При разработке в среде 1С:Предприятие 8.3 разработчики часто сталкиваются с задачей программного запуска внешних отчетов или обработок. Распространенной ошибкой является попытка открыть интерактивную форму непосредственно из серверного контекста (например, из модуля объекта обработки или серверной процедуры формы).
В этой статье мы подробно разберем, почему возникает классическая ошибка "Сервер не может вызывать клиента", как правильно организовать архитектуру вызова и приведем готовый шаблон кода для безопасного подключения и открытия формы управляемой внешней обработки.
Рассмотрим типичную ситуацию. Разработчик пытается запустить обработку прямо из модуля объекта на сервере:
ВнешниеОбработки.Создать("D:\ИмяОбработки.epf").Отладить();
Такой подход обречен на неудачу, если внутри метода Отладить() предполагается вывод формы на экран. Метод ВнешниеОбработки.Создать() выполняется исключительно на стороне сервера. Серверный контекст платформы физически изолирован от клиентской части — сервер "не знает", на каком компьютере запущен сеанс пользователя, и не имеет доступа к графическому интерфейсу. Попытка вызвать клиентские процедуры (такие как открытие окон) из серверного кода всегда приводит к ошибкам выполнения.
Для корректного решения этой задачи мы должны разделить процесс на два этапа:
Давайте рассмотрим по шагам классический и надежный алгоритм программного запуска внешней обработки из файла на диске.
Для этого в форме нашей обработки (или в общей форме) мы опишем процедуру на клиенте, которая сначала поместит файл во временное хранилище, затем вызовет серверный метод для регистрации обработки в системе, а после этого откроет форму.
&НаКлиенте
Процедура ОткрытьВнешнююОбработку(Команда)
Перем ИмяОбработки, АдресХранилища;
АдресХранилища = "";
// Помещаем файл обработки во временное хранилище на сервере
Если НЕ ПоместитьФайл(АдресХранилища, "D:\ИмяОбработки.epf", , Ложь) Тогда
Возврат; // Пользователь отказался или файл недоступен
КонецЕсли;
// Подключаем обработку на сервере и получаем ее внутреннее имя
ИмяОбработки = ПодключитьВнешнююОбработкуНаСервере(АдресХранилища);
// Формируем путь к форме и открываем ее на клиенте
ПутьКФорме = "ВнешняяОбработка." + ИмяОбработки + ".Форма.Форма";
ОткрытьФорму(ПутьКФорме);
КонецПроцедуры
&НаСервере БезКонтекста
Функция ПодключитьВнешнююОбработкуНаСервере(Знач АдресХранилища)
// Регистрируем внешнюю обработку в системе
Возврат ВнешниеОбработки.Подключить(АдресХранилища);
КонецФункции
В этом коде метод ПоместитьФайл временно загружает двоичные данные файла .epf в оперативную память сервера. Серверная функция Подключить() регистрирует временный файл в системе под уникальным именем, которое мы возвращаем обратно на клиент. На финальном этапе стандартный клиентский метод ОткрытьФорму инициализирует интерфейс.
При использовании вышеописанного метода на современных версиях платформы 1С:Предприятие 8.3 вы можете столкнуться с защитными механизмами системы:
ПараметрыЗащиты = Новый ОписаниеЗащитыОтОпасныхДействий;
ПараметрыЗащиты.ПредупреждатьОбОпасныхДействиях = Ложь;
// Передаем параметры защиты четвертым параметром метода Подключить
ИмяОбработки = ВнешниеОбработки.Подключить(АдресХранилища, , Ложь, ПараметрыЗащиты);
Ложь третьим параметром в метод Подключить().Если ваша конфигурация разработана на базе Библиотеки стандартных подсистем (БСП), крайне не рекомендуется вручную прописывать подключение через временные хранилища. Для этого в БСП предусмотрены готовые модули, которые берут на себя всю рутину по контролю безопасности, прав доступа и очистке временных файлов.
Для открытия формы обработки через БСП достаточно вызвать методы общего модуля ДополнительныеОтчетыИОбработкиКлиент, например, процедуру ВыполнитьОткрытиеФормыОбработки(), передав туда ссылку на элемент справочника дополнительных обработок.
Часто программисты сталкиваются с тем, что точки останова в модулях внешней обработки не срабатывают при программном вызове. Это происходит из-за того, что платформа копирует бинарный код во временную директорию сервера, теряя связь с исходным файлом .epf на диске.
Практический совет: Чтобы отладчик стабильно перехватывал управление в точках останова, перед запуском программного кода откройте этот же файл обработки вручную через главное меню 1С:Предприятие: Файл -> Открыть. Платформа сопоставит сеанс отладки с физическим файлом на диске, и отладка будет работать корректно.