Помогите разобраться с КД, при выгрузке из 1 ТЧ в 2 ТЧ

1. SegaZX 13 21.05.25 08:55 Сейчас в теме
Здравствуйте.

Пробую сделать правила обмена, между БП.
В базе Источник есть документ "Отчет комитента", в котором есть одна общая табличная часть, в ней список товаров, которые продали, но разными отчетами о розничных продажах, т.е. разные даты. 18.05 продали два товара, и 21.05 продали один товар.

А в базе приемник документ "Отчет комиссионера", но в нем 2 табличные части.
в верхней ТЧ идет список этих дат, а в нижней ТЧ проданные товары, относящиеся к этой дате.

Я в правилах конвертации Объекта указал, что нужно преобразовать "ОтчетКомитентуОПродажах" в "ОтчетКомиссионераОпродажах", создал ПКГС "Товары", они заполняются ВСЕМИ товарами

так же создал вторую ПКГС "Покупатели", пока пробую просто хоть что то в ней заполнить.
Для этого сформировал запрос, где пока что выбрал просто дату.

в результате, естественно, загружается 2 строки с нужными датами, а в нижней табличной части загружается общий список товаров.

А как сделать, так чтобы загрузился не общий список товаров, а только относящийся к нужной дате, я не знаю.
Дело в том, что нижняя табличная часть она одна, но в ней появляются разные данные, когда щелкаешь по строкам верхней ТЧ, они как то связаны между собой.

А еще в верхней ТЧ есть поля "Всего" и "НДС", их нет в реквизитах, это я так понимаю реквизиты формы, их как то можно заполнить?

прошу подсказать, последовательность, где написать запрос, может я не там его пишу, в ПВД, или в ПКГС.
может кто сталкивался с подобной задачей? я не нашел похожих примеров.

заранее спасибо.
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. RustamZz 21.05.25 09:12 Сейчас в теме
(1) Должно быть поле - ключ строки.
3. SegaZX 13 21.05.25 09:25 Сейчас в теме
(1) я добавил в обе ПКГС КлючСтроки, а как их связать? ведь они явно должны не из источника заполняться, т.к. там одна табличная часть выгружается
4. RustamZz 21.05.25 09:34 Сейчас в теме
(3) 1, 2, 3. Или номер дня года. Всё в ваших руках.
5. SegaZX 13 21.05.25 09:37 Сейчас в теме
Я понял что есть у обоих ТЧ реквизит КлючСтроки, и его тоже можно при выгрузке заполнить, мне в целом не понятно в каком месте и в каком обработчике получать запросом данные и заполнить их в две ТЧ.
может это не в ПКГС делается, т.к. тут я могу писать код в обработчиках Конкретной ТЧ, а если у меня результат для двоих ТЧ, то может это ПВД?
6. SegaZX 13 21.05.25 09:39 Сейчас в теме
Если после загрузки я для верхней ТЧ задам КлючСтроки 0, и для нижней ТЧ задам для всех строк КлючСтроки 0, то они и будут относиться к верхней строке, не понятно, в каком месте это нужно получить запросом и как это заполнить
7. maks_20 170 21.05.25 10:00 Сейчас в теме
(6) Заполнять нужно в обработчике ПКО ПередВыгрузкой. Вот для примера код


         ТЗ = Источник.Товары;
        ТЗТовары = Новый ТаблицаЗначений;
	ТЗТовары.Колонки.Добавить("КлючСтроки");
	ТЗТовары.Колонки.Добавить("Номенклатура");
	ТЗТовары.Колонки.Добавить("Единица");
	ТЗТовары.Колонки.Добавить("Количество");
	ТЗТовары.Колонки.Добавить("Сумма");
	ТЗТовары.Колонки.Добавить("СуммаНДС");

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

	НомерСтрокиТЗПокупатели = 0;

	Для Каждого ТекСтрока Из ТЗ Цикл
		//Сообщить( "Обрабатываем строку результата запроса № " + ТЗ.Индекс(ТекСтрока) );
		
		// ищем в ТЗПокупатели строку с документом, если есть то получаем КлючСтрокиПокупателя и пишем его в ТЗТовары, если нет то создаем строку в ТЗПокупатели
		СтрокаТЗПокупатели = ТЗПокупатели.Найти(ТекСтрока.Ссылка, "Ссылка");
		Если СтрокаТЗПокупатели = Неопределено Тогда
			// добавляем строку в ТЗПокупатели
			НомерСтрокиТЗПокупатели = НомерСтрокиТЗПокупатели + 1; // КлючСтроки
			//Сообщить("Новая строка ТЗПокупатели: №" + НомерСтрокиТЗПокупатели + " для " + ТекСтрока.Ссылка);
			НоваяСтрокаТЗПокупатели = ТЗПокупатели.Добавить();
			НоваяСтрокаТЗПокупатели.Ссылка = ТекСтрока.Ссылка;
			//Проба найти номер СФ
			Построитель = ПолучитьПостроитель("ДокументСсылка.СчетФактураВыданный");
			НайтиДобавитьЭлементОтбора(Построитель, "Ссылка.ОбъектОснование", , , , ТекСтрока.Ссылка);
			НайтиДобавитьЭлементОтбора(Построитель, "Ссылка.ПометкаУдаления", , , , ЛОЖЬ);
			НайтиДобавитьЭлементОтбора(Построитель, "Ссылка.Проведен", , , , Истина);
			СчетФактура = ПолучитьОбъектИлиКоллекцию(Построитель);
			Если СчетФактура = Неопределено ИЛИ СчетФактура.Пустая() Тогда
				НомерСчетФактуры	= "";
			Иначе
				НомерСчетФактуры	= Прав(СчетФактура.Номер, 12);
			КонецЕсли;	
			НоваяСтрокаТЗПокупатели.НомерСФВУправленке = НомерСчетФактуры;			
			НоваяСтрокаТЗПокупатели.КлючСтрокиПокупатели = НомерСтрокиТЗПокупатели;
			НоваяСтрокаТЗПокупатели.ВыставленСФ = Ложь;
			НоваяСтрокаТЗПокупатели.ДатаСФ = ТекСтрока.Ссылка.Дата;
			НоваяСтрокаТЗПокупатели.Контрагент = ТекСтрока.Контрагент;
			КлючСтроки = НомерСтрокиТЗПокупатели;
		Иначе
			//Сообщить("Найдена строка ТЗПокупатели: №" + КлючСтроки + " для " + ТекСтрока.Ссылка);
			КлючСтроки = СтрокаТЗПокупатели.КлючСтрокиПокупатели;
		КонецЕсли;
		
		НоваяСтрокаТЗТовары = ТЗТовары.Добавить();
		НоваяСтрокаТЗТовары.КлючСтроки = КлючСтроки;
		НоваяСтрокаТЗТовары.Номенклатура = ТекСтрока.Номенклатура;
		НоваяСтрокаТЗТовары.Единица = ТекСтрока.ЕдиницаПоКлассификатору;
		НоваяСтрокаТЗТовары.Количество = ТекСтрока.КоличествоУЧ;
		НоваяСтрокаТЗТовары.Сумма = ТекСтрока.СуммаУЧ;
		НоваяСтрокаТЗТовары.СуммаНДС = ТекСтрока.СуммаНДС;
		//Сообщить("ТЗТовары -> Номенклатура: " + ТекСтрока.Номенклатура + " Ссылка: " + ТекСтрока.Ссылка);
		
	КонецЦикла;

ВходящиеДанные	= Новый Структура;

ВходящиеДанные.Вставить("Номер",НомерДок);
ВходящиеДанные.Вставить("Товары", ТЗТовары);
Показать


В самом ПКО для таб частей ставите получение из входящих данных.

p.s. пример старый и не очень оптимальный, но сама идея там понятна.
8. SegaZX 13 21.05.25 10:48 Сейчас в теме
(7) В ПКО нет события "ПередОбработкой", может другое событие?
и подскажите пожалуйста, у вас в коде перебирается ТЗ и на основе ее заполняются другие 2 ТЗ
написано:
Для Каждого ТекСтрока Из ТЗ Цикл - а какие данные содержатся в ТЗ и как их получить?
10. maks_20 170 21.05.25 13:07 Сейчас в теме
(8) в обработчике ПКО ПередВыгрузкой. ТЗ = Источник.Товары; это таб часть документа. я уже не помню, что это за конфигурации были
9. SegaZX 13 21.05.25 11:06 Сейчас в теме
Подскажите как можно в ПВД в обработчике "ПередОбработкой" установить параметр для запроса.
я получаю запросом данные, затем хочу их поместить в ТЗ. Условие на ссылку по документу можно как то задать?
11. maks_20 170 21.05.25 13:10 Сейчас в теме
(9) если в ПередВыгрузкой то Источник.Ссылка. В предыдущем комментарии поправил название обработчика.В ПВД точно не помню, но по-моему там придется в таком случае самостоятельно выборку формировать.
12. SegaZX 13 21.05.25 14:19 Сейчас в теме
Решил делать через ПВД, потихоньку по очереди заполняя все реквизиты.
Запросом получаю различные результаты и затем заполняю.

Первый запрос - данные для самого документа, пока это (Дата, ВидОперации, СуммаДокумента) - все хорошо
Второй запрос - данные для верхней ТЧ, сгруппированные по датам и имеющие КлючСтроки - тоже все хорошо
Третий запрос - получаю данные для нижней ТЧ, по товарам, но почему то выходит ошибка.


//добавление загружаемых реквизитов
ВыборкаДанных = Новый ТаблицаЗначений();   
ВыборкаДанных.Колонки.Добавить("Ссылка"); 
ВыборкаДанных.Колонки.Добавить("Дата"); 
ВыборкаДанных.Колонки.Добавить("ВидОперации"); 
ВыборкаДанных.Колонки.Добавить("ПометкаУдаления");
ВыборкаДанных.Колонки.Добавить("ВалютаДокумента");
ВыборкаДанных.Колонки.Добавить("Контрагент");  
ВыборкаДанных.Колонки.Добавить("Организация");  
ВыборкаДанных.Колонки.Добавить("КратностьВзаиморасчетов");
ВыборкаДанных.Колонки.Добавить("КурсВзаиморасчетов");
ВыборкаДанных.Колонки.Добавить("СуммаДокумента"); 
ВыборкаДанных.Колонки.Добавить("СчетУчетаРасчетовСКонтрагентом"); 
ВыборкаДанных.Колонки.Добавить("СчетУчетаРасчетовЗаПосредническиеУслуги"); 
ВыборкаДанных.Колонки.Добавить("СчетУчетаРасчетовПоАвансамВыданным");  
ВыборкаДанных.Колонки.Добавить("СчетУчетаРасчетовПоАвансамПолученным"); 
ВыборкаДанных.Колонки.Добавить("СчетУчетаНДС");  
ВыборкаДанных.Колонки.Добавить("СпособЗачетаАвансов");  
ВыборкаДанных.Колонки.Добавить("СчетУчетаЗатрат"); 
ВыборкаДанных.Колонки.Добавить("СпособРасчетаКомиссионногоВознаграждения"); 
ВыборкаДанных.Колонки.Добавить("ДатаВходящегоДокумента"); 
ВыборкаДанных.Колонки.Добавить("НомерВходящегоДокумента");

ВыборкаДанных.Колонки.Добавить("Покупатели"); //добавляем верхнюю ТЧ
ВыборкаДанных.Колонки.Добавить("Товары"); // Добавляем нижнюю ТЧ


Запрос = Новый Запрос;
Запрос.Текст =

//данные самого документа
"ВЫБРАТЬ
|	ОтчетКомитентуОПродажахТовары.Ссылка КАК Ссылка,
|	ОтчетКомитентуОПродажахТовары.Ссылка.Дата КАК Дата,
|	ОтчетКомитентуОПродажахТовары.Ссылка.ВидОперации КАК ВидОперации,
|	ОтчетКомитентуОПродажахТовары.Ссылка.СуммаДокумента КАК СуммаДокумента
|ИЗ
|	Документ.ОтчетКомитентуОПродажах.Товары КАК ОтчетКомитентуОПродажахТовары
|;

|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|	ОтчетКомитентуОПродажахТовары.Ссылка.Организация КАК Организация,
|	ОтчетКомитентуОПродажахТовары.ДатаРеализации КАК ДатаРеализации,
|	АВТОНОМЕРЗАПИСИ() КАК Номер
|ПОМЕСТИТЬ втСгруппированныеДаты
|ИЗ
|	Документ.ОтчетКомитентуОПродажах.Товары КАК ОтчетКомитентуОПродажахТовары

|СГРУППИРОВАТЬ ПО
|	ОтчетКомитентуОПродажахТовары.ДатаРеализации,
|	ОтчетКомитентуОПродажахТовары.Ссылка.Организация
|;
Показать


//второй запрос для заполнения верхней ТЧ
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|	втСгруппированныеДаты.Организация КАК Покупатель,
|	втСгруппированныеДаты.ДатаРеализации КАК ДатаСф,
|	втСгруппированныеДаты.Номер - 1 КАК КлючСтроки,
|	ОтчетКомитентуОПродажахТовары.Номенклатура КАК Номенклатура,
|	ОтчетКомитентуОПродажахТовары.Количество КАК Количество,
|	ОтчетКомитентуОПродажахТовары.Сумма КАК Сумма,
|	ОтчетКомитентуОПродажахТовары.ДатаРеализации КАК ДатаРеализации
|ИЗ
|	Документ.ОтчетКомитентуОПродажах.Товары КАК ОтчетКомитентуОПродажахТовары
|		ЛЕВОЕ СОЕДИНЕНИЕ втСгруппированныеДаты КАК втСгруппированныеДаты
|		ПО ОтчетКомитентуОПродажахТовары.ДатаРеализации = втСгруппированныеДаты.ДатаРеализации

|УПОРЯДОЧИТЬ ПО
|	ДатаРеализации
|ИТОГИ
|	МИНИМУМ(Покупатель),
|	МИНИМУМ(КлючСтроки)
|ПО
|	ДатаРеализации
|;

//третий запрос для заполнения нижней ТЧ
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|	втСгруппированныеДаты.Организация КАК Покупатель,
|	втСгруппированныеДаты.ДатаРеализации КАК ДатаСф,
|	втСгруппированныеДаты.Номер - 1 КАК КлючСтроки,
|	ОтчетКомитентуОПродажахТовары.Номенклатура КАК Номенклатура,
|	ОтчетКомитентуОПродажахТовары.Количество КАК Количество,
|	ОтчетКомитентуОПродажахТовары.Сумма КАК Сумма,
|	ОтчетКомитентуОПродажахТовары.ДатаРеализации КАК ДатаРеализации
|ИЗ
|	Документ.ОтчетКомитентуОПродажах.Товары КАК ОтчетКомитентуОПродажахТовары
|		ЛЕВОЕ СОЕДИНЕНИЕ втСгруппированныеДаты КАК втСгруппированныеДаты
|		ПО (ОтчетКомитентуОПродажахТовары.ДатаРеализации = втСгруппированныеДаты.ДатаРеализации)

|УПОРЯДОЧИТЬ ПО
|	ДатаРеализации";


РезультатыЗапросов = Запрос.ВыполнитьПакет();
РезультатДокументы = РезультатыЗапросов[0];

ВыборкаДокументы = РезультатДокументы.Выбрать();

Пока ВыборкаДокументы.Следующий() Цикл
	СтрокаДокумент = ВыборкаДанных.Добавить();
	СтрокаДокумент.Дата = ВыборкаДокументы.Дата;
	СтрокаДокумент.Ссылка = ВыборкаДокументы.Ссылка;
	СтрокаДокумент.СуммаДокумента = ВыборкаДокументы.СуммаДокумента;
	СтрокаДокумент.ВидОперации = ВыборкаДокументы.ВидОперации;
	
	//Верхняя ТЧ
	СтрокаДокумент.Покупатели = Новый ТаблицаЗначений;
	СтрокаДокумент.Покупатели.Колонки.Добавить("Покупатель");
	СтрокаДокумент.Покупатели.Колонки.Добавить("ДатаСф");
	СтрокаДокумент.Покупатели.Колонки.Добавить("КлючСтроки");
	
	РезультатРеализация = РезультатыЗапросов[2];
	ВыборкаРеализация = РезультатРеализация.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	
	Пока ВыборкаРеализация.Следующий() Цикл
		СтрокаРеализация = СтрокаДокумент.Покупатели.Добавить();
		СтрокаРеализация.Покупатель = ВыборкаРеализация.Покупатель; 
		СтрокаРеализация.ДатаСф = ВыборкаРеализация.ДатаРеализации;
		СтрокаРеализация.КлючСтроки = ВыборкаРеализация.КлючСтроки; 
	КонецЦикла;

	
	//Нижняя ТЧ
	СтрокаДокумент.Товары = Новый ТаблицаЗначений;
	СтрокаДокумент.Товары.Колонки.Добавить("Номенклатура");
	СтрокаДокумент.Товары.Колонки.Добавить("КлючСтроки");
	
	РезультатТовар = РезультатыЗапросов[3]; 
	
	ВыборкаТовары = РезультатТовар.Выбрать();
	Пока ВыборкаТовары.Следующий() Цикл 
		Сообщить(ВыборкаТовары.Номенклатура);
	//	СтрокаТовар = СтрокаДокумент.Товары.Добавить();
	//	СтрокаТовар.Номенклатура = ВыборкаТовары.Номенклатура;
	//	СтрокаТовар.КлючСтроки = ВыборкаТовары.КлючСтроки;
	КонецЦикла;

КонецЦикла;
Показать




на скринах виден результат запросов в консоли. Последний результат, там всего 5 строк.
подскажите пжст. очень застрял тут
Прикрепленные файлы:
13. SegaZX 13 21.05.25 14:31 Сейчас в теме
Изначально я попробовал делать обходи результата по итоговым записям (их 3, т.к. 3 даты) и заполнял верхнюю ТЧ, а внутри цикла делал выборку по детальным записям и уже заполнял нижнюю ТЧ (по товарам), в результате ошибок не было, но заполнились в верхней ТЧ 3 строки, а в нижней ТЧ заполнился один товар, относящийся к последней строке верхней табличной части.

такое ощущение, что на каждой итерации по итоговой записи таблица затирается и создается новая, хотя ТЧ то одна. т.е. данное решение тоже не верно



	//Верхняя ТЧ
	СтрокаДокумент.Покупатели = Новый ТаблицаЗначений;
	СтрокаДокумент.Покупатели.Колонки.Добавить("Покупатель");
	СтрокаДокумент.Покупатели.Колонки.Добавить("ДатаСф");
	СтрокаДокумент.Покупатели.Колонки.Добавить("КлючСтроки");
	
	РезультатРеализация = РезультатыЗапросов[2];
	ВыборкаРеализация = РезультатРеализация.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	
	Пока ВыборкаРеализация.Следующий() Цикл
		СтрокаРеализация = СтрокаДокумент.Покупатели.Добавить();
		СтрокаРеализация.Покупатель = ВыборкаРеализация.Покупатель; 
		СтрокаРеализация.ДатаСф = ВыборкаРеализация.ДатаРеализации;
		СтрокаРеализация.КлючСтроки = ВыборкаРеализация.КлючСтроки; 
		
		//Нижняя ТЧ
		СтрокаДокумент.Товары = Новый ТаблицаЗначений;
		СтрокаДокумент.Товары.Колонки.Добавить("Номенклатура");
		СтрокаДокумент.Товары.Колонки.Добавить("КлючСтроки");
		
		ВыборкаТовары = ВыборкаРеализация.Выбрать();
		Пока ВыборкаТовары.Следующий() Цикл
			СтрокаТовар = СтрокаДокумент.Товары.Добавить();
			СтрокаТовар.Номенклатура = ВыборкаТовары.Номенклатура;
			СтрокаТовар.КлючСтроки = ВыборкаТовары.КлючСтроки;
		КонецЦикла;
	КонецЦикла;
Показать
14. SegaZX 13 21.05.25 14:37 Сейчас в теме
УРА, получилось )) Нужно было создать ТЗ для нижней ТЧ не в цикле, а заполнять ее наоборот внутри цикла.
Прикрепленные файлы:
15. SegaZX 13 21.05.25 14:41 Сейчас в теме
Подскажите пожалуйста еще один момент, как можно заполнить данные реквизиты? если их нет в структуре метаданных, это не реквизиты объекта.
Прикрепленные файлы:
16. RustamZz 21.05.25 15:26 Сейчас в теме
(15) Заполнишь в нижней - увидишь в верхней.
17. SegaZX 13 21.05.25 16:37 Сейчас в теме
(16) так и есть, спасибо.
задача решена
Оставьте свое сообщение

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