Как заполнить пустой ссылочный реквизит при конвертации данных из 1С 7.7 в 1С 8.3?

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

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

Если реквизит является ссылочным (ссылка на справочник СправочникСсылка.Пользователи), просто передать строковое имя пользователя не получится: система ожидает ссылку либо объект, сопоставимый по правилам конвертации. Разберем основные способы решения этой задачи, особенности синтаксиса платформы 1С 7.7 и оптимизацию производительности при переносе.

Способ 1. Поиск и передача ссылки на стороне источника (1С 7.7)

Если для справочника Пользователи в правилах обмена уже настроено отдельное Правило конвертации объектов (ПКО), мы можем найти элемент непосредственно в базе-источнике 7.7 и передать его в обработчике Правила конвертации свойства (ПКС).

Рассмотрим порядок настройки:

  1. Открываем правило конвертации справочника Контрагенты.
  2. Находим ПКС для реквизита ОсновнойМенеджер (или создаем его, если источник пустой). Указываем соответствующее ПКО для пользователей.
  3. В обработчике «При выгрузке» этого ПКС пишем код поиска элемента в базе 7.7:

спр = СоздатьОбъект("Справочник.Пользователи");
// Третий параметр 1 включает режим точного соответствия строки в 1С 7.7
Если спр.НайтиПоНаименованию("Светлана_Журавская", 0, 1) = 1 Тогда
    Значение = спр.ТекущийЭлемент();
КонецЕсли;

Важный нюанс синтаксиса 1С 7.7: переменная спр содержит объект типа «Справочник», а обработчик выгрузки ожидает конкретную ссылку на элемент. Поэтому необходимо присваивать именно Значение = спр.ТекущийЭлемент();, а не сам объект спр.

Способ 2. Заполнение ссылки на стороне приемника (1С 8.3)

Если в базе 1С 7.7 нужного пользователя нет, либо структура справочников пользователей в источниках сильно различается, проще всего заполнить реквизит непосредственно в момент загрузки в базу 1С 8.3.

Разберем по шагам, как это реализовать:

  1. В ПКС для менеджера отключаем выгрузку или оставляем источник пустым.
  2. В ПКО справочника-приемника переходим в обработчик событий «После загрузки».
  3. Выполняем поиск нужного пользователя средствами платформы 8.3 и присваиваем ссылку объекту:

СсылкаНаПользователя = Справочники.Пользователи.НайтиПоНаименованию("Иванов И.И.");
Если ЗначениеЗаполнено(СсылкаНаПользователя) Тогда
    Объект.ОсновнойМенеджер = СсылкаНаПользователя;
КонецЕсли;

Обратите внимание: если метод НайтиПоНаименованию() в 1С 8.3 не находит запись, он возвращает Справочники.Пользователи.ПустаяСсылка(). Проверка через ЗначениеЗаполнено() предотвращает случайное затирание уже существующих значений пустыми ссылками при повторных обменах.

Способ 3. Передача через параметры конвертации (без «хардкода»)

Прописывать конкретные имена пользователей жестко в коде правил не рекомендуется, так как при изменении ответственного лица правила придется выгружать и загружать заново. Оптимальнее использовать механизм параметров правил обмена.

  1. В конфигурации «Конвертация данных» на вкладке «Параметры» создаем новый параметр, например ОсновнойМенеджерПоУмолчанию.
  2. При выгрузке или загрузке данных этот параметр можно будет выбрать интерактивно в окне обработки обмена.
  3. В обработчике «После загрузки» ПКО присваиваем значение из параметров:

Если ЗначениеЗаполнено(Параметры.ОсновнойМенеджерПоУмолчанию) Тогда
    Объект.ОсновнойМенеджер = Параметры.ОсновнойМенеджерПоУмолчанию;
КонецЕсли;

Оптимизация производительности при выгрузке и загрузке

Проанализируем частую ошибку: если выполнять СоздатьОбъект() в 7.7 или НайтиПоНаименованию() в 8.3 внутри обработчиков свойств каждого отдельного контрагента, время переноса базы данных вырастет в разы из-за постоянных запросов к СУБД.

Чтобы ускорить обмен, выполним кэширование ссылки:

  1. Для базы-приемника найдем пользователя один раз в глобальном обработчике «Перед загрузкой данных»:
    
    Параметры.Вставить("КэшМенеджера", Справочники.Пользователи.НайтиПоНаименованию("Иванов И.И."));
    
  2. В обработчике «После загрузки» каждого контрагента просто используем подготовленное значение: Объект.ОсновнойМенеджер = Параметры.КэшМенеджера;

Такой подход обеспечивает высокую скорость загрузки больших справочников и защищает правила от сбоев при сопоставлении ссылочных данных.

← На главную