Как реализовать многоуровневые («двухэтажные») шапки таблиц на форме в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

Разработка сложных аналитических отчетов и документов в платформе 1С 7.7 часто упирается в ограничения стандартного интерфейса. Типичный пример — создание регламентированной отчетности или специализированных документов (например, алкогольной декларации), где таблица ввода содержит десятки колонок (более 20-30 штук). Чтобы сделать такую форму удобной и читаемой для пользователя, колонки необходимо логически группировать. Например, объединять под общими заголовками «Данные производителя», «Поступление», «Расход» и «Остатки».

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

Решение №1: Использование внешней компоненты «Йоксель» (Рекомендуемый способ)

Использование компоненты Йоксель (в частности, ее элемента управления табличного документа) — это наиболее гибкий, современный и стабильный вариант для платформы 1С 7.7. Он позволяет вывести на форму полноценный аналог листа Excel с поддержкой сложных объединенных шапок, формул, форматирования ячеек и интерактивного ввода данных.

Рассмотрим по шагам, как внедрить это решение в форму документа:

  1. Создание визуального шаблона (макета): В конфигураторе 1С создаем обычную таблицу (макет с расширением .mxl). В этом макете мы рисуем шапку любой сложности: объединяем ячейки, задаем цвета, рамки, шрифты и выравнивание. Ниже шапки размечаем область строк, в которую будут выводиться данные.
  2. Размещение элемента на форме: На форму нашего документа (или обработки) помещаем ActiveX-элемент «Йоксель.ТабличныйДокумент» (внедряемый элемент управления Йокселя). Присваиваем ему идентификатор, например, ТабДок.
  3. Программная инициализация: В процедуре ПриОткрытии формы документа мы считываем созданный макет, загружаем его в объект Йокселя и заполняем строками данных из табличной части документа (которую мы храним в базе, но скрываем от пользователя на форме).
  4. Управление интерактивным вводом: Чтобы пользователь мог вводить данные непосредственно в ячейки Йокселя, нам нужно правильно настроить защиту:
    • Для ячеек шапки оставляем защиту включенной: Область.Защита(1). Это предотвратит случайное изменение структуры таблицы пользователем.
    • Для ячеек ввода данных программно отключаем защиту: Область.Защита(0).
    • Переводим сам табличный документ в режим редактирования, разрешив редактирование ячеек.

Проанализируем пример кода инициализации Йокселя на форме документа:


Процедура ПриОткрытии()
    // Создаем объект Йокселя и загружаем шаблон таблицы
    ТабДокОбъект = СоздатьОбъект("ТабличныйДокумент");
    ТабДокОбъект.Открыть(КаталогИБ() + "Шаблоны\ДекларацияРаздел1.mxl");
    
    // Передаем табличный документ в элемент управления на форме
    Форма.ТабДок.УстановитьДокумент(ТабДокОбъект);
    
    // Блокируем шапку от изменений и открываем ячейки данных для редактирования
    // Предположим, шапка занимает первые 4 строки
    ВсегоСтрок = ТабДокОбъект.ВысотаТаблицы();
    ВсегоКолонок = ТабДокОбъект.ШиринаТаблицы();
    
    Для Стр = 5 По ВсегоСтрок Цикл
        Для Кол = 1 По ВсегоКолонок Цикл
            Ячейка = ТабДокОбъект.Область(Стр, Кол, Стр, Кол);
            Если ЭтоКолонкаВвода(Кол) = 1 Тогда
                Ячейка.Защита = 0; // Разрешаем ввод
            Иначе
                Ячейка.Защита = 1; // Запрещаем ввод (например, для служебных кодов)
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
    
    // Включаем режим ввода данных и отображение сетки
    ТабДокОбъект.ТолькоПросмотр = 0;
    ТабДокОбъект.ПоказыватьСетку = 1;
КонецПроцедуры

Для сохранения введенных пользователем данных необходимо перехватывать события изменения ячеек Йокселя (например, событие ПослеРедактированияЯчейки) и записывать измененные значения обратно в скрытую табличную часть документа или в связанную ТаблицуЗначений.

Решение №2: Многострочные строки в ТЗ с помощью внешней компоненты «FormEx»

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

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

Этот способ имеет право на жизнь, когда нужно уместить 20 колонок на одном экране без горизонтальной прокрутки, распределив реквизиты строки друг под другом в несколько «этажей» внутри одной строки таблицы.

Решение №3: Использование «Табличного Поля» (ВК 1С++)

Компонента 1С++ предоставляет мощный класс ТабличноеПоле, который значительно превосходит стандартную таблицу значений по скорости работы и возможностям кастомизации. Однако, важно учитывать технический нюанс: элемент управления ТабличноеПоле базируется на системном классе Windows SysHeader32, который нативно не поддерживает древовидные или многоуровневые заголовки.

Тем не менее, разработчики обходят это ограничение следующими путями:

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

Решение №4: Использование HTML-интерфейса (ActiveX WebBrowser)

Еще один альтернативный и очень гибкий способ создания сложных интерфейсов ввода — отображение таблицы через встроенный HTML-браузер (ActiveX Shell.Explorer на форме 1С).

В этом случае разработчик полностью свободен в проектировании дизайна:

Резюме: какой метод выбрать?

Выбор конкретного решения зависит от сложности вашей задачи и готовности использовать внешние библиотеки:

  1. Если вам нужна максимальная простота разработки, полное визуальное соответствие печатным формам деклараций и надежный интерактивный ввод — используйте связку Документ + ВК Йоксель. Это проверенный временем стандарт для регламентированной отчетности в 1С 7.7.
  2. Если важно сохранить интерфейс максимально близким к стандартным спискам 1С и обойтись без отрисовки сложных шаблонов — рассмотрите многострочную ТЗ с помощью FormEx.
  3. Если требуется высокая производительность на огромных массивах данных (десятки тысяч строк) — смотрите в сторону Табличного Поля от 1С++, но будьте готовы к сложной программной реализации синхронизации заголовков.
← На главную