Как обновить печатную форму отчета в 1С 7.7 при обработке расшифровки ячейки без открытия нового окна?

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

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

Рассмотри подробно, почему возникает проблема дублирования окон, проанализируем механизмы платформы 1С 7.7 и разберем проверенные способы обновления печатной формы без закрытия и повторного создания MDI-окна.

Причина поведения платформы 1С 7.7

Если в коде процедуры повторно вызывается СоздатьОбъект("Таблица") и затем метод Таб.Показать() с новым заголовком или без привязки к существующему окну, платформа 1С 7.7 создает новое независимое окно табличного документа. В результате при каждом клике по ячейке с расшифровкой пользователь получает всё новые и новые открытые печатные формы.

Кроме того, если в предопределенной процедуре ОбработкаЯчейкиТаблицы не сбросить стандартный флаг обработки, платформа попытается выполнить встроенное действие по умолчанию, что может привести к мерцанию экрана или некорректному переходу.

Способ 1. Использование переменной модуля и фиксированного заголовка окна

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

Разберем по шагам реализацию данного подхода:

  1. Объявим переменную Таб в самом начале модуля отчета вне процедур.
  2. В процедуре формирования отчета проверяем, создан ли объект таблицы. Если объект уже существует, перед повторным выводом секций вызываем Таб.Очистить().
  3. В методе Показать() передаем одинаковый заголовок окна. Если заголовок совпадает с уже открытым окном, 1С 7.7 обновляет данные в нем, не открывая новое.
  4. В процедуре ОбработкаЯчейкиТаблицы устанавливаем параметр Флаг = 0;, чтобы отключить стандартную обработку клика платформой.

Рассмотрим пример кода:


Перем Таб; // Объявляем переменную на уровне модуля

Процедура Отчет()
    Если ТипЗначенияСтр(Таб) <> "Таблица" Тогда
        Таб = СоздатьОбъект("Таблица");
    Иначе
        Таб.Очистить(); // Очищаем существующую таблицу перед повторным заполнением
    КонецЕсли;
    
    Таб.ИсходнаяТаблица("Отчет");
    Таб.ВывестиСекцию("Заголовок");
    
    Если Индекс = "0" Тогда
        // Выводим базовые секции отчета
        Таб.ВывестиСекцию("СотрудникКратко");
    Иначе
        // Выводим детализированные секции
        Таб.ВывестиСекцию("СотрудникПодробно");
    КонецЕсли;
    
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Отчет по сотрудникам", ""); // Фиксированный заголовок окна
КонецПроцедуры

Процедура ОбработкаЯчейкиТаблицы(Значение, Флаг, Таблица, Адрес)
    Если Лев(Значение, 15) = "РаскрытьПоКоду/" Тогда
        Флаг = 0; // Отменяем стандартное действие платформы
        Индекс = "1";
        Отчет(); // Переформировываем отчет в том же окне
    КонецЕсли;
КонецПроцедуры

Способ 2. Прямая работа с параметром Таблица в процедуре ОбработкаЯчейкиТаблицы

В платформе 1С 7.7 предопределенная процедура ОбработкаЯчейкиТаблицы принимает третий параметр — Таблица. Этот параметр содержит прямую ссылку на открытый табличный документ, в ячейке которого произошел клик.

Проанализируем пример использования этого параметра для очистки и повторного заполнения открытого документа без обращения к глобальным переменным:


Процедура ОбработкаЯчейкиТаблицы(Значение, Флаг, Таблица, Адрес)
    Если Лев(Значение, 15) = "РаскрытьПоКоду/" Тогда
        Флаг = 0; // Отключаем стандартную расшифровку
        
        // Очищаем существующий табличный документ напрямую через параметр
        Таблица.Очистить();
        Таблица.ИсходнаяТаблица("Отчет");
        
        // Заполняем секции заново
        Таблица.ВывестиСекцию("Заголовок");
        Таблица.ВывестиСекцию("Подробно");
        
        // Обновляем отображение
        Таблица.Показать("Отчет по сотрудникам", "");
    КонецЕсли;
КонецПроцедуры

Способ 3. Использование элемента управления «Таблица» на форме

Посмотрим на альтернативный вариант: размещение таблицы непосредственно на форме отчета (как элемент управления). В этом случае отчет генерируется внутри самой формы, а не в отдельном MDI-окне.

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

  1. Очищаем элемент таблицы на форме с помощью метода Форма.Таблица.Очистить().
  2. Выводим необходимые секции через Форма.Таблица.ВывестиСекцию().
  3. Вызываем метод Форма.Обновить() для перерисовывания формы.

Альтернативные решения через внешние компоненты

Если штатных возможностей 1С 7.7 недостаточно для решения вашей задачи (например, требуется более сложная интерактивность или группировка строк без полной перерисовки), рассмотрим применение сторонних библиотек:

  1. Внешняя компонента Йоксель: позволяет реализовывать полнофункциональные группировки (детализацию со значками «+» и «-») прямо в табличном документе. Это исключает необходимость перерисовывать печатную форму при раскрытии строк.
  2. Внешняя компонента FormEx: дает возможности тонкого управления MDI-окнами платформы, перехвата событий мыши и программного закрытия/активации открытых окон табличных документов.

Таким образом, для предотвращения появления новых окон при интерактивном взаимодействии с печатной формой в 1С 7.7 достаточно установить Флаг = 0; в ОбработкаЯчейкиТаблицы, повторно использовать объект таблицы с вызовом Очистить() и сохранять неизменным заголовок в методе Показать().

← На главную