При работе в платформе 1С:Предприятие 7.7 разработчики часто сталкиваются со своеобразным поведением интерфейса. Типичная ситуация: после внесения незначительных изменений в конфигурацию (например, добавили новый реквизит в справочник или слегка подвинули элементы на форме) форма документа перестает корректно масштабироваться. Само окно документа разворачивается на весь экран, но его внутренние элементы — в первую очередь табличная часть (ТЧ) — остаются «зажатыми» в фиксированных размерах и не растягиваются. Обычная очистка каталога пользователя в этом случае не помогает.
В этой статье мы подробно разберем, как устроен механизм масштабирования в «семерке», выясним истинные причины такого поведения интерфейса и рассмотрим все доступные способы решения проблемы — от простых штатных настроек до использования возможностей внешних компонент.
В отличие от современных управляемых форм в 1С 8.3, где позиционированием и растягиванием элементов управляет гибкий автоматический движок, в платформе 1С 7.7 все процессы отрисовки интерфейса жестко завязаны на внутренние алгоритмы Win32 API и структуру диалога конфигуратора. Чтобы успешно устранять любые проблемы с геометрией форм, нам необходимо понимать три фундаментальных правила платформы 1С 7.7:
Проанализируем по шагам все возможные способы восстановления корректного масштабирования формы.
Начнем с самого простого, но обязательного шага. Нам необходимо убедиться, что у самой формы вообще разрешено изменение размеров. Выполним следующие действия:
Если свойство «Изменять размер» установлено, но табличная часть по-прежнему не реагирует на разворачивание окна, велика вероятность, что сбился порядок обхода. Платформа больше не считает табличную часть главным растягиваемым элементом.
Для исправления порядка обхода выполним следующие шаги в Конфигураторе:
Иногда новый реквизит, добавленный на форму (или случайно сдвинутый старый элемент), начинает визуально «блокировать» расширение ТЧ. Платформа 1С 7.7 считает, что при растягивании таблицы этот элемент будет перекрыт, и отключает масштабирование.
Рассмотрим, как локализовать и устранить такую проблему:
Часто разработчики забывают, что 1С 7.7 кэширует размеры, координаты и состояние окон (развернуто/свернуто) индивидуально для каждого пользователя. И эти настройки хранятся вовсе не в каталоге пользователя (который автор темы безуспешно чистил), а в системном реестре Windows.
Если конфигурация изменилась, а в реестре осталась старая привязка координат, форма может открываться некорректно. Чтобы сбросить эти настройки, применим один из следующих приемов:
Вариант А. Пересоздание базы в списке запуска (Самый простой и безопасный способ):
Вариант Б. Ручная очистка реестра через regedit:
Если мы хотим решить проблему точечно для конкретного пользователя без удаления базы из списка, выполним следующие действия:
regedit и нажмем Enter).HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\<Имя_Вашей_Базы>\V7\<Имя_Пользователя>\WindowsДокумент.Реализация), и полностью удалим его.Если штатные средства бессильны, а перестраивать форму с нуля нет времени, мы можем прибегнуть к программным методам управления окнами. Для этого используется внешняя компонента Addon1C.
Суть метода заключается в принудительном программном «передергивании» состояния окна при его открытии. Это заставляет операционную систему Windows отправить окну системное сообщение WM_SIZE, и платформа заново пересчитывает координаты всех элементов формы.
Проанализируем пример кода, который необходимо разместить в процедуре ПриОткрытии() модуля формы документа:
Процедура ПриОткрытии()
// Проверим, загружена ли компонента и инициализируем объект
Попытка
Addon1C = СоздатьОбъект("Addon1C.Commands");
// Принудительно максимизируем дочернее MDI-окно
Addon1C.ShowChild(, 1);
// Возвращаем фокус и принудительно обновляем отрисовку формы
Addon1C.ShowChild(, 0);
Исключение
// Если компонента не зарегистрирована, пропускаем шаг
Предупреждение("Компонента Addon1C не найдена! Автомасштабирование может работать некорректно.", 1);
КонецПопытки;
КонецПроцедуры
Для крупных и сложных конфигураций на платформе 1С 7.7 стандартный механизм привязок слишком ограничен. В профессиональной разработке принято использовать связку внешних компонент FormEx и 1С++, которые позволяют внедрить полноценный класс привязок элементов формы.
Использование класса привязок позволяет жестко зафиксировать границы любых элементов (например, привязать правый край таблицы к правому краю формы, а нижний — к нижнему). При этом форма будет идеально масштабироваться независимо от порядка обхода.
Важные правила работы с классом привязок:
Для простейшего позиционирования силами FormEx достаточно переопределить всего одно событие формы, обрабатывающее изменение размеров окна, и прописать там несколько строк кода для пересчета координат элементов управления. Это полностью избавит форму от зависимости от порядка обхода и расположения соседних реквизитов.
Мы подробно разобрали, почему ломается масштабирование табличной части в 1С 7.7. В большинстве случаев для исправления ситуации достаточно вернуть табличную часть на первое место в порядке обхода или пересоздать базу в списке запуска для очистки кэша реестра Windows. Если же форма перегружена сложными элементами, оптимальным выбором станет использование программных костылей через Addon1C или переход на профессиональные библиотеки FormEx и 1С++.