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

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

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

Почему перестает работать расшифровка при закрытии формы обработки

Проанализируем механику работы платформы 1С 7.7. Когда мы пытаемся закрыть форму в предопределенной процедуре ПриОткрытии() с помощью следующей конструкции:


СтатусВозврата(0);
Возврат;

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

Если же мы не закрываем диалог, форма обработки продолжает висеть («болтаться») на экране под таблицей или поверх нее, создавая визуальный шум и неудобство для пользователя.

Обязательные условия для работы расшифровки в таблицах 1С 7.7

Перед тем как перейти к вариантам решения, вспомним базовые правила платформы, без выполнения которых расшифровка не сработает ни при каких обстоятельствах:

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

Способ 1. Обработка расшифровки в глобальном модуле

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

Разберем по шагам, как это реализовать:

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

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

Способ 2. Использование совмещенной формы и таблицы

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

В этом случае таблица открывается непосредственно в рабочей области окна обработки. Контекст обработки остается активным, процедура ОбработкаЯчейкиТаблицы() внутри модуля .ert успешно выполняется, а лишняя промежуточная форма попросту отсутствует, так как таблица и есть само окно обработки.

Способ 3. Прямая ссылка без перехвата процедурой

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

Платформа 1С 7.7 обладает встроенным стандартным механизмом расшифровки ссылочных типов данных. Если в поле «Расшифровка» ячейки передать непосредственно сам объект (например, переменную, содержащую ссылку на документ вида ТекущийДокумент), то при закрытом контексте внешней формы ядро 1С самостоятельно откроет данный объект базы данных по двойному клику. Главное — убедиться, что включен режим Таб.ТолькоПросмотр(1);.

Способ 4. Минимизация диалогового окна обработки

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

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

Способ 5. Скрытие окна через внешние компоненты (FormEx)

Если в системе разрешено использование сторонних библиотек, наиболее технологичным решением является перехват окна с помощью внешней компоненты FormEx. В этом случае мы не вызываем СтатусВозврата(0), сохраняя модуль обработки в памяти, но программно скрываем окно диалога через методы перехвата окон Windows (аналог вызова WinAPI-функции ShowWindow с флагом SW_HIDE). Контекст модуля продолжает жить ровно столько, сколько открыта печатная форма, обеспечивая полноценную работу всех интерактивных событий.

← На главную