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

ФИФО И ЛИФО на расходный документ

Автор Влад Семёнов, 27 мая 2019, 18:45

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

Влад Семёнов

Помогите сократить)

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

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

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

мсвПопыток = Новый Массив;
Для Каждого СтрокаТЧ Из ПереченьНоменклатуры Цикл
Отбор = Новый Структура;
Отбор.Вставить("Материал",СтрокаТЧ.Материал);
мсвСтрок = ВыборкаДетальныеЗаписи.НайтиСтроки(Отбор);
СуммаКолличества = 0;
МояТаблица = Новый ТаблицаЗначений;
МояТаблица.Колонки.Добавить("Материал");
МояТаблица.Колонки.Добавить("Количество");
МояТаблица.Колонки.Добавить("Партия");
Если мсвСтрок.Количество() > 0 Тогда
Для Счетчик = 0 По мсвСтрок.Количество() Цикл
Если СуммаКолличества >= СтрокаТЧ.Количество Тогда
Если СуммаКолличества = СтрокаТЧ.Количество Тогда
мсвПопыток.Добавить(МояТаблица);
Прервать;
ИначеЕсли СуммаКолличества > СтрокаТЧ.Количество Тогда
МояТаблица[Счетчик-1].Количество = МояТаблица[Счетчик-1].Количество - (СуммаКолличества - СтрокаТЧ.Количество);
мсвПопыток.Добавить(МояТаблица);
Прервать;
КонецЕсли;
Иначе
Попытка
СуммаКолличества = СуммаКолличества + мсвСтрок[Счетчик].КоличествоОстаток;
НоваяСтрока = МояТаблица.Добавить();
НоваяСтрока.Материал = мсвСтрок[Счетчик].Материал;
НоваяСтрока.Количество = мсвСтрок[Счетчик].КоличествоОстаток;
НоваяСтрока.Партия = мсвСтрок[Счетчик].Партия;
Исключение
Сообщить("Не хватает "+мсвСтрок[Счетчик-1].Материал+" в количество "+(СтрокаТЧ.Количество-СуммаКолличества));
Отказ = Истина;
КонецПопытки;
КонецЕсли;
КонецЦикла;
Иначе
Сообщить("На складе нет "+СтрокаТЧ.Материал);
Отказ = Истина;
КонецЕсли;
КонецЦикла;


// регистр ОстаткиМатериалов Расход
Движения.ОстаткиМатериалов.Записывать = Истина;
Для Счетчик = 0 по мсвПопыток.Количество() - 1 Цикл
Для Счет = 0 по мсвПопыток[Счетчик].Количество() - 1 Цикл
Движение = Движения.ОстаткиМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Материал = мсвПопыток[Счетчик][Счет].Материал;
Движение.Партия = мсвПопыток[Счетчик][Счет].Партия.Ссылка;
Движение.Количество = мсвПопыток[Счетчик][Счет].Количество;
КонецЦикла;
КонецЦикла;
Движения.Записать();
КонецПроцедуры

Теги:

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

Рейтинг@Mail.ru

Поиск