При разработке отчетов в платформе 1С:Предприятие 7.7 часто возникает необходимость динамически изменять содержимое сформированной печатной формы. Например, когда пользователь щелкает мышью по ячейке с расшифровкой (вызывается процедура ОбработкаЯчейкиТаблицы), отчет должен раскрыть детализирующую информацию («раскрыть по коду»), перерисовав текущую таблицу, а не плодить новые дублирующие окна.
Рассмотри подробно, почему возникает проблема дублирования окон, проанализируем механизмы платформы 1С 7.7 и разберем проверенные способы обновления печатной формы без закрытия и повторного создания MDI-окна.
Если в коде процедуры повторно вызывается СоздатьОбъект("Таблица") и затем метод Таб.Показать() с новым заголовком или без привязки к существующему окну, платформа 1С 7.7 создает новое независимое окно табличного документа. В результате при каждом клике по ячейке с расшифровкой пользователь получает всё новые и новые открытые печатные формы.
Кроме того, если в предопределенной процедуре ОбработкаЯчейкиТаблицы не сбросить стандартный флаг обработки, платформа попытается выполнить встроенное действие по умолчанию, что может привести к мерцанию экрана или некорректному переходу.
Выясним, как обновить содержимое таблицы в существующем окне. Для этого объект таблицы объявляется на уровне модуля формы отчета, а при переформировании печатной формы содержимое таблицы очищается вызовом метода Очистить().
Разберем по шагам реализацию данного подхода:
Таб в самом начале модуля отчета вне процедур.Таб.Очистить().Показать() передаем одинаковый заголовок окна. Если заголовок совпадает с уже открытым окном, 1С 7.7 обновляет данные в нем, не открывая новое.ОбработкаЯчейкиТаблицы устанавливаем параметр Флаг = 0;, чтобы отключить стандартную обработку клика платформой.Рассмотрим пример кода:
Перем Таб; // Объявляем переменную на уровне модуля
Процедура Отчет()
Если ТипЗначенияСтр(Таб) <> "Таблица" Тогда
Таб = СоздатьОбъект("Таблица");
Иначе
Таб.Очистить(); // Очищаем существующую таблицу перед повторным заполнением
КонецЕсли;
Таб.ИсходнаяТаблица("Отчет");
Таб.ВывестиСекцию("Заголовок");
Если Индекс = "0" Тогда
// Выводим базовые секции отчета
Таб.ВывестиСекцию("СотрудникКратко");
Иначе
// Выводим детализированные секции
Таб.ВывестиСекцию("СотрудникПодробно");
КонецЕсли;
Таб.ТолькоПросмотр(1);
Таб.Показать("Отчет по сотрудникам", ""); // Фиксированный заголовок окна
КонецПроцедуры
Процедура ОбработкаЯчейкиТаблицы(Значение, Флаг, Таблица, Адрес)
Если Лев(Значение, 15) = "РаскрытьПоКоду/" Тогда
Флаг = 0; // Отменяем стандартное действие платформы
Индекс = "1";
Отчет(); // Переформировываем отчет в том же окне
КонецЕсли;
КонецПроцедуры
В платформе 1С 7.7 предопределенная процедура ОбработкаЯчейкиТаблицы принимает третий параметр — Таблица. Этот параметр содержит прямую ссылку на открытый табличный документ, в ячейке которого произошел клик.
Проанализируем пример использования этого параметра для очистки и повторного заполнения открытого документа без обращения к глобальным переменным:
Процедура ОбработкаЯчейкиТаблицы(Значение, Флаг, Таблица, Адрес)
Если Лев(Значение, 15) = "РаскрытьПоКоду/" Тогда
Флаг = 0; // Отключаем стандартную расшифровку
// Очищаем существующий табличный документ напрямую через параметр
Таблица.Очистить();
Таблица.ИсходнаяТаблица("Отчет");
// Заполняем секции заново
Таблица.ВывестиСекцию("Заголовок");
Таблица.ВывестиСекцию("Подробно");
// Обновляем отображение
Таблица.Показать("Отчет по сотрудникам", "");
КонецЕсли;
КонецПроцедуры
Посмотрим на альтернативный вариант: размещение таблицы непосредственно на форме отчета (как элемент управления). В этом случае отчет генерируется внутри самой формы, а не в отдельном MDI-окне.
При использовании таблицы на форме важно помнить ключевое ограничение 1С 7.7: метод Показать() вызывать нельзя, иначе платформа выдаст ошибку «Открытие окна в данном режиме недоступно!». Порядок работы следующий:
Форма.Таблица.Очистить().Форма.Таблица.ВывестиСекцию().Форма.Обновить() для перерисовывания формы.Если штатных возможностей 1С 7.7 недостаточно для решения вашей задачи (например, требуется более сложная интерактивность или группировка строк без полной перерисовки), рассмотрим применение сторонних библиотек:
Таким образом, для предотвращения появления новых окон при интерактивном взаимодействии с печатной формой в 1С 7.7 достаточно установить Флаг = 0; в ОбработкаЯчейкиТаблицы, повторно использовать объект таблицы с вызовом Очистить() и сохранять неизменным заголовок в методе Показать().