Разработчики на платформе 1С:Предприятие 7.7 часто сталкиваются с ограничением: стандартный метод Видимость(0) для объекта Форма попросту отсутствует или не работает так, как ожидается в контексте управления целым окном. Иногда возникает специфическая задача — использовать внешнюю обработку как «библиотеку функций». Для этого форму нужно открыть (чтобы инициализировать её контекст и иметь возможность вызывать экспортные процедуры), но при этом она не должна мозолить глаза пользователю.
В этой статье мы подробно разберем, почему штатные средства не справляются, и рассмотрим профессиональные способы решения задачи с помощью внешних компонент FormEx и 1С++.
Разберем типичные ошибки и заблуждения, упомянутые в обсуждении:
СтатусВозврата(0) полностью прерывает процесс создания формы. Объект не создается в памяти, а значит, вы не сможете обратиться к его методам из вызывающего кода. Контекст будет пуст.Проанализируем ситуацию и выясним, как обойти эти ограничения.
Если нам нужно, чтобы форма формально «была открыта», но пользователь её не видел, мы можем просто переместить её за пределы видимой области рабочего стола. Для этого лучше всего воспользоваться внешней компонентой FormEx.
Рассмотрим пример кода, который перемещает форму на координаты, недоступные для монитора:
// В модуле формы, которую нужно скрыть
Процедура ПриОткрытии()
// Используем расширение формы из FormEx
Расширение = СоздатьОбъект("РасширениеФормы");
Расширение.УстановитьИмяФормы("СкрытаяОбработка");
// Сдвигаем форму далеко за пределы экрана
// Параметры: Лево, Верх, Ширина, Высота
Форма.Расположение(-10000, -10000, 100, 100);
КонецПроцедуры
В этом случае форма остается активной, её процедуры доступны через Контекст, но визуально она никак не беспокоит пользователя. Чтобы форма не «мелькала» в момент открытия, в FormEx можно задействовать метод СкрыватьПриОткрытии(1).
Более «чистый» технически способ — это использование функций Windows API. Каждое окно в Windows имеет свой идентификатор — hWnd. Если мы его узнаем, мы сможем приказать операционной системе скрыть это окно полностью.
Разберем по шагам, как это реализовать:
hWnd формы при помощи FormEx.ShowWindow с параметром 0 (скрыть).
// Пример получения идентификатора окна
Сервис = СоздатьОбъект("Сервис");
hWnd = Сервис.ПолучитьhWndФормы(Контекст);
// Используем WinAPI для скрытия (константа SW_HIDE = 0)
Сервис.ShowWindow(hWnd, 0);
При таком подходе форма исчезает даже из панели задач 1С, но продолжает жить в памяти процесса. Важный момент: не забудьте программно закрыть эту форму при завершении работы основной программы, иначе вы получите «утечку» GDI-объектов и дескрипторов в системе.
Как упоминалось в сообщении №9, если форма модальная или специфическая, можно поиграться с прозрачностью (через атрибут Layered Window в 1С++) или просто программно свернуть её в иконку. Однако для целей создания «библиотеки функций» лучше всего подходит именно скрытие окна через координаты или WinAPI.
Давайте проанализируем ситуацию: зачем нам вообще форма, если нам нужны только процедуры? Использование формы как хранилища кода — это наследие старых подходов проектирования. Современный (для 7.7) и «тру-стиль» — это использование классов внешней компоненты 1С++.
Вместо скрытой формы мы создаем текстовый файл (или внешнюю обработку), описываем там класс и работаем с ним как с объектом. Это избавляет от необходимости манипулировать окнами.
Пример создания и использования класса:
// В основном коде
Помощник = СоздатьОбъект("Класс.МояБиблиотека");
Результат = Помощник.ВыполнитьНужнуюФункцию(Параметры);
Этот метод считается наиболее правильным, так как он экономит ресурсы системы (не создаются лишние оконные объекты) и делает код более структурированным. Вы можете завести отдельные классы под каждую задачу (например, ПомощникОтчетов, СервисПечати) и вызывать их по мере необходимости.
Если вы не хотите использовать 1С++, но процедур очень много, рассмотрите вариант использования Глобального модуля. Чтобы не перегружать основной глобальный модуль конфигурации (который и так может содержать десятки тысяч строк), FormEx позволяет динамически подключать дополнительные модули командой ДобавитьГлобальныйМодуль().
Преимущества этого метода:
Мы рассмотрели несколько вариантов управления «видимостью» логики в 1С 7.7. Если вам нужно быстрое решение «здесь и сейчас» без изменения архитектуры — используйте смещение координат окна через FormEx. Если же вы проектируете сложную систему отчетов, мы рекомендуем посмотреть в сторону классов 1С++. Это позволит вам создавать по-настоящему профессиональные и эффективные решения, не перегружая интерфейс пользователя невидимыми окнами.