Как сделать сворачивание и группировку строк («плюсики») в табличном документе 1С 7.7?

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

Разработчики, работающие с платформой 1С:Предприятие 7.7, часто сталкиваются с аппаратными ограничениями штатного табличного документа (Moxel). Одно из самых досадных ограничений — отсутствие встроенной поддержки интерактивных группировок строк (тех самых «плюсиков» слева, к которым все привыкли в 1С 8.x и Microsoft Excel). Когда нужно вывести отчет, например, по сотрудникам и их детальным выплатам, плоская таблица быстро разрастается и становится нечитаемой.

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

Причина ограничения: почему в 1С 7.7 нет штатных «плюсиков»?

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

Рассмотрим подробнее каждый из возможных способов решения этой задачи — от простых «костылей» штатными средствами до использования продвинутых внешних компонент.

Способ 1. Эмуляция свертки строк штатными средствами (двойной клик)

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

Разберем алгоритм реализации этого метода:

  1. При выводе отчета в первый столбец (где выводится группировочное поле, например, ФИО сотрудника) мы записываем символ +. Это будет визуальный маркер для пользователя.
  2. Для ячейки с плюсиком мы настраиваем свойство Расшифровка. В расшифровку мы передаем специальный маркер (например, список номеров детальных строк, которые относятся к этому сотруднику, или уникальный строковый идентификатор группы).
  3. При формировании отчета мы изначально выводим все детальные строки, но программно устанавливаем их высоту в значение 0, делая их скрытыми.
  4. В модуле формы отчета мы переопределяем стандартную процедуру ПриВыбореСтроки(), которая перехватывает двойной щелчок мыши по ячейке таблицы.

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


Процедура ПриВыбореСтроки(Элемент, ФлагСтандартнойОбработки)
    Перем ТекЗначениеРасшифровки;
    
    // Получаем значение расшифровки из текущей ячейки
    ТекЗначениеРасшифровки = Таблица.ТекущаяОбласть().Расшифровка;
    
    Если ТипЗначенияСтр(ТекЗначениеРасшифровки) = "СписокЗначений" Тогда
        ФлагСтандартнойОбработки = 0; // Отменяем стандартное действие
        
        // Извлекаем из списка границы строк, которые нужно показать или скрыть
        НачалоСтрок = ТекЗначениеРасшифровки.Получить("Старт");
        КонецСтрок = ТекЗначениеРасшифровки.Получить("Финиш");
        ТекущееСостояние = ТекЗначениеРасшифровки.Получить("Состояние"); // "Свернуто" или "Развернуто"
        
        Таблица.Область(НачалоСтрок, , КонецСтрок, ).ВысотаСтроки(?(ТекущееСостояние = "Свернуто", 15, 0));
        
        // Меняем символ "+" на "-" или наоборот
        Если ТекущееСостояние = "Свернуто" Тогда
            Таблица.ТекущаяОбласть().Текст = "[-]";
            ТекЗначениеРасшифровки.Установить("Состояние", "Развернуто");
        Иначе
            Таблица.ТекущаяОбласть().Текст = "[+]";
            ТекЗначениеРасшифровки.Установить("Состояние", "Свернуто");
        EndIf;
        
        // Принудительно обновляем отображение таблицы
        Таблица.Показать();
    КонецЕсли;
КонецПроцедуры

Преимущества метода: Работает в «чистой» конфигурации, не требует администрирования операционной системы и установки внешнего софта.

Недостатки метода: Сетка таблицы при установке высоты строк в 0 может визуально искажаться. Отрисовка больших отчетов происходит медленно, а сам процесс написания такого кода очень трудоемок.

Способ 2. Использование внешней компоненты «Йоксель» (Yoksel)

Если вы хотите получить по-настоящему качественные, красивые и быстрые группировки, как в современных версиях 1С, лучшим выбором будет использование внешней компоненты Йоксель (файл SpreadSheet.dll).

Вопреки распространенному заблуждению, Йоксель — это не конвертер в формат Excel, а полноценная замена стандартного табличного документа 1С 7.7. Он внедряется прямо в форму в виде ActiveX-элемента или используется для генерации отчетов в фоне.

С использованием Йокселя группировка строк реализуется стандартным и лаконичным кодом:


// Создаем объект Йоксель
ТабДок = СоздатьОбъект("ТабличныйДокумент");

// Заполняем документ данными...
// Допустим, строки с 10 по 15 — это детальные выплаты сотрудника Иванов
ТабДок.ДобавитьГруппуСтрок(10, 15);

// Строки с 17 по 22 — выплаты сотрудника Петров
ТабДок.ДобавитьГруппуСтрок(17, 22);

// Показываем документ пользователю
ТабДок.Показать();

При использовании метода ДобавитьГруппуСтрок() Йоксель автоматически отрисует стандартные линии уровней группировки и интерактивные кнопки свертывания/развертывания слева от таблицы. Более того, при сохранении этого отчета в формате XLS все созданные группы сохранят свою интерактивность внутри Microsoft Excel.

Способ 3. Связка 1С++ и класса «ТЗСГруппировками»

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

На базе 1С++ сообществом был разработан специализированный класс ТЗСГруппировками. Рассмотрим, как он упрощает жизнь программисту:

Способ 4. Готовое универсальное решение «NotaBene»

Если у вас нет времени программировать сложные иерархические алгоритмы вывода, обратите внимание на известную в кругах разработчиков 1С 7.7 обработку NotaBene (автор Александр Зернятко).

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

  1. В своей обработке вы собираете «плоскую» таблицу значений с данными (например, три колонки: ФИО, ВидВыплаты, Сумма).
  2. Передаете эту таблицу значений в качестве параметра в обработку NotaBene.
  3. NotaBene самостоятельно строит на экране форму отчета. Вместо классических «плюсиков» там реализована динамическая перестройка структуры: пользователь может прямо на экране перетаскивать группировки мыinterактивно, сворачивать уровни, настраивать фильтры и получать детализацию (drill-down) по двойному клику.

Способ 5. Программная группировка в Microsoft Excel через COM/OLE

Если конечной целью вашего отчета все равно является передача данных руководству в формате Excel, то нет смысла пытаться настроить «плюсики» внутри 1С. Гораздо эффективнее сразу сформировать файл Excel программным путем и настроить группировки средствами самого табличного процессора.

Проанализируем пример кода, который выгружает данные в Excel и программно создает группы строк:


// Инициализируем COM-соединение с Excel
Попытка
    Excel = СоздатьОбъект("Excel.Application");
Исключение
    Предупреждение("Microsoft Excel не установлен на данном компьютере!");
    Возврат;
КонецПопытки;

Книга = Excel.Workbooks.Add();
Лист = Книга.Worksheets(1);

// Заполняем строки данными
Лист.Cells(1, 1).Value = "Иванов И.И. (Всего: 15000)";
Лист.Cells(2, 1).Value = "  - Оклад: 10000";
Лист.Cells(3, 1).Value = "  - Премия: 5000";

// Группируем детальные строки (строки 2 и 3)
Лист.Rows("2:3").Group();

// Настраиваем отображение кнопок группировки сверху от детальных строк (по умолчанию в Excel снизу)
Лист.Outline.SummaryRow = 0; // xlSummaryRowAbove

// Сворачиваем группы, чтобы показать только итоговые строки
Лист.Outline.ShowLevels(1);

Excel.Visible = 1;

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

Резюме: что выбрать?

Мы подробно разобрали пять различных подходов к решению проблемы отсутствия группировок в 1С 7.7. Подведем итоги для быстрого выбора оптимального пути:

← На главную