При организации обмена данными между различными конфигурациями (например, УПП 1.3 и ERP 2.5/УП) программисты часто сталкиваются с проблемой «разрастания» номера документа. Суть проблемы заключается в том, что при каждом цикле обмена к номеру документа (например, ПеремещениеТоваров) принудительно добавляется префикс информационной базы. В итоге номер вида «Ю0000004140» превращается в «УТУПУТЮ004140», а затем и вовсе перестает помещаться в отведенную длину строки, обрезая значащие цифры. Разберем подробно, почему это происходит и как это исправить.
Прежде чем переходить к коду, проанализируем механизм работы платформы 1С. Когда объект загружается через механизм Конвертации данных 2.0 (КД2), платформа устанавливает свойство ОбменДанными.Загрузка = Истина. Это должно отключать большинство проверок и автоматических действий, в том числе и автоматическую установку нового номера. Однако префиксы могут продолжать добавляться по нескольким причинам:
Номер включено обновление свойства у существующих объектов.ПриЗагрузке или ПослеЗагрузки вызывается метод Объект.Записать(), когда объект еще не полностью заполнен, система может инициировать механизм префиксации.ОбменДанными.Загрузка.Первым делом проанализируем настройки самих правил обмена. Самый простой и эффективный способ остановить бесконечное изменение номера — запретить его перезапись для уже существующих в базе-приемнике объектов.
Рассмотрим по шагам, что нужно сделать в конфигурации «Конвертация данных»:
ПеремещениеТоваров).Номер.Это гарантирует, что если документ уже был один раз загружен с номером «Ю0000004140», то при повторных обменах (даже если номер в файле обмена изменился на «УТЮ...») в приемнике останется первоначальное значение. Однако это решение не поможет, если объект создается впервые и сразу с «кривым» префиксом.
Чтобы в базу-приемник всегда приходил «чистый» номер, мы можем использовать программную обработку значения перед его попаданием в файл выгрузки. Для этого в ПКС реквизита Номер в обработчике «Перед выгрузкой» напишем следующий код:
// Получаем чистый номер без префиксов информационной базы и организации
// Используем типовую функцию, если она доступна в конфигурации
Если ТипЗнч(Источник) = Тип("ДокументСсылка.ПеремещениеТоваров") Тогда
Значение = ОбщегоНазначения.ПолучитьНомерНаПечать(Источник);
Иначе
Значение = Источник.Номер;
КонецЕсли;
Если вы хотите просто передать номер «как есть», без вмешательства механизмов платформы при выгрузке, используйте прямое присваивание в том же обработчике:
Значение = Источник.Номер;
Важно помнить: если в приемнике длина номера меньше, чем в источнике (с учетом накопленных префиксов), платформа принудительно обрежет строку, что может привести к дублям номеров.
Проанализируем ситуацию, описанную в одном из сообщений форума: иногда разработчики добавляют в обработчик ПриЗагрузке код, который записывает объект раньше времени. Это критическая ошибка для нумерации.
Рассмотрим пример ошибочного кода в обработчике «ПриЗагрузке»:
// ОШИБОЧНЫЙ КОД
Если Объект.Проведен Тогда
Объект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
КонецЕсли;
Почему это плохо? В момент срабатывания ПриЗагрузке объект еще может не иметь заполненных реквизитов (например, организации), на основе которых строится префикс. Вызов метода Записать() заставляет систему генерировать номер или пересчитывать префиксы для «недозаполненного» объекта.
Как исправить: Добавьте проверку на то, является ли объект новым, и убедитесь, что вы не вызываете Записать() без крайней необходимости до завершения загрузки всех свойств.
Если правка правил КД2 не помогает, необходимо проверить модуль самого документа в конфигурации-приемнике. Разберем, как должна выглядеть процедура ПриУстановкеНовогоНомера в модуле документа или в подписке на событие:
Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
// Если идет загрузка данных, блокируем стандартные механизмы изменения номера
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Дальнейшая логика установки префикса...
КонецПроцедуры
Проверьте также подписки на события, такие как ПрефиксацияОбъектовСобытия.УстановитьПрефиксИнформационнойБазы. Если в конфигурации ERP/УП внедрена БСП, убедитесь, что настройки синхронизации данных для узла обмена содержат корректные префиксы. Если префикс базы в настройках обмена совпадает с префиксом, который вы пытаетесь передать, система может считать его «чужим» и добавлять свой сверху.
Посмотрим на технический аспект: в 1С:УПП длина номера документа часто составляет 11 символов, а в ERP она может быть другой. Проанализируем ситуацию: если номер в источнике уже переполнен префиксами, его длина может составлять, например, 15 символов. При попытке записать его в поле длиной 11 символов, платформа отсечет правую часть (цифры), оставив только префиксы.
Чтобы этого избежать, мы рекомендуем:
ОбщегоНазначения.ПолучитьНомерНаПечать(), чтобы передавать в файл обмена только значащую цифровую часть и префикс организации, позволяя приемнику самому решить, какой префикс ИБ добавить (если это необходимо).Таким образом, комплексный подход, включающий настройку ПКС (запрет замещения) и аудит обработчиков загрузки на предмет лишних вызовов Записать(), позволяет полностью устранить проблему «разрастающихся» префиксов и сохранить целостность нумерации в обеих информационных базах.