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