PDA

Просмотр полной версии : Регистр накопления не правильно считает сумму остатком и сумму



Krpolina1996
17.12.2018, 04:57
Здравствуйте! Есть задание , вроде себестоимость правильно считается,но остатки списываются нет.
Задание 1.
Создать пустую конфигурацию.
Создать справочники "Номенклатура", "Склады".
Организовать количественно-суммовой учёт товара в регистре
"ТоварыНаСкладах". Измерения "Номенклатура" и "Склад" Ресурсы:
"Сумма", "Количество".

Создать документ "Приходная накладная" Реквизиты шапки: "Склад"
Табличная часть: "Товары". Реквизиты табличной части: Номенклатура,
Количество, Цена, Сумма. Документ делает приход товара в регистр.
Создать документ "Расходная накладная". Реквизитов в шапке нет.
Табличная часть "товары" содержит реквизиты: номенклатура, склад,
количество, цена, сумма. (Склад в табличной части, следовательно
документом можно продать товары с нескольких складов).
В конфигурации документах и в регистрах все суммы (сумма и цена)
имеют измерения [15,2] что означает длина 15, знаков после запятой 2.
Количество везде имеет измерение [15,3]
Документ Расхродная накладная списывает товары со складов по
себестоимости (определяет стоимость товара в регистре и делает
движение "расход"). Если товара на складе не хватает, документ
сообщает об этом и не проводится.

Процедура ОбработкаПроведения(Отказ, Режим)
// регистр ТоварыНаСкладах Расход
Движения.ТоварыНаСкладах.З аписывать = Истина;

МенеджерВТ = Новый МенеджерВременныхТаблиц;

Запрос = Новый Запрос;

Запрос.МенеджерВременныхТ� �блиц = МенеджерВТ;
Запрос.Текст = "ВЫБРАТЬ
| РасходнаяНакладнаяТовары.� �оменклатура КАК Номенклатура,
| РасходнаяНакладнаяТовары.� �клад КАК Склад,
| РасходнаяНакладнаяТовары.� �оличество КАК КоличествоВДокументе,
| РасходнаяНакладнаяТовары.� �умма КАК СуммаВДокументе
|ПОМЕСТИТЬ НоменклатураДокумента
|ИЗ
| Документ.РасходнаяНакладн� �я.Товары КАК РасходнаяНакладнаяТовары
|ГДЕ
| РасходнаяНакладнаяТовары.� �сылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РасходнаяНакладнаяТовары.� �оменклатура,
| РасходнаяНакладнаяТовары.� �клад,
| РасходнаяНакладнаяТовары.� �оличество,
| РасходнаяНакладнаяТовары.� �умма";

Запрос.УстановитьПараметр("Ссылка", Ссылка);

РезультатЗапроса = Запрос.Выполнить();

Запрос=Новый Запрос;
Запрос.МенеджерВременныхТ� �блиц = МенеджерВТ;//ТОВАРЫ ОСТАТКИ НЕ ПРАВИЛЬНО ПОЛУЧЕНЫ ГДЕ АПРОС ПО СКЛАДУ? учись получать товары по складам!
//ПРИМЕР ПОСТАВЬ 200 ТОВАРОВ НА СКЛАД 1
//СПИШИ По 100 С КАЖДОГО СКЛАДА ОДНИМ ДОКУМЕНТОМ ПРОЖИ
Запрос.Текст = "ВЫБРАТЬ
| НоменклатураДокумента.Ном� �нклатура КАК Номенклатура,
| НоменклатураДокумента.Кол� �чествоВДокументе КАК КоличествоВДокументе,
| НоменклатураДокумента.Сум� �аВДокументе КАК СуммаВДокументе,
| НоменклатураДокумента.Скл� �д КАК Склад,
| ЕСТЬNULL(ТоварыНаСкладахОст� �тки.СуммаОстаток, 0) КАК СуммаОстаток,
| ЕСТЬNULL(ТоварыНаСкладахОст� �тки.КоличествоОстаток, 0) КАК КоличествоОстаток,
| РасходнаяНакладная.Ссылка КАК Ссылка
|ИЗ
| НоменклатураДокумента КАК НоменклатураДокумента
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыН� �Складах.Остатки(, ) КАК ТоварыНаСкладахОстатки
| ПО (ТоварыНаСкладахОстатки.Ск лад В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВЫРАЗИТЬ(НоменклатураДоку� �ента.Склад КАК Справочник.Склады)
| ИЗ
| Документ.РасходнаяНакладн� �я.Товары КАК РасходнаяНакладная
| ГДЕ
| РасходнаяНакладная.Ссылка = &Ссылка
| И НЕ ВЫРАЗИТЬ(НоменклатураДоку� �ента.Склад КАК Справочник.Склады) ЕСТЬ NULL))
| И (ТоварыНаСкладахОстатки.Но менклатура В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| НоменклатураДокумента.Ном� �нклатура
| ИЗ
| Документ.РасходнаяНакладн� �я.Товары КАК РасходнаяНакладная
| ГДЕ
| РасходнаяНакладная.Ссылка = &Ссылка)),
| Документ.РасходнаяНакладн� �я КАК РасходнаяНакладная";

Запрос.УстановитьПараметр("Ссылка", Ссылка);



Движения.ТоварыНаСкладах.Б локироватьДляИзменения = Истина;
//////
Движения.ТоварыНаСкладах.З аписать();
////
РезультатЗапроса = Запрос.Выполнить();

//ТЗ = РезультатЗапроса.Выгрузит� �();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Сл� �дующий() Цикл

Движение = Движения.ТоварыНаСкладах.Д обавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Рас� �од;
Движение.Период = Дата;
Движение.Номенклатура =ВыборкаДетальныеЗаписи.Но менклатура;
Движение.Склад =ВыборкаДетальныеЗаписи.Ск лад;
Движение.Сумма = (ВыборкаДетальныеЗаписи.Су ммаОстаток/ВыборкаДетальныеЗаписи.Ко� �ичествоОстаток)*ВыборкаДе� �альныеЗаписи.КоличествоВД окументе;
Движение.Количество = ВыборкаДетальныеЗаписи.Ко� �ичествоВДокументе;


КонецЦикла;

Движения.Записать();

Если Режим = РежимПроведенияДокумента.� �перативный Тогда
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТ� �блиц = МенеджерВТ;
Запрос.Текст = "ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Но� �енклатура КАК Номенклатура,
| ЕСТЬNULL(ТоварыНаСкладахОст� �тки.КоличествоОстаток, 0) КАК КоличествоОстаток
|ИЗ
| РегистрНакопления.ТоварыН� �Складах.Остатки(
| ,
| Номенклатура В
| (ВЫБРАТЬ
| НоменклатураДокумента.Ном� �нклатура
| ИЗ
| НоменклатураДокумента)
| И Склад = &Склад) КАК ТоварыНаСкладахОстатки
|ГДЕ
| ТоварыНаСкладахОстатки.Ко� �ичествоОстаток < 0";//КОНТРОЛЬ БЕЗ УЧЕТА СКЛАДА ТУТ, ОШИБКА
Запрос.УстановитьПараметр("Склад",ВыборкаДетальныеЗаписи.Ск лад);

РезультатЗапроса = Запрос.Выполнить();

ТЗ = РезультатЗапроса.Выгрузит� �();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Сл� �дующий() Цикл
//Если ВыборкаДетальныеЗаписи.Ко� �ичествоОстаток<0 Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "Не хватает "+Строка(-ВыборкаДетальныеЗаписи.Ко� �ичествоОстаток)+
"Единиц материала " + ВыборкаДетальныеЗаписи.Но� �енклатура+"";
Сообщение.Сообщить();

Отказ = Истина;
//КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры

Krpolina1996
17.12.2018, 05:03
Процедура ОбработкаПроведения(Отказ, Режим)
// регистр ТоварыНаСкладах Расход
Движения.ТоварыНаСкладах.З аписывать = Истина;

МенеджерВТ = Новый МенеджерВременныхТаблиц;

Запрос = Новый Запрос;

Запрос.МенеджерВременныхТ� �блиц = МенеджерВТ;
Запрос.Текст = "ВЫБРАТЬ
| РасходнаяНакладнаяТовары.� �оменклатура КАК Номенклатура,
| РасходнаяНакладнаяТовары.� �клад КАК Склад,
| РасходнаяНакладнаяТовары.� �оличество КАК КоличествоВДокументе,
| РасходнаяНакладнаяТовары.� �умма КАК СуммаВДокументе
|ПОМЕСТИТЬ НоменклатураДокумента
|ИЗ
| Документ.РасходнаяНакладн� �я.Товары КАК РасходнаяНакладнаяТовары
|ГДЕ
| РасходнаяНакладнаяТовары.� �сылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РасходнаяНакладнаяТовары.� �оменклатура,
| РасходнаяНакладнаяТовары.� �клад,
| РасходнаяНакладнаяТовары.� �оличество,
| РасходнаяНакладнаяТовары.� �умма";

Запрос.УстановитьПараметр("Ссылка", Ссылка);

РезультатЗапроса = Запрос.Выполнить();

Запрос=Новый Запрос;
Запрос.МенеджерВременныхТ� �блиц = МенеджерВТ;//ТОВАРЫ ОСТАТКИ НЕ ПРАВИЛЬНО ПОЛУЧЕНЫ ГДЕ АПРОС ПО СКЛАДУ? учись получать товары по складам!
//ПРИМЕР ПОСТАВЬ 200 ТОВАРОВ НА СКЛАД 1
//СПИШИ По 100 С КАЖДОГО СКЛАДА ОДНИМ ДОКУМЕНТОМ ПРОЖИ
Запрос.Текст = "ВЫБРАТЬ
| НоменклатураДокумента.Ном� �нклатура КАК Номенклатура,
| НоменклатураДокумента.Кол� �чествоВДокументе КАК КоличествоВДокументе,
| НоменклатураДокумента.Сум� �аВДокументе КАК СуммаВДокументе,
| НоменклатураДокумента.Скл� �д КАК Склад,
| ЕСТЬNULL(ТоварыНаСкладахОст� �тки.СуммаОстаток, 0) КАК СуммаОстаток,
| ЕСТЬNULL(ТоварыНаСкладахОст� �тки.КоличествоОстаток, 0) КАК КоличествоОстаток,
| РасходнаяНакладная.Ссылка КАК Ссылка
|ИЗ
| НоменклатураДокумента КАК НоменклатураДокумента
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыН� �Складах.Остатки(, ) КАК ТоварыНаСкладахОстатки
| ПО (ТоварыНаСкладахОстатки.Ск лад В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВЫРАЗИТЬ(НоменклатураДоку� �ента.Склад КАК Справочник.Склады)
| ИЗ
| Документ.РасходнаяНакладн� �я.Товары КАК РасходнаяНакладная
| ГДЕ
| РасходнаяНакладная.Ссылка = &Ссылка
| И НЕ ВЫРАЗИТЬ(НоменклатураДоку� �ента.Склад КАК Справочник.Склады) ЕСТЬ NULL))
| И (ТоварыНаСкладахОстатки.Но менклатура В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| НоменклатураДокумента.Ном� �нклатура
| ИЗ
| Документ.РасходнаяНакладн� �я.Товары КАК РасходнаяНакладная
| ГДЕ
| РасходнаяНакладная.Ссылка = &Ссылка)),
| Документ.РасходнаяНакладн� �я КАК РасходнаяНакладная";

Запрос.УстановитьПараметр("Ссылка", Ссылка);



Движения.ТоварыНаСкладах.Б локироватьДляИзменения = Истина;
//////
Движения.ТоварыНаСкладах.З аписать();
////
РезультатЗапроса = Запрос.Выполнить();

//ТЗ = РезультатЗапроса.Выгрузит� �();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Сл� �дующий() Цикл

Движение = Движения.ТоварыНаСкладах.Д обавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Рас� �од;
Движение.Период = Дата;
Движение.Номенклатура =ВыборкаДетальныеЗаписи.Но менклатура;
Движение.Склад =ВыборкаДетальныеЗаписи.Ск лад;
Движение.Сумма = (ВыборкаДетальныеЗаписи.Су ммаОстаток/ВыборкаДетальныеЗаписи.Ко� �ичествоОстаток)*ВыборкаДе� �альныеЗаписи.КоличествоВД окументе;
Движение.Количество = ВыборкаДетальныеЗаписи.Ко� �ичествоВДокументе;


КонецЦикла;

Движения.Записать();

Если Режим = РежимПроведенияДокумента.� �перативный Тогда
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТ� �блиц = МенеджерВТ;
Запрос.Текст = "ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Но� �енклатура КАК Номенклатура,
| ЕСТЬNULL(ТоварыНаСкладахОст� �тки.КоличествоОстаток, 0) КАК КоличествоОстаток
|ИЗ
| РегистрНакопления.ТоварыН� �Складах.Остатки(
| ,
| Номенклатура В
| (ВЫБРАТЬ
| НоменклатураДокумента.Ном� �нклатура
| ИЗ
| НоменклатураДокумента)
| И Склад = &Склад) КАК ТоварыНаСкладахОстатки
|ГДЕ
| ТоварыНаСкладахОстатки.Ко� �ичествоОстаток < 0";//КОНТРОЛЬ БЕЗ УЧЕТА СКЛАДА ТУТ, ОШИБКА
Запрос.УстановитьПараметр("Склад",ВыборкаДетальныеЗаписи.Ск лад);

РезультатЗапроса = Запрос.Выполнить();

ТЗ = РезультатЗапроса.Выгрузит� �();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Сл� �дующий() Цикл
//Если ВыборкаДетальныеЗаписи.Ко� �ичествоОстаток<0 Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "Не хватает "+Строка(-ВыборкаДетальныеЗаписи.Ко� �ичествоОстаток)+
"Единиц материала " + ВыборкаДетальныеЗаписи.Но� �енклатура+"";
Сообщение.Сообщить();

Отказ = Истина;
//КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры