Как отобразить табличную часть на форме документа и рассчитать итог по строке в 1С?

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

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

Выбор объекта: Табличная часть или Таблица значений?

Проанализируем распространенную ошибку, когда для хранения вводимых пользователем строк документа пытаются программно создать объект ТаблицаЗначений. Объект ТаблицаЗначений является универсальной коллекцией значений, существующей исключительно в оперативной памяти, причем в клиент-серверной архитектуре управляемого приложения он доступен только на стороне сервера.

Для сохранения данных в базе данных у объекта конфигурации Документ предусмотрен специальный подчиненный объект — Табличная часть. Данные табличной части автоматически привязываются к документу, сохраняются при записи и проводятся по регистрам. Создавать программную таблицу значений в данном случае не требуется: достаточно сконфигурировать табличную часть в дереве метаданных.

  1. В дереве метаданных найдем нужный документ и перейдем в ветку Табличные части.
  2. Добавим новую табличную часть (например, с именем ПитаниеСотрудников).
  3. Внутри созданной табличной части добавим реквизиты:
    1. Сотрудник — тип СправочникСсылка.Сотрудники;
    2. Завтрак, Обед, Ужин, ПозднийУжин — тип Число (длина 10, точность 0, неотрицательное);
    3. Итого — тип Число (для фиксации общего количества приемов пищи).

Почему реквизиты отображаются как отдельные поля, а не таблица?

Выясним причину ситуации, когда добавленные реквизиты табличной части отображаются на форме не в виде столбцов таблицы, а как разрозненные поля ввода. В редакторе управляемой формы структура интерфейса представлена двумя панелями: справа расположены Реквизиты (данные), а слева — Элементы (визуальные элементы управления).

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

  1. Откроем форму документа в конфигураторе.
  2. В правой панели (вкладка Реквизиты) найдем реквизит Объект и раскроем его ветку.
  3. Найдем узел нашей табличной части ПитаниеСотрудников.
  4. Захватим мышью весь узел целиком и перетащим его в левую панель в дерево Элементы.

При таком действии платформа автоматически создаст элемент управления ТаблицаФормы, привяжет его к данным табличной части объекта и внутри сформирует подчиненные элементы типа ПолеФормы (колонки) для каждого реквизита.

Вертикальные итоги в подвале vs горизонтальный расчет по строке

Рассмотрим различие между двумя типами расчетов в таблицах 1С: суммированием по вертикали и суммированием по горизонтали.

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

Для расчета горизонтальной суммы (Завтрак + Обед + Ужин + ПозднийУжин) в строке реализуется программный пересчет.

Реализация расчета «Итого» в управляемых формах

Разберем оптимальный способ расчета, выполняемый на стороне клиента без лишних серверных вызовов. Мы используем клиентское событие ПриИзменении элементов ввода таблицы.

  1. В дереве элементов формы выделим колонку ПитаниеСотрудниковЗавтрак.
  2. В палитре свойств найдем событие ПриИзменении и нажмем кнопку с лупой для создания клиентского обработчика.
  3. Для остальных колонок (Обед, Ужин, ПозднийУжин) в палитре свойств укажем этот же созданный обработчик, чтобы не дублировать код.

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


&НаКлиенте
Процедура ПитаниеСотрудниковКоличествоПриИзменении(Элемент)
    
    ТекущаяСтрока = Элементы.ПитаниеСотрудников.ТекущиеДанные;
    
    Если ТекущаяСтрока <> Неопределено Тогда
        ТекущаяСтрока.Итого = 
            ТекущаяСтрока.Завтрак + 
            ТекущаяСтрока.Обед + 
            ТекущаяСтрока.Ужин + 
            ТекущаяСтрока.ПозднийУжин;
    КонецЕсли;
    
КонецПроцедуры

Свойство Элементы.ПитаниеСотрудников.ТекущиеДанные возвращает объект ДанныеФормыЭлементКоллекции, представляющий активную строку таблицы на клиенте. Изменение свойства Итого мгновенно отображается на экране и фиксируется в данных документа без обращения к серверу.

Особенности обычных форм (толстый клиент)

Если разработка ведется на обычных формах (толстый клиент), в свойствах табличного поля доступно событие ПриПолученииДанных. В нем расчет колонки можно выполнять динамически без добавления реквизита Итого в саму структуру метаданных документа, выводя значение в ячейку через метод ОформлениеСтроки.Ячейки.Итого.УстановитьТекст(). Однако в управляемом приложении (тонкий и веб-клиент) данное событие отсутствует, поэтому описанный выше расчет через ПриИзменении является стандартным и универсальным решением.

Рекомендация по нормализации структуры данных

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

В типовых конфигурациях для подобных задач чаще применяют нормализованную структуру табличной части всего из трех реквизитов:

  1. Сотрудник (тип СправочникСсылка.Сотрудники);
  2. ВидПриемаПищи (тип СправочникСсылка.ВидыПитания или ПеречислениеСсылка);
  3. Количество (тип Число).

Такой подход позволяет добавлять любые новые категории питания пользователями в режиме «1С:Предприятие» без внесения изменений в конфигурацию.

← На главную