Как решить проблему с обменом УТ-БП, когда документ не переносится из-за длины номера?

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

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

В этой статье мы подробно проанализируем, почему возникает ошибка Поле Номер полученного объекта имеет некорректное значение. Загрузка не возможна, разберем методологические причины ее появления и рассмотрим несколько практических способов решения этой проблемы: от простого изменения метаданных до программирования правил обмена в формате XDTO.

---

Почему возникает эта ошибка?

При обмене данными через универсальный формат EnterpriseData (на что указывает обработчик ПриКонвертацииДанныхXDTO в системном логе) библиотека стандартных подсистем (БСП) выполняет строгую валидацию входящих XML-данных перед записью объекта в базу-приемник. В стандартной конфигурации 1С:Бухгалтерия предприятия редакции 3.0 длина системного реквизита Номер для документа Поступление (акт, накладная) (в конфигураторе — ПоступлениеТоваровУслуг) по умолчанию ограничена 11 символами.

Если в базе-источнике (УТ) документу присвоен длинный номер, например, 01/202002190379 (14 символов) или более, то при попытке загрузить его в БП валидатор XDTO определяет, что значение превышает допустимую длину поля в метаданных приемника. В результате транзакция прерывается, и в журнал регистрации записывается ошибка.

---

Методологическая ошибка: разница между внутренним и входящим номером

Прежде чем переходить к техническим решениям, важно понять методологическую суть проблемы. В программных продуктах 1С у входящих документов (таких как поступление товаров и услуг от поставщика) есть два разных реквизита:

  1. Внутренний номер документа (системный реквизит Номер) — используется исключительно для внутреннего учета, сортировки и обеспечения уникальности записей в вашей базе данных 1С. По умолчанию он имеет длину 11 символов и генерируется автоматически.
  2. Номер входящего документа (реквизит НомерВходящегоДокумента) — это реальный номер накладной или акта, который вам предоставил поставщик. Его длина в конфигурации «Бухгалтерия предприятия» составляет от 30 до 50 символов, что позволяет вводить любые сложные комбинации знаков.

Часто пользователи в базе-источнике (УТ) вручную записывают длинный номер поставщика непосредственно в поле Номер, вместо того чтобы вносить его в поле входящего документа. При переносе данных это приводит к конфликту ограничений метаданных.

Если изменить бизнес-процесс заполнения документов на стороне источника невозможно, рассмотрим технические варианты устранения проблемы.

---

Вариант решения №1: Изменение длины номера в конфигураторе (прямое изменение метаданных)

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

Рассмотрим этот процесс по шагам:

  1. Откройте базу 1С:Бухгалтерия предприятия в режиме Конфигуратор.
  2. В меню Конфигурация выберите пункт Открыть конфигурацию (если она еще не открыта).
  3. Если конфигурация находится на поддержке, включите возможность изменения через меню Конфигурация -> Поддержка -> Настройка поддержки. Обратите внимание, что для этого потребуется установить статус «Редактируется с сохранением поддержки» для нужного документа.
  4. В дереве метаданных найдите ветку Документы и выберите документ ПоступлениеТоваровУслуг (в пользовательском интерфейсе он называется «Поступление (акт, накладная)»).
  5. Нажмите на документ правой кнопкой мыши и выберите пункт Свойства.
  6. В палитре свойств найдите раздел Основные и поле Длина номера.
  7. Измените стандартное значение 11 на необходимое (например, 25 или 30).
  8. Обновите конфигурацию базы данных (клавиша F7) и подтвердите изменения метаданных.

Важное предупреждение: Данный способ имеет существенный недостаток. Изменение метаданных напрямую в основной конфигурации снимает объект с полной поддержки. Это может усложнить процесс последующих обновлений программы (потребуется ручное объединение при обновлении релиза).

---

Вариант решения №2: Использование расширения конфигурации (Рекомендуемый способ)

Если вы используете платформу 1С:Предприятие версии 8.3.22 и выше, вы можете изменить длину номера документа, не снимая основную конфигурацию с поддержки. Для этого используются механизмы расширения конфигурации.

Проанализируем этот современный подход:

  1. В конфигураторе БП перейдите в меню Конфигурация -> Расширения конфигурации.
  2. Добавьте новое расширение (укажите назначение «Адаптация» или «Дополнение»).
  3. В основном дереве метаданных найдите документ ПоступлениеТоваровУслуг, нажмите на него правой кнопкой мыши и выберите команду Добавить в расширение.
  4. Перейдите в дерево объектов созданного расширения, найдите добавленный документ и откройте его свойства.
  5. В свойствах документа в расширении увеличьте параметр Длина номера до нужного размера (например, до 25 символов).
  6. Сохраните расширение и обновите базу данных.

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

---

Вариант решения №3: Переопределение сопоставления полей через правила обмена (КД 3.0)

Наиболее правильным решением с точки зрения архитектуры систем является перенаправление данных в процессе обмена. Мы можем сделать так, чтобы длинный номер из УТ при загрузке в БП автоматически записывался в реквизит НомерВходящегоДокумента, а системный номер БП генерировался автоматически в пределах стандартных 11 символов.

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


Процедура ПередЗаписьюПолученныхДанных(ПолученныеДанные, ДокументОбъект, КомпонентОбмена) Экспорт
    
    // Проверяем, что обрабатываемый объект является поступлением товаров и услуг
    Если ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.ПоступлениеТоваровУслуг") Тогда
        
        // Анализируем длину номера, пришедшего из базы-источника
        Если СтрДлина(ДокументОбъект.Номер) > 11 Тогда
            
            // Если реквизит входящего номера пуст, переносим туда оригинальный длинный номер
            Если ПустаяСтрока(ДокументОбъект.НомерВходящегоДокумента) Тогда
                ДокументОбъект.НомерВходящегоДокумента = ДокументОбъект.Номер;
            КонецЕсли;
            
            // Очищаем системный номер, чтобы сработал механизм автонумерации БП,
            // либо принудительно обрезаем его до допустимых 11 символов
            ДокументОбъект.Номер = ""; 
            
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

Этот код позволяет полностью избежать модификации структуры метаданных базы данных. Все длинные номера поставщиков будут корректно сохранены в предназначенном для этого поле НомерВходящегоДокумента, а системные номера документов БП останутся в рамках стандартной сквозной нумерации.

← На главную