При настройке и обновлении обмена между конфигурациями «1С:Управление торговлей 11» и «1С:Бухгалтерия предприятия 3.0» разработчики нередко сталкиваются с ситуацией, когда привычные механизмы обмена по правилам конвертации перестают функционировать, а при переходе на универсальный формат EnterpriseData загрузка прерывается с ошибкой вида: «Номер полученного объекта имеет некорректное значение». Разберем по шагам, почему это происходит, как устроена работа форматов обмена и какими способами можно быстро устранить неполадку.
Проанализируем архитектурные изменения в типовых конфигурациях. Начиная с релизов ветки 3.0.44 в «Бухгалтерии предприятия» классический обмен по правилам конвертации данных 2.0 (через отдельные XML-файлы правил) был признан устаревшим и выведен из типовой поставки. На смену ему пришел обмен через универсальный формат данных (EnterpriseData / КД 3.0).
Попытка вернуть старый обмен простым добавлением строки в общем модуле ОбменДаннымиПереопределяемый в процедуре ПолучитьПланыОбмена():
ПланыОбменаПодсистемы.Добавить(Метаданные.ПланыОбмена.ОбменУправлениеТорговлейБухгалтерияПредприятияКОРП30);
не приведет к успеху. В типовой конфигурации удалены или переработаны вспомогательные обработчики, формы настроек узлов и модули загрузки старых правил. Система принудительно направляет потоки обмена через план обмена СинхронизацияДанныхЧерезУниверсальныйФормат.
Если вам критически важно продолжать использовать правила КД 2.0 без перехода на EnterpriseData, штатная подсистема БСП уже не подойдет. Единственным рабочим решением останется регулярный запуск внешней обработки «Универсальный обмен данными в формате XML» вручную или через отдельное регламентное задание с передачей параметров выгрузки и загрузки.
Рассмотрим распространенное заблуждение: при анализе ошибки разработчики часто предполагают, что сбой вызван несовпадением подверсий формата, например, когда в УТ используется EnterpriseData версии 1.2.1, а в БП — 1.2.2. Это не так. Подсистема обмена через универсальный формат в библиотеке стандартных подсистем (БСП) обладает встроенной обратной совместимостью в рамках одной основной ветки (в данном случае 1.2). База-приемник с более свежей версией схемы корректно распознает и обрабатывает структуры данных младшей подверсии, поэтому экстренно обновлять конфигурацию только ради подверсии формата схемы нет необходимости.
Выясним причину остановки загрузки документа «Счет на оплату покупателю». В типовой конфигурации БП 3.0 длина стандартного реквизита Номер для документа СчетНаОплатуПокупателю составляет 11 символов. Если в конфигурации «Управление торговлей» длина номера связанного документа (например, ЗаказКлиента) превышает это значение (например, составляет 12 или более символов), платформа не может поместить входящую строку в реквизит приемника и генерирует исключение.
Превышение длины номера в источнике чаще всего возникает по двум причинам:
Если конфигурации находятся на типовой поддержке и дорабатывать их нежелательно, решим проблему административным путем в базе-источнике:
В концепции КД 3.0 правила конвертации хранятся не в файлах XML, а описываются программным кодом в общих модулях (например, МенеджерОбменаЧерезУниверсальныйФормат). Для внесения изменений вовсе не обязательно разворачивать саму конфигурацию «Конвертация данных 3.0» — логику можно переопределить с помощью расширения.
Рассмотрим, как обрезать номер до допустимой длины на стороне БП 3.0. Подключим расширение и перехватим обработчик события перед записью данных для счета на оплату:
&Вместо("ПКО_Документ_СчетНаОплатуПокупателю_ПередЗаписьюПолученныхДанных")
Процедура Расш_ПКО_Документ_СчетНаОплатуПокупателю_ПередЗаписьюПолученныхДанных(КомпонентыОбмена, ПолученныеДанные, Объект, ДанныеXDTO)
// Вызываем оригинальную обработку
ПродолжитьВызов(КомпонентыОбмена, ПолученныеДанные, Объект, ДанныеXDTO);
// Проверяем длину номера и при необходимости сокращаем ее
Если СтрДлина(Объект.Номер) > 11 Тогда
Объект.Номер = Прав(Объект.Номер, 11);
КонецЕсли;
КонецПроцедуры
Аналогичным образом обработку можно добавить на стороне источника (УТ 11) в момент выгрузки данных, укорачивая исходящий номер заказа функцией Лев() или Прав() перед формированием сообщения EnterpriseData.
Если база «Бухгалтерия предприятия» уже снята с полной поддержки и допускает изменения структуры метаданных, решим задачу через конфигуратор:
СчетНаОплатуПокупателю.Номер.Длина (например, с 11 до 12 или 15 символов), чтобы оно гарантированно вмещало входящие номера из УТ 11.После увеличения длины реквизита в приемнике ошибка формата исчезнет, а загрузка данных завершится успешно без изменения логики правил обмена.