В процессе разработки и поддержки систем на платформе 1С:Предприятие программисты часто сталкиваются с ситуацией, когда основная часть конфигурации работает в режиме обычного приложения (толстый клиент), но новые инструменты или внешние обработки создаются уже на управляемых формах. Возникает закономерный вопрос: как запустить такую обработку, не внося изменений в структуру метаданных основной конфигурации? В этой статье мы подробно разберем все доступные механизмы, проанализируем технические ограничения и найдем оптимальные решения для этой задачи.
Прежде чем приступать к написанию кода, мы должны убедиться, что сама платформа «понимает», что ей разрешено работать с управляемым интерфейсом внутри обычного приложения. Разберем этот момент подробнее. В корне конфигурации (свойства объекта «Конфигурация») существует критически важный флаг: «Использовать управляемые формы в обычном приложении».
Проанализируем ситуацию: если эта галочка не установлена, движок управляемых форм в толстом клиенте просто не инициализируется. В таком случае любые попытки вызвать управляемую форму программно или интерактивно закончатся неудачей — система либо выдаст ошибку, либо откроет пустую обычную форму по умолчанию. Поэтому первым шагом мы всегда проверяем эту настройку. Если она включена, платформа позволяет сосуществовать обоим типам интерфейса в рамках одного сеанса.
Многие разработчики совершают ошибку, пытаясь использовать стандартный метод ОткрытьФорму() для внешней обработки в обычном приложении. Выясним причину, по которой это часто не срабатывает. В обычном режиме контекст выполнения ограничен, и прямой вызов управляемой формы внешней обработки через строку пути может быть недоступен. Рассмотрим более надежный метод через связку Создать и ПолучитьФорму.
Для реализации этого метода нам потребуется следующий алгоритм действий:
Посмотрим на пример кода, который реализует эту логику:
// Определяем путь к файлу обработки на диске
ПутьКФайлу = "C:\ExternalTools\MyManagedProcessing.epf";
// Создаем объект внешней обработки
// Второй параметр "Ложь" указывает на то, что мы не выполняем безопасный режим
ОбработкаОбъект = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
// Получаем управляемую форму.
// Если имя формы не указано, будет получена основная форма.
ИмяФормы = "Форма"; // или "УправляемаяФорма"
Форма = ОбработкаОбъект.ПолучитьФорму(ИмяФормы);
// Открываем форму для пользователя
Если Форма <> Неопределено Тогда
Форма.Открыть();
КонецЕсли;
Важно помнить: при использовании метода ПолучитьФорму в толстом клиенте, система будет искать именно ту форму, которая соответствует текущему режиму запуска, если не указано иное. Однако, если в обработке создана только управляемая форма, платформа попытается инициализировать её.
Если ваша конфигурация построена на базе БСП (например, современная «Бухгалтерия предприятия» или «Управление торговлей», работающие в режиме совместимости или в толстом клиенте), мы можем воспользоваться механизмом «Дополнительные отчеты и обработки». Это наиболее правильный путь с точки зрения архитектуры системы.
Разберем по шагам, как это работает. В БСП реализованы специальные «прокладки» (врапперы). Когда вы регистрируете внешнюю обработку в справочнике, система сохраняет её в информационной базе. При запуске такой обработки механизмы БСП сами определяют тип формы и используют внутренние процедуры (например, ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКоманду()) для корректного отображения интерфейса. Это позволяет обойти ограничения интерактивного открытия через меню «Файл — Открыть», которое в толстом клиенте часто ориентировано только на обычные формы.
Существует еще один интересный технический прием, который позволяет «обмануть» платформу. Если нам нужно, чтобы обработка открывалась интерактивно через «Файл — Открыть», мы можем создать в ней одну пустую обычную форму и назначить её основной.
Рассмотрим подробнее реализацию этого метода:
ПриОткрытии пишем код для программного вызова нашей основной управляемой формы.Отказ = Истина).Пример кода в модуле обычной формы:
Процедура ПриОткрытии(Отказ)
// Платформа уже создала объект обработки, используем это
// Вызываем открытие управляемой формы
ЭтаФорма.ЭтотОбъект.ПолучитьФорму("УправляемаяФорма").Открыть();
// Отменяем открытие текущей "пустой" обычной формы
Отказ = Истина;
КонецПроцедуры
Таким образом, для платформы в толстом клиенте входной точкой является привычная ей обычная форма, которая затем инициирует запуск управляемого интерфейса.
Если задача стоит не просто «открыть один раз», а обеспечить удобную работу пользователей без изменения основной конфигурации, отличным решением станет использование Расширений. Мы можем добавить внешнюю обработку в состав расширения. В этом случае она перестает быть «внешней» в классическом понимании и становится частью метаданных (пусть и в расширении).
Проанализируем преимущества этого подхода:
ОткрытьФорму("Обработка.ИмяОбработкиВРасширении.Форма.ИмяФормы").В самых сложных случаях, когда управляемая форма использует специфические функции, доступные только в тонком клиенте (например, глубокая интеграция с веб-сервисами или сложные элементы оформления), мы можем прибегнуть к запуску отдельного процесса. Рассмотрим, как это сделать программно из толстого клиента с помощью функции ЗапуститьСистему().
Мы можем сформировать командную строку, которая запустит тонкий клиент той же информационной базы и сразу откроет нужную внешнюю обработку:
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
// Формируем параметры запуска
// /Execute указывает на путь к внешней обработке
ПараметрыЗапуска = "ENTERPRISE /S " + СтрокаСоединения + " /Execute ""C:\MyWork.erf""";
// Запускаем тонкий клиент
ЗапуститьСистему(ПараметрыЗапуска);
Этот метод создаст второе окно программы, но зато обработка будет работать в своей «родной» среде тонкого клиента, что исключит любые проблемы с отображением или поведением интерфейса.
Проанализируем риски, с которыми мы можем столкнуться даже при успешном открытии формы. Работа управляемых форм в толстом клиенте имеет свои особенности:
ПоместитьФайл: При работе с временными хранилищами во внешних обработках в толстом клиенте следует проявлять осторожность и проверять доступность адреса временного хранилища между серверными вызовами.Подводя итог, мы видим, что задача открытия управляемой формы в толстом клиенте вполне решаема. Выбор метода зависит от ваших возможностей по изменению настроек конфигурации и необходимости обеспечить долгосрочную поддержку решения. Наиболее современным и надежным способом является использование Расширений или механизмов БСП, в то время как программный вызов через ПолучитьФорму остается отличным инструментом для быстрой отладки и разовых задач.