Как реализовать сложную таблицу с расчетными строками и ручным вводом на управляемой форме 1С 8.3

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

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

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

Способ 1. Использование редактируемого Табличного документа

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

Рассмотрим по шагам настройку табличного документа для интерактивного ввода данных:

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

Для пересчета зависимых показателей отслеживаем изменения данных через событие элемента формы ПриИзмененииСодержимого:


&НаКлиенте
Процедура ТабличныйДокументПриИзмененииСодержимого(Элемент, Область)
    // Вызываем пересчет расчетных показателей на сервере или клиенте
    ПересчитатьПоказатели();
КонецПроцедуры

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

Способ 2. Единая таблица значений со служебной типизацией строк

Если задача требует остаться в рамках стандартной таблицы формы, можно смоделировать расчетные строки внутри обычной ТаблицыЗначений, не ломая общую структуру данных. Для этого в структуру таблицы добавляется служебная колонка для классификации строк.

Разберем по шагам, как настроить такую таблицу:

  1. Добавим в реквизит формы «Таблица» числовую колонку ТипСтроки (например: 1 — расчетная строка, 2 — строка пользовательского ввода). Саму эту колонку на форму не выводим.
  2. Для создания визуальной шапки используем группы колонок (в свойствах группы указываем отображение в шапке). Сами заголовки колонок можно динамически менять из встроенного языка.
  3. Настроим условное оформление формы. Для колонок, где не должно быть ввода в расчетных строках, добавляем элементы условного оформления:
    1. Условие: Таблица.ТипСтроки Равно 1.
    2. Оформляемые поля: указываем нужные колонки.
    3. Параметры оформления: ТолькоПросмотр = Истина, ЦветФона = ЦветФонаФормы, Текст = "".
    Таким образом, ячейка остается частью структуры строки, но выглядит пустой и блокируется от случайного редактирования.
  4. Ограничим стандартные механизмы редактирования и удаления для фиксированных строк в обработчиках событий таблицы:

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

&НаКлиенте
Процедура ТаблицаПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, ЭтоГруппа)
    // Переопределяем стандартное добавление, чтобы новые строки всегда были ниже расчетных
    Отказ = Истина;
    ДобавитьСтрокуПользователя();
КонецПроцедуры

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


&НаСервере
Процедура ДобавитьСтрокуПользователя()
    НоваяСтрока = Объект.Таблица.Добавить();
    НоваяСтрока.ТипСтроки = 2;
    // Заполнение значений по умолчанию
КонецПроцедуры

Способ 3. Разделение интерфейса на две независимые таблицы

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

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

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

← На главную