Почему табличная часть не попадает из ПВД в ПКО в Конвертации данных 2.1

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

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

Анализ типичной ошибки: почему прямое присваивание бесполезно

Рассмотрим ситуацию, представленную в исходном коде. Программист создает таблицу значений ТабЧастьВозвраты, заполняет ее в цикле и в конце пытается передать ее в объект-источник следующим образом:

ДокРТУ.Возвраты = ТабЧастьВозвраты;

Проанализируем, что происходит "под капотом" КД 2.1. Когда выполняется выгрузка по правилу, движок конвертации обращается к свойствам объекта-источника. Если ДокРТУ — это реальный объект базы данных, то при попытке записи в свойство Возвраты (которое является табличной частью) система 1С либо выдаст ошибку (так как ТЧ доступна только для чтения через .Добавить() или .Загрузить()), либо изменения останутся в памяти и не будут обработаны конвертацией, если ТЧ не сопоставлена корректно.

Основная проблема заключается в том, что механизм КД 2.1 ожидает получения данных из структуры объекта-источника или из специального хранилища — ВходящиеДанные. Если вы формируете данные "на лету" в ПВД, использование ВходящиеДанные является единственным верным способом передачи этой информации в ПКО.

Решение проблемы через использование параметра ВходящиеДанные

Для того чтобы табличная часть успешно выгрузилась, нам необходимо использовать связку ПВД и ПКО через структуру ВходящиеДанные. Разберем этот процесс по шагам.

Шаг 1. Формирование данных в ПВД.

В обработчике ПВД (например, "Перед выгрузкой"), когда мы используем произвольный алгоритм, мы должны подготовить структуру. Эта структура будет передана в функцию ВыгрузитьПоПравилу. Выясним, как должен выглядеть исправленный код:


// Создаем таблицу значений с нужными колонками
ТабЧастьВозвраты = Новый ТаблицаЗначений;
ТабЧастьВозвраты.Колонки.Добавить("ДатаРеализации");
ТабЧастьВозвраты.Колонки.Добавить("Количество");
ТабЧастьВозвраты.Колонки.Добавить("Номенклатура");
// ... добавление остальных колонок

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

// Теперь самое важное: упаковываем ТЗ в структуру ВходящиеДанные
СтруктураВходящиеДанные = Новый Структура;
СтруктураВходящиеДанные.Вставить("Возвраты", ТабЧастьВозвраты);

// Вызываем выгрузку, передавая структуру в 7-й параметр функции
ВыгрузитьПоПравилу(Источник, , СтруктураВходящиеДанные, , "ИмяВашегоПКО");

Шаг 2. Настройка ПКС в ПКО.

Перейдем в правила конвертации свойств (ПКС) для вашего ПКО. Найдите строку, отвечающую за выгрузку табличной части (в нашем примере — "Возвраты"). Посмотрим на ключевые настройки:

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

Явное указание коллекции в обработчике ПКС

Иногда автоматическое сопоставление по имени не срабатывает (например, если имена ключей в структуре отличаются от имен ТЧ). В этом случае проанализируем использование обработчика "Перед выгрузкой" для конкретного ПКС табличной части. Рассмотрим пример кода внутри ПКС:


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

Использование переменной КоллекцияОбъектов позволяет нам принудительно подсунуть движку КД таблицу значений, которую мы подготовили ранее. Это наиболее надежный способ, гарантирующий, что данные попадут в файл обмена.

Важные технические нюансы и проверки

Выясним, на что еще стоит обратить внимание, если табличная часть все равно остается пустой:

1. Соответствие имен колонок.

В вашей программно созданной таблице значений имена колонок должны строго (с учетом регистра) совпадать с именами свойств "Источник" в ПКС, вложенных в эту табличную часть. Если в ТЗ колонка называется Себестоимость, а в правилах ПКС источником указано СуммаСебестоимости, данные не будут перенесены, так как система не найдет соответствия.

2. Типы данных в колонках.

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

3. Режим выгрузки ПВД.

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

4. Очистка данных.

При выгрузке большого количества документов в цикле не забывайте переинициализировать или очищать структуру ВходящиеДанные и саму Таблицу Значений. В противном случае данные из предыдущего документа могут "перекочевать" в следующий или вызвать переполнение памяти.

Резюме

Для успешного переноса табличной части из ПВД в ПКО необходимо:

  1. Сформировать Таблицу Значений в ПВД.
  2. Поместить ее в структуру ВходящиеДанные.
  3. Передать эту структуру в метод ВыгрузитьПоПравилу.
  4. В настройках ПКС табличной части включить признак "Получить из входящих данных" или явно переопределить КоллекцияОбъектов.
  5. Обеспечить идентичность имен колонок ТЗ и имен источников в правилах обмена.

Соблюдение этих правил позволит вам корректно обрабатывать даже самые сложные алгоритмы трансформации данных при миграции между конфигурациями 1С.

← На главную