Как в КД 2.1 передать из 1С 7.7 ссылку на справочник, которого нет в источнике

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Анализ проблемы: почему стандартный подход не работает

В «Конвертации данных 2.1» (КД) стандартный процесс выгрузки предполагает наличие объекта-источника. Когда источника нет, система не знает, откуда брать данные для заполнения свойств. Многие начинающие разработчики пытаются решить это в обработчике ПослеЗагрузки на стороне 1С 8.х, программно находя нужную ссылку. Однако это порождает проблемы с производительностью (лишняя перезапись объекта) и нарушает логику самой конвертации, так как связь между объектами становится «невидимой» для правил обмена.

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

Решение №1: Использование механизма «Входящие данные»

Этот метод считается эталонным в КД 2.1. Мы создадим правило конвертации для справочника, у которого нет источника, и будем передавать в него данные «на лету» из родительского объекта.

Шаг 1: Настройка ПКО для отсутствующего справочника

Сначала создадим правило конвертации объектов (ПКО) для справочника ВидыНоменклатуры:

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

Шаг 2: Настройка ПКС в основном объекте

Теперь перейдем к правилу выгрузки основного объекта (например, справочника Номенклатура). Нам нужно заполнить реквизит ВидНоменклатуры.

  1. В ПКС для свойства ВидНоменклатуры выбираем созданное выше ПКО (ВидыНоменклатуры).
  2. Источник для этого ПКС оставляем пустым.
  3. В обработчике Перед выгрузкой пишем код на языке 1С 7.7. Нам нужно сформировать СписокЗначений, ключи которого соответствуют именам ПКС в правиле-приемнике.

Рассмотрим пример кода для обработчика Перед выгрузкой в ПКС ВидНоменклатуры:


// Создаем специальный список значений для передачи входящих данных
ВходящиеДанные = СоздатьОбъект("СписокЗначений");

// Определяем логику: что именно мы хотим найти в приемнике
// Например, если это товар, передаем наименование "Товар"
Если Источник.ТипНоменклатуры = Перечисление.ТипыНоменклатуры.Товар Тогда
    ВходящиеДанные.Установить("Наименование", "Товар");
ИначеЕсли Источник.ТипНоменклатуры = Перечисление.ТипыНоменклатуры.Услуга Тогда
    ВходящиеДанные.Установить("Наименование", "Услуга");
КонецЕсли;

// Передаем этот список в переменную Значение. 
// КД поймет, что это данные для подчиненного ПКО.
Значение = ВходящиеДанные;

Важно помнить, что в 1С 7.7 СписокЗначений работает как аналог структуры. КД 2.1 при обработке выгрузки увидит, что в Значение передан список, и использует его для заполнения свойств ПКО ВидыНоменклатуры, пометив их как «Входящие данные».

Решение №2: Прямая манипуляция узлами XML (для продвинутых)

Если по каким-то причинам стандартный механизм ВходящиеДанные не подходит (например, при очень сложной вложенности или нестандартной логике поиска), мы можем применить низкоуровневый подход — добавление параметров непосредственно в XML-файл выгрузки.

В ПКО основного объекта в обработчике При выгрузке можно программно вмешаться в формирование файла. Проанализируем пример кода:


// Создаем узел для параметра
УзелПараметра = СоздатьУзел("ЗначениеПараметра");
УстановитьАтрибут(УзелПараметра, "Имя", "ИмяНужногоВида");
ЗаписатьЭлемент(УзелПараметра, "Значение", "Продукция");

// Вставляем узел в начало приемника
Приемник.insertBefore(УзелПараметра, Приемник.firstChild);

Этот метод позволяет передать произвольную информацию, которую потом можно перехватить в 1С 8.х через ПараметрыОбъекта. Однако стоит учитывать, что штатная выгрузка 7.7 из КД 2.1 требует осторожности при работе с DOM-моделью XML, чтобы не нарушить структуру файла.

Сравнение подходов и рекомендации

Разберем, почему первый метод (через ВходящиеДанные) предпочтительнее:

Если же вы решите использовать второй метод или программную подстановку ГУИДов, убедитесь, что в ПКО приемника отключена опция «Генерировать новый номер или код, если он не задан», чтобы избежать создания дублей при повторных выгрузках.

Таким образом, мы выяснили, что отсутствие справочника в источнике 7.7 не является препятствием для качественной настройки обмена. Использование СписокЗначений для эмуляции структуры данных и механизм ВходящиеДанные позволяют реализовать гибкую и чистую логику переноса данных, соответствующую стандартам разработки на платформе 1С.

← На главную