Как правильно прописать путь к весу номенклатуры и настроить автоматический пересчет в документе 1С

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

При разработке в системе 1С программисты часто сталкиваются с ситуацией, когда данные в табличной части документа отображаются корректно, но при попытке программного обращения к ним возвращается 0 или неопределенное значение. Особенно это актуально для весовых и объемных характеристик номенклатуры. В этой статье мы подробно разберем, как правильно обращаться к данным справочника напрямую из строки документа, как настроить мгновенное обновление итогов и почему условное оформление может не срабатывать для числовых полей.

Разбор обращения к весу через числитель и знаменатель

В современных конфигурациях 1С (таких как УТ 11, ERP 2 или КА) вес номенклатуры часто хранится не в одном поле, а в виде пары реквизитов: ВесЧислитель и ВесЗнаменатель. Это необходимо для обеспечения высокой точности при работе с дробными единицами измерения. Если вы попытаетесь обратиться просто к полю Вес, которое является лишь визуальным представлением в форме, вы можете получить 0.

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


// Получаем вес одной единицы товара
ВесЕдиницы = Строка.Номенклатура.ВесЧислитель / Строка.Номенклатура.ВесЗнаменатель;

// Вычисляем общий объем или вес для всей строки
СуммаОбъема = Строка.Количество * ВесЕдиницы;

Важный нюанс: при таком обращении всегда существует риск деления на ноль, если данные в справочнике заполнены некорректно. Мы рекомендуем всегда добавлять проверку на заполнение знаменателя, чтобы избежать аварийного завершения работы программы:


Знаменатель = Строка.Номенклатура.ВесЗнаменатель;
Числитель = Строка.Номенклатура.ВесЧислитель;

ВесЕдиницы = ?(Знаменатель = 0, 0, Числитель / Знаменатель);
Строка.Вес = ВесЕдиницы; // Записываем в реквизит строки для удобства

Организация автоматического пересчета в форме

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

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

  1. Найдем на форме документа таблицу Товары.
  2. Выберем колонку Количество и перейдем в её свойства.
  3. Создадим (или откроем существующий) обработчик события ПриИзменении.
  4. Внутри этого обработчика вызовем процедуру, которая обходит строки и считает итог.

Пример реализации процедуры пересчета итогов на клиенте:


&НаКлиенте
Процедура ТоварыКоличествоПриИзменении(Элемент)
    
    ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
    
    // Пересчитываем вес конкретной строки
    Если ТекущаяСтрока <> Неопределено Тогда
        Числитель = ТекущаяСтрока.Номенклатура.ВесЧислитель;
        Знаменатель = ТекущаяСтрока.Номенклатура.ВесЗнаменатель;
        ВесЗаЕдиницу = ?(Знаменатель = 0, 0, Числитель / Знаменатель);
        
        ТекущаяСтрока.СуммаВеса = ТекущаяСтрока.Количество * ВесЗаЕдиницу;
    КонецЕсли;
    
    // Вызываем общий пересчет итога по документу
    РассчитатьИтогиВеса();
    
КонецПроцедуры

&НаКлиенте
Процедура РассчитатьИтогиВеса()
    
    ВсегоВес = 0;
    Для Каждого Стр Из Объект.Товары Цикл
        ВсегоВес = ВсегоВес + Стр.СуммаВеса;
    КонецЦикла;
    
    // ИтогоВес - это реквизит формы, выведенный в подвал
    ИтогоВес = ВсегоВес; 
    
КонецПроцедуры

Оптимизация: работа «через точку» и производительность

Выясним причину, по которой обращение Строка.Номенклатура.ВесЧислитель может замедлять работу системы. В 1С каждое обращение «через точку» от ссылки к реквизиту (от строки к справочнику) порождает отдельный запрос к базе данных. Если в документе сотни строк, и вы запускаете цикл пересчета при каждом изменении количества, пользователь может ощутить заметные задержки.

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

Условное оформление числовых полей

Разберем ситуацию, когда требуется выделить красным цветом ячейки, где вес не заполнен. Распространенная ошибка — использование условия «Не заполнено» для числовых типов данных. Для системы 1С число 0 является заполненным значением, поэтому стандартная проверка «Не заполнено» не срабатывает.

Чтобы условное оформление заработало, выполним следующие настройки:

  1. Откроем настройки условного оформления формы.
  2. Добавим новое правило.
  3. В Оформлении установим Цвет фона — Красный.
  4. В Условии выберем поле Объект.Товары.Вес (или ВесЧислитель).
  5. Вид сравнения установим «Меньше или равно», а значение — 0.
  6. В Оформляемых полях укажем те колонки, которые должны окраситься.

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

Использование упаковок

Проанализируем ситуацию, когда в программе включен учет в упаковках. Если товар продается в коробках по 10 штук, то Номенклатура.ВесЧислитель может возвращать вес одной штуки (базовой единицы), а в строке документа выбрана упаковка. В этом случае итоговый вес будет рассчитан неверно.

Для корректного расчета всегда проверяйте наличие реквизита Упаковка в строке. Если упаковка заполнена, вес следует брать из справочника УпаковкиЕдиницыИзмерения, так как он может отличаться от веса базовой единицы, умноженного на коэффициент.

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

← На главную