При работе с инструментом «1С:Конвертация данных 2.1» программисты часто сталкиваются с нетипичными задачами. Одна из самых трудоемких — ситуация, когда из одного исходного документа необходимо создать несколько документов-приемников (например, по количеству строк в основной табличной части), и при этом в каждый новый документ нужно «пробросить» данные из другой табличной части исходного объекта.
В этой статье мы подробно разберем, как реализовать этот механизм, проанализируем типичные ошибки и выясним, какие объекты 1С лучше всего использовать для передачи данных между правилами.
Рассмотрим конкретный пример: у нас есть документ РеализацияТоваровУслуг. Нам нужно выгрузить его в базу CRM как набор документов Событие. При этом соблюдаются следующие условия:
Событие должно соответствовать количеству строк в табличной части Товары исходной реализации.Событие должна попасть вся табличная часть Акции из того же исходного документа реализации.Стандартное сопоставление «Источник — Приемник» здесь не сработает, так как иерархия объектов меняется. Нам потребуется программное управление выгрузкой через обработчики событий.
Для решения задачи мы будем использовать метод ВыгрузитьПоПравилу. Основная логика будет располагаться в обработчике «Перед выгрузкой» правила конвертации (ПКО) исходного документа или в аналогичном обработчике группы свойств (ПКГС).
Проанализируем шаги, которые необходимо предпринять:
1. Подготовка коллекции для передачи. Поскольку мы создаем документы «на лету», нам нужно подготовить структуру данных, которую мы передадим в правило конвертации документа-приемника. Важно помнить, что для передачи строк табличной части лучше всего подходит массив структур.
2. Использование правильных типов данных. Распространенная ошибка — использование объекта СписокЗначений. В контексте конвертации данных СписокЗначений часто воспринимается системой как интерактивный объект или просто некорректно сериализуется. Вместо него следует использовать Структура.
3. Передача данных в ПКО приемника. Мы будем передавать подготовленную таблицу (массив структур) через параметр ВходящиеДанные метода ВыгрузитьПоПравилу.
Посмотрим на пример кода, который решает эту задачу:
// В обработчике ПКО РеализацияИсходная -> ПКГС Товары (Перед обработкой выгрузки)
Для Каждого СтрокаТовар Из Источник.Товары Цикл
// Создаем структуру для передачи данных в новый документ
ВходящиеДанныеДляСобытия = Новый Структура;
ВходящиеДанныеДляСобытия.Вставить("Дата", Источник.Дата);
ВходящиеДанныеДляСобытия.Вставить("Контрагент", Источник.Контрагент);
ВходящиеДанныеДляСобытия.Вставить("Содержание", "Продажа товара: " + СтрокаТовар.Номенклатура);
// Теперь формируем данные для вложенной табличной части "Акции"
МассивАкций = Новый Массив;
Для Каждого СтрАкция Из Источник.Акции Цикл
СтруктураСтрокиТЧ = Новый Структура;
СтруктураСтрокиТЧ.Вставить("Акция", СтрАкция.Акция);
СтруктураСтрокиТЧ.Вставить("ПроцентСкидки", СтрАкция.ПроцентСкидки);
МассивАкций.Добавить(СтруктураСтрокиТЧ);
КонецЦикла;
// Добавляем массив строк ТЧ во входящие данные под именем,
// которое совпадает с именем ПКГС в приемнике
ВходящиеДанныеДляСобытия.Вставить("ТЧ_Акции", МассивАкций);
// Выгружаем объект по правилу для документа Событие
ВыгрузитьПоПравилу( , , ВходящиеДанныеДляСобытия, , "РеализацияЦРМ");
КонецЦикла;
После написания кода необходимо правильно настроить само ПКО РеализацияЦРМ (документ Событие в приемнике). Без этих настроек система не поймет, откуда брать данные, даже если они переданы в параметрах.
Разберем настройки по шагам:
РеализацияЦРМ найдите группу свойств (ПКГС), отвечающую за табличную часть (например, ТЧ_Акции).СтруктураСтрокиТЧ в коде выше.При реализации этой схемы часто возникают ошибки. Рассмотрим самые популярные из них и способы их решения:
Ошибка: «Поле объекта не обнаружено (АкцияТЧ)».
Причина обычно кроется в том, что вы пытаетесь передать данные через СписокЗначений вместо Структура. Как мы выяснили ранее, механизм конвертации ожидает коллекцию, свойства которой он может прочитать. У СпискаЗначений нет свойств с именами ваших колонок, поэтому возникает ошибка при обращении. Всегда используйте Структура для строк и Массив (или ТаблицаЗначений) для самой коллекции.
Ошибка: «Ошибка получения коллекции подчиненных объектов».
Эта ошибка указывает на то, что имя ключа в структуре ВходящиеДанные не совпадает с именем группы свойств в настройках конвертации. Проверьте регистр букв и наличие лишних пробелов. Имя в коде ВходящиеДанныеДляСобытия.Вставить("ТЧ_Акции", ...) должно быть идентично имени ПКГС в дереве свойств правила.
Ошибка: «Объект (Не определено)» при поиске свойств.
Если система сообщает, что не может найти свойство, хотя вы его передали, проверьте, не стоит ли у данного свойства в ПКС галочка «Поиск». Для реквизитов табличных частей поиск обычно не используется, и его активация может приводить к попыткам системы найти объект там, где данных еще нет.
Если табличная часть Акции очень большая или содержит много ссылочных типов, имеет смысл рассмотреть вариант использования обработчика «При выгрузке» непосредственно в ПКГС. В этом обработчике можно напрямую определить переменную КоллекцияОбъектов.
Рассмотрим этот вариант:
// Обработчик ПКГС ТЧ_Акции -> При выгрузке
// Этот код сработает, если мы передали структуру "ВходящиеДанные" в ПКО
Если ВходящиеДанные <> Неопределено И ВходящиеДанные.Свойство("ТЧ_Акции") Тогда
КоллекцияОбъектов = ВходящиеДанные.ТЧ_Акции;
КонецЕсли;
Такой подход делает правила более «прозрачными» и позволяет избежать автоматического (иногда некорректного) сопоставления полей, предоставляя разработчику полный контроль над данными табличной части.
Резюмируя: Ключ к успеху при переносе табличных частей в разделяемые документы — это использование Массива Структур, передача его через ВходящиеДанные и обязательная установка флага «Получать из входящих данных» в настройках ПКГС. Это универсальный способ, который позволяет обходить ограничения стандартного механизма конвертации.