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