Как перенести табличную часть при разделении одного документа на несколько в «1С:Конвертация данных»

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При работе с инструментом «1С:Конвертация данных 2.1» программисты часто сталкиваются с нетипичными задачами. Одна из самых трудоемких — ситуация, когда из одного исходного документа необходимо создать несколько документов-приемников (например, по количеству строк в основной табличной части), и при этом в каждый новый документ нужно «пробросить» данные из другой табличной части исходного объекта.

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

Постановка задачи и анализ ситуации

Рассмотрим конкретный пример: у нас есть документ РеализацияТоваровУслуг. Нам нужно выгрузить его в базу CRM как набор документов Событие. При этом соблюдаются следующие условия:

  1. Количество документов Событие должно соответствовать количеству строк в табличной части Товары исходной реализации.
  2. В каждый созданный документ Событие должна попасть вся табличная часть Акции из того же исходного документа реализации.

Стандартное сопоставление «Источник — Приемник» здесь не сработает, так как иерархия объектов меняется. Нам потребуется программное управление выгрузкой через обработчики событий.

Алгоритм реализации через программную выгрузку

Для решения задачи мы будем использовать метод ВыгрузитьПоПравилу. Основная логика будет располагаться в обработчике «Перед выгрузкой» правила конвертации (ПКО) исходного документа или в аналогичном обработчике группы свойств (ПКГС).

Проанализируем шаги, которые необходимо предпринять:

1. Подготовка коллекции для передачи. Поскольку мы создаем документы «на лету», нам нужно подготовить структуру данных, которую мы передадим в правило конвертации документа-приемника. Важно помнить, что для передачи строк табличной части лучше всего подходит массив структур.

2. Использование правильных типов данных. Распространенная ошибка — использование объекта СписокЗначений. В контексте конвертации данных СписокЗначений часто воспринимается системой как интерактивный объект или просто некорректно сериализуется. Вместо него следует использовать Структура.

3. Передача данных в ПКО приемника. Мы будем передавать подготовленную таблицу (массив структур) через параметр ВходящиеДанные метода ВыгрузитьПоПравилу.

Посмотрим на пример кода, который решает эту задачу:


// В обработчике ПКО РеализацияИсходная -> ПКГС Товары (Перед обработкой выгрузки)

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

Настройка правил конвертации (ПКО) в интерфейсе

После написания кода необходимо правильно настроить само ПКО РеализацияЦРМ (документ Событие в приемнике). Без этих настроек система не поймет, откуда брать данные, даже если они переданы в параметрах.

Разберем настройки по шагам:

  1. В ПКО РеализацияЦРМ найдите группу свойств (ПКГС), отвечающую за табличную часть (например, ТЧ_Акции).
  2. Поле «Источник» для этой группы свойств оставьте пустым.
  3. Обязательно установите флаг «Получать из входящих данных».
  4. Внутри этой группы свойств для каждого реквизита (Акция, ПроцентСкидки) также оставьте поле «Источник» пустым. Имена свойств должны строго совпадать с ключами, которые вы указали в СтруктураСтрокиТЧ в коде выше.

Анализ типичных ошибок

При реализации этой схемы часто возникают ошибки. Рассмотрим самые популярные из них и способы их решения:

Ошибка: «Поле объекта не обнаружено (АкцияТЧ)».
Причина обычно кроется в том, что вы пытаетесь передать данные через СписокЗначений вместо Структура. Как мы выяснили ранее, механизм конвертации ожидает коллекцию, свойства которой он может прочитать. У СпискаЗначений нет свойств с именами ваших колонок, поэтому возникает ошибка при обращении. Всегда используйте Структура для строк и Массив (или ТаблицаЗначений) для самой коллекции.

Ошибка: «Ошибка получения коллекции подчиненных объектов».
Эта ошибка указывает на то, что имя ключа в структуре ВходящиеДанные не совпадает с именем группы свойств в настройках конвертации. Проверьте регистр букв и наличие лишних пробелов. Имя в коде ВходящиеДанныеДляСобытия.Вставить("ТЧ_Акции", ...) должно быть идентично имени ПКГС в дереве свойств правила.

Ошибка: «Объект (Не определено)» при поиске свойств.
Если система сообщает, что не может найти свойство, хотя вы его передали, проверьте, не стоит ли у данного свойства в ПКС галочка «Поиск». Для реквизитов табличных частей поиск обычно не используется, и его активация может приводить к попыткам системы найти объект там, где данных еще нет.

Рекомендации по оптимизации

Если табличная часть Акции очень большая или содержит много ссылочных типов, имеет смысл рассмотреть вариант использования обработчика «При выгрузке» непосредственно в ПКГС. В этом обработчике можно напрямую определить переменную КоллекцияОбъектов.

Рассмотрим этот вариант:


// Обработчик ПКГС ТЧ_Акции -> При выгрузке
// Этот код сработает, если мы передали структуру "ВходящиеДанные" в ПКО

Если ВходящиеДанные <> Неопределено И ВходящиеДанные.Свойство("ТЧ_Акции") Тогда
    КоллекцияОбъектов = ВходящиеДанные.ТЧ_Акции;
КонецЕсли;

Такой подход делает правила более «прозрачными» и позволяет избежать автоматического (иногда некорректного) сопоставления полей, предоставляя разработчику полный контроль над данными табличной части.

Резюмируя: Ключ к успеху при переносе табличных частей в разделяемые документы — это использование Массива Структур, передача его через ВходящиеДанные и обязательная установка флага «Получать из входящих данных» в настройках ПКГС. Это универсальный способ, который позволяет обходить ограничения стандартного механизма конвертации.

← На главную