В процессе сопровождения и активной разработки конфигураций 1С часто возникает ситуация, когда определенная обработка требует регулярного обновления. При этом сама информационная база обновляется не так часто. Постоянно заставлять пользователей запускать внешние файлы через меню «Файл — Открыть» неудобно и может привести к путанице, когда сотрудники продолжают использовать устаревшую встроенную версию.
В этой статье мы подробно разберем, как сделать замену встроенной обработки на внешнюю прозрачной для конечного пользователя. Мы проанализируем причины возникновения популярных ошибок, таких как «Интерактивные операции недоступны», и рассмотрим несколько надежных архитектурных подходов: от создания обработки-заглушки до использования механизмов БСП и расширений конфигурации.
При попытке реализовать простую замену разработчики часто сталкиваются с аппаратными ограничениями платформы в управляемом приложении. Ошибка «Интерактивные операции недоступны» обычно возникает, когда код открытия внешней формы вызывается непосредственно на сервере (например, внутри обработчика ПриСозданииНаСервере встроенной обработки).
В управляемом интерфейсе 1С жестко разделены контексты выполнения кода. Любые действия, связанные с отображением окон, диалогов и форм (включая метод ОткрытьФорму()), могут выполняться только на клиенте. На сервере мы можем лишь подготовить данные, прочитать файл внешней обработки, подключить его в сеансе, но не визуализировать форму пользователю.
Рассмотрим, как правильно обойти это ограничение с помощью трех различных сценариев решения.
Суть этого метода заключается в том, что встроенная обработка остается в конфигурации, но при ее открытии пользователем управление мгновенно передается внешней обработке, а сама встроенная форма закрывается.
Разберем по шагам правильную схему реализации, которая не будет вызывать ошибок выполнения.
Шаг 1. Модуль формы встроенной обработки (на клиенте)
Мы не можем прервать открытие формы на сервере, поэтому позволяем форме инициализироваться, но сразу после открытия запускаем процедуру перенаправления. Для более плавного интерфейса можно использовать обработчик ожидания с минимальной задержкой.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Подключаем однократный обработчик ожидания для мгновенного вызова
ПодключитьОбработчикОжидания("Подключаемый_ПеренаправитьНаВнешнюю", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПеренаправитьНаВнешнюю()
// Получаем адрес двоичных данных внешней обработки
АдресХранилища = ПолучитьФайлВнешнейОбработкиНаСервере();
Если ЗначениеЗаполнено(АдресХранилища) Тогда
// Подключаем внешнюю обработку в сеансе
ИмяВнешнейОбработки = ПодключитьОбработкуНаСервере(АдресХранилища);
// Открываем форму внешней обработки
ОткрытьФорму("ВнешняяОбработка." + ИмяВнешнейОбработки + ".Форма.Форма");
Иначе
ПоказатьПредупреждение(, "Не удалось загрузить внешнюю обработку. Будет открыта встроенная версия.");
КонецЕсли;
// Закрываем текущую форму-заглушку
ЭтаФорма.Закрыть();
КонецПроцедуры
Шаг 2. Получение и подключение обработки (на сервере)
Для того чтобы открыть форму внешнего файла .epf, его необходимо предварительно считать в двоичные данные, поместить во временное хранилище и зарегистрировать в текущем сеансе при помощи менеджера ВнешниеОбработки.
&НаСервереБезКонтекста
Функция ПолучитьФайлВнешнейОбработкиНаСервере()
// Путь к файлу обработки (может храниться в константе, регистре сведений или сетевой папке)
ПутьКФайлу = "\\server\share\Processings\НоваяОбработка.epf";
Файл = Новый Файл(ПутьКФайлу);
Если Файл.Существует() Тогда
ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);
Возврат ПоместитьВоВременноеХранилище(ДвоичныеДанные);
КонецЕсли;
Возврат "";
КонецФункции
&НаСервереБезКонтекста
Функция ПодключитьОбработкуНаСервере(АдресХранилища)
// Подключаем внешнюю обработку. Третий параметр - БезопасныйРежим (Ложь - для полной функциональности)
ИмяОбработки = ВнешниеОбработки.Подключить(АдресХранилища, , Ложь);
Возврат ИмяОбработки;
КонецФункции
Этот способ хорош тем, что вам не нужно менять существующие права доступа и интерфейсные меню пользователей — они по-прежнему кликают на привычную кнопку, но получают самый актуальный функционал из внешнего файла.
Если ваша конфигурация разработана на базе Библиотеки Стандартных Подсистем (БСП), то наиболее правильным с архитектурной точки зрения решением будет интеграция через стандартный справочник ДополнительныеОтчетыИОбработки.
Рассмотрим преимущества этого подхода:
СведенияОВнешнейОбработке() вы можете указать свойство ЗаменяемыеКоманды, что позволит автоматически перенаправлять вызовы встроенных функций на вашу внешнюю разработку.Для добавления обработки перейдите в раздел «НСИ и администрирование» — «Печатные формы, отчеты и обработки» — «Дополнительные отчеты и обработки», добавьте новый элемент и загрузите ваш файл .epf.
Использование расширений — это наиболее технологичный способ кастомизации логики в современной платформе 1С v8.3. Этот метод позволяет полностью отказаться от изменения основной конфигурации, сохраняя её на поддержке поставщика.
Мы можем перехватить команду открытия формы встроенной обработки и вместо неё запустить внешнюю форму. Проанализируем пример кода в модуле расширения для общей команды или команды формы:
&Вместо("ПриОткрытии")
Процедура Расш1_ПриОткрытии(Отказ)
// Устанавливаем Отказ в Истина, чтобы стандартная форма встроенной обработки вообще не инициализировалась
Отказ = Истина;
// Запускаем альтернативный сценарий открытия внешней обработки
ОткрытьВнешнююВерсиюОбработки();
КонецПроцедуры
Использование расширений также дает возможность внедрить саму новую логику непосредственно внутрь расширения (без использования внешних файлов .epf). При необходимости оперативного обновления логики программисту достаточно обновить только само расширение (что во многих случаях можно сделать динамически, без монопольного доступа к базе данных).
Мы рассмотрели различные варианты решения задачи. Выбор конкретного подхода зависит от архитектуры вашей системы. Для простых баз подойдет обработка-заглушка с клиент-серверным перенаправлением. В крупных корпоративных системах лучшим выбором станет использование встроенных механизмов БСП или написание чистого кода через расширение конфигурации.