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