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