При работе с инструментом 1С:Конвертация данных 2.0 (КД 2.0) часто возникают ситуации, когда структура данных источника существенно отличается от приемника. Одной из классических задач является необходимость заполнить колонку табличной части в приемнике (например, СчетУчета), которой физически не существует в объекте-источнике. Попытки решить это «в лоб» через создание параметров часто приводят к системным ошибкам 11 и 47. В этой статье мы подробно разберем, как правильно передавать произвольные данные в строки табличных частей и какие механизмы КД 2.0 для этого предназначены.
Прежде чем перейти к решениям, проанализируем, почему стандартные попытки подстановки параметров в ПКС (Правила конвертации свойств) табличной части часто терпят неудачу:
ВходящиеДанные. Если вы используете произвольный запрос, это означает, что имя колонки в результате запроса не совпадает с именем в ПКС.Для обхода этих ограничений мы рассмотрим два основных метода: программное формирование всей коллекции и использование параметров строки. Для проверки структуры реквизитов и строк в файле выгрузки перед загрузкой подойдёт обработка для анализа состава выгруженных данных конвертации.
Это самый гибкий и «чистый» метод с точки зрения архитектуры КД 2.0. Он позволяет полностью подменить стандартную выборку строк табличной части вашей собственной таблицей значений. Разберем этот процесс по шагам.
Перейдем в Правила конвертации группы свойств (ПКГС), которая отвечает за вашу табличную часть. В обработчике Перед выгрузкой мы можем сформировать данные программно. Если мы установим значение переменной КоллекцияОбъектов, КД 2.0 проигнорирует данные реального объекта-источника и начнет обходить вашу таблицу. Для удобного написания кода с подсказками по доступным переменным обработчиков можно использовать доработанную конфигурацию «Конвертация данных» со всплывающими подсказками.
Проанализируем пример кода, который можно разместить в этом обработчике:
// Создаем таблицу значений, которая будет имитировать нашу ТЧ
ТЗ_БудущейТЧ = Новый ТаблицаЗначений;
ТЗ_БудущейТЧ.Колонки.Добавить("Сотрудник");
ТЗ_БудущейТЧ.Колонки.Добавить("СчетУчета");
ТЗ_БудущейТЧ.Колонки.Добавить("Сумма");
// Формируем запрос для получения данных, которых нет в объекте
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Зарплата.Сотрудник КАК Сотрудник,
| Зарплата.Сумма КАК Сумма
|ИЗ
| РегистрНакопления.ЗарплатаКВыплате КАК Зарплата
|ГДЕ
| Зарплата.Регистратор = &Источник";
Запрос.УстановитьПараметр("Источник", Источник.Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтр = ТЗ_БудущейТЧ.Добавить();
НоваяСтр.Сотрудник = Выборка.Sotrudnik;
НоваяСтр.Сумма = Выборка.Summa;
// Вычисляем счет учета, которого нет в источнике
// Здесь может быть ваша логика или получение из констант/настроек
НоваяСтр.СчетУчета = "70";
КонецЦикла;
// Передаем нашу таблицу в КД
КоллекцияОбъектов = ТЗ_БудущейТЧ;
Важный нюанс: В именах свойств ПКС (внутри этой группы) в колонке «Имя свойства источника» нужно указать именно те названия колонок, которые вы создали в ТаблицаЗначений (например, СчетУчета). Для колонки СчетУчета в ПКС укажите тип поиска по коду, если передаете строку.
Если табличная часть в источнике существует, и вам нужно лишь «докинуть» в каждую строку дополнительную информацию, не переписывая всю коллекцию, используем механизм параметров строки.
Разберем алгоритм настройки:
СчетУчета в колонке «Источник» ничего не указываем.Перед выгрузкой этого ПКС пишем:
// Вычисляем значение или берем из переменной
Значение = "401.20"; // Пример кода счета
В этом случае КД не будет пытаться записать Значение в реквизит СчетУчета напрямую (что часто вызывает ошибку 47), а поместит его в структуру Параметры текущей строки. Выясним, как это использовать на стороне приемника.
В ПКО (Правило конвертации объекта) в обработчике После загрузки (или в обработчике При загрузке самой ТЧ) мы можем прочитать этот параметр:
Для Каждого СтрокаТЧ Из Объект.Зарплата Цикл
// Если мы передавали параметр для каждой строки,
// его нужно уметь идентифицировать.
// Однако чаще параметры ПКС используются для поиска.
// Если нужно прямое заполнение, лучше использовать Решение 1 или 3.
КонецЦикла;
Если расчет счета на стороне источника затруднителен, мы можем перенести только ключевые данные (например, ВидОперации), а счет определить уже в базе-приемнике. Это часто применяется при переносе данных из ERP Управление предприятием в УПП.
Посмотрим на пример кода в ПКС реквизита СчетУчета в обработчике Перед загрузкой (на стороне приемника):
// Код выполняется в базе-приемнике
Если Объект.ВидОперации = Перечисления.ВидыОпераций.ВыплатаЗарплаты Тогда
Значение = ПланыСчетов.Хозрасчетный.НайтиПоКоду("70");
Иначе
Значение = ПланыСчетов.Хозрасчетный.НайтиПоКоду("71");
КонецЕсли;
Этот способ хорош тем, что нам не нужно заботиться о сериализации ссылок счетов между разными базами, так как поиск происходит локально в приемнике. Если элементы в двух базах были заведены вручную и имеют разные ссылки, при точечной миграции можно настроить сопоставление объектов по произвольным полям поиска.
Проанализируем специфику, упомянутую в обсуждении. При переносе данных из ERP в УПП счета учета часто зависят от настроек отражения зарплаты в финансовом учете. Вместо прямой передачи счета рекомендуется передавать Способ отражения (ссылкой или строкой). Для более масштабных проектов выделения исторических сведений в другие системы будет полезен раздел готовых решений для переноса из ERP.
Выясним, почему это надежнее:
СпособыОтраженияЗарплатыВРегламентированномУчете.Таким образом, лучшей стратегией будет формирование КоллекцияОбъектов в ПКГС, где в качестве колонок будут выступать не только стандартные реквизиты, но и вычисленные значения «способов отражения», которые в приемнике через стандартные ПКО превратятся в нужные ссылки.
Для успешного переноса отсутствующих в источнике реквизитов ТЧ:
КоллекцияОбъектов, если данных в источнике вообще нет в этой ТЧ или требуется сложный запрос.Перед загрузкой на стороне приемника, если логика определения счета проста и зависит от данных самой строки.ТаблицаЗначений и имен свойств в ПКС, чтобы избежать 11-й ошибки.Код или Наименование, настраивая поиск в ПКО по этим полям, чтобы избежать проблем с несовпадением УИД.