Почему форма в обычном приложении 1С открывается в сжатом (суженном) виде и как это исправить?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке интерфейсов в обычном приложении 1С:Предприятие 8 разработчики иногда сталкиваются с загадочным поведением: созданная форма настроек при открытии сжимается в едва заметную точку, полоску или становится практически невидимой. При этом в конструкторе форма выглядит абсолютно нормально. Выясним причину этой проблемы, проанализируем механизм ее возникновения и рассмотрим надежные способы ее решения.

Разбор проблемы: почему «схлопывается» форма?

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


Процедура ПриОткрытии()
    СтрокаНачалаДанных = 1;
    Наименование       = 1;
    Штрихкод           = 2;
    Вес                = 3;
    Длина              = 4;
    Ширина             = 5;
    Высота             = 6;
    Артикул            = 7;
КонецПроцедуры

Как только этот код вступает в силу, форма при запуске открывается в суженном виде. Секрет такого поведения кроется в особенностях работы пространства имен и контекста модуля формы в «Обычном приложении» 1С.

Дело в том, что у самого объекта «Форма» существуют стандартные встроенные свойства Ширина и Высота. Они отвечают за линейные размеры окна на экране (в пикселях или логических единицах). Когда в коде модуля формы выполняется присваивание значения переменной без явного указания области видимости (например, Ширина = 5), платформа 1С интерпретирует это как обращение к свойству самой формы. В результате форма моментально сжимается до ширины в 5 пикселей и высоты в 6 пикселей, становясь практически невидимой для пользователя.

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

Решение 1. Использование обращения через «ЭтотОбъект»

Если параметры (Ширина, Высота, Длина и т.д.) являются реквизитами обработки или документа, к которому принадлежит форма, обращаться к ним следует явно. Ключевое слово ЭтотОбъект указывает системе, что обращение идет к реквизитам самого прикладного объекта (данным), а не к свойствам визуального окна формы.

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


Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
    ЭтотОбъект.СтрокаНачалаДанных = 1;
    ЭтотОбъект.Наименование       = 1;
    ЭтотОбъект.Штрихкод           = 2;
    ЭтотОбъект.Вес                = 3;
    ЭтотОбъект.Длина              = 4;
    ЭтотОбъект.Ширина             = 5;
    ЭтотОбъект.Высота             = 6;
    ЭтотОбъект.Артикул            = 7;
КонецПроцедуры

Благодаря префиксу ЭтотОбъект значения запишутся в соответствующие реквизиты объекта, а размеры окна формы останутся нетронутыми.

Решение 2. Объявление локальных переменных через «Перем»

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


Процедура ПриОткрытии()
    Перем СтрокаНачалаДанных, Наименование, Штрихкод, Вес, Длина, Ширина, Высота, Артикул;

    СтрокаНачалаДанных = 1;
    Наименование       = 1;
    Штрихкод           = 2;
    Вес                = 3;
    Длина              = 4;
    Ширина             = 5;
    Высота             = 6;
    Артикул            = 7;
КонецПроцедуры

Объявление переменных через Перем перекрывает системные свойства формы внутри данной процедуры, гарантируя безопасность выполнения кода и неизменность геометрии окна.

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

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

Что делать, если форма продолжает открываться сжатой?

Иногда даже после исправления кода в конфигураторе форма на компьютере пользователя продолжает открываться в «сломанном» виде. Это происходит из-за механизма сохранения параметров окон в 1С. Система запоминает последние координаты и размеры окна, которые были установлены ошибочным кодом, и записывает их в локальный кэш пользователя.

Чтобы исправить это, выполните следующие действия:

  1. Сбросьте настройки внешнего вида формы для текущего пользователя (через меню «Все функции» / «Стандартные настройки» или удалением настроек формы в режиме предприятия).
  2. В свойствах формы в конфигураторе временно отключите свойство Автоматическое сохранение свойств (или «Сохранять параметры»), запустите сеанс, откройте форму, закройте ее, а затем верните свойство обратно.
  3. Простым и быстрым решением для проверки также является очистка локального кэша базы данных 1С.

Проанализировав данную проблему, мы видим, насколько важно соблюдать чистоту контекста и использовать явные обращения к свойствам объектов с помощью ключевых слов ЭтотОбъект или ЭтаФорма, чтобы избежать случайного переопределения системных параметров интерфейса.

← На главную