Как устранить ошибку дублирования префиксов при обмене данными между УПП и ERP через КД 2.0?

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

При организации обмена данными между различными конфигурациями (например, УПП 1.3 и ERP 2.5/УП) программисты часто сталкиваются с проблемой «разрастания» номера документа. Суть проблемы заключается в том, что при каждом цикле обмена к номеру документа (например, ПеремещениеТоваров) принудительно добавляется префикс информационной базы. В итоге номер вида «Ю0000004140» превращается в «УТУПУТЮ004140», а затем и вовсе перестает помещаться в отведенную длину строки, обрезая значащие цифры. Разберем подробно, почему это происходит и как это исправить.

Выясним причину возникновения ошибки

Прежде чем переходить к коду, проанализируем механизм работы платформы 1С. Когда объект загружается через механизм Конвертации данных 2.0 (КД2), платформа устанавливает свойство ОбменДанными.Загрузка = Истина. Это должно отключать большинство проверок и автоматических действий, в том числе и автоматическую установку нового номера. Однако префиксы могут продолжать добавляться по нескольким причинам:

  1. Некорректная настройка ПКС: В правилах конвертации свойств (ПКС) для реквизита Номер включено обновление свойства у существующих объектов.
  2. Принудительная запись в обработчиках: Если в обработчике ПриЗагрузке или ПослеЗагрузки вызывается метод Объект.Записать(), когда объект еще не полностью заполнен, система может инициировать механизм префиксации.
  3. Специфика типовых конфигураций: В современных конфигурациях на базе БСП (как ERP или УП) за префиксацию отвечают подписки на события, которые иногда могут срабатывать в обход стандартного флага загрузки, если в них явно не прописана проверка ОбменДанными.Загрузка.

Решение 1: Настройка ПКС в Конвертации данных 2.0

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

Рассмотрим по шагам, что нужно сделать в конфигурации «Конвертация данных»:

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

Это гарантирует, что если документ уже был один раз загружен с номером «Ю0000004140», то при повторных обменах (даже если номер в файле обмена изменился на «УТЮ...») в приемнике останется первоначальное значение. Однако это решение не поможет, если объект создается впервые и сразу с «кривым» префиксом.

Решение 2: Очистка номера от префиксов при выгрузке

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


// Получаем чистый номер без префиксов информационной базы и организации
// Используем типовую функцию, если она доступна в конфигурации
Если ТипЗнч(Источник) = Тип("ДокументСсылка.ПеремещениеТоваров") Тогда
    Значение = ОбщегоНазначения.ПолучитьНомерНаПечать(Источник);
Иначе
    Значение = Источник.Номер;
КонецЕсли;

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

Значение = Источник.Номер;

Важно помнить: если в приемнике длина номера меньше, чем в источнике (с учетом накопленных префиксов), платформа принудительно обрежет строку, что может привести к дублям номеров.

Решение 3: Проверка обработчиков загрузки в КД2

Проанализируем ситуацию, описанную в одном из сообщений форума: иногда разработчики добавляют в обработчик ПриЗагрузке код, который записывает объект раньше времени. Это критическая ошибка для нумерации.

Рассмотрим пример ошибочного кода в обработчике «ПриЗагрузке»:


// ОШИБОЧНЫЙ КОД
Если Объект.Проведен Тогда
    Объект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
КонецЕсли;

Почему это плохо? В момент срабатывания ПриЗагрузке объект еще может не иметь заполненных реквизитов (например, организации), на основе которых строится префикс. Вызов метода Записать() заставляет систему генерировать номер или пересчитывать префиксы для «недозаполненного» объекта.

Как исправить: Добавьте проверку на то, является ли объект новым, и убедитесь, что вы не вызываете Записать() без крайней необходимости до завершения загрузки всех свойств.

Решение 4: Контроль префиксации в модуле объекта (Приемник)

Если правка правил КД2 не помогает, необходимо проверить модуль самого документа в конфигурации-приемнике. Разберем, как должна выглядеть процедура ПриУстановкеНовогоНомера в модуле документа или в подписке на событие:


Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
    
    // Если идет загрузка данных, блокируем стандартные механизмы изменения номера
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    
    // Дальнейшая логика установки префикса...
КонецПроцедуры

Проверьте также подписки на события, такие как ПрефиксацияОбъектовСобытия.УстановитьПрефиксИнформационнойБазы. Если в конфигурации ERP/УП внедрена БСП, убедитесь, что настройки синхронизации данных для узла обмена содержат корректные префиксы. Если префикс базы в настройках обмена совпадает с префиксом, который вы пытаетесь передать, система может считать его «чужим» и добавлять свой сверху.

Рекомендации по синхронизации длин номеров

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

Чтобы этого избежать, мы рекомендуем:

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

← На главную