При разработке интерфейсов в обычном приложении 1С:Предприятие 8 разработчики иногда сталкиваются с загадочным поведением: созданная форма настроек при открытии сжимается в едва заметную точку, полоску или становится практически невидимой. При этом в конструкторе форма выглядит абсолютно нормально. Выясним причину этой проблемы, проанализируем механизм ее возникновения и рассмотрим надежные способы ее решения.
Рассмотрим типичный сценарий. Разработчик создает форму настроек в обычном приложении и прописывает в обработчике события ПриОткрытии() или ПередОткрытием() инициализацию начальных значений для различных параметров:
Процедура ПриОткрытии()
СтрокаНачалаДанных = 1;
Наименование = 1;
Штрихкод = 2;
Вес = 3;
Длина = 4;
Ширина = 5;
Высота = 6;
Артикул = 7;
КонецПроцедуры
Как только этот код вступает в силу, форма при запуске открывается в суженном виде. Секрет такого поведения кроется в особенностях работы пространства имен и контекста модуля формы в «Обычном приложении» 1С.
Дело в том, что у самого объекта «Форма» существуют стандартные встроенные свойства Ширина и Высота. Они отвечают за линейные размеры окна на экране (в пикселях или логических единицах). Когда в коде модуля формы выполняется присваивание значения переменной без явного указания области видимости (например, Ширина = 5), платформа 1С интерпретирует это как обращение к свойству самой формы. В результате форма моментально сжимается до ширины в 5 пикселей и высоты в 6 пикселей, становясь практически невидимой для пользователя.
При этом переменная Длина не вызывает никаких проблем, так как у объекта «Форма» нет встроенного свойства с таким именем. Платформа просто создает локальную переменную внутри процедуры, что никак не влияет на визуальное отображение окна.
Если параметры (Ширина, Высота, Длина и т.д.) являются реквизитами обработки или документа, к которому принадлежит форма, обращаться к ним следует явно. Ключевое слово ЭтотОбъект указывает системе, что обращение идет к реквизитам самого прикладного объекта (данным), а не к свойствам визуального окна формы.
Правильный вариант кода в процедуре ПередОткрытием() будет выглядеть следующим образом:
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
ЭтотОбъект.СтрокаНачалаДанных = 1;
ЭтотОбъект.Наименование = 1;
ЭтотОбъект.Штрихкод = 2;
ЭтотОбъект.Вес = 3;
ЭтотОбъект.Длина = 4;
ЭтотОбъект.Ширина = 5;
ЭтотОбъект.Высота = 6;
ЭтотОбъект.Артикул = 7;
КонецПроцедуры
Благодаря префиксу ЭтотОбъект значения запишутся в соответствующие реквизиты объекта, а размеры окна формы останутся нетронутыми.
Если эти переменные не являются реквизитами объекта, а нужны исключительно внутри процедуры для временных расчетов, их необходимо принудительно объявить как локальные. Для этого используется ключевое слово Перем:
Процедура ПриОткрытии()
Перем СтрокаНачалаДанных, Наименование, Штрихкод, Вес, Длина, Ширина, Высота, Артикул;
СтрокаНачалаДанных = 1;
Наименование = 1;
Штрихкод = 2;
Вес = 3;
Длина = 4;
Ширина = 5;
Высота = 6;
Артикул = 7;
КонецПроцедуры
Объявление переменных через Перем перекрывает системные свойства формы внутри данной процедуры, гарантируя безопасность выполнения кода и неизменность геометрии окна.
Если вам необходимо, чтобы эти переменные были доступны в нескольких процедурах модуля формы, но при этом они не должны быть реквизитами самого объекта (документа/обработки), правильным решением будет добавить их в список Реквизитов формы на соответствующей вкладке редактора формы. Обращение к ним внутри модуля формы в обычном приложении происходит напрямую по имени, но система уже не будет путать их со свойствами окна формы.
Иногда даже после исправления кода в конфигураторе форма на компьютере пользователя продолжает открываться в «сломанном» виде. Это происходит из-за механизма сохранения параметров окон в 1С. Система запоминает последние координаты и размеры окна, которые были установлены ошибочным кодом, и записывает их в локальный кэш пользователя.
Чтобы исправить это, выполните следующие действия:
Проанализировав данную проблему, мы видим, насколько важно соблюдать чистоту контекста и использовать явные обращения к свойствам объектов с помощью ключевых слов ЭтотОбъект или ЭтаФорма, чтобы избежать случайного переопределения системных параметров интерфейса.