0. lopatin 468 25.09.15 21:12 Сейчас в теме

Функция ВыгрузитьПоПравилу - мощный инструмент расширения возможностей ваших правил конвертации. Конвертация данных 2.1

Казалось бы, всего лишь одна функция из арсенала разработчика правил обмена на Конвертации данных 2.1, но понимание этой функции расширяет ваши возможности при написании качественных правил обмена в несколько раз. Да, что там писать эти правила? Сопоставил реквизиты, сопоставил табличные части, да еще помощник автоматически создаст необходимые ПКО, ПКС, ПВД. А как быть, когда нужно передать Регистр сведений в регистр сведений, да не просто передать, а привязать это действие к выгрузке определенных элементов, например, элементов справочника Физические лица? Или как передать табличную часть справочника в документы, да так, чтобы одна строка табличной части создавала ровно один документ на стороне приемника? А как быть, если невозможно сделать соответствия между объектами и данные для приемника необходимо собирать из разных источников? Именно для подобных задач вам может понадобиться функция ВыгрузитьПоПравилу.

Здесь, я расскажу вам о тех ситуациях, в которых мне понадобилась эта функция, и как она меня не раз выручила. Все свое повествование я сопровожу реальными примерами, которые реализовывались мной в одном из проектов.

Перейти к публикации

Комментарии
Избранное Подписка Сортировка: Древо
1. TarasovAV 11.11.15 10:28 Сейчас в теме
Статья хорошая. Есть замечание по поводу 2 примера.

По поводу переноса контактной информации физ. лиц (и вообще связанной информации), на мой взгляд, лучше делать так (пример для переноса КИ физ. лиц):
1. В процедуре конвертации "После загрузки правил обмена" определить параметр "ТаблицаФизЛиц" типа таблица значений с колонкой "Объект".
2. В процедуре ПКО справочника физ. лиц "После выгрузки" заполняем таблицу из пункта 1: если физ лицо присутствует в таблице - ничего не делаем, иначе добавляем.
3. В процедуре конвертации "После выгрузки данных" формируем запрос по РС "КонтактнаяИнформация" с отбором по массиву объектов из параметра "ТаблицаФизЛиц". После этого применяем функцию "ВыгрузитьПоПравилу" или "ВыгрузитьРегистр" для каждой строки результата запроса.

В данном случае имеем всего лишь 1 запрос к БД, в вашем же случае имеем столько обращений к БД за контактной информацией, сколько раз выгружаются объекты с типом "Физические лица", плюс к этому в вашем случае одна и та же информация по контактной информации может быть выгружена несколько раз (если одно и тоже физ. лицо выгружается несколько раз), что ведет к увеличению файла обмена.
for_sale; sbcode; alest; lopatin; +4 Ответить
2. lopatin 468 11.11.15 10:44 Сейчас в теме
(1) TarasovAV, Согласен. Логичнее было бы сначала всех отобрать, а потом выгружать одним запросом. Как-то упустил этот нюанс)))
4. alest 11.11.15 12:49 Сейчас в теме
(1) TarasovAV,
Делал немного по-другому- в ПВД ФЛ, т.к. регистрация ФЛ производилась и они выгружались по своему ПВД, а не по ссылке.
- ПВД.ПослеВыгрузки собирал ТЗ физлиц
- ПВД.ПослеОбработки делал запрос по этой ТЗ и выгружал паспортные данные и проч.

Но ваш вариант более универсален.
3. Region102 33 11.11.15 12:31 Сейчас в теме
КД интересна тем, что для решения задачи можно выбрать разные решения, в принципе каждый из ваших примеров можно сделать по другому, и каждый из этих способов будет правильным, но все таки хотелось бы избегать запросы в циклах как в вашем решении.
5. Zhilyakovdr 92 12.11.15 10:48 Сейчас в теме
Хорошая статья, однозначно плюс.
6. for_sale 720 25.11.15 18:23 Сейчас в теме
Очень интересная статья, спасибо!

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

Проблема в том, что все описанные в статье приёмы работают на стороне источника, а у меня все эти условия проверяются в приёмнике, где уже нет ВыгрузитьПоПравилу() или ЗагрузитьПоПравилу()

Знает кто-нибудь, как победить эту проблему?
7. lopatin 468 25.11.15 19:16 Сейчас в теме
(6) for_sale, Если в регистре только элемент справочника является ссылочным или если другие ссылочные измерения и реквизиты Регистра по определению должны уже существовать в базе приемнике можно попробовать отключить перенос по ссылка, если объекты не находятся:
Вкладка ПКО Настройки - Не выгружать объекты свойств источника по ссылкам.. и посмотреть какие ошибки выдаст обмен, когда у регистра не будет заполнено измерение

Какие вы условия проверяете, что они должны быть обязательно проверяться на стороне приемника? Может как-то перестроить эти условия, чтобы они проверялись на стороне Источника и не закачивать в файл вообще элементы?
8. Yuri1C 2 05.12.15 09:04 Сейчас в теме
Очень интересная и главное полезная статья.
Есть несколько вопросов:
1. ДокументыЗакреплениеЗаКафедрой = Неопределено;

Далее идет цикл по ДокументыЗакреплениеЗаКафедрой. Но оно же "Неопределено"?

2. можно увидеть текст алгоритма Алгоритмы.ПереводТаблицыЗначенийВМассивЗакреплениеЗаКафедрой ?
Спасибо!

//Переводим отобранные данные из Таблицы значений в Массив структур для дальнейшей передачи в ПКО
ДокументыЗакреплениеЗаКафедрой = Неопределено;
Выполнить(Алгоритмы.ПереводТаблицыЗначенийВМассивЗакреплениеЗаКафедрой);

//Обходим отобранные данные и выгружаем с помощью функции ВыгрузитьПоПравилу
Для каждого Документ Из ДокументыЗакреплениеЗаКафедрой Цикл
ВыгрузитьПоПравилу(,,Документ,,"ЗакреплениеЗаКафедройИзВходящихДанных");
КонецЦикла;
//Отменяем стандартную выгрузку объекта
9. lopatin 468 05.12.15 13:25 Сейчас в теме
(8) Yuri1C, ДокументыЗакреплениеЗаКафедрой, как раз в Алгоритме Перевода из ТЗ в Массив и заполняется.

В том алгоритме каждая строка ТЗ переводится в структуру с соответствующими ключевыми полями, и добавляется в массив, т.е. вместо ТЗ получается массив структур.

Сейчас этих правил нет под рукой.
10. Yuri1C 2 08.12.15 16:28 Сейчас в теме

Подскажите, пожалуйста!
в первом пункте: Выгрузка произвольной выборки данных через стандартную выборку с регистрацией объекта источника.
Все получилось. один вопрос. На последней картинке перед вторым пунктом "Выгрузка Регистр сведений -> Регистр сведений с зависимостью от переноса другого объекта." показано, но непонятно как сделать. Нужно загрузить данные именно в табличную часть, какой там код?
11. spa07 14.01.16 17:03 Сейчас в теме
Добрый день!
Подскажите пож-та как получить значение выгруженное с помощью этой функции?
Выгружаю т.ч. документа и в ней собираю справочник (объекта такого нет):
ТаблЧастьТовары.НоваяСтрока();
				ТаблЧастьТовары.Коэффициент = Объект.Коэффициент;

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

объект выгружается в справочник успешно и вот теперь нужно получить и записать ссылку:
ТаблЧастьТовары.ЕдиницаИзмерения = УзелСсылки;
!!! но так не работает!
12. slawanix 12 19.01.16 20:20 Сейчас в теме
Я правильно понимаю, что в данных примерах, при использовании функции "ВыгрузитьПоПравилу()" как бы можно вообще не использовать ПВД? Ведь мы и так указываем что и по какому ПКО выгрузить. Так?
13. lopatin 468 20.01.16 11:58 Сейчас в теме
(12) slawanix, Для тех данных которые выгружаются с помощью этой функции ПВД, не то чтобы можно не использовать, его не нужно использовать. Потому что все данные будут выгружены через функцию, а через ПВД пойдут грузиться все зарегистрированные к выгрузке данные, т.е. могут выгрузиться лишние данные, не предусмотренные алгоритмом, который подразумевает использование функции ВыгрузитьПоПравилу().
14. slawanix 12 20.01.16 15:36 Сейчас в теме
(13) ок. Спасибо. И у меня возник еще вот такой вопрос, сейчас решаю свою задачу методами, взятыми на вооружение из статьи и нужно мне динамически добавить свой параметр типа ТЗ и заполнить его в обработчиках ПВД или ПКО, не важно. Делаю как в статье :
Параметры.Вставить("СписокФизическихЛиц", Новый ТаблицаЗначений());
Параметры.СписокФизическихЛиц.Колонки.Добавить("ФизическоеЛицо");

Но за одним исключением: мне нужно чтобы этот параметр был доступен для чтения в обработчике "После загрузки данных" конвертации. То есть как будто я создал параметр в форме конвертации на закладке "Параметры" и поставил ему галку При загрузке. Как это можно сделать? Мне нужны эти параметры уже для их использования на стороне приемника.
Добавлю, что параметр создается нормально и заполняется тоже как надо. Но прочитать его после загрузки данных в приемник я не могу. Не доступен.
15. Kesak 9 11.04.16 09:55 Сейчас в теме
Выгрузка Табличная часть -> Регистр сведений.
а можно увидеть ПКО "УченыеСтепениФизическихЛиц". Какой тип источника? Если не указывать тип источника и в ПКО структуру конвертировать в РС, то получаем следующую ошибку:
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(9676)}: Ошибка в обработчике события ПередОбработкойВыгрузки группы свойств
    ПКО                    =  ГруппыПользователей  (Пользователи -> Группы пользователей)
    ПКГС                   =  4  (--> Состав)
    Объект                 =  ОТР  (Справочник объект: Пользователи)
    Обработчик             =  ПередОбработкойВыгрузкиГруппыСвойств
    ОписаниеОшибки         =  Поле объекта не обнаружено (Ссылка)
    ПозицияМодуля          =  Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(11286)
    КСообщенияОбОшибках    =  48
    ВызватьИсключение СтрокаСообщенияОбОшибке;
Показать
если имеем источник с пустым типом, то механизм в модуле объекта "КонвертацияОбъектовИнформационныхБаз" думает, что выгружается ссылочный объект. Можно ли обойти данную проблему без правки кода БСП?
e-9; rakhimov9; +2 Ответить
17. v.gonchar 09.12.16 13:28 Сейчас в теме
(15)
Столкнулся с аналогичной проблемой, решил путём добавления колонки с именем "Ссылка" в строки набора записей.
Рабочий пример для обработчика ПКО "После выгрузки в файл"

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

Запрос.УстановитьПараметр("Ссылка", Источник.Ссылка);

Выборка = Запрос.Выполнить().Выбрать();

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

КонецЦикла;
Показать
16. ut2k5 13 15.07.16 12:47 Сейчас в теме
а у меня ругается, не находит функцию "ВыгрузитьРегистр"
18. ghost1987 02.06.17 09:34 Сейчас в теме
Добрый день, подскажите как можно сделать следующее: в источнике получаем запросом таблицу проводок (запросом), а в приемнике ее необходимо загрузить в документ Операция (бухгалтерия)??? поможет ли сделать ВыгрузитьПоПравилу???
19. user801808 23.08.17 13:29 Сейчас в теме
Спасибо, статья прям направила на путь истинный!
Хотелось бы еще аналогичную со стороны загрузки, какие преобразования и как выполняются. Потому что иногда в источнике есть данные, а в приемник их нужно преобразовать. Значение реквизита справочника, например, в строковое значение.
20. yegorovnv 02.09.17 17:56 Сейчас в теме
Спасибо за труд. Почерпнул для себя полезное. Поставлю +
21. Coole 12.11.17 05:44 Сейчас в теме
Ошибка в обработчике события ПослеВыгрузкиДанных (конвертация)
Обработчик = ПослеВыгрузкиДанных (конвертация)
ОписаниеОшибки = Ошибка компиляции при вычислении выражения или выполнении фрагмента кода: {(1,9)}: Переменная не определена (Источник)
ПозицияМодуля = Обработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(12962)
КодСообщения = 63
Сначала сделала как в статье. Работает, но очень долго.
Сделала с учетом апдейт, ошибка выше, что я сделала не так(?
22. lopatin 468 13.11.17 15:28 Сейчас в теме
(21)Очень похоже на то, что в том обработчике каком вы пишите код, нет переменной Источник
23. Coole 13.11.17 16:00 Сейчас в теме
(22) да с этим разобралась.
теперь дургая тема, как значение Организации передать в приемник
https://forum.infostart.ru/forum15/topic181146/#message1880539
если можете, помогите)))
24. e-9 28.12.17 12:48 Сейчас в теме
Очень не хватает для последнего примера (табчасть => регистр сведений) скрина с ПКС для ПКО "УченыеСтепениФизическихЛиц".
Я выгружаю данные из табчасти документа, приемник регистр сведений (независимый, непериодический) - и никак не могу победить (см. скрин)...

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

МассивСсылок = Параметры.ТЗДокументов.ВыгрузитьКолонку("Ссылка");
Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок);

Выборка = Запрос.Выполнить().Выбрать();

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

	ВыгрузитьРегистр(НаборЗаписей,,,Истина,"ЮИ_СырьеМолокоДляAITS");

КонецЦикла;
Показать
Прикрепленные файлы:
26. e-9 29.12.17 11:37 Сейчас в теме
(24) ...сам себе же и отвечу: видимо, у автора (и тех, у кого "все получилось") совсем другая "кухня" КД, в которой все "варится" - т.е., та самая встроенная универсальная обработка, которая осуществляет функциональность конвертации. У меня это ОбменДаннымиXML.

Так вот, при раскуривании процедуры ВыгрузитьРегистр стало ясно, что никакую структуру("Отбор, Строки") она не поймет. Только НаборЗаписей регистра:
	Для Каждого СтрокаРегистра Из НаборЗаписейДляВыгрузки Цикл
		
		ВыгрузкаОбъектаВыборки(СтрокаРегистра, ПравилоВыгрузкиДанных, , ВходящиеДанные, НеВыгружатьОбъектыПоСсылкам, Истина, 
			Приемник, , ИмяПКО, ЛОЖЬ);
				
	КонецЦикла;


Т.е., в этой версии "кухни", эта функция годиться ТОЛЬКО для переноса регистра в регистр. И без доработки (неизвестно заранее, насколько глубокой - например, после того как я изменил выше на НаборЗаписейДляВыгрузки.СТРОКИ - полезли новые ошибки) не "взлетит".

П.С. Тут, кстати, пример, который ответил на мой следующий вопрос про "гранулярность" применения этой функции:
http://www.forum.mista.ru/topic.php?id=803805
Все-таки автор не вполне корректно применил функцию ВыгрузитьРегистр.

П.П.С.
А вот тут почерпнул для себя рабочую, в итоге, идею, как перенести таб.часть в регистр сведений:
http://novichok1c.ru/vygruzka-dannyh-iz-tablichnoy-chasti-dokumenta-ili-spravochnika-v-nezavisimyy-registr-svedeniy

Правда, там не учтен (или не раскрыт) один важный нЬюанс: при УДАЛЕНИИ записи табчасти в источнике, это удаление никак не отразится в приемнике - там запись останется!! Надо что-то мутить в правилах на стороне приемника...Вот над этим сейчас работаю - если добью, постараюсь поделиться.
27. e-9 29.12.17 13:07 Сейчас в теме
(26) договорю сам с собой)
Итак, сделал успешно выгрузку из табчасти документа в РС, как в последней ссылке выше; теперь цель: перезаписывать при обмене наборы записей по "объекту" (в моем случае роль "объекта" играет строковое поле GUIN), чтобы не только добавлялись новые, но и очищались удаленные записи.

1. В обработчике КОНВЕРТАЦИИ "Перед загрузкой данных" инициируем глобальную ТЗ с полями, как у регистра-приемника (ОБЯЗАТЕЛЬНО явно типизируем поля):
Параметры.Вставить("ТЗЗаписей", Новый ТаблицаЗначений()); 
Параметры.ТЗЗаписей.Колонки.Добавить("GUIN", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(36));
Параметры.ТЗЗаписей.Колонки.Добавить("Отправитель", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(200));
Параметры.ТЗЗаписей.Колонки.Добавить("НомерВходящегоДокумента", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(12));
Параметры.ТЗЗаписей.Колонки.Добавить("ПунктПогрузки", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(200));
Параметры.ТЗЗаписей.Колонки.Добавить("ПунктРазгрузки", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(200));
Параметры.ТЗЗаписей.Колонки.Добавить("Номенклатура", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(200));
Параметры.ТЗЗаписей.Колонки.Добавить("ДатаПартии", ОбщегоНазначения.ПолучитьОписаниеТиповДаты(ЧастиДаты.Дата));
Параметры.ТЗЗаписей.Колонки.Добавить("НомерПартии", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(12));
Параметры.ТЗЗаписей.Колонки.Добавить("НомерСтрокиДокумента", ОбщегоНазначения.ПолучитьОписаниеТиповЧисла(10));
Параметры.ТЗЗаписей.Колонки.Добавить("Белок", ОбщегоНазначения.ПолучитьОписаниеТиповЧисла(5,2));
Параметры.ТЗЗаписей.Колонки.Добавить("Жирность", ОбщегоНазначения.ПолучитьОписаниеТиповЧисла(5,2));
Параметры.ТЗЗаписей.Колонки.Добавить("Кислотность", ОбщегоНазначения.ПолучитьОписаниеТиповЧисла(15,3));
Параметры.ТЗЗаписей.Колонки.Добавить("Плотность", ОбщегоНазначения.ПолучитьОписаниеТиповЧисла(15,3));
Параметры.ТЗЗаписей.Колонки.Добавить("Редуктаза", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(25));
Параметры.ТЗЗаписей.Колонки.Добавить("Сорт", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(10));
Параметры.ТЗЗаписей.Колонки.Добавить("Температура", ОбщегоНазначения.ПолучитьОписаниеТиповЧисла(3,1));
Параметры.ТЗЗаписей.Колонки.Добавить("ГруппаЧистоты", ОбщегоНазначения.ПолучитьОписаниеТиповЧисла(1));
Параметры.ТЗЗаписей.Колонки.Добавить("Активность", Новый ОписаниеТипов("Булево"));
Показать


2. В обработчике КОНВЕРТАЦИИ (хотя можно и в аналогичном ПКО) "После загрузки объекта" добавляем строчку в ТЗ, заполняем ее из объекта - и отказываемся от записи объекта:
Если объект <> Неопределено Тогда //Неопределено прилетает из "костыльного" ПКО, который называется "НеВажно"
	ЗаполнитьЗначенияСвойств(Параметры.ТЗЗаписей.Добавить(),Объект);
КонецЕсли;	
Отказ = Истина;


3. В обработчике КОНВЕРТАЦИИ "После загрузки данных" делаем всю работу:
Запрос = Новый Запрос;
Запрос.Текст = 
	"ВЫБРАТЬ
	|	ТЗЗаписей.*
	|ПОМЕСТИТЬ Записи
	|ИЗ
	|	&ТЗЗаписей КАК ТЗЗаписей
	|;
	|ВЫБРАТЬ
	|	Записи.*
	|ИЗ
	|	Записи КАК Записи
	|ИТОГИ ПО GUIN
	|";

Запрос.УстановитьПараметр("ТЗЗаписей", Параметры.ТЗЗаписей);

Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока Выборка.Следующий() Цикл
	
	НаборЗаписей = РегистрыСведений.ЮИ_СырьеМолокоДляAITS.СоздатьНаборЗаписей();
	НаборЗаписей.Отбор.GUIN.Установить(Выборка.GUIN);
	НаборЗаписей.Записать();

	ВыборкаДетали = Выборка.Выбрать();
	Пока ВыборкаДетали.Следующий() Цикл
		Строка = НаборЗаписей.Добавить();
		ЗаполнитьЗначенияСвойств(Строка, ВыборкаДетали);
	КонецЦикла;    

	НаборЗаписей.Записать();
	
КонецЦикла;
Показать


...It works!!!..
25. e-9 28.12.17 15:15 Сейчас в теме
...И еще, вопрос ко всем кто "втыкнул" в эту тему: почему у автора "гранула обмена" (набор записей) для ВыгрузитьРегистр - это каждая ученая степень??? (последний пример)
Ведь отбор установили на уровне физ. лица!
...
 СтрокаОтбора.Имя = "ФизическоеЛицо";
 СтрокаОтбора.Значение = Выборка.Ссылка;

...
Не правильнее ли было в запрос добавить итоги по физ-лицу, и сделать обход двумя вложенными циклами, "отправляя" набор записей в ВыгрузитьРегистр во внешнем цикле (по физ. лицу), а не каждую ученую степень...
28. muzzombie 19.12.18 16:41 Сейчас в теме
Здравствуйте! Пожалуйста, помогите!
В "После загрузки правил обмена" написал:

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


В "После выгрузки" у справочника "Сотрудники" написал:
НайденнаяСтрока = Параметры.СписокСотрудников.Найти(Источник);
Если НайденнаяСтрока = Неопределено Тогда
    ЗапросВидаЗанятости = Новый Запрос;
    ЗапросВидаЗанятости.Текст = "ВЫБРАТЬ
    |    ВЫБОР
    |        КОГДА ВидыЗанятостиСотрудниковСрезПоследних.ВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятости.ОсновноеМестоРаботы)
    |            ТОГДА ""Основное место работы""
    |        КОГДА ВидыЗанятостиСотрудниковСрезПоследних.ВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятости.Совместительство)
    |            ТОГДА ""Внешнее совместительство""
    |        КОГДА ВидыЗанятостиСотрудниковСрезПоследних.ВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятости.ВнутреннееСовместительство)
    |            ТОГДА ""Внутреннее совместительство""
    |    КОНЕЦ КАК ВидЗанятости
    |ИЗ
    |    РегистрСведений.ВидыЗанятостиСотрудников.СрезПоследних КАК ВидыЗанятостиСотрудниковСрезПоследних
    |ГДЕ
    |    ВидыЗанятостиСотрудниковСрезПоследних.Сотрудник = &Сотрудник";
    ЗапросВидаЗанятости.УстановитьПараметр("Сотрудник", Источник);
    
    РезультатЗапросВидаЗанятости = ЗапросВидаЗанятости.Выполнить().Выбрать();
    Если РезультатЗапросВидаЗанятости.Следующий() Тогда
        НоваяСтрока = Параметры.СписокСотрудников.Добавить();
            НоваяСтрока.Сотрудник = Источник;
        НоваяСтрока.ВидЗанятости =  РезультатЗапросВидаЗанятости.ВидЗанятости;    
    КонецЕсли;

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



С помощью оператора "Сообщить" я узнал, что параметр заполняется как надо. Однако в XML-файл параметр "СписокСотрудников" не попадает. Использую "Универсальный обмен данных". Выгрузку делаю из ЗУП 3.1.8.155.


В чем может быть причина?
29. lopatin 468 19.12.18 16:45 Сейчас в теме
(28)Попробуйте параметр объявить в самих правилах и выставить свойство используется в при загрузке. А в "После загрузки правил обмена", уже указать, что это таблица значений.
30. muzzombie 20.12.18 08:28 Сейчас в теме
(29) Увы, чуда не произошло. Параметр заполняется как надо, но в XML-файл не попадает.
Прикрепленные файлы:
31. lopatin 468 20.12.18 09:19 Сейчас в теме
(30)Передавать при выгрузке пробовали еще поставить?

Возможно это означает, что параметр будет помещен в файл выгрузки, когда будут выгружать данные.
32. muzzombie 20.12.18 10:14 Сейчас в теме
33. user603532_fan_club_chelsea 13.02.19 12:39 Сейчас в теме
Добрый день. Не подскажите почему у меня Функция ВыгрузитьПоПравилу не работает в БСП.

Выходит Ошибка при ЗаполнитьЗначениеСвойств(*, Источник) - где источник = Неопределенно выходит. И поэтому выходит ошибка во втором параметре. Хотя Источник мне нет необходимости выгружать, если у меня все через ВходящиеДанные выгружается.

Помогите с этим вопросом разобраться. Не могу узел из-за этого добавить
34. lopatin 468 13.02.19 12:47 Сейчас в теме
(33) А как вы собираетесь использовать функцию ЗаполнитьЗначениеСвойств, если вы не указываете откуда эта функция должна заполнять свойства?
35. user603532_fan_club_chelsea 13.02.19 13:26 Сейчас в теме
(34) ПервыйПараметр - *, Второй - Источник. Ругается именно на "Источник"...
36. user603532_fan_club_chelsea 13.02.19 13:29 Сейчас в теме
(34) И эта функция Типовая в КомплекснойАвтоматизации в Обрваботке "КонвертацияОбъектовИнформационнойБазы.

вот сама ошибка
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(4283)}: Ошибка в обработчике события ПередВыгрузкойОбъекта
ПВД = ЗаказКлиента
Объект = Заказ клиента 00АШ-000177 от 17.01.2019 9:49:00 (Документ объект: Заказ клиента)
Обработчик = ПередВыгрузкойОбъектаВыборки
ОписаниеОшибки = Ошибка при вызове метода контекста (ЗаполнитьЗначенияСвойств): Недопустимое значение параметра (параметр номер '2')
ПозицияМодуля = Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(324)
КСообщенияОбОшибках = 33
ВызватьИсключение СтрокаСообщенияОбОшибке;
38. lopatin 468 13.02.19 15:27 Сейчас в теме
(36) Как мне кажется это не типовая функция в обработке, а это ваш код, который вы вызываете в обработчике ПередВыгрузкойОбъектаВыборки...

Проверяйте код в этом обработчике. Вам же пишет Недопустимое значение параметра номер 2.

Вы сказали что Источник = Неопределено, ЭТО не правильно. Нельзя передавать неопределенный Источник. Там должен быть объект с свойствами.
39. user603532_fan_club_chelsea 14.02.19 04:59 Сейчас в теме
(38) ошибка именно в обработке которая типовая. Номер строки модуля указывает туда. Даже в самой статье указано... Что если все реквизиты документа получать из входящих данных тогда можно источник не указывать...
40. user603532_fan_club_chelsea 14.02.19 07:50 Сейчас в теме
(38)
Выгрузка Табличная часть -> Регистр сведений.
По своему решению задача аналогична предыдущей. С той лишь разницей, что информацию для регистра сведений "приемника" брать придется из других объектов "источника", а точнее табличной части того объекта, который на данный момент выгружается. Если бы на стороне "приемника" была так же табличная часть, то задача легко решалась бы в виде ПГКС. Поэтому снова воспользуемся функцией ВыгрузитьРегистр.

Надеюсь это решение моей проблемы.
41. gamletspb 6 17.05.19 11:56 Сейчас в теме
Может я чего не так понимаю, но.
В первом примере автор пишет:
Пишем обработчик "Перед выгрузкой"

и пихает в него свой запрос выборки данных и потом в цикле выгружает данные по этой выгрузку..

Причем подчеркивает, что нужно использовать именно этот обработчик (впрочем, никак не объясняя, почему).

Однако в описании данного обработчика сказано:
Перед выгрузкой объекта
Условия возникновения события
Событие выполняется при получении очередного объекта из выборки, до передачи этого объекта правилу конвертации.


соответственно если сделать так как говорит автор, то получим получение нашей выборки много много раз - столько раз, сколько возвращается объектов из стандартной выборки. То что мы в конце отменили стандартную выгрузку объекта вовсе не отменяет саму стандартную выборку.
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Бизнес-аналитик 1С
Москва
зарплата от 90 000 руб. до 150 000 руб.
Полный день

Программист 1С
Москва
зарплата от 140 000 руб.
Полный день

Программист 1С
Санкт-Петербург
Полный день

Программист 1С
Нижневартовск
зарплата от 60 000 руб.
Полный день

Руководитель проекта, аналитик, консультант
Санкт-Петербург
По совместительству