При настройке правил обмена в конфигурации Конвертация данных (КД 2) для переноса справочников из 1С:Предприятия 7.7 в современную платформу 1С:Предприятие 8.3 разработчики часто сталкиваются с несовпадением структур хранения данных. Классический пример — перенос данных из справочника Контрагенты (7.7), где контактная информация хранится в виде простых строковых реквизитов шапки, в справочник Партнеры (8.3), где контакты размещаются в табличной части КонтактнаяИнформация.
Для решения этой задачи в правиле конвертации объектов (ПКО) создают правило конвертации группы свойств (ПКГС) с пустым источником. Однако при первой же выгрузке стандартная обработка V77Exp.ert может выдать ошибку: «Ошибка выбора объектов коллекции». Разберем по шагам причины этой проблемы и выясним, как правильно выгружать данные в табличную часть приемника.
Проанализируем типовой код, который разработчик помещает в обработчик «Перед обработкой» в ПКГС:
КоллекцияОбъект = СоздатьОбъект("ТаблицаЗначений");
КоллекцияОбъект.НоваяКолонка("Тип","Строка");
КоллекцияОбъект.НоваяКолонка("Вид","Строка");
КоллекцияОбъект.НоваяКолонка("Представление","Строка");
// заполнение строк...
В приведенном коде допущены сразу две ошибки, которые приводят к сбою выгрузки:
КоллекцияОбъектов (во множественном числе). Переменная КоллекцияОбъект платформой просто игнорируется, из-за чего коллекция остается пустой или неопределенной.ИсходящиеДанные). Если же мы формируем таблицу значений прямо в обработчике «Перед обработкой» текущего ПКГС, данный флаг ставить нельзя, иначе стандартный обработчик пытается прочитать несуществующую структуру.Рассмотрим корректный вариант заполнения таблицы значений. Снимем флажок «Получить из входящих данных» в свойствах ПКГС и укажем правильное имя переменной КоллекцияОбъектов:
КоллекцияОбъектов = СоздатьОбъект("ТаблицаЗначений");
КоллекцияОбъектов.НоваяКолонка("Тип");
КоллекцияОбъектов.НоваяКолонка("Вид");
КоллекцияОбъектов.НоваяКолонка("Представление");
КоллекцияОбъектов.НоваяКолонка("НомерТелефона");
КоллекцияОбъектов.НоваяКолонка("АдресЭП");
// Юридический адрес
Если ПустоеЗначение(Источник.ЮридическийАдрес) = 0 Тогда
КоллекцияОбъектов.НоваяСтрока();
КоллекцияОбъектов.Тип = "Адрес";
КоллекцияОбъектов.Вид = "Юридический адрес";
КоллекцияОбъектов.Представление = СокрЛП(Источник.ЮридическийАдрес);
КонецЕсли;
// Почтовый адрес
Если ПустоеЗначение(Источник.ПочтовыйАдрес) = 0 Тогда
КоллекцияОбъектов.НоваяСтрока();
КоллекцияОбъектов.Тип = "Адрес";
КоллекцияОбъектов.Вид = "Почтовый адрес";
КоллекцияОбъектов.Представление = СокрЛП(Источник.ПочтовыйАдрес);
КонецЕсли;
// Телефон
Если ПустоеЗначение(Источник.Телефоны) = 0 Тогда
КоллекцияОбъектов.НоваяСтрока();
КоллекцияОбъектов.Тип = "Телефон";
КоллекцияОбъектов.Вид = "Телефон";
КоллекцияОбъектов.Представление = СокрЛП(Источник.Телефоны);
КоллекцияОбъектов.НомерТелефона = СокрЛП(Источник.Телефоны);
КонецЕсли;
// Электронная почта
Если ПустоеЗначение(Источник.ЭлПочта) = 0 Тогда
КоллекцияОбъектов.НоваяСтрока();
КоллекцияОбъектов.Тип = "Адрес электронной почты";
КоллекцияОбъектов.Вид = "Электронная почта";
КоллекцияОбъектов.Представление = СокрЛП(Источник.ЭлПочта);
КоллекцияОбъектов.АдресЭП = СокрЛП(Источник.ЭлПочта);
КонецЕсли;
Выгрузить строки в коллекцию — лишь половина дела. В современных типовых конфигурациях 1С 8.3 реквизиты табличной части КонтактнаяИнформация являются ссылочными:
ПеречислениеСсылка.ТипыКонтактнойИнформации. Для него необходимо настроить сопоставление строковых значений из источника значениям перечисления приемника. Это можно сделать через отдельное ПКО с таблицей соответствия либо программно в ПККС реквизита «Тип» на стороне приемника в обработчике «При загрузке»:Значение = Перечисления.ТипыКонтактнойИнформации[Значение];
ВидыКонтактнойИнформации. Этот справочник иерархический, и элементы с одинаковыми наименованиями (например, «Почтовый адрес») могут дублироваться в папках «Справочник Партнеры», «Справочник Контактные лица» и других. Поиск только по наименованию часто сопоставляет строку с чужой группой. Поэтому для ПКО ВидыКонтактнойИнформации критически важно настраивать поиск с учетом родителя либо использовать поиск по предопределенному имени.В современных конфигурациях 8.3 контактная информация управляется механизмом Библиотеки стандартных подсистем (БСП). Для корректного хранения адресов требуются служебные поля (XML/JSON-десериализация полей адреса в реквизите ЗначенияПолей). Если заполнить только строковое представление, адрес может некорректно открываться в форме ввода.
Чтобы избежать проблем с внутренними форматами БСП, часто применяют более надежный подход: не переносить данные напрямую в табличную часть через ПКГС, а передать строки через параметры или входящие данные, после чего применить штатные методы подсистемы.
Разберем, как это реализовать:
Контрагенты_Партнеры в обработчике «При выгрузке» упакуем контактные данные в ИсходящиеДанные:
ИсходящиеДанные = СоздатьОбъект("СписокЗначений");
ИсходящиеДанные.ДобавитьЗначение(Источник.ЮридическийАдрес, "ЮрАдрес");
ИсходящиеДанные.ДобавитьЗначение(Источник.Телефоны, "Телефон");
ИсходящиеДанные.ДобавитьЗначение(Источник.ЭлПочта, "Email");
Если Не ПустаяСтрока(ПараметрыОбъекта["ЮрАдрес"]) Тогда
ВидКИ = Справочники.ВидыКонтактнойИнформации.ЮрАдресПартнера;
УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(Объект, ПараметрыОбъекта["ЮрАдрес"], ВидКИ, Перечисления.ТипыКонтактнойИнформации.Адрес);
КонецЕсли;
Такой подход гарантирует, что типовые механизмы БСП сформируют все системные структуры и нормализуют записи табличной части без ошибок целостности данных.
Если в процессе выгрузки из 1С 7.7 возникают трудноуловимые ошибки в коде обработчиков, не обязательно гадать или использовать внешние промежуточные файлы. В стандартной обработке V77Exp.ert предусмотрен специальный режим отладки: