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