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

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

При использовании внешних классов динамического изменения размеров элементов (например, класса Привязка_New на базе 1С++ или FormEx) в платформе 1С:Предприятие 7.7 разработчики часто сталкиваются с графическими артефактами. После закрытия формы подбора или возврата фокуса в документ текстовые рамки, подвалы и кнопки «съезжают», оставляют следы или дублируют свои контуры.

Рассмотрим подробно причины возникновения этой проблемы и разберем по шагам, как правильно настроить привязки элементов диалога, чтобы избежать искажения интерфейса.

Выясним причину графических лагов

Проанализируем ситуацию, которая происходит в момент закрытия подбора и возврата в форму документа:

  1. Конфликт штатного алгоритма и класса привязок: В свойствах формы платформы 1С 7.7 может быть включен флаг «Изменять размер». В этом случае сама платформа пытается растягивать элементы относительно первой табличной части в порядке обхода. Когда одновременно с этим работает сторонний класс, координаты элементов рассчитываются дважды, что вызывает графические сбои.
  2. Особенности метода Форма.Обновить(): В стандартном глобальном модуле при завершении процедур подбора вызывается метод Форма.Обновить(0). Он инициирует перерисовку штатных данных, но не генерирует системное событие изменения размера окна (WM_SIZE). В результате класс привязок не пересчитывает координаты, и элементы отрисовываются поверх предыдущих графических контуров.
  3. Привязка всех элементов «к форме»: Если левый и верхний край элементов подвала или надписей привязаны непосредственно к границам формы, а не к многострочной части, при изменении высоты окна или вызове событий обновления происходят наложения элементов друг на друга.

Правильная настройка класса привязок и свойств формы

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

Шаг 1. Отключение штатного масштабирования формы

В конфигураторе открываем форму документа и в её свойствах обязательно снимаем флаг «Изменять размер». Управление всеми координатами диалога должно полностью передаваться объекту привязок.

Шаг 2. Корректная привязка элементов в коде

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

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


Процедура НастроитьПривязки()
    
    оПривязки = СоздатьОбъект("Привязка_New");
    
    // Растягиваем табличную часть по ширине и высоте формы
    оПривязки.Добавить("МногострочнаяЧасть", "НН", "Форма", "ПП", "Форма");
    
    // Элементы подвала привязываем к нижней границе табличной части
    оПривязки.Добавить("Комментарий",          "НН", "МногострочнаяЧасть", "ВН", "МногострочнаяЧасть");
    оПривязки.Добавить("КомментарийНадпись",   "НН", "МногострочнаяЧасть", "ВН", "МногострочнаяЧасть");
    
    // Кнопки управления
    оПривязки.Добавить("кнПечать",             "НН", "МногострочнаяЧасть", "ВН", "МногострочнаяЧасть");
    оПривязки.Добавить("кнОК",                 "НН", "МногострочнаяЧасть", "ВН", "МногострочнаяЧасть");
    оПривязки.Добавить("кнЗакрыть",            "НН", "МногострочнаяЧасть", "ВН", "МногострочнаяЧасть");
    
    // Рамки и итоговые суммы в подвале
    оПривязки.Добавить("РамкаВсего",           "НН", "МногострочнаяЧасть", "ВН", "МногострочнаяЧасть", "ПП", "МногострочнаяЧасть", "ЛП", "Форма");
    оПривязки.Добавить("ВсегоОбщ",             "НН", "МногострочнаяЧасть", "ВН", "МногострочнаяЧасть", "ПП", "МногострочнаяЧасть", "ЛП", "Форма");
    оПривязки.Добавить("РамкаНДС",             "НН", "МногострочнаяЧасть", "ВН", "МногострочнаяЧасть", "ПП", "МногострочнаяЧасть", "ЛП", "Форма");
    оПривязки.Добавить("ВсегоНДС",             "НН", "МногострочнаяЧасть", "ВН", "МногострочнаяЧасть", "ПП", "МногострочнаяЧасть", "ЛП", "Форма");
    
КонецПроцедуры

Принудительное обновление интерфейса после подбора

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

Вариант 1. Использование компоненты FormEx

При наличии подключенной внешней компоненты FormEx можно перехватывать событие активизации окна и вызывать процедуру пересчета элементов или обновление формы:


Процедура ПриАктивацииОкна()
    // Принудительно обновляем форму для устранения графических артефактов
    Форма.Обновить(0);
КонецПроцедуры

Вариант 2. Корректировка обработки подбора

Если в процедуре глОбработкаПодбора() вызов Конт.Форма.Обновить(0) сбивает отрисовку рамок, проверьте последовательность активизации элементов. Замену вызова Форма.Обновить(0) можно произвести принудительным пересчетом координат через вызов метода самого класса привязок (например, оПривязки.ИзменениеРазмера() или аналогичного метода, предусмотренного в используемой ERT-версии класса).

← На главную