При выполнении задач по миграции данных между различными конфигурациями 1С, например, при переходе с «1С:Бухгалтерия предприятия» (БП) на «1С:Комплексная автоматизация» (КА) или «1С:ERP Управление предприятием», программисты часто сталкиваются с проблемой корректного переноса единиц измерения. Типичная ситуация: документ перенесен, реквизиты визуально заполнены, но при попытке проведения система выдает ошибку: «Обнаружено нулевое количество при пересчете в единицу хранения». В этой статье мы подробно разберем, почему это происходит и как правильно настроить правила конвертации данных (КД), чтобы избежать ручного перевыбора значений в каждом документе.
Для начала проанализируем, почему возникает эта техническая коллизия. В конфигурации «Бухгалтерия предприятия 3.0» учет ведется в простых единицах измерения, которые ссылаются на справочник КлассификаторЕдиницИзмерения (ОКЕИ). Структура справочников здесь линейна: у номенклатуры есть базовая единица, и она едина для всей базы.
В современных ERP-системах (КА 2.x, ERP 2.x) логика значительно сложнее. Вместо простых единиц измерения используются упаковки. Рассмотрим ключевые отличия:
Номенклатура (индивидуальные упаковки), либо справочник НаборыУпаковок (общие упаковки для группы товаров).Упаковка, КоличествоУпаковок и Количество (базовое).Как отмечается в обсуждении, если в загруженном документе просто перевыбрать ту же самую единицу измерения (упаковку), документ начинает проводиться. Проанализируем ситуацию: в управляемых формах КА/ERP на реквизит Упаковка в табличной части назначен обработчик события ПриИзменении. При интерактивном выборе срабатывает программный код конфигурации, который:
Количество путем умножения КоличествоУпаковок на Коэффициент.При программной загрузке данных через механизм «Конвертация данных» эти экранные обработчики не запускаются. В базу записываются только те данные, которые были непосредственно переданы в файле выгрузки. Если вы перенесли только ссылку на упаковку, но не рассчитали Количество, проведение документа станет невозможным.
Для правильного переноса данных необходимо обеспечить корректное заполнение всех зависимых полей и соблюдение иерархии владельцев. Разберем по шагам, что нужно сделать в правилах конвертации.
Основная ошибка заключается в попытке напрямую сопоставить КлассификаторЕдиницИзмерения из БП со справочником УпаковкиЕдиницыИзмерения в КА. Поскольку второй справочник подчинен номенклатуре, в ПКО (Правила конвертации объектов) для упаковок необходимо обязательно настроить поиск по Владельцу.
В настройках ПКО для упаковок включите поля поиска: Наименование (или Код) и Владелец. В качестве владельца должна передаваться ссылка на номенклатуру, которая конвертируется в текущем контексте.
В правилах конвертации документа (например, ТребованиеНакладная -> ПередачаМатериаловВПроизводство) в ПКС (Правила конвертации свойств) для табличной части Товары (или Материалы) необходимо обеспечить выгрузку следующих полей:
НоменклатураУпаковка (сопоставленная с единицей измерения из БП)КоличествоУпаковок (число из БП)Количество (базовое количество, в БП оно обычно совпадает с количеством в ТЧ)Если в исходном документе БП нет разделения на упаковки и базовые единицы, то в КоличествоУпаковок и Количество передается одно и то же значение, а в Упаковка — базовая единица хранения номенклатуры.
Чтобы гарантировать корректность данных и заполнение всех внутренних механизмов КА (таких как знаменатели единиц измерения), рекомендуется прописать принудительный пересчет в обработчике ПослеЗагрузки самого документа. Рассмотрим пример кода, который можно использовать в правилах загрузки:
Для Каждого СтрокаТЧ Из Объект.Материалы Цикл
// Проверяем наличие упаковки
Если ЗначениеЗаполнено(СтрокаТЧ.Упаковка) Тогда
// Если упаковка заполнена, получаем её коэффициент
// В КА 2.x коэффициент обычно хранится в самой упаковке
Коэффициент = СтрокаТЧ.Упаковка.Коэффициент;
Если Коэффициент = 0 Тогда
Коэффициент = 1;
КонецЕсли;
// Принудительно рассчитываем количество
СтрокаТЧ.Количество = СтрокаТЧ.КоличествоУпаковок * Коэффициент;
Иначе
// Если упаковок нет, количество равно количеству упаковок (базовые единицы)
СтрокаТЧ.Количество = СтрокаТЧ.КоличествоУпаковок;
КонецЕсли;
КонецЦикла;
Этот код гарантирует, что даже если в файле обмена по какой-то причине реквизит Количество пришел пустым или нулевым, он будет рассчитан на стороне приемника исходя из данных упаковки.
Проанализируем еще несколько важных моментов, которые могут влиять на результат проведения:
Упаковка в документе должен оставаться пустым. В этом случае заполняется только Количество.ЕдиницаИзмерения в карточке номенклатуры, которое визуально может выглядеть как упаковка.Владелец выбранной упаковки действительно совпадает с Номенклатурой в этой же строке. Если в поле Упаковка попадет элемент от другой номенклатуры, система выдаст ошибку при проведении, так как не сможет найти правило пересчета.Таким образом, решение задачи сводится к двум аспектам: соблюдению иерархии справочников (Упаковка должна принадлежать Номенклатуре) и полноте данных в табличной части (заполнение и количества, и количества упаковок). Использование обработчика ПослеЗагрузки является наиболее надежным способом "оживить" перенесенный документ, имитируя действия пользователя по заполнению формы.