Как настроить перенос оригинальных кодов справочников в 1С:Конвертация данных 2.1 и отключить автогенерацию

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

При настройке обмена данными между конфигурациями 1С (например, при переносе справочника «Контрагенты» из «Управление торговлей 10.3» в «Бухгалтерия предприятия 2.0») разработчики часто сталкиваются с неприятной ситуацией. Несмотря на то, что правила конвертации свойств (ПКС) для кода настроены, в базе-приемнике коды элементов создаются автоматически (по порядку) либо вовсе записываются пустыми. В этой статье мы подробно разберем, почему это происходит, как устроены механизмы платформы 1С и конфигурации «Конвертация данных 2.1», и как настроить правила так, чтобы коды переносились «один в один» из источника в приемник.

Почему код справочника перезаписывается или очищается в базе-приемнике?

Для начала проанализируем внутренние механизмы платформы 1С и обработки «Универсальный обмен данными XML», которая отвечает за выгрузку и загрузку данных. Существует три основные причины, по которым оригинальный код элемента справочника может заменяться на новый или очищаться при загрузке:

  1. Флаг «Автоматическое генерирование кода» в ПКО. В настройках правила конвертации объекта (ПКО) на вкладке «Настройки» присутствует важный флаг «Автоматическое генерирование кода при создании нового элемента». Если этот флаг установлен, то при загрузке нового объекта обработка обмена принудительно вызывает метод УстановитьНовыйКод() платформы 1С. Этот метод генерирует код на основании последнего записанного в базе-приемнике, полностью игнорируя то значение, которое было выгружено из источника.
  2. Переопределение кодов в обработчиках событий КД. Если вы используете или модифицируете типовые правила обмена, в них почти наверняка заложена логика префиксации. В обработчиках событий ПКО «При загрузке» или «После загрузки» разработчики часто прописывают вызовы общих модулей для установки префиксов базы-приемника или организации. Этот код переопределяет оригинальный код, пришедший из файла обмена.
  3. Срабатывание подписок на события и кода модуля объекта в приемнике. При стандартной загрузке через КД свойству объекта ОбменДанными.Загрузка присваивается значение Истина. Это отключает большинство стандартных проверок и автогенерацию кодов при записи на уровне платформы. Однако, если загрузка выполняется напрямую через COM-соединение или в модуле справочника (либо в подписках на события) базы-приемника прописан обход проверки режима загрузки, то при вызове метода Записать() платформа автоматически сгенерирует новый код.

Пошаговое руководство по настройке сохранения кодов

Рассмотрим последовательность действий, которая позволит гарантированно перенести оригинальные коды справочника из источника в приемник.

Шаг 1. Проверка и настройка ПКО (Правила конвертации объекта)

Первым делом нам необходимо отключить системную автогенерацию кодов для нужного справочника в правилах обмена. Выполним следующие действия:

  1. Откроем правила обмена в конфигурации «Конвертация данных 2.1».
  2. Найдем нужное ПКО (в нашем примере — ПКО для справочника «Контрагенты»).
  3. Перейдем на вкладку «Настройки».
  4. Найдем флаг «Автоматическое генерирование кода при создании нового элемента» (в некоторых версиях КД он называется «Автоматическое присвоение кодов») и снимем его.
  5. Сохраним изменения в ПКО.

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

Шаг 2. Настройка ПКС (Правила конвертации свойства) для реквизита «Код»

Убедимся, что значение кода корректно передается из источника. Для этого проанализируем таблицу конвертации свойств внутри нашего ПКО:

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

Шаг 3. Использование обработчика «Перед выгрузкой» для ПКС

Если автоматическое сопоставление свойств по какой-то причине дает сбой (например, при выгрузке напрямую через COM-соединение контекст источника может быть частично утерян), мы можем принудительно передать значение кода через обработчик события.

Для этого откроем ПКС для свойства Код, перейдем в обработчик события «Перед выгрузкой» и напишем следующий код:

Значение = СокрЛП(Источник.Код);

Использование функции СокрЛП() крайне важно: она удаляет лишние пробелы в начале и в конце строки. Это предотвратит ситуации, когда код не записывается из-за несоответствия формата длины строки в приемнике.

Шаг 4. Анализ обработчиков событий загрузки

Если код по-прежнему заменяется или очищается, нам необходимо проверить обработчики событий самого ПКО, которые выполняются на стороне базы-приемника. Перейдем на вкладку «Обработчики событий» в ПКО «Контрагенты» и проанализируем код в следующих событиях:

Ищите строки кода, которые могут принудительно изменять реквизиты загружаемого объекта. Шаблонные правила обмена часто содержат вызовы функций автонумерации. Например, там может быть написан подобный код:


// Пример опасного кода в обработчике, который затирает оригинальный код:
Объект.УстановитьНовыйКод(ПараметрыНастройки.Префикс);

Если вы обнаружили такой код, его необходимо закомментировать или ограничить условием проверки на то, заполнен ли уже код, пришедший из источника:


Если Не ЗначениеЗаполнено(Объект.Код) Тогда
    Объект.УстановитьНовыйКод();
КонецЕсли;

Как локализовать проблему с помощью отладки?

Если вы зашли в тупик и не понимаете, на каком этапе (выгрузки или загрузки) пропадает код, воспользуйтесь проверенным алгоритмом локализации проблемы.

Метод 1. Промежуточный выгрузка в XML-файл

Даже если в рабочей среде вы используете прямое COM-соединение между базами, для теста выполните выгрузку данных в обычный XML-файл. Откройте полученный файл в любом текстовом редакторе (например, Notepad++) и найдите выгруженный узел контрагента.

Посмотрим на структуру выгруженного объекта в XML:


<Объект Тип="СправочникСсылка.Контрагенты">
    <Свойство Имя="Код" Тип="Строка">
        <Значение>000000125</Значение>
    </Свойство>
    ...
</Объект>

Анализируем результат:

Метод 2. Использование вывода сообщений в обработчиках

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


Сообщить("Выгружается код для контрагента " + Источник.Наименование + ": " + Источник.Код);

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

Сообщить("Загружен код контрагента: " + Объект.Код);

Если в окне сообщений при загрузке вы увидите правильный код, а после открытия карточки контрагента в режиме «1С:Предприятие» код окажется другим — это стопроцентное подтверждение того, что код перезаписывается в транзакции записи объекта внутри самой базы-приемника (работает код модуля справочника или подписки на события).

Резюме

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

← На главную