В процессе эксплуатации систем на базе 1С:Предприятия 7.7 программисты часто сталкиваются с тем, что пользователи случайно или намеренно изменяют размеры служебных окон. Окно сообщений (которое вызывается командой Сообщить) особенно уязвимо: его могут свернуть до такой степени, что важная техническая информация или результаты проведения документов становятся невидимыми. Поскольку штатных средств встроенного языка 1С 7.7 для управления размерами этого окна не существует, нам приходится прибегать к расширенным методам. Разберем основные способы решения этой задачи.
Наиболее надежным и динамичным способом управления окном сообщений является использование внешней компоненты RWidjets.dll. Она предоставляет объект RMsgWindow, который позволяет не только выводить текст, но и программно позиционировать окно на экране. Проанализируем пример кода, который позволяет загрузить компоненту и установить нужные координаты окна.
Рассмотрим по шагам реализацию этого метода:
RMsgWindow.Переместить для установки координат и размеров.
// Пример управления окном сообщений через RWidjets.dll
Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "LIB\RWidjets.dll") = 0 Тогда
Предупреждение("Неудачная попытка загрузить RWidjets.dll");
Возврат;
КонецЕсли;
Попытка
лОкно = СоздатьОбъект("RMsgWindow");
// Выводим тестовое сообщение
лОкно.Сообщить("Внимание! Окно сообщений было автоматически масштабировано.", "Заголовок окна", 1);
// Устанавливаем положение: Лево=100, Верх=100, Ширина=500, Высота=200
лОкно.Переместить(100, 100, 500, 200);
Исключение
Сообщить("Не удалось создать объект RMsgWindow или выполнить перемещение");
КонецПопытки;
В данном примере метод Переместить принимает четыре параметра: координаты X и Y верхнего левого угла, а также ширину и высоту окна. Это позволяет принудительно развернуть окно, если пользователь его скрыл.
Если использование внешних DLL по каким-то причинам ограничено, мы можем воздействовать на настройки интерфейса через реестр. 1С 7.7 хранит информацию о расположении панелей инструментов и служебных окон в ветке HKEY_CURRENT_USER. Выясним причину, по которой этот метод имеет свои особенности: 1С считывает эти данные при старте и записывает при закрытии. Следовательно, менять их "на лету" внутри сеанса бесполезно — изменения вступят в силу только при следующем запуске.
Путь к настройкам выглядит следующим образом:
HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\<Имя базы>\V7\<Имя пользователя>\ToolbarSystem\
Проанализируем конкретные ключи, отвечающие за окно сообщений:
Для того чтобы сбросить размер окна программно, можно создать .reg файл или использовать объект WScript.Shell для записи значений в реестр перед запуском основной конфигурации или в момент выхода из системы.
// Пример записи в реестр через встроенный язык (используя WScript.Shell)
Шелл = СоздатьОбъект("WScript.Shell");
ПутьРеестра = "HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\МояБаза\V7\Администратор\ToolbarSystem\ToolbarPlace-Bar6\";
// Устанавливаем высоту окна в пикселях (примерное значение)
Шелл.RegWrite(ПутьРеестра + "MRUHorzDockCY", 150, "REG_DWORD");
Если в вашей конфигурации уже используются популярные расширения FormEx или 1C++, мы можем получить дескриптор окна (HWND) и управлять им напрямую через функции Windows API. Это самый гибкий метод, так как он позволяет изменять размер окна "здесь и сейчас".
Разберем логику работы через WinAPI:
1C:Сообщения (или соответствующим идентификатором для вашей версии).MoveWindow для изменения геометрии.С помощью 1C++ это можно реализовать через класс Окно. Проанализируем ситуацию: когда окно сообщений "прилипает" к краю, оно становится частью сложной структуры контейнеров. В этом случае иногда проще сначала программно "отлепить" его (сделать Floating), задать размер и прилепить обратно.
Рассмотрим "экзотический", но рабочий метод без использования внешних компонент. Мы можем использовать объект WScript.Shell и метод SendKeys. Суть заключается в эмуляции нажатия горячих клавиш. Например, Ctrl+Shift+Z активирует окно сообщений. После этого можно имитировать нажатие Alt+Space (системное меню) и команды изменения размера. Однако этот способ крайне нестабилен и не рекомендуется для промышленного использования, так как зависит от текущей раскладки клавиатуры и фокуса окна.
Выясним, какой подход лучше. Если вам нужно гарантированное решение "в один клик", используйте RWidjets. Если нужно массово вернуть окно всем пользователям — используйте скриптовую правку реестра перед запуском 1С. Если же вы создаете сложный интерфейс, лучше всего реализовать собственную форму сообщений на базе текстового поля или таблицы, где вы сможете полностью контролировать размеры и поведение элементов интерфейса, не полагаясь на системные окна платформы 1С 7.7.