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

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

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

Почему возникает мерцание и задержка отрисовки

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


Конт = 0;
ОткрытьФорму("Документ.ЗаявкаНаРаботу", Конт);

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

В штатном синтаксисе метода ОткрытьФорму() не предусмотрен флаг фонового создания или скрытия окна. Однако решить поставленную задачу можно несколькими путями — от правильного архитектурного рефакторинга до использования возможностей внешней компоненты FormEx.

Решение 1. Отказ от открытия формы и перевод создания документа на объектную модель

Наиболее правильный и производительный подход — полностью отказаться от интерактивного вызова ОткрытьФорму(). Зачастую форму открывают только ради получения переменной Контекст, чтобы задействовать уже написанные в модуле формы алгоритмы заполнения реквизитов. Создание системного окна ради вычислительной логики создает избыточную нагрузку на сервер и интерфейс.

Разберем по шагам правильный механизм создания документов через объектную модель:

  1. Выносим расчетные алгоритмы и логику заполнения реквизитов из модуля формы документа в отдельную процедуру в Глобальном модуле конфигурации (с ключевым словом Экспорт) либо в модуль внешней обработки.
  2. В месте вызова инициализируем объект метаданных напрямую через СоздатьОбъект() без создания графических окон.
  3. Заполняем реквизиты шапки и табличной части непосредственно через объект документа и записываем его в базу данных.

Посмотрим на пример кода, заменяющего интерактивное открытие:


Док = СоздатьОбъект("Документ.ЗаявкаНаРаботу");
Док.Новый();

// Заполняем реквизиты напрямую или через общую процедуру
Док.ДатаДок = ТекущаяДата();
Док.Клиент = ВыбранныйКлиент;
Док.Комментарий = "Создано автоматически";

// При необходимости проводим или просто записываем
Если НеобходимостьПроведения = 1 Тогда
    Док.Записать();
    Док.Провести();
Иначе
    Док.Записать();
КонецЕсли;

Такой способ гарантирует полное отсутствие мерцания интерфейса, экономит ресурсы клиентской машины и ускоряет пакетную обработку в десятки раз.

Решение 2. Отмена открытия через СтатусВозврата(0)

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


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

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

Решение 3. Использование возможностей компоненты FormEx

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

Рассмотрим подробнее доступные варианты скрытия:

  1. Смещение координат окна за пределы видимости экрана. В самом начале процедуры ПриОткрытии() привязываем объект РасширениеФормы к текущему окну и задаем заведомо недосягаемые координаты:
    
    Сервис = СоздатьОбъект("Сервис");
    РФ = СоздатьОбъект("РасширениеФормы");
    РФ.УстановитьФорму(Форма);
    
    // Смещаем форму далеко за пределы рабочей области монитора
    РФ.Лево = -10000;
    РФ.Верх = -10000;
    
    После смещения координат форма будет рассчитываться и закрываться вне зоны видимости пользователя, что полностью исключает эффект мерцания.
  2. Установка прозрачности окна. Объект РасширениеФормы позволяет регулировать уровень прозрачности через свойство Прозрачность. Установка максимальной прозрачности делает окно полностью невидимым на период проведения необходимых расчетов:
    
    РФ = СоздатьОбъект("РасширениеФормы");
    РФ.УстановитьФорму(Форма);
    РФ.Прозрачность = 255; // Полная прозрачность окна
    
  3. Сворачивание формы в момент инициализации. Также можно перевести создаваемое окно в минимизированное состояние с помощью установки свойства РФ.Минимизирована = 1, что сведет видимые перерисовки к системному минимуму.

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

← На главную