При разработке обработок, отчетов или форм документов в платформе 1С:Предприятие 7.7 разработчики иногда сталкиваются с внезапными аварийными завершениями программы (вылетом с ошибкой Access Violation / GPF) при открытии или повторном открытии формы. Выясним причину этой нестабильности и разберем по шагам, как корректно управлять свойствами окна формы.
Рассмотрим типичную ситуацию, приводящую к падению платформы. В модуле формы в самом низу (в теле модуля вне процедур и функций) размещается исполняемый код инициализации и настройки окна:
Перем зап;
Процедура ПриОткрытии()
// Пользовательский код
КонецПроцедуры
зап = 1;
Форма.Заголовок("Заголовок обработки");
При таком подходе при первом или втором открытии формы программа 1С:Предприятие 7.7 аварийно закрывается. Проанализируем, почему это происходит:
HWND), а элементы управления еще не размещены.Форма.Заголовок()) до фактической отрисовки окна нарушает внутренние структуры данных платформы.Чтобы исключить падение платформы, необходимо строго соблюдать очередность инициализации: любые манипуляции с визуальной частью формы должны выполняться только тогда, когда окно уже готово к работе. Для этого перенесем вызов метода в предопределенную процедуру ПриОткрытии().
Посмотрим на исправленный вариант структуры модуля формы:
Перем зап;
Процедура ПриОткрытии()
// Устанавливаем заголовок формы в штатном событии
Форма.Заголовок("Заголовок обработки");
КонецПроцедуры
// В теле модуля вне процедур оставляем только инициализацию переменных
зап = 1;
Разберем подробнее, какой код где должен располагаться, чтобы избежать нештатных ситуаций:
Допускается объявление и инициализация внутренних служебных переменных (Перем), создание не привязанных к интерфейсу объектов (таких как СписокЗначений или ТаблицаЗначений) и базовые расчеты констант.
Выполняются все операции с интерфейсом: изменение заголовка через Форма.Заголовок(), переключение слоев с помощью Форма.ИспользоватьСлой(), настройка видимости и доступности реквизитов диалога, установка начального фокуса. Если по условиям проверки форму открывать нельзя, здесь вызывается СтатусВозврата(0).
Реализуется обработка повторного обращения пользователя к уже открытому окну (актуально для форм справочников, документов и отчетов).
Рассмотрим возможности метода Форма.Заголовок(). Он принимает до двух параметров:
// Заменяет стандартное название окна на новое
Форма.Заголовок("Параметры формирования отчета", 0);
// Второй параметр можно опускать:
Форма.Заголовок("Параметры формирования отчета");
// Добавляет текст в конец существующего системного заголовка
Форма.Заголовок(" (только для чтения)", 1);
Альтернативный вариант: Если заголовок окна не должен меняться динамически в зависимости от условий, лучше всего задать его статически в свойствах диалога формы в конфигураторе без использования программного кода.