Как программно закрыть или обновить таблицу отчета в 1С 7.7 без открытия дублирующих окон?

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

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

Разберем причины такого поведения платформы, проанализируем синтаксис методов табличного документа и рассмотрим надежные способы избежать дублирования окон.

Почему плодятся окна и как работает метод Показать()

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

Для управления отображением окна печатной формы используется метод со следующим полным синтаксисом:

Показать(<Заголовок>, <ИмяФайла>, <Активизировать>)

Рассмотрим подробнее назначение третьего параметра <Активизировать>:

  1. 1 (значение по умолчанию) — открыть окно и передать ему фокус ввода (активизировать).
  2. 0 — открыть или обновить окно без передачи фокуса (в фоновом режиме).
  3. -1 — программно закрыть окно, если оно уже открыто.

Если разработчик передает значение -1 в самом конце процедуры вывода отчета (вместо отображения), платформа моментально закрывает только что сформированное окно, из-за чего пользователь вообще ничего не видит на экране. Чтобы управлять окнами правильно, применим один из двух проверенных подходов.

Способ 1. Обновление отчета в существующем окне через метод Очистить()

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

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

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

Посмотрим на пример программного кода:


Перем Таб;

Процедура Сформировать()
    Если ТипЗначенияСтр(Таб) <> "Таблица" Тогда
        Таб = СоздатьОбъект("Таблица");
    Иначе
        Таб.Очистить();
    КонецЕсли;

    // Вывод секций отчета
    Таб.ВывестиСекцию("Шапка");
    // Здесь располагается цикл выборки данных и сортировки
    Таб.ВывестиСекцию("Строка");
    Таб.ВывестиСекцию("Подвал");

    Таб.Показать("Отчет по остаткам", "");
КонецПроцедуры

Способ 2. Программное закрытие старого окна перед переформированием

Если логика отчета требует полного уничтожения предыдущего окна перед выводом нового, применим параметр -1. Главное правило — вызывать закрытие до создания нового отчета, а не после.

Проанализируем ситуацию: чтобы закрыть конкретное окно, нам требуется рабочая ссылка на объект этого окна. Поэтому переменная также должна быть объявлена на уровне модуля.

Разберем по шагам алгоритм закрытия:

  1. Перед формированием новых данных проверяем наличие открытого объекта таблицы.
  2. Вызываем метод Показать() с третьим параметром, равным -1. Окно на экране закрывается.
  3. Инициализируем новый объект таблицы и строим печатную форму с нуля.
  4. Отображаем новое окно с параметром 1.

Посмотрим на реализацию в коде:


Перем Таб;

Процедура ПереформироватьСНовойСортировкой()
    // Закрываем предыдущую таблицу, если она открыта
    Если ТипЗначенияСтр(Таб) = "Таблица" Тогда
        Таб.Показать("Отчет", , -1);
    КонецЕсли;

    // Создаем объект заново
    Таб = СоздатьОбъект("Таблица");

    Таб.ВывестиСекцию("Шапка");
    // Формирование строк с учетом новой сортировки
    Таб.ВывестиСекцию("Строка");

    // Открываем новое окно
    Таб.Показать("Отчет", , 1);
КонецПроцедуры

Альтернативные решения для динамических отчетов

Рассмотрим альтернативные способы организации интерфейса, когда требуется частая интерактивная сортировка колонок:

  1. Режим «Пустая таблица» на форме диалога. В свойствах формы отчета можно установить параметр «Использовать таблицу» в значение «Пустую». В таком случае табличное поле встраивается непосредственно в саму форму отчета. Вывод секций перенаправляется во встроенный объект Таблица, метод Показать() не требуется вовсе, а вся перерисовка происходит внутри одной формы.
  2. Использование элемента управления «ТаблицаЗначений». Если отчет представляет собой плоскую таблицу без сложных объединений ячеек, разместим на форме диалога элемент «ТаблицаЗначений». Сортировка колонок по клику на заголовок в ней выполняется штатными методами без необходимости перерисовывать печатный бланк.
← На главную