Разработка сложных аналитических отчетов и документов в платформе 1С 7.7 часто упирается в ограничения стандартного интерфейса. Типичный пример — создание регламентированной отчетности или специализированных документов (например, алкогольной декларации), где таблица ввода содержит десятки колонок (более 20-30 штук). Чтобы сделать такую форму удобной и читаемой для пользователя, колонки необходимо логически группировать. Например, объединять под общими заголовками «Данные производителя», «Поступление», «Расход» и «Остатки».
Стандартный элемент формы ТаблицаЗначений в 1С 7.7, равно как и табличная часть документа, не поддерживает объединение ячеек в шапке по горизонтали или вертикали. Шапка всегда остается строго однострочной. В этой статье мы подробно разберем, как обойти это ограничение, и рассмотрим несколько эффективных способов реализации многоуровневых шапок таблиц на форме в 1С 7.7.
Использование компоненты Йоксель (в частности, ее элемента управления табличного документа) — это наиболее гибкий, современный и стабильный вариант для платформы 1С 7.7. Он позволяет вывести на форму полноценный аналог листа Excel с поддержкой сложных объединенных шапок, формул, форматирования ячеек и интерактивного ввода данных.
Рассмотрим по шагам, как внедрить это решение в форму документа:
.mxl). В этом макете мы рисуем шапку любой сложности: объединяем ячейки, задаем цвета, рамки, шрифты и выравнивание. Ниже шапки размечаем область строк, в которую будут выводиться данные.ТабДок.ПриОткрытии формы документа мы считываем созданный макет, загружаем его в объект Йокселя и заполняем строками данных из табличной части документа (которую мы храним в базе, но скрываем от пользователя на форме).Область.Защита(1). Это предотвратит случайное изменение структуры таблицы пользователем.Область.Защита(0).Проанализируем пример кода инициализации Йокселя на форме документа:
Процедура ПриОткрытии()
// Создаем объект Йокселя и загружаем шаблон таблицы
ТабДокОбъект = СоздатьОбъект("ТабличныйДокумент");
ТабДокОбъект.Открыть(КаталогИБ() + "Шаблоны\ДекларацияРаздел1.mxl");
// Передаем табличный документ в элемент управления на форме
Форма.ТабДок.УстановитьДокумент(ТабДокОбъект);
// Блокируем шапку от изменений и открываем ячейки данных для редактирования
// Предположим, шапка занимает первые 4 строки
ВсегоСтрок = ТабДокОбъект.ВысотаТаблицы();
ВсегоКолонок = ТабДокОбъект.ШиринаТаблицы();
Для Стр = 5 По ВсегоСтрок Цикл
Для Кол = 1 По ВсегоКолонок Цикл
Ячейка = ТабДокОбъект.Область(Стр, Кол, Стр, Кол);
Если ЭтоКолонкаВвода(Кол) = 1 Тогда
Ячейка.Защита = 0; // Разрешаем ввод
Иначе
Ячейка.Защита = 1; // Запрещаем ввод (например, для служебных кодов)
КонецЕсли;
КонецЦикла;
КонецЦикла;
// Включаем режим ввода данных и отображение сетки
ТабДокОбъект.ТолькоПросмотр = 0;
ТабДокОбъект.ПоказыватьСетку = 1;
КонецПроцедуры
Для сохранения введенных пользователем данных необходимо перехватывать события изменения ячеек Йокселя (например, событие ПослеРедактированияЯчейки) и записывать измененные значения обратно в скрытую табличную часть документа или в связанную ТаблицуЗначений.
Если вы хотите остаться в рамках стандартного элемента формы ТаблицаЗначений, но сделать представление данных более компактным, можно использовать возможности компоненты FormEx.
С помощью FormEx можно настроить многострочный режим отображения ячеек (когда одна строка таблицы визуально состоит из двух или трех физических подстрок, аналогично представлению строк в табличной части некоторых типовых документов). При этом шапка таблицы тоже становится многострочной по высоте, хотя объединить соседние колонки по горизонтали не удастся.
Этот способ имеет право на жизнь, когда нужно уместить 20 колонок на одном экране без горизонтальной прокрутки, распределив реквизиты строки друг под другом в несколько «этажей» внутри одной строки таблицы.
Компонента 1С++ предоставляет мощный класс ТабличноеПоле, который значительно превосходит стандартную таблицу значений по скорости работы и возможностям кастомизации. Однако, важно учитывать технический нюанс: элемент управления ТабличноеПоле базируется на системном классе Windows SysHeader32, который нативно не поддерживает древовидные или многоуровневые заголовки.
Тем не менее, разработчики обходят это ограничение следующими путями:
Такой подход достаточно сложен в реализации и требует тонкой настройки WinAPI-событий, поэтому для многоуровневых шапок чаще отдают предпочтение чистому Йокселю.
Еще один альтернативный и очень гибкий способ создания сложных интерфейсов ввода — отображение таблицы через встроенный HTML-браузер (ActiveX Shell.Explorer на форме 1С).
В этом случае разработчик полностью свободен в проектировании дизайна:
colspan и rowspan.<input>.ПриНажатииКнопки или при изменении состояния браузера), либо через внешние библиотеки интеграции.Выбор конкретного решения зависит от сложности вашей задачи и готовности использовать внешние библиотеки: