Почему аварийно закрывается 1С 7.7 при использовании Форма.Заголовок() и как это исправить?

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

При разработке обработок, отчетов или форм документов в платформе 1С:Предприятие 7.7 разработчики иногда сталкиваются с внезапными аварийными завершениями программы (вылетом с ошибкой Access Violation / GPF) при открытии или повторном открытии формы. Выясним причину этой нестабильности и разберем по шагам, как корректно управлять свойствами окна формы.

Анализ проблемы и механизма сбоя

Рассмотрим типичную ситуацию, приводящую к падению платформы. В модуле формы в самом низу (в теле модуля вне процедур и функций) размещается исполняемый код инициализации и настройки окна:


Перем зап;

Процедура ПриОткрытии()
    // Пользовательский код
КонецПроцедуры

зап = 1;
Форма.Заголовок("Заголовок обработки");

При таком подходе при первом или втором открытии формы программа 1С:Предприятие 7.7 аварийно закрывается. Проанализируем, почему это происходит:

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

Решение проблемы: перенос кода в процедуру ПриОткрытии()

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

Посмотрим на исправленный вариант структуры модуля формы:


Перем зап;

Процедура ПриОткрытии()
    // Устанавливаем заголовок формы в штатном событии
    Форма.Заголовок("Заголовок обработки");
КонецПроцедуры

// В теле модуля вне процедур оставляем только инициализацию переменных
зап = 1;

Правила распределения логики в модуле формы 1С 7.7

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

  1. Вне процедур (в основной исполняемой части модуля):

    Допускается объявление и инициализация внутренних служебных переменных (Перем), создание не привязанных к интерфейсу объектов (таких как СписокЗначений или ТаблицаЗначений) и базовые расчеты констант.

  2. В предопределенной процедуре ПриОткрытии():

    Выполняются все операции с интерфейсом: изменение заголовка через Форма.Заголовок(), переключение слоев с помощью Форма.ИспользоватьСлой(), настройка видимости и доступности реквизитов диалога, установка начального фокуса. Если по условиям проверки форму открывать нельзя, здесь вызывается СтатусВозврата(0).

  3. В предопределенной процедуре ПриПовторномОткрытии():

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

Особенности работы с методом Форма.Заголовок()

Рассмотрим возможности метода Форма.Заголовок(). Он принимает до двух параметров:

  1. Полная замена заголовка:
    
    // Заменяет стандартное название окна на новое
    Форма.Заголовок("Параметры формирования отчета", 0);
    // Второй параметр можно опускать:
    Форма.Заголовок("Параметры формирования отчета");
    
  2. Дополнение стандартного заголовка:
    
    // Добавляет текст в конец существующего системного заголовка
    Форма.Заголовок(" (только для чтения)", 1);
    

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

← На главную