Как вывести итоговый вес и объем в управляемой форме документа 1С

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

При разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с задачей динамического расчета итоговых показателей, таких как общий вес, объем или количество упаковок в документе. В управляемом приложении логика работы с формой существенно отличается от старых версий (например, 10.3), и попытки использовать старые подходы часто приводят к ошибкам типа «Объект не найден» или отсутствию обновлений данных на экране.

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

Разбор основной ошибки: Реквизиты против Элементов

Разберем ситуацию, с которой столкнулся автор темы. В его коде была попытка присвоить значение напрямую визуальному элементу: Элементы.СуммаОбъема.Значение = Объем1. В управляемых формах 1С 8.3 такой подход не работает.

Проанализируем архитектуру управляемой формы: существует Данные (Реквизиты) и Отображение (Элементы). Чтобы данные появились на экране, вы должны изменить значение реквизита, а платформа сама обновит связанный с ним элемент формы. Если вы создали на форме реквизиты ВесТовара и ОбъемТовара, обращаться к ним нужно напрямую по имени (если это реквизиты формы) или через объект (если это реквизиты документа).

Правильный синтаксис присвоения выглядит так:


// Если это реквизиты самой формы
ОбъемТовара = Объем1;
ВесТовара = Вес1;

// Если это реквизиты объекта (документа)
Объект.ВесТовара = Вес1;
Объект.ОбъемТовара = Объем1;

Метод 1. Оптимизированный расчет через метод Итог()

Вместо того чтобы вручную обходить все строки табличной части в цикле Для Каждого, в 1С предусмотрен гораздо более быстрый и лаконичный метод. Рассмотрим пример использования метода Итог() для коллекции строк.

Предположим, в вашей табличной части Товары уже есть колонки Вес и Объем, которые рассчитываются для каждой строки (например, Вес единицы * Количество). В этом случае расчет общих итогов по всему документу сведется к двум строкам кода:


&НаКлиенте
Процедура РассчитатьИтогиВесаОбъема()
    
    // Используем встроенный метод коллекции для суммирования колонки
    Объект.ВесТовара = Объект.Товары.Итог("Вес");
    Объект.ОбъемТовара = Объект.Товары.Итог("Объем");
    
КонецПроцедуры

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

Метод 2. Расчет в цикле (если данные не хранятся в таблице)

Бывают ситуации, когда колонки «Вес» и «Объем» в самой таблице товаров отсутствуют (не являются реквизитами табличной части), и нам нужно вычислять их «на лету», обращаясь к свойствам номенклатуры. Разберем, как поправить цикл, предложенный автором темы.

Проанализируем алгоритм:

  1. Обнуляем переменные-счетчики.
  2. Проходим циклом по всей таблице товаров.
  3. Для каждой строки получаем данные из справочника или текущей строки.
  4. Суммируем результат в переменные.
  5. Записываем итог в реквизиты формы.

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

Где вызывать расчет?

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

Метод 3. Автоматические итоги в подвале (без кода)

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

  1. Откроем форму документа в конфигураторе.
  2. Выберем элемент формы Таблица (ваша табличная часть Товары).
  3. В свойствах таблицы установим галочку Подвал (Footer).
  4. Теперь выберем конкретное Поле (колонку), например, ТоварыВес.
  5. В свойствах поля найдем параметр ПутьКДаннымПодвала.
  6. Нажмем на кнопку выбора и в открывшемся окне выберем Объект.Товары.ИтогВес.

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

Настройка условного оформления (раскраска ячеек)

Автор темы пытался использовать цикл Для каждого ОформлениеСтроки. Это типичная ошибка при переходе с обычных форм на управляемые. В управляемом приложении за раскраску отвечает механизм Условного оформления.

Проанализируем, как выделить розовым цветом ячейку «Вес», если она не заполнена (равна 0):

  1. В редакторе формы перейдем на закладку Условное оформление.
  2. Добавим новое правило.
  3. В поле Оформление выберем «Цвет фона» и установим нужный оттенок (например, розовый).
  4. В поле Условие добавим новый элемент: Объект.Товары.Вес Равно 0.
  5. В поле Оформляемые поля выберем колонку ТоварыВес.

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

Рекомендации по работе с весом и объемом

Рассмотрим важный нюанс: в типовых конфигурациях (УТ 11, ERP 2.5) вес и объем часто зависят от выбранной упаковки. Если вы просто умножаете количество на вес из карточки номенклатуры, вы можете получить неверные данные, если товар отгружается в коробках или паллетах.

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

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

← На главную