Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 20:11

Списание методом фифо

Автор EvgeniyaJ, 30 сен 2019, 23:10

0 Пользователей и 1 гость просматривают эту тему.

EvgeniyaJ

Помогите пожалуйста понять, где ошибка! Списание проходит, только в регистр продаж в сумму попадают значения со знаком минус, и в себестоимость тоже, что не так

Процедура ОбработкаПроведения(Отказ, Режим)

ВидУслуга = Перечисления.ВидыНоменклатуры.Услуга;

Движения.ОстаткиМатериалов.Записать();
Движения.Себестоимость.Записать();
Движения.Продажи.Записывать = Истина;

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

Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("Дата", МоментВремени());
РезультатЗапроса = Запрос.Выполнить();

Если НЕ РезультатЗапроса.Пустой() Тогда

ВыборкаТовары = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаТовары.Следующий() Цикл

Если ВыборкаТовары.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Товар
И ВыборкаТовары.КоличествоОстаток < ВыборкаТовары.КоличествоВДокументе Тогда

Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не хватает номенклатуры " + ВыборкаТовары.Номенклатура
+ ", в количестве " + Строка(ВыборкаТовары.КоличествоВДокументе - ВыборкаТовары.КоличествоОстаток) + ".";
Сообщение.Поле = "Товары[" + (ВыборкаТовары.НомерСтроки - 1) + "].Количество";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();

Отказ = Истина;

КонецЕсли;

Если Отказ Тогда
Продолжить;
КонецЕсли;

КоличествоНоменклатурыВДок = ВыборкаТовары.КоличествоВДокументе;

ВыборкаПартий = ВыборкаТовары.Выбрать();

Пока ВыборкаПартий.Следующий() И НЕ КоличествоНоменклатурыВДок = 0 Цикл

Если ВыборкаТовары.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Товар Тогда

ОстатокВПартии = ВыборкаПартий.КоличествоОстаток;
КоличествоТоваров = Мин(ОстатокВПартии, КоличествоНоменклатурыВДок);

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

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

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

КоличествоНоменклатурыВДок = ОстатокВПартии - КоличествоНоменклатурыВДок;

ИначеЕсли ВыборкаТовары.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда

//Движения по регистру Продажи для услуг
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = ВыборкаТовары.Номенклатура;
Движение.Мастер = Мастер;
Движение.Количество = ВыборкаТовары.КоличествоВДокументе;
Движение.Сумма = ВыборкаТовары.СуммаВДокументе;
КонецЕсли;

КонецЦикла;

КонецЦикла;

КонецЕсли;

Движения.ОстаткиМатериалов.Записать();
Движения.Себестоимость.Записать();

КонецПроцедуры






Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск