Как устранить ошибку нулевого количества при пересчете единиц измерения при переносе данных из БП в КА или ERP?

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

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

Анализ архитектурных различий систем

Для начала проанализируем, почему возникает эта техническая коллизия. В конфигурации «Бухгалтерия предприятия 3.0» учет ведется в простых единицах измерения, которые ссылаются на справочник КлассификаторЕдиницИзмерения (ОКЕИ). Структура справочников здесь линейна: у номенклатуры есть базовая единица, и она едина для всей базы.

В современных ERP-системах (КА 2.x, ERP 2.x) логика значительно сложнее. Вместо простых единиц измерения используются упаковки. Рассмотрим ключевые отличия:

  1. Справочник УпаковкиЕдиницыИзмерения: Этот справочник является подчиненным. Его владельцем может выступать либо конкретная позиция справочника Номенклатура (индивидуальные упаковки), либо справочник НаборыУпаковок (общие упаковки для группы товаров).
  2. Связанные реквизиты в табличных частях: В документах КА/ERP для корректного расчета складских остатков и себестоимости используются одновременно три реквизита: Упаковка, КоличествоУпаковок и Количество (базовое).
  3. Коэффициенты пересчета: Каждая упаковка содержит коэффициент относительно базовой единицы хранения. Ошибка «нулевое количество» возникает именно тогда, когда система не может вычислить базовое количество, так как связь между упаковкой, номенклатурой и коэффициентом разорвана или не заполнена.

Выясняем причину: почему «ручной перевыбор» помогает?

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

При программной загрузке данных через механизм «Конвертация данных» эти экранные обработчики не запускаются. В базу записываются только те данные, которые были непосредственно переданы в файле выгрузки. Если вы перенесли только ссылку на упаковку, но не рассчитали Количество, проведение документа станет невозможным.

Решение проблемы через настройку правил конвертации (КД 2.1)

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

Шаг 1: Правильная конвертация справочника упаковок

Основная ошибка заключается в попытке напрямую сопоставить КлассификаторЕдиницИзмерения из БП со справочником УпаковкиЕдиницыИзмерения в КА. Поскольку второй справочник подчинен номенклатуре, в ПКО (Правила конвертации объектов) для упаковок необходимо обязательно настроить поиск по Владельцу.

В настройках ПКО для упаковок включите поля поиска: Наименование (или Код) и Владелец. В качестве владельца должна передаваться ссылка на номенклатуру, которая конвертируется в текущем контексте.

Шаг 2: Синхронное заполнение реквизитов табличной части

В правилах конвертации документа (например, ТребованиеНакладная -> ПередачаМатериаловВПроизводство) в ПКС (Правила конвертации свойств) для табличной части Товары (или Материалы) необходимо обеспечить выгрузку следующих полей:

Если в исходном документе БП нет разделения на упаковки и базовые единицы, то в КоличествоУпаковок и Количество передается одно и то же значение, а в Упаковка — базовая единица хранения номенклатуры.

Шаг 3: Использование обработчика «ПослеЗагрузки»

Чтобы гарантировать корректность данных и заполнение всех внутренних механизмов КА (таких как знаменатели единиц измерения), рекомендуется прописать принудительный пересчет в обработчике ПослеЗагрузки самого документа. Рассмотрим пример кода, который можно использовать в правилах загрузки:


Для Каждого СтрокаТЧ Из Объект.Материалы Цикл
    
    // Проверяем наличие упаковки
    Если ЗначениеЗаполнено(СтрокаТЧ.Упаковка) Тогда
        // Если упаковка заполнена, получаем её коэффициент
        // В КА 2.x коэффициент обычно хранится в самой упаковке
        Коэффициент = СтрокаТЧ.Упаковка.Коэффициент;
        Если Коэффициент = 0 Тогда
            Коэффициент = 1;
        КонецЕсли;
        
        // Принудительно рассчитываем количество
        СтрокаТЧ.Количество = СтрокаТЧ.КоличествоУпаковок * Коэффициент;
    Иначе
        // Если упаковок нет, количество равно количеству упаковок (базовые единицы)
        СтрокаТЧ.Количество = СтрокаТЧ.КоличествоУпаковок;
    КонецЕсли;
    
КонецЦикла;

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

Важные нюансы и рекомендации

Проанализируем еще несколько важных моментов, которые могут влиять на результат проведения:

Таким образом, решение задачи сводится к двум аспектам: соблюдению иерархии справочников (Упаковка должна принадлежать Номенклатуре) и полноте данных в табличной части (заполнение и количества, и количества упаковок). Использование обработчика ПослеЗагрузки является наиболее надежным способом "оживить" перенесенный документ, имитируя действия пользователя по заполнению формы.

← На главную