объединить документы в один

1. Raideres 8 19.03.21 22:07 Сейчас в теме
Добрый день задача следующая есть таблица вида например https://prnt.sc/10q813c

когда создавал обработку делал что для каждого документа из приемника создавался документ в источнике и поиск был по ГУИД в регистре (см ниже )
а вот когда задача встала что нужно объединить в один что то застрял.
Подскажите как объединить документы в один???

Отказ = Ложь;
	
	Попытка
		УТ = ПодключитьсяКБазе(ИмяСервера, ИмяБазы, ПутьКБазе, Пользователь, Пароль);	
	Исключение
		Сообщить("База не открыта");
		Отказ = Истина;
	КонецПопытки;
	
	Если Отказ Тогда
		Возврат;
	КонецЕсли;    	
	
	

Функция СопоставитьВнутреннийДокумент(ОписаниеДокументаУТ_УИД, ВидДок8БП, ВидОбъекта) Экспорт
	
	Запрос = Новый Запрос;
	
	Запрос.УстановитьПараметр("ИдентификаторВ83",		ОписаниеДокументаУТ_УИД);
		
	ТекстЗапроса = 
		"ВЫБРАТЬ
		|	СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника КАК Ссылка
		|ИЗ
		|	РегистрСведений.СоответствияОбъектовИнформационныхБаз КАК СоответствияОбъектовИнформационныхБаз
		|ГДЕ
		|	СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторПриемника = &ИдентификаторВ83";
		
	
	Запрос.Текст = ТекстЗапроса;
	
	Результат	= Запрос.Выполнить();
	Выборка		= Результат.Выбрать();

	Если Выборка.Следующий() Тогда 
		Док8БП = Выборка.Ссылка;
	Иначе 
		Если ВидОбъекта="Документ" Тогда	
			Док8БП = Документы[ВидДок8БП].ПустаяСсылка();		
		ИначеЕсли ВидОбъекта="Справочник" Тогда
			Док8БП = Справочники[ВидДок8БП].ПустаяСсылка();
		КонецЕсли;
		
	КонецЕсли;
	
	Возврат Док8БП;
	
КонецФункции
	Для Каждого Док Из СписокДокументов Цикл   //СПИСОК ДОКУМЕНТОВ ДЛЯ ПЕРЕНОСА
		Если Док.Выбран Тогда 			       //ПЕРЕНОСИМ ТОЛЬКО ТЕ КОТОРЫЕ ОТМЕТИЛИ
				Организация = Док.Организация;				
			Если Док.Вид="Реализация (акты, накладные)" Тогда //И ОПРЕДЛЕННОГО 	
				
				ДокУТ = УТ.Документы.РеализацияТоваровУслуг.НайтиПоНомеру(Док.Номер, Док.Дата); //НАШЛИ ДОКУМЕНТ В БАЗЕ УТ 				
			
				Если ЗначениеЗаполнено(Док.СсылкаБух) тогда   //УЖЕ ЕСТЬ СОЗДАННЫЙ ДОКУМЕНТ В БУХГАЛТЕРИИ
					
					Если НЕ ПропускатьРанееЗанесенныеДокументы тогда
						Док.СсылкаБух = СоздатьРеализацию(ДокУТ, Док.СсылкаБух,Док.КонтрагентЗамена, ПроблемныеКонтрагенты);
					Иначе 
						СообщитьЗаписатьВЛог("Пропущен документ: """ + Док.СсылкаБух.Номер + """ от: " + Формат(Док.СсылкаБух.Дата, "ДЛФ=Д"));
						ЗаполнитьРезультатПереноса("РеализацияТоваровУслуг",Ложь,,,Истина);
						Продолжить;
					КонецЕсли;
					
				Иначе        
					//СОЗДАЕМ НОВЫЙ ДОКУМЕНТ В БУХГАЛТЕРИИ 
					СсылкаБух  = СопоставитьВнутреннийДокумент(Док.УИД,"РеализацияТоваровУслуг", "Документ");
					//СсылкаБух БУДЕТ ПУСТАЯ ССЫЛКА
					Док.СсылкаБух = СоздатьРеализацию(ДокУТ, СсылкаБух, Док.КонтрагентЗамена,ПроблемныеКонтрагенты);
				КонецЕсли;
				
				Если ЗначениеЗаполнено(Док.СсылкаБух) И ПроводитьДокументы И НЕ Док.Ссылкабух.Проведен Тогда
					Док.ошибка = Истина;
				Иначе
					Док.ошибка = Ложь; 
				КонецЕсли;
				СообщитьЗаписатьВЛог("*** *** ***"); 			              			
			КонецЕсли;		
			КонецЕсли; 		
	КонецЦикла;
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. GAMLET 52 20.03.21 02:13 Сейчас в теме
Что значит "Объединить документы в один"?
3. Raideres 8 20.03.21 07:42 Сейчас в теме
(2)из ут переношу документы реализации в бухгалтерию и нужно объединить по определенному покупателю в одну реализацию

Табличную часть сгруппирововать не нужно
4. starjevschik 20.03.21 09:01 Сейчас в теме
Для Каждого Док Из СписокДляПереноса Цикл
Если УсловиеДляОбъединенияВыполнено Тогда
НовыйДок = УжеСозданныйДок;
Иначе
НовыйДок = Документы.НужныйВидДокумента.СоздатьДокумент();
КонецЕсли;

Для Каждого Строка из ну и дальше все понятно заполняем все что нужно.
КонецЦикла;
Показать
5. Raideres 8 20.03.21 11:21 Сейчас в теме
вот да вы правы но меня смущает другое
вот что тнужно объединить в списке мы сами выбираем отсуда получаем список нужных документов для переноса ну естественно добавлю проверки на то что один контрагент а не разные и т.д.

когда я создавал связь по ГУИД Источника = ГУИД приемника (регистр СоответствияОбъектовИнформационныхБаз )

тут у меня будет что источники разные приемник один это тоже я проблем не вижу
а вот я создал первый документ из списка то мне как потом найти "УжеСозданныйДок" условие скажем так написать

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

Для Каждого Строка из ну и дальше все понятно заполняем все что нужно.
КонецЦикла;
Показать
6. Fox-trot 158 21.03.21 09:13 Сейчас в теме
(5) как вариант
создать ТЗ как список уже созданных документов и заполнять по мере надобности=НайтиСтроки("Документ, Контрагент", Док, Контра)
7. Raideres 8 21.03.21 13:13 Сейчас в теме
(6)встал другой вопрос сделал условия отбора но чтот как то тупо мне кажется

	ТЗПроверки = СписокДокументов.Выгрузить(,"Выбран,Контрагент,СсылкаБух");
	МассивСтрок = ТЗПроверки.НайтиСтроки(Новый Структура("Выбран", Ложь));
	Для Каждого ЭлементМассив Из МассивСтрок Цикл
		ТЗПроверки.Удалить(ЭлементМассив); //удаляем строки
	КонецЦикла;
	
	ТЗПроверки.Свернуть("Выбран,Контрагент,СсылкаБух");
	
	ДокументыДляПереноса = СписокДокументов.НайтиСтроки(Новый Структура("Выбран, Вид",Истина,"Реализация (акты, накладные)"));

	Если ТЗПроверки.Количество()= 1 Тогда
		Если не ЗначениеЗаполнено(ТЗПроверки[0].СсылкаБух) Тогда
			
			Для Каждого Док Из ДокументыДляПереноса Цикл   //СПИСОК ДОКУМЕНТОВ ДЛЯ ПЕРЕНОСА
				
				
			КонецЦикла;	
		Иначе
			Сообщить("Нельзя выбрать документ для которых уже есть сссылки в БП 3.0"); 
		КонецЕсли; 
		
		
	Иначе 
		Сообщить("Объединение документов возможно только по одному контрагенту.");
	КонецЕсли;
Показать
8. user856012 13 21.03.21 13:31 Сейчас в теме
(5)
я создал первый документ из списка то мне как потом найти "УжеСозданныйДок" условие скажем так написать
ИМХО, лучше вообще поменять алгоритм: сначала загрузить все нужные документы в таблицу значений, ТЗ свернуть по нужным параметрам и потом из нее создать и заполнить один документ.
9. Raideres 8 21.03.21 14:21 Сейчас в теме
ВОТ ЧТО ПОЛУЧИЛОСЬ МБ ПОДСКАЖИТЕ НА СЧЕТ ОПТИМИЗАЦИИ СКАЖЕМ ТАК

Процедура ОбъединитьДокументыНаСервере (ТабличныйДокумент) Экспорт
	
	Отказ = Ложь;
	
	Попытка
		УТ = ПодключитьсяКБазе(ИмяСервера, ИмяБазы, ПутьКБазе, Пользователь, Пароль);	
	Исключение
		Сообщить("База не открыта");
		Отказ = Истина;
	КонецПопытки;
	
	Если Отказ Тогда
		Возврат;
	КонецЕсли;    	
	
	ТЗПроверки = СписокДокументов.Выгрузить(,"Выбран,Контрагент,СсылкаБух");
	МассивСтрок = ТЗПроверки.НайтиСтроки(Новый Структура("Выбран", Ложь));
	Для Каждого ЭлементМассив Из МассивСтрок Цикл
		ТЗПроверки.Удалить(ЭлементМассив); //удаляем строки
	КонецЦикла;
	
	ТЗПроверки.Свернуть("Выбран,Контрагент,СсылкаБух");
	
	ДокументыДляПереноса = СписокДокументов.НайтиСтроки(Новый Структура("Выбран, Вид",Истина,"Реализация (акты, накладные)"));
	
	Если ТЗПроверки.Количество()= 1 Тогда
		Если не ЗначениеЗаполнено(ТЗПроверки[0].СсылкаБух) Тогда
			//////////////------------------------------------
			НаклБух = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
			РеализацияУТ = УТ.Документы.РеализацияТоваровУслуг.НайтиПоНомеру(ДокументыДляПереноса[0].Номер, ДокументыДляПереноса[0].Дата);
			//заполним шапку по первой РТУ 	
			Организация = ДокументыДляПереноса[0].Организация;		
			НаклБух.Дата 					= КонецДня(ТекущаяДата());
			НаклБух.ВалютаДокумента 		= Справочники.Валюты.НайтиПоКоду(РеализацияУТ.Валюта.Код);
			НаклБух.ВидОперации 			= Перечисления.ВидыОперацийРеализацияТоваров.ПродажаКомиссия;
			Отказ = Ложь;
			
			Если Не  ЗначениеЗаполнено(ДокументыДляПереноса[0].КонтрагентЗамена) Тогда
				НаклБух.Контрагент 				= НайтиКонтрагента(РеализацияУТ.Контрагент, РеализацияУТ, "Реализация (акты, накладные)", ПроблемныеКонтрагенты, Отказ);
			Иначе	
				НаклБух.Контрагент 				= ДокументыДляПереноса[0].КонтрагентЗамена;
			КонецЕсли; 
			
			
			
			Комментарий="";
			Для каждого стр Из ДокументыДляПереноса Цикл
				НаклБух.Комментарий = Комментарий +"н"+стр.Номер+"д"+стр.Дата+";" 
			КонецЦикла;               //"н"+1+"д"+2+";"
			
			НаклБух.Комментарий = Комментарий;
			
			НаклБух.КратностьВзаиморасчетов = 1;
			НаклБух.КурсВзаиморасчетов 		= 1;
			НаклБух.Склад 					= ЭтотОбъект.СкладПоУмолчанию;
			НаклБух.Организация				= Организация;
			НаклБух.Ответственный			= Ответственный;
			НаклБух.СуммаВключаетНДС		= РеализацияУТ.ЦенаВключаетНДС;
			НаклБух.СуммаДокумента			= РеализацияУТ.СуммаДокумента;
			НаклБух.СпособЗачетаАвансов		= Перечисления.СпособыЗачетаАвансов.Автоматически;
			НаклБух.ПодразделениеОрганизации = НайтиПодразделение(РеализацияУТ.Подразделение);
			
			Если НЕ РеализацияУТ.Договор.Наименование="" Тогда
				НаклБух.ДоговорКонтрагента		= НайтиДоговор(РеализацияУТ.Договор, НаклБух.Контрагент,УТ.XMLСтрока(РеализацияУТ.Договор.ТипДоговора), НаклБух.ВалютаДокумента, "Договор с покупателем");
			Иначе
				НаклБух.ДоговорКонтрагента		= НайтиДоговор(Неопределено, НаклБух.Контрагент, "СПокупателем", НаклБух.ВалютаДокумента, "Договор с покупателем");  			
			КонецЕсли;  	
			
			Документы.РеализацияТоваровУслуг.ЗаполнитьСчетаУчетаРасчетов(НаклБух);		
			
			
			//ЗАПОЛНЯЕМ ТЧ
			РеализацияУТ = "";
			Для каждого ДОК  Из ДокументыДляПереноса Цикл
				
				РеализацияУТ = УТ.Документы.РеализацияТоваровУслуг.НайтиПоНомеру(ДОК.Номер, ДОК.Дата); //НАШЛИ ДОКУМЕНТ В БАЗЕ УТ 				
				
				
				Если УТ.XMLСтрока(РеализацияУТ.Статус) = "Отгружено" Тогда
					ТоварыУТ = РеализацияУТ.ВидыЗапасов;
				Иначе
					ТоварыУТ = РеализацияУТ.Товары;
				КонецЕсли;	
				
				Для каждого Стр из ТоварыУТ Цикл
					
					АналитикаНоменклатуры = Стр.АналитикаУчетаНоменклатуры;
					
					// LS.AKU.26.03.2020 15:38:39 -> Обмен по расписанию в переносе УТ 11-БП 
					Услуга = ?(УТ.XMLСтрока(АналитикаНоменклатуры.Номенклатура.ТипНоменклатуры)="Услуга", Истина, Ложь);
					Если Услуга Тогда
						Продолжить;
					КонецЕсли;	
					//<-
					НовСтрока = НаклБух.Товары.Добавить();
					
					НовСтрока.Номенклатура = НайтиНоменклатуру(АналитикаНоменклатуры.Номенклатура);
					НовСтрока.Субконто			= НовСтрока.Номенклатура.НоменклатурнаяГруппа;
					НовСтрока.Количество 		= Стр.Количество;
					НовСтрока.Сумма 			= Стр.СуммаСНДС; 			
					// LS.AKU.10.08.2018 ->
					//НовСтрока.Цена 				= Стр.Цена;
					НовСтрока.Цена = ?(ЗначениеЗаполнено(Стр.Количество), Стр.СуммаСНДС/Стр.Количество, 0);
					//<-
					НовСтрока.СтавкаНДС = НайтиПеречисление(УТ.XMLСтрока(Стр.СтавкаНДС), "НДС");
					НовСтрока.СуммаНДС = Стр.СуммаНДС;
					НовСтрока.ЕдиницаИзмерения 	= НовСтрока.Номенклатура.ЕдиницаИзмерения;
					НовСтрока.Коэффициент 		= 1;
					Если УТ.XMLСтрока(РеализацияУТ.Статус) = "Отгружено" Тогда
						НовСтрока.НомерГТД = НайтиГТД(Стр.НомерГТД.Код);
						НовСтрока.СтранаПроисхождения = НайтиСтрану(Стр.НомерГТД.СтранаПроисхождения);
					КонецЕсли;	
					
					
				КонецЦикла;
				
				Документы.РеализацияТоваровУслуг.ЗаполнитьСчетаУчетаВТабличнойЧасти(НаклБух, "Товары");	
				// Услуги в отдельную ТЧ
				ТоварыУТ = РеализацияУТ.Товары;
				Для каждого Стр из ТоварыУТ Цикл
					
					АналитикаНоменклатуры = Стр.АналитикаУчетаНоменклатуры;
					
					Услуга = ?(УТ.XMLСтрока(АналитикаНоменклатуры.Номенклатура.ТипНоменклатуры)="Услуга", Истина, Ложь);
					Если НЕ Услуга Тогда
						Продолжить;
					КонецЕсли;	
					
					НовСтрока = НаклБух.Услуги.Добавить();
					
					НовСтрока.Номенклатура = НайтиНоменклатуру(АналитикаНоменклатуры.Номенклатура);
					НовСтрока.Субконто			= НовСтрока.Номенклатура.НоменклатурнаяГруппа;
					НовСтрока.Количество 		= Стр.Количество;
					НовСтрока.Сумма 			= Стр.СуммаСНДС; 			
					НовСтрока.Цена = ?(ЗначениеЗаполнено(Стр.Количество), Стр.СуммаСНДС/Стр.Количество, 0);
					НовСтрока.СтавкаНДС = НайтиПеречисление(УТ.XMLСтрока(Стр.СтавкаНДС), "НДС");
					НовСтрока.СуммаНДС = Стр.СуммаНДС;
					
				КонецЦикла;
				Документы.РеализацияТоваровУслуг.ЗаполнитьСчетаУчетаВТабличнойЧасти(НаклБух, "Услуги");	
				//<-
			КонецЦикла;	
			
			
			Попытка
				Если НЕ ПроводитьДокументы Тогда
					НаклБух.Записать(РежимЗаписиДокумента.Запись);
					Для каждого ДОКУТ Из ДокументыДляПереноса Цикл
						РеализацияУТ = УТ.Документы.РеализацияТоваровУслуг.НайтиПоНомеру(ДОКУТ.Номер, ДОКУТ.Дата); //НАШЛИ ДОКУМЕНТ В БАЗЕ УТ 				
						ЗаписатьУИД(НаклБух, УТ.XMLString(РеализацияУТ.УникальныйИдентификатор()));  
						//ОбъектУТРеализация = РеализацияУТ.GetObject();
						//ОбъектУТРеализация.АМ_ЗагруженВБухгалтерию = Истина;
						//ОбъектУТРеализация.Записать();
						
					КонецЦикла; 
					
				Иначе
					НаклБух.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
					Для каждого ДОКУТ Из ДокументыДляПереноса Цикл
						РеализацияУТ = УТ.Документы.РеализацияТоваровУслуг.НайтиПоНомеру(ДОКУТ.Номер, ДОКУТ.Дата); //НАШЛИ ДОКУМЕНТ В БАЗЕ УТ 				
						ЗаписатьУИД(НаклБух, УТ.XMLString(РеализацияУТ.УникальныйИдентификатор()));  
						//ОбъектУТРеализация = РеализацияУТ.GetObject();
						//ОбъектУТРеализация.АМ_ЗагруженВБухгалтерию = Истина;
						//ОбъектУТРеализация.Записать();	 
					КонецЦикла; 
					Сообщить("Создан документ РеализацияТоваровУслуг: """ + НаклБух.Номер + """ от: " + Формат(НаклБух.Дата, "ДЛФ=Д")); 								
					
					
				КонецЕсли;
			Исключение	
				НаклБух.Записать(РежимЗаписиДокумента.Запись);
				
				Для каждого ДОКУТ Из ДокументыДляПереноса Цикл
					РеализацияУТ = УТ.Документы.РеализацияТоваровУслуг.НайтиПоНомеру(ДОКУТ.Номер, ДОКУТ.Дата); //НАШЛИ ДОКУМЕНТ В БАЗЕ УТ 				
					ЗаписатьУИД(НаклБух, УТ.XMLString(РеализацияУТ.УникальныйИдентификатор()));  
					//ОбъектУТРеализация = РеализацияУТ.GetObject();
					//ОбъектУТРеализация.АМ_ЗагруженВБухгалтерию = Истина;
					//ОбъектУТРеализация.Записать();	 
				КонецЦикла; 
			КонецПопытки;
			
			
		Иначе
			Сообщить("Нельзя выбрать документ для которых уже есть сссылки в БП 3.0"); 
		КонецЕсли; 
		
		
	Иначе 
		Сообщить("Объединение документов возможно только по одному контрагенту.");
	КонецЕсли;
	
	СообщитьЗаписатьВЛог(" ");
	СообщитьЗаписатьВЛог("****** Перенос документов успешно завершен! ******");
	
	УТ = "";  
	
КонецПроцедуры
Показать
Оставьте свое сообщение

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