Как перенести контактную информацию из реквизитов справочника в независимый регистр сведений в Конвертации данных 2.1

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

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

Разбор основной ошибки и причины возникновения

Типичная ошибка при попытке сопоставить строку источника (например, реквизит Адрес) напрямую с полем регистра приемника — «Получение элемента по индексу для значения не определено». Это происходит потому, что механизм обмена ожидает объект или структуру свойств, а получает примитивный тип данных (строку). Кроме того, регистр сведений является независимым объектом, и для создания его записи недостаточно просто выгрузить справочник. Нам необходимо программно инициировать создание записей регистра для каждого вида информации (телефон, адрес, email).

Шаг 1. Создание ПКО для регистра сведений

Первым делом проанализируем структуру приемника. Нам нужно создать Правило Конвертации Объектов (ПКО) для регистра сведений КонтактнаяИнформация. Выполним следующие настройки:

  1. В поле Источник оставим значение пустым.
  2. В поле Приемник выберем РегистрСведенийЗапись.КонтактнаяИнформация.
  3. Создадим ПКС (Правила Конвертации Свойств) для всех измерений и ресурсов регистра: Объект, Тип, Вид, Представление, Поле1, Поле2 и т.д.
  4. Важный момент: для каждого ПКС необходимо установить флаг «Получить из входящих данных». Это скажет системе, что значения нужно брать не из объекта-источника, а из структуры, которую мы передадим программно.

Шаг 2. Программная выгрузка из ПКО справочника

Теперь перейдем к справочнику Контрагенты. Вместо прямого сопоставления реквизитов, мы воспользуемся обработчиком события «После выгрузки». Это гарантирует, что сам контрагент уже выгружен, и его ссылка доступна для связи с записью регистра.

Рассмотрим пример кода, который нужно разместить в обработчике «После выгрузки» ПКО Контрагенты:


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

// Вызываем выгрузку по правилу для записи регистра
ВыгрузитьПоПравилу(,, ПараметрыКИ,, "КонтактнаяИнформация");

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

Шаг 3. Настройка поиска и типов данных

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

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


// Если мы передали в структуру строку с наименованием
Значение = ВходящиеДанные.Вид;

Аналогично поступим с измерением Объект. В ПКС Объект должно быть указано ПКО Контрагенты. Это свяжет запись регистра с соответствующим элементом справочника в базе-приемнике.

Особенности для конфигураций на базе БСП

Проанализируем ситуацию с современными конфигурациями (БП 3.0, УТ 11, ЗУП 3.1). В них контактная информация хранится не только в полях регистра, но и в специальной XML-строке в поле ЗначенияПолей. Если вы перенесете только Представление, карточка контрагента может выглядеть пустой, хотя в регистре данные будут. Чтобы этого избежать, рассмотрим два пути:

  1. Программное формирование XML: В приемнике, в обработчике ПКО регистра «После загрузки», вызвать стандартную функцию БСП УправлениеКонтактнойИнформацией.СформироватьXMLПоля(), чтобы заполнить служебные поля на лету.
  2. Заполнение полей по отдельности: Передавать в структуру ВходящиеДанные не только представление, но и компоненты (город, улица, дом) в поля Поле1, Поле2 и т.д., если конфигурация-приемник поддерживает такой формат.

Использование запроса в ПКО (Альтернативный метод)

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

Важные замечания:

Таким образом, мы вместе разобрали технологию переноса «плоских» данных в структуру регистра. Главное — помнить про использование ВходящиеДанные и корректную передачу ссылочных типов (Тип и Вид КИ).

← На главную