Запись нескольких документов в одном цикле

1. VKuser168942809 02.07.24 16:25 Сейчас в теме
Есть задание сделать обработку для записи документов поступлений.
На форме 4 колонки, номер документа, номенклатура, количество и группа

Я должен сделать запись номенклатуры в документы в зависимости от номера документа в табличной части.

Сначала сделал с подсчётом всех различных строк в колонке номер и по их количеству что бы запускался цикл по созданию документов и внутри этого цикла, цикл для перебора строк с табличной части и записи номенклатуры в нужный документ. Но препод сказал что так делать не очень хорошо, что бы серв не перегружать.

Сейчас немного поправил код, но записать несколько док-ов по количеству не получается, подскажите пожалуйста в какую сторону копать?

Код текущей программы:
Таб = Объект.ТабличнаяЧасть.Выгрузить();
	Таб.Свернуть("Номенклатура, Номер, Группа","Количество");
	Таб.Сортировать("Номер");
	СозданиеГрупп();
	НовыеТовары();   
	
	Для Каждого Строка из Таб цикл 
			Поступление = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
			Поступление.Дата = ТекущаяДата();
			Поступление.Комментарий = "Создано автоматической обработкой, требуется заполнить данные";
	
		Если Строка.Номер = Таб[0][0] Тогда 
			Товар = Поступление.Товары.Добавить();             

			Товар.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(Строка.Номенклатура);
			Товар.КоличествоУпаковок = Число(Строка.Количество);
			Таб.Удалить(0);
		КонецЕсли;
		
		Попытка
			Поступление.Записать(); 
		Исключение
			Сообщить("Ошибка записи");
		КонецПопытки; 
	КонецЦикла;
Показать


ps. пока обучаюсь
pps. Что удалять строки из перебираемой таблицы не хорошо, уже так же сказали, чем заменить не знаю
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. soft_wind 02.07.24 16:59 Сейчас в теме
попробуйте такой вариант (не проверял, могут быть опечатки)

Таб = Объект.ТабличнаяЧасть.Выгрузить();
    Таб.Свернуть("Номенклатура, Номер, Группа","Количество");
    Таб.Сортировать("Номер");
    СозданиеГрупп();
    НовыеТовары();   
	
	СписокДоков = Новый Соответствие;
	
	Для Каждого Строка из Таб цикл   
		лкДокПТУ = СписокДоков.Получить(Строка.Номер);
		Если лкДокПТУ = Неопределено Тогда
            лкДокПТУ = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
            лкДокПТУ.Дата = ТекущаяДата();
            лкДокПТУ.Номер = Строка.Номер;
			
            лкДокПТУ.Комментарий = "Создано автоматической обработкой, требуется заполнить данные";
		    СписокДоков.Вставить(Строка.Номер,лкДокПТУ);
		КонецЕсли;
    
            Товар = лкДокПТУ.Товары.Добавить();             

            Товар.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(Строка.Номенклатура);
            Товар.КоличествоУпаковок = Число(Строка.Количество);
            //Таб.Удалить(0);
        
	КонецЦикла;
	
	Для каждого лкСтр Из СписокДоков Цикл
        Попытка
            лкСтр.Значение.Записать(); 
        Исключение
            Сообщить("Ошибка записи");
        КонецПопытки; 
	КонецЦикла;
Показать
3. VKuser168942809 02.07.24 18:42 Сейчас в теме
(2)Спасибо, даже не думал про запись доков в отдельный список и оттуда запись, ну мне нужно было одним циклом, сделал по другому:
Таб = Объект.ТабличнаяЧасть.Выгрузить();
	Таб.Свернуть("Номер, Номенклатура, Группа","Количество");
	Таб.Сортировать("Номер");
	
	СозданиеГрупп();
	НовыеТовары(); 
	Проверка = Таб[0].Номер;

	Поступление = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
	Поступление.Дата =  ТекущаяДата();
	Поступление.Комментарий = "Создано автоматической обработкой, требуется заполнить данные";

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

			Товар.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(Строка.Номенклатура);
			Товар.КоличествоУпаковок = Число(Строка.Количество);
			Проверка = Строка.Номер;
		Иначе                       
			Поступление.Записать();
			Поступление = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
			Поступление.Дата = ТекущаяДата();
			Поступление.Комментарий = "Создано автоматической обработкой, требуется заполнить данные";
			
            Товар.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(Строка.Номенклатура);
			Товар.КоличествоУпаковок = Число(Строка.Количество);
			Проверка = Строка.Номер;
		КонецЕсли;
		
	КонецЦикла;  
	
	Поступление.Записать(); 
Показать
Оставьте свое сообщение

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