При разработке интерфейсов на управляемых формах разработчики нередко сталкиваются с необходимостью создать нестандартную матричную таблицу. Например, когда в верхней части таблицы требуется разместить фиксированные расчетные показатели (своеобразную продолженную шапку с автоматическими формулами), а ниже — строки для ручного ввода с возможностью добавления и удаления строк через стандартные команды.
Сложность заключается в архитектуре управляемой формы платформы 1С:Предприятие 8.3: стандартная таблица (будь то табличная часть объекта или таблица значений) представляет собой жесткую прямоугольную матрицу. В ней невозможно объединять ячейки произвольным образом по строкам, а свойство «Видимость» при попытке скрыть элемент целиком отключает колонку по всей высоте таблицы. Разберем основные архитектурные подходы к решению этой задачи.
Именно такой подход традиционно применяется в регламентированной отчетности, подсистемах бюджетирования в 1С:ERP и других сложных расчетных формах. Поле табличного документа снимает все ограничения на структуру строк, позволяет объединять любые диапазоны ячеек по горизонтали и вертикали, а также гибко разделять доступные для редактирования и расчетные области.
Рассмотрим по шагам настройку табличного документа для интерактивного ввода данных:
ТабличныйДокумент и перетащим его в элементы формы.ТолькоПросмотр.Защита = Истина.Защита = Истина, а для ячеек, предназначенных для ввода пользователем, — Защита = Ложь.ВставитьОбласть() и УдалитьОбласть().Для пересчета зависимых показателей отслеживаем изменения данных через событие элемента формы ПриИзмененииСодержимого:
&НаКлиенте
Процедура ТабличныйДокументПриИзмененииСодержимого(Элемент, Область)
// Вызываем пересчет расчетных показателей на сервере или клиенте
ПересчитатьПоказатели();
КонецПроцедуры
Для интерактивного взаимодействия, открытия специализированных форм подбора или контекстных меню используем события элемента Выбор и ВыборЗначения.
Если задача требует остаться в рамках стандартной таблицы формы, можно смоделировать расчетные строки внутри обычной ТаблицыЗначений, не ломая общую структуру данных. Для этого в структуру таблицы добавляется служебная колонка для классификации строк.
Разберем по шагам, как настроить такую таблицу:
ТипСтроки (например: 1 — расчетная строка, 2 — строка пользовательского ввода). Саму эту колонку на форму не выводим.Таблица.ТипСтроки Равно 1.ТолькоПросмотр = Истина, ЦветФона = ЦветФонаФормы, Текст = "".
&НаКлиенте
Процедура ТаблицаПередУдалением(Элемент, Отказ)
ТекущиеДанные = Элемент.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено И ТекущиеДанные.ТипСтроки = 1 Тогда
Отказ = Истина;
ПоказатьОповещениеПользователя("Ошибка", , "Нельзя удалять расчетные строки шапки!");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТаблицаПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, ЭтоГруппа)
// Переопределяем стандартное добавление, чтобы новые строки всегда были ниже расчетных
Отказ = Истина;
ДобавитьСтрокуПользователя();
КонецПроцедуры
Процедура добавления новой строки пользователя программно вставляет строку в нижнюю часть коллекции:
&НаСервере
Процедура ДобавитьСтрокуПользователя()
НоваяСтрока = Объект.Таблица.Добавить();
НоваяСтрока.ТипСтроки = 2;
// Заполнение значений по умолчанию
КонецПроцедуры
В некоторых случаях логично разделить экран на две части: сверху разместить компактную статическую сетку (или таблицу без командной панели и подвала) с расчетными показателями, а снизу — полноценную таблицу для ввода пользовательских данных.
Важное ограничение платформы: в управляемом интерфейсе 1С нет штатного механизма для синхронной прокрутки двух отдельных таблиц по горизонтали. Если в таблице много колонок и появляется полоса горизонтальной прокрутки, скролл нижней таблицы не будет двигать верхнюю сетку. Данное решение применимо исключительно тогда, когда количество колонок фиксировано и форма гарантированно помещается по ширине экрана пользователя.
Проанализировав все варианты, для сложных многоуровневых документов с произвольным объединением ячеек рекомендуется использовать Табличный документ, а для типовых списков с несколькими фиксированными строками сверху — Таблицу значений с условным оформлением и программной валидацией строк.