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