При использовании внешних классов динамического изменения размеров элементов (например, класса Привязка_New на базе 1С++ или FormEx) в платформе 1С:Предприятие 7.7 разработчики часто сталкиваются с графическими артефактами. После закрытия формы подбора или возврата фокуса в документ текстовые рамки, подвалы и кнопки «съезжают», оставляют следы или дублируют свои контуры.
Рассмотрим подробно причины возникновения этой проблемы и разберем по шагам, как правильно настроить привязки элементов диалога, чтобы избежать искажения интерфейса.
Проанализируем ситуацию, которая происходит в момент закрытия подбора и возврата в форму документа:
Форма.Обновить(): В стандартном глобальном модуле при завершении процедур подбора вызывается метод Форма.Обновить(0). Он инициирует перерисовку штатных данных, но не генерирует системное событие изменения размера окна (WM_SIZE). В результате класс привязок не пересчитывает координаты, и элементы отрисовываются поверх предыдущих графических контуров.Разберем по шагам, какие действия необходимо выполнить для устранения некорректного отображения элементов.
Шаг 1. Отключение штатного масштабирования формы
В конфигураторе открываем форму документа и в её свойствах обязательно снимаем флаг «Изменять размер». Управление всеми координатами диалога должно полностью передаваться объекту привязок.
Шаг 2. Корректная привязка элементов в коде
Связывать элементы подвала нужно не с самой формой, а с табличной частью (МногострочнаяЧасть). При этом табличная часть привязывается к краям формы, а элементы нижнего блока — к нижнему краю табличной части.
Посмотрим на пример правильной инициализации класса Привязка_New в модуле формы:
Процедура НастроитьПривязки()
оПривязки = СоздатьОбъект("Привязка_New");
// Растягиваем табличную часть по ширине и высоте формы
оПривязки.Добавить("МногострочнаяЧасть", "НН", "Форма", "ПП", "Форма");
// Элементы подвала привязываем к нижней границе табличной части
оПривязки.Добавить("Комментарий", "НН", "МногострочнаяЧасть", "ВН", "МногострочнаяЧасть");
оПривязки.Добавить("КомментарийНадпись", "НН", "МногострочнаяЧасть", "ВН", "МногострочнаяЧасть");
// Кнопки управления
оПривязки.Добавить("кнПечать", "НН", "МногострочнаяЧасть", "ВН", "МногострочнаяЧасть");
оПривязки.Добавить("кнОК", "НН", "МногострочнаяЧасть", "ВН", "МногострочнаяЧасть");
оПривязки.Добавить("кнЗакрыть", "НН", "МногострочнаяЧасть", "ВН", "МногострочнаяЧасть");
// Рамки и итоговые суммы в подвале
оПривязки.Добавить("РамкаВсего", "НН", "МногострочнаяЧасть", "ВН", "МногострочнаяЧасть", "ПП", "МногострочнаяЧасть", "ЛП", "Форма");
оПривязки.Добавить("ВсегоОбщ", "НН", "МногострочнаяЧасть", "ВН", "МногострочнаяЧасть", "ПП", "МногострочнаяЧасть", "ЛП", "Форма");
оПривязки.Добавить("РамкаНДС", "НН", "МногострочнаяЧасть", "ВН", "МногострочнаяЧасть", "ПП", "МногострочнаяЧасть", "ЛП", "Форма");
оПривязки.Добавить("ВсегоНДС", "НН", "МногострочнаяЧасть", "ВН", "МногострочнаяЧасть", "ПП", "МногострочнаяЧасть", "ЛП", "Форма");
КонецПроцедуры
Если после подбора в форме все равно остаются полосы или следы от рамок, необходимо принудительно обновить графический контекст при активации окна или завершении обработки подбора.
Вариант 1. Использование компоненты FormEx
При наличии подключенной внешней компоненты FormEx можно перехватывать событие активизации окна и вызывать процедуру пересчета элементов или обновление формы:
Процедура ПриАктивацииОкна()
// Принудительно обновляем форму для устранения графических артефактов
Форма.Обновить(0);
КонецПроцедуры
Вариант 2. Корректировка обработки подбора
Если в процедуре глОбработкаПодбора() вызов Конт.Форма.Обновить(0) сбивает отрисовку рамок, проверьте последовательность активизации элементов. Замену вызова Форма.Обновить(0) можно произвести принудительным пересчетом координат через вызов метода самого класса привязок (например, оПривязки.ИзменениеРазмера() или аналогичного метода, предусмотренного в используемой ERT-версии класса).