При настройке обмена данными между конфигурациями 1С (например, при переносе справочника «Контрагенты» из «Управление торговлей 10.3» в «Бухгалтерия предприятия 2.0») разработчики часто сталкиваются с неприятной ситуацией. Несмотря на то, что правила конвертации свойств (ПКС) для кода настроены, в базе-приемнике коды элементов создаются автоматически (по порядку) либо вовсе записываются пустыми. В этой статье мы подробно разберем, почему это происходит, как устроены механизмы платформы 1С и конфигурации «Конвертация данных 2.1», и как настроить правила так, чтобы коды переносились «один в один» из источника в приемник.
Для начала проанализируем внутренние механизмы платформы 1С и обработки «Универсальный обмен данными XML», которая отвечает за выгрузку и загрузку данных. Существует три основные причины, по которым оригинальный код элемента справочника может заменяться на новый или очищаться при загрузке:
УстановитьНовыйКод() платформы 1С. Этот метод генерирует код на основании последнего записанного в базе-приемнике, полностью игнорируя то значение, которое было выгружено из источника.ОбменДанными.Загрузка присваивается значение Истина. Это отключает большинство стандартных проверок и автогенерацию кодов при записи на уровне платформы. Однако, если загрузка выполняется напрямую через COM-соединение или в модуле справочника (либо в подписках на события) базы-приемника прописан обход проверки режима загрузки, то при вызове метода Записать() платформа автоматически сгенерирует новый код.Рассмотрим последовательность действий, которая позволит гарантированно перенести оригинальные коды справочника из источника в приемник.
Первым делом нам необходимо отключить системную автогенерацию кодов для нужного справочника в правилах обмена. Выполним следующие действия:
Важно понимать: если мы просто снимем этот флаг, но само правило конвертации свойства (ПКС) для кода не передаст значение, элемент запишется в базу-приемник с пустым кодом. Поэтому переходим к следующему шагу.
Убедимся, что значение кода корректно передается из источника. Для этого проанализируем таблицу конвертации свойств внутри нашего ПКО:
Код сопоставлено со свойством приемника Код.Если автоматическое сопоставление свойств по какой-то причине дает сбой (например, при выгрузке напрямую через COM-соединение контекст источника может быть частично утерян), мы можем принудительно передать значение кода через обработчик события.
Для этого откроем ПКС для свойства Код, перейдем в обработчик события «Перед выгрузкой» и напишем следующий код:
Значение = СокрЛП(Источник.Код);
Использование функции СокрЛП() крайне важно: она удаляет лишние пробелы в начале и в конце строки. Это предотвратит ситуации, когда код не записывается из-за несоответствия формата длины строки в приемнике.
Если код по-прежнему заменяется или очищается, нам необходимо проверить обработчики событий самого ПКО, которые выполняются на стороне базы-приемника. Перейдем на вкладку «Обработчики событий» в ПКО «Контрагенты» и проанализируем код в следующих событиях:
Ищите строки кода, которые могут принудительно изменять реквизиты загружаемого объекта. Шаблонные правила обмена часто содержат вызовы функций автонумерации. Например, там может быть написан подобный код:
// Пример опасного кода в обработчике, который затирает оригинальный код:
Объект.УстановитьНовыйКод(ПараметрыНастройки.Префикс);
Если вы обнаружили такой код, его необходимо закомментировать или ограничить условием проверки на то, заполнен ли уже код, пришедший из источника:
Если Не ЗначениеЗаполнено(Объект.Код) Тогда
Объект.УстановитьНовыйКод();
КонецЕсли;
Если вы зашли в тупик и не понимаете, на каком этапе (выгрузки или загрузки) пропадает код, воспользуйтесь проверенным алгоритмом локализации проблемы.
Даже если в рабочей среде вы используете прямое COM-соединение между базами, для теста выполните выгрузку данных в обычный XML-файл. Откройте полученный файл в любом текстовом редакторе (например, Notepad++) и найдите выгруженный узел контрагента.
Посмотрим на структуру выгруженного объекта в XML:
<Объект Тип="СправочникСсылка.Контрагенты">
<Свойство Имя="Код" Тип="Строка">
<Значение>000000125</Значение>
</Свойство>
...
</Объект>
Анализируем результат:
Для быстрой отладки без запуска полноценного отладчика 1С мы можем использовать вывод сообщений в окно сообщений пользователю. Добавим в обработчик ПКС «Код» «Перед выгрузкой» вывод информации:
Сообщить("Выгружается код для контрагента " + Источник.Наименование + ": " + Источник.Код);
Аналогично, в обработчике ПКО «При загрузке» мы можем проверить, дошло ли значение до приемника:
Сообщить("Загружен код контрагента: " + Объект.Код);
Если в окне сообщений при загрузке вы увидите правильный код, а после открытия карточки контрагента в режиме «1С:Предприятие» код окажется другим — это стопроцентное подтверждение того, что код перезаписывается в транзакции записи объекта внутри самой базы-приемника (работает код модуля справочника или подписки на события).
Перенос оригинальных кодов справочников в «1С:Конвертация данных 2.1» — это простая задача, если понимать последовательность работы механизмов КД. Отключив автоматическое генерирование кодов в настройках ПКО, настроив явную передачу свойства в ПКС и очистив обработчики событий загрузки от принудительной префиксации, вы добьетесь идеального переноса данных «один в один».