Обработка перезаполнения табличной части
Впервые дали писать обработку заполнения ТЧ. С инициализацией разобрался, но возникли трудности с тем как правильно продумать алгоритм перезаполнения.
Суть проста. Пользователь вводит в тч документа номенклатуру(комплектующее), количество. Жмет процедуру обработки заполнения. Обработка должна расписать каждую номенклатуру по серийному номеру из ТоварыНаСкладах используя принцип FIFO.
Пример: Юзер ввел Деталь1 в количестве 100 штук (различных номенклатур может быть куда больше чем одна).
В ТНС есть 50 штук Деталь1 с серийным номером 02_06_2023 и 100 с серийным номером 13_07_2023.
После работы обработки в тч документа должно быть две строки Деталь1 с серийником 02_06_2023 в количестве 50 штук и Деталь1 с серийником 13_07_2023 в количестве 50 штук.
С самой логикой расчета было не так трудно (привел ее ниже)
Трудности с тем как вывести данные, которые я сую в НовыеКомплектующие, в документ.
Если просто загружать через Объект.Комплектующие.Загрузить(НовыеКомплектующие); то часть колонок будет пустой (единицы измерения например), попробовал перенести процедуры формы и объекта, чтоб заполнять колонки, все заполняется кроме СчетУчетаБУ и СчетУчетаНу. Пока разбирался, где они заполняются, подумал, может я все усложнил и можно изначально все сделать проще. Сразу как-то работать с табличным полем и ТЧ. Но как это сделать грамотно, чтоб не потерять данные введеные пользователем и вывести данные со всеми колонками как надо понятия не имею, может кто-то тут сможет подсказать.
Суть проста. Пользователь вводит в тч документа номенклатуру(комплектующее), количество. Жмет процедуру обработки заполнения. Обработка должна расписать каждую номенклатуру по серийному номеру из ТоварыНаСкладах используя принцип FIFO.
Пример: Юзер ввел Деталь1 в количестве 100 штук (различных номенклатур может быть куда больше чем одна).
В ТНС есть 50 штук Деталь1 с серийным номером 02_06_2023 и 100 с серийным номером 13_07_2023.
После работы обработки в тч документа должно быть две строки Деталь1 с серийником 02_06_2023 в количестве 50 штук и Деталь1 с серийником 13_07_2023 в количестве 50 штук.
С самой логикой расчета было не так трудно (привел ее ниже)
Процедура Инициализировать(ОбъектДок, ИмяТаблЧасти, ТабличноеПоле) Экспорт
Объект = ОбъектДок;
ИмяТЧ = ИмяТаблЧасти;
СформироватьНовыеКомплектующие(ТабличноеПоле);
КонецПроцедуры
Процедура СформироватьНовыеКомплектующие(ТабПоле)
ПоказыватьВДокументахСчетаУчета = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ПоказыватьВДокументахСчетаУчета");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Номенклатура,
| ТоварыНаСкладахОстатки.СерияНоменклатуры,
| ТоварыНаСкладахОстатки.КоличествоОстаток КАК Количество
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&КонПериода, Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОстатки
|
|УПОРЯДОЧИТЬ ПО
| ТоварыНаСкладахОстатки.СерияНоменклатуры.ДатаПоступления";
Запрос.УстановитьПараметр("КонПериода", Дата(ТекущаяДата()));
НовыеКомплектующие = Новый ТаблицаЗначений;
НовыеКомплектующие.Колонки.Добавить("Номенклатура",Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
НовыеКомплектующие.Колонки.Добавить("Количество",Новый ОписаниеТипов("Число"));
НовыеКомплектующие.Колонки.Добавить("СерияНоменклатуры",Новый ОписаниеТипов("Строка"));
Для Строка = 0 по Объект.Комплектующие.Количество()-1 Цикл
Запрос.УстановитьПараметр("Номенклатура",Объект.Комплектующие[Строка].Номенклатура);
Серии = Запрос.Выполнить().Выгрузить();
КоличествоНом = Объект.Комплектующие[Строка].Количество;
СуммаПартий = 0;
НомерСтр = 0;
Для каждого Партия из Серии Цикл
Если НомерСтр = 0 Тогда
СуммаПартий = СуммаПартий + Партия.Количество;
КонецЕсли;
Если СуммаПартий > КоличествоНом Тогда
Если НомерСтр = 0 Тогда
НомерСтр = Строка
Иначе
Серии.Удалить(Партия);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Для НС = 0 По Серии.Количество() - 1 Цикл
НовоеКомплект = НовыеКомплектующие.Добавить();
Если КоличествоНом - Серии[НС].Количество > 0 Тогда
НовоеКомплект.Номенклатура = Объект.Комплектующие[Строка].Номенклатура;
Если Серии[НС].СерияНоменклатуры.Наименование > "" Тогда
НовоеКомплект.СерияНоменклатуры = Серии[НС].СерияНоменклатура;
Иначе
НовоеКомплект.СерияНоменклатуры = "";
КонецЕсли;
НовоеКомплект.Количество = Серии[НС].КоличествоОстаток;
КоличествоНом = КоличествоНом - Серии[НС].КоличествоОстаток;
Иначе
НовоеКомплект.Номенклатура = Объект.Комплектующие[Строка].Номенклатура;
Если Серии[НС].СерияНоменклатуры.Наименование > "" Тогда
НовоеКомплект.СерияНоменклатуры = Серии[НС].СерияНоменклатура;
Иначе
НовоеКомплект.СерияНоменклатуры = "";
КонецЕсли;
НовоеКомплект.Количество = КоличествоНом;
КоличествоНом = 0;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
ПоказатьТрудности с тем как вывести данные, которые я сую в НовыеКомплектующие, в документ.
Если просто загружать через Объект.Комплектующие.Загрузить(НовыеКомплектующие); то часть колонок будет пустой (единицы измерения например), попробовал перенести процедуры формы и объекта, чтоб заполнять колонки, все заполняется кроме СчетУчетаБУ и СчетУчетаНу. Пока разбирался, где они заполняются, подумал, может я все усложнил и можно изначально все сделать проще. Сразу как-то работать с табличным полем и ТЧ. Но как это сделать грамотно, чтоб не потерять данные введеные пользователем и вывести данные со всеми колонками как надо понятия не имею, может кто-то тут сможет подсказать.
По теме из базы знаний
- Перезаполнение табличных частей Отчета о розничных продажах. Розница 2.2/2.3
- Перезаполнение табличной части документа Поступление товаров по документу ТТН входящая ЕГАИС для Розницы 2.2
- Заполнение табличной части Материалы документа Требование-накладная сериями материалов (по методу FIFO) (УТ 10.3, КА 1.1, УПП 1.3)
- Перезаполнение табличных частей Отчета о розничных продажах. Розница 2.3
- Передача материалов в эксплуатацию, перезаполнение табличной части по заданным параметрам. БП 3.0
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот