В практике разработчика 1С часто возникает ситуация, когда информационная база работает в режиме обычного приложения (толстый клиент), но появляется необходимость использовать современные управляемые формы (УФ). Если форма встроена в конфигурацию, проблем обычно не возникает. Однако, когда речь заходит о внешних обработках (файлы .epf), разработчики сталкиваются с серьезным ограничением платформы: стандартный метод ПолучитьФорму() в обычном приложении упорно пытается найти обычную форму и игнорирует управляемую, либо выдает ошибку «Схема не зарегистрирована».
В этой статье мы подробно разберем, почему это происходит, и проанализируем все доступные способы решения задачи — от классического программного подключения до современных методик с использованием расширений.
Разберем ситуацию: у нас есть внешняя обработка, в которой создана только управляемая форма. Мы запускаем 1С в режиме обычного приложения и пытаемся открыть эту обработку. Платформа 1С разделяет контексты выполнения. В обычном приложении приоритет отдается «родным» объектам. Когда мы работаем с внешним файлом, система не всегда может корректно сопоставить типы данных, что приводит к невозможности прямого создания объекта управляемой формы.
Основная «боль» разработчиков заключается в том, что для встроенных в конфигурацию объектов метод ОткрытьФорму() работает прозрачно, а для внешних — требует предварительной регистрации метаданных в сеансе.
Для того чтобы система «увидела» управляемую форму внешнего файла, обработку необходимо сначала подключить. Это превращает внешний файл во временный объект метаданных, к которому можно обращаться по внутреннему имени. Рассмотрим этот процесс по шагам.
Проанализируем пример кода, который позволяет зарегистрировать обработку и вызвать ее форму:
// 1. Указываем путь к файлу обработки
ПутьКФайлу = "D:\MyReports\ExternalProcessing.epf";
// 2. Подключаем обработку. Метод возвращает внутреннее имя
// Важно: БезопасныйРежим лучше установить в Ложь, если требуется полный доступ
ИмяОбработки = ВнешниеОбработки.Подключить(ПутьКФайлу, , Ложь);
// 3. Формируем полное имя формы для открытия
// Используется синтаксис "ВнешняяОбработка.[Имя].Форма.[ИмяФормы]"
ИмяФормыУФ = "ВнешняяОбработка." + ИмяОбработки + ".Форма.ФормаУправляемая";
// 4. Открываем форму
ОткрытьФорму(ИмяФормыУФ);
Почему это может не сработать? Если вы используете метод ПоместитьВоВременноеХранилище (как в сообщении №26 обсуждения), платформа может выдать ошибку «Схема не зарегистрирована». Это происходит потому, что в обычном приложении работа с навигационными ссылками временного хранилища для внешних метаданных ограничена. Рекомендуется использовать прямой путь к файлу на диске или предварительно сохранять двоичные данные во временный файл.
Иногда требуется не просто открыть форму, а получить ее объект для программного заполнения данных перед открытием. В обычном приложении для этого можно попробовать использовать менеджер внешних обработок. Посмотрим на алгоритм:
ВнешниеОбработки.Создать(ИмяОбработки).ПолучитьФорму, явно указав имя управляемой формы.Однако стоит помнить: в толстом клиенте (обычное приложение) метод ПолучитьФорму у объекта внешней обработки часто возвращает тип Форма (обычная), а не УправляемаяФорма. Если вам критически важен объект УправляемаяФорма, лучше использовать глобальный метод ОткрытьФорму с передачей параметров в структуре.
Если внешнюю обработку нужно открывать часто и вышеописанные методы вызывают ошибки, рассмотрим надежный обходной путь. Мы можем создать в основной конфигурации пустую обработку-заглушку (например, ПроксиУФ) с одной управляемой формой.
Алгоритм работы будет следующим:
ПроксиУФ.ПроксиУФ при создании на сервере подключает внешний файл и динамически отрисовывает его данные или просто выполняет заложенную в него логику.Этот метод гарантирует отсутствие ошибок со «схемами», так как инициатором открытия управляемой формы выступает объект, уже известный конфигурации.
Если ваша конфигурация построена на базе БСП, мы настоятельно рекомендуем не «изобретать велосипед», а использовать штатный механизм. При регистрации внешней обработки в справочнике «Дополнительные отчеты и обработки», система сама берет на себя все сложности с контекстами.
Рассмотрим, как это упрощает жизнь:
ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКоманду(...).Проанализируем еще несколько важных моментов, которые помогут избежать ошибок:
1. Настройки конфигурации. Убедитесь, что в свойствах конфигурации стоят галочки «Использовать управляемые формы в обычном приложении» и «Использовать обычные формы в управляемом приложении». Без этого смешивание интерфейсов будет блокироваться на уровне ядра платформы.
2. Режим запуска. Помните, что управляемая форма в обычном приложении будет выглядеть как отдельное окно. Она не сможет стать «закладкой» в привычном понимании интерфейса 8.2, но сохранит весь функционал: работу с командами, динамическими списками и т.д.
3. Использование расширений. Если задача позволяет, рассмотрите возможность переноса логики из внешней обработки в расширение конфигурации. Объекты расширения (включая формы) воспринимаются системой как родные объекты метаданных. Управляемая форма из расширения откроется в обычном приложении без дополнительных манипуляций с методом Подключить().
4. Навигационные ссылки. Рассмотрим использование команды ПерейтиПоНавигационнойСсылке(). Для внешних обработок можно сформировать ссылку вида e1cib/data/ВнешняяОбработка.[Имя]?Форма=[ИмяФормы]. Однако этот метод требует, чтобы обработка уже была известна системе в текущем сеансе.
Открыть управляемую форму из обычного интерфейса внешней обработки можно, но это требует понимания механизмов регистрации внешних метаданных. Самым стабильным способом является предварительное использование ВнешниеОбработки.Подключить() с последующим вызовом ОткрытьФорму() по полному системному пути. Если же ваша база поддерживает расширения — это будет самым современным и беспроблемным вариантом решения задачи.