Как массово изменить префиксы документов и справочников при переносе данных в 1С:Конвертация данных 2.1?

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

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

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

Почему не работает стандартное изменение «Объект.Номер» при выгрузке?

Начинающие специалисты часто совершают одну и ту же ошибку: пытаются изменить номер или код объекта в обработчиках выгрузки (например, «Перед выгрузкой» или «При выгрузке» ПКО) прямым присвоением:


// Ошибка! Этот код не изменит номер в файле выгрузки XML
Объект.Номер = "ИК" + Сред(Источник.Номер, 3);

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

Также в глобальных обработчиках выгрузки у нас нет прямого доступа к переменной Значение, которая отвечает за итоговую запись реквизита в XML-файл. Переменная Значение доступна локально только внутри конкретного ПКС. Заходить в ПКС каждого документа и прописывать индивидуальный код — это колоссальные затраты времени. Рассмотрим, как сделать это быстро и глобально.

---

Способ 1. Использование глобального обработчика «После загрузки объекта» (На стороне приемника)

Это самый простой и быстрый способ, если вам необходимо изменить префиксы только в базе-приемнике, не внося никаких изменений в логику работы базы-источника. Мы перехватим объект сразу после его чтения из XML-файла, но до момента его физической записи в базу данных приемника.

Для этого мы воспользуемся глобальным обработчиком конвертации. Давайте разберем этот процесс по шагам:

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

// Проверяем тип загружаемого объекта
Если ИмяТипаОбъекта = "Документ" Тогда
    
    // Проверяем длину номера во избежание ошибок выхода за границы строки
    Если СтрДлина(Объект.Номер) > 2 Тогда
        // Срезаем старый префикс (первые 2 символа) и добавляем новый "ИК"
        Объект.Номер = "ИК" + Сред(Объект.Номер, 3);
    КонецЕсли;

ИначеЕсли ИмяТипаОбъекта = "Справочник" Тогда
    
    // Для справочников аналогично меняем Код
    Если СтрДлина(Объект.Код) > 2 Тогда
        Объект.Код = "ИК" + Сред(Объект.Код, 3);
    КонецЕсли;

КонецЕсли;

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

Ограничение метода: Этот способ идеально работает в том случае, если сопоставление (поиск) объектов в правилах обмена настроено по Уникальному идентификатору (УИД). Если же поиск у вас настроен по полям «Номер + Дата» для документов или «Код» для справочников, то при повторном переносе система не сможет сопоставить объекты (так как в XML передается старый номер из источника, а в базе приемника он уже изменен на префикс "ИК") и создаст дубли. Для обхода этого ограничения используйте второй способ.

---

Способ 2. Использование механизма «Алгоритмов» (На стороне источника при выгрузке)

Если вам требуется, чтобы новые префиксы были прописаны непосредственно в самом XML-файле выгрузки (чтобы поиск по коду/номеру при загрузке работал корректно), но при этом вы не хотите дублировать код в ПКС каждого объекта, лучшим решением станет использование встроенного механизма «Алгоритмы».

Алгоритмы в КД 2.1 — это общие процедуры, которые можно объявить один раз, а затем вызывать из любых обработчиков одной строкой кода. Разберем, как это реализовать:

  1. В левом дереве метаданных конфигурации «Конвертация данных» найдите раздел «Алгоритмы».
  2. Создайте новый алгоритм и назовите его, например, СформироватьНовыйНомер.
  3. В поле «Текст алгоритма» напишите следующий код:

// Переменная 'Значение' предопределена в контексте выполнения ПКС "Перед выгрузкой"
Если ЗначениеЗаполнено(Значение) Тогда
    // Заменяем старый префикс на "ИК"
    Значение = "ИК" + Сред(Значение, 3);
КонецЕсли;

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

Выполнить(Алгоритмы.СформироватьНовыйНомер);

В чем главное преимущество этого подхода? Архитектурная гибкость. Если завтра ваш заказчик или руководство примет решение изменить префикс переноса с "ИК" на "АК", вам не придется заходить в десятки ПКС и переписывать код. Вы просто откроете созданный алгоритм СформироватьНовыйНомер, измените префикс в одной строке, и изменения мгновенно вступят в силу для всей конвертации.

---

Дополнительные рекомендации по работе с префиксами

При массовом изменении префиксов рекомендуем также обратить внимание на следующие нюансы:

Мы рассмотрели два надежных и гибких инструмента для решения задачи перепрефиксации. Выбирайте первый способ для быстрой одноразовой загрузки по УИД, или второй способ — для создания надежной, легко масштабируемой и контролируемой системы обмена данными.

← На главную