Обработка перезаполнения табличной части

1. Scar_rus 03.08.23 09:00 Сейчас в теме
Впервые дали писать обработку заполнения ТЧ. С инициализацией разобрался, но возникли трудности с тем как правильно продумать алгоритм перезаполнения.

Суть проста. Пользователь вводит в тч документа номенклатуру(комплектующее), количество. Жмет процедуру обработки заполнения. Обработка должна расписать каждую номенклатуру по серийному номеру из ТоварыНаСкладах используя принцип 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. nomad_irk 76 03.08.23 09:12 Сейчас в теме
(1)Выгрузите ТЧ в ТЗ, сверните по Номенклатура + остальные колонки с суммированием по Количеству и Суммам используйте ее в качестве параметра запроса.
Результат обработайте кодом и загрузите обратно в ТЧ
3. newlogin1 03.08.23 09:18 Сейчас в теме
(1)Есть же типовые процедурки заполнения всех реквизитов, грузите ТЧ и после вызываете эти процедуры, сами процедуры смотрите в документе в событиях При добавлении новой строки, при изменении номенклатуры, количества
4. user1973639 03.08.23 09:29 Сейчас в теме
В типовой есть дикое шаманство как строку на две разбить. Можно по аналогии откуда выдрать.
А так да, проще выгрузить в ТЗ поизголяться как хочется и перезаполнить из ТЗ табличную часть.
По крайней мере это проще. И в отладчике всего можно проверить свою ТЗ. Чего оно там позаполнилось.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот