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