Разработка и Конфигурация · 11 мин
Как открыть обработку на сервере в 1С
Как открыть внешнюю обработку на сервере 1С: подключение через ДополнительныеОтчетыИОбработки, вызов серверных методов, права доступа и типичные ошибки.
Открытие внешней обработки на сервере 1С — задача, которая возникает у разработчиков и администраторов в двух совершенно разных ситуациях. Первая: нужно выполнить код обработки в серверном контексте, например в фоновом задании, регламентном задании или при вызове с клиента без передачи файла. Вторая: обработка подключена через механизм дополнительных отчетов и обработок (БСП), и её нужно запустить именно в серверной части информационной базы.
Ключевая сложность в том, что внешняя обработка физически хранится в виде файла .epf на диске или в виде двоичных данных в базе. Чтобы исполнить её код на сервере, нужно правильно создать объект обработки в серверном контексте — через менеджер внешних обработок. Обычный диалог «Файл → Открыть» работает только на клиенте и для серверного исполнения не подходит.
Ниже разобраны рабочие способы: программное создание объекта обработки на сервере, подключение через справочник дополнительных обработок, запуск в фоновом задании, а также ограничения безопасного режима и прав доступа, из-за которых чаще всего возникают ошибки.
Что значит «открыть обработку на сервере» и когда это нужно
В архитектуре «1С:Предприятие» клиент и сервер — разные контексты исполнения. Код, выполняемый на сервере, имеет доступ к базе данных напрямую, не имеет интерфейса и не может показывать формы, диалоги и предупреждения. Поэтому фраза «открыть обработку на сервере» в строгом смысле означает: создать программный объект внешней обработки в серверном контексте и выполнить её серверные процедуры и функции.
Типовые сценарии, где это требуется: массовая загрузка или корректировка данных по расписанию, выполнение тяжелых вычислений без блокировки сеанса пользователя, интеграционные обмены, вызов обработки из веб-сервиса или HTTP-сервиса, а также фоновое выполнение длительных операций из пользовательского режима.
Важно понимать ограничение: интерактивно «открыть форму обработки на сервере» нельзя. Форма всегда открывается на клиенте. Если задача — показать пользователю форму внешней обработки, используется ОткрытьФорму() или ПолучитьФорму() на клиенте, а серверная часть при этом вызывается из формы через серверные процедуры.
Создание объекта обработки из файла на сервере
Самый прямой способ — метод глобального контекста ВнешниеОбработки.Создать(). Он доступен в серверном контексте и принимает путь к файлу .epf, который должен быть доступен именно с сервера 1С, а не с клиентской машины. Это частая причина ошибок: файл лежит на компьютере разработчика, а код выполняется на сервере, где такого пути не существует.
&НаСервере
Процедура ВыполнитьНаСервере()
ПутьКФайлу = "C:\1C_Обработки\ЗагрузкаДанных.epf";
Обработка = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
Обработка.ВыполнитьЗагрузку();
КонецПроцедурыВторой параметр метода — признак безопасного режима. Если передать Истина, код обработки будет исполняться с ограничениями безопасного режима: запрещены операции с файловой системой вне разрешенных каталогов, COM-объекты, внешние компоненты и ряд других действий. Для проверенных внутренних обработок обычно передают Ложь, но только если источник файла полностью доверенный.
После создания объекта доступны экспортные процедуры и функции модуля объекта обработки. Именно они и должны содержать логику, предназначенную для серверного исполнения. Если логика написана только в модуле формы, вызвать её на сервере не получится — потребуется рефакторинг с переносом кода в модуль объекта.
Подключение через дополнительные отчеты и обработки (БСП)
В конфигурациях на базе Библиотеки стандартных подсистем (УТ, ERP, ЗУП, Бухгалтерия и другие) внешние обработки подключаются через справочник «Дополнительные отчеты и обработки». Файл обработки при этом хранится внутри базы в виде двоичных данных, и вопрос путей к файлам на сервере снимается — это главное преимущество подхода.
Чтобы подключить обработку: откройте раздел «Администрирование → Печатные формы, отчеты и обработки», включите флажок «Дополнительные отчеты и обработки», перейдите по ссылке к списку и добавьте файл .epf. Обработка должна содержать экспортную функцию СведенияОВнешнейОбработке() в модуле объекта — без неё регистрация невозможна.
Программное создание объекта такой обработки на сервере выполняется через общий модуль БСП:
&НаСервере
Процедура ВыполнитьПодключеннуюОбработку(СсылкаНаОбработку)
ОбъектОбработки = ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(СсылкаНаОбработку);
ОбъектОбработки.ВыполнитьОсновноеДействие();
КонецПроцедурыМетод ОбъектВнешнейОбработки() сам заботится о безопасном режиме: для обработок, не прошедших проверку, он применяет ограничения согласно настройкам. Если в базе действует профиль безопасности кластера, дополнительно может потребоваться разрешение в настройках профиля.
Запуск обработки в фоновом задании
На практике «открыть обработку на сервере» чаще всего означает запустить её в фоновом задании, чтобы не блокировать сеанс пользователя. Механизм БСП «Длительные операции» позволяет выполнить процедуру обработки асинхронно и вернуть результат на клиент по завершении.
- 1Перенесите исполняемый код в экспортную процедуру модуля объекта обработки
- 2На сервере создайте объект: ВнешниеОбработки.Создать(Путь) или через ДополнительныеОтчетыИОбработки
- 3Для БСП используйте ДлительныеОперации.ВыполнитьВФоне() с указанием метода
- 4Либо запустите ФоновыеЗадания.Выполнить() с именем метода общего модуля, который создаст обработку
- 5На клиенте дождитесь завершения и обработайте результат из адреса временного хранилища
Нюанс: ФоновыеЗадания.Выполнить() может вызывать только методы общих серверных модулей, а не методы внешней обработки напрямую. Поэтому создается общий модуль-прокладка, в котором создается объект обработки и вызывается нужная процедура. Параметры в фоновое задание передаются только сериализуемые — сам объект обработки передать нельзя, его нужно создавать внутри фонового метода.
В файловом варианте базы фоновые задания исполняются в том же процессе, что и сеанс, но всё равно без клиентского контекста — ограничения серверного исполнения сохраняются.
Права доступа, безопасный режим и профили безопасности
Даже корректный код часто не работает из-за ограничений безопасности. Основных источника три: права пользователя базы, безопасный режим исполнения и профиль безопасности кластера серверов.
Как проверить результат
ВнешниеОбработки.Создать() возвращает объект без исключения
Ошибка «Файл не обнаружен» или «Ошибка компиляции» — проверьте путь и права агента сервера
Процедура отрабатывает, данные в базе изменены
Исключение о запрещенной операции — срабатывает безопасный режим или профиль безопасности
Задание в консоли заданий имеет состояние «Завершено»
Состояние «Ошибка» — смотрите текст ошибки в свойствах задания и журнале регистрации
Для интерактивного открытия внешних файлов у пользователя должно быть право «Интерактивное открытие внешних отчетов и обработок». Для работы через справочник дополнительных обработок нужны права на добавление и использование объектов этого справочника. В кластере с профилем безопасности операции с файловой системой требуют явного разрешения в свойствах профиля.
Типичные ошибки и их устранение
Отдельно стоит ошибка «Метод объекта не обнаружен»: она означает, что процедура в модуле объекта не объявлена с ключевым словом Экспорт. Проверьте сигнатуру — без Экспорт метод виден только внутри модуля.
Если обработка работает в толстом клиенте, но падает на сервере, ищите в коде клиентские вызовы: Сообщить с выводом пользователю, работа с Excel через COM, диалоги выбора файлов, обращения к локальным дискам. Всё это нужно заменить серверными аналогами или вынести на клиентскую сторону.
Выбор подхода под задачу
Как выбрать действие
Для конфигураций без БСП (самописные решения) механизма дополнительных обработок нет — остается прямое создание из файла или собственный справочник с хранением двоичных данных и программной записью во временный файл перед созданием объекта.
Что важно запомнить
На сервере обработку «открывают» программно: ВнешниеОбработки.Создать() для файла или ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки() для подключенной к базе. Формы на сервере не открываются, исполняемый код должен быть в экспортных процедурах модуля объекта, а пути к файлам и права проверяются относительно сервера, а не клиента.
Частые вопросы
Можно ли открыть форму внешней обработки на сервере?
Нет. Формы существуют только в клиентском контексте. На сервере можно создать объект обработки и выполнить его серверные методы. Если нужен интерфейс, форму открывают на клиенте, а обращения к данным делают из неё через серверные вызовы.
Почему ВнешниеОбработки.Создать() выдает ошибку «Файл не обнаружен», хотя файл есть?
Путь проверяется на том компьютере, где исполняется код. Если код выполняется на сервере, файл должен лежать в доступном серверу каталоге, а учетная запись агента сервера 1С должна иметь право чтения. Локальный путь с клиентской машины не сработает.
Как выполнить обработку по расписанию?
Создайте регламентное задание, в обработчике которого программно создается объект внешней обработки и вызывается нужная процедура. Регламентные задания исполняются на сервере без пользовательского интерфейса, поэтому весь код обработки должен быть серверно-совместимым.
Что делать, если обработка требует доступа к файлам, а безопасный режим это запрещает?
Для обработок из справочника дополнительных обработок администратор может разрешить выполнение без безопасного режима после проверки кода. При профиле безопасности кластера добавьте в профиль разрешение на нужный каталог файловой системы. Полностью снимать ограничения без проверки кода небезопасно.
Можно ли передать параметры в обработку при серверном вызове?
Да. После создания объекта можно присвоить значения его реквизитам (если они объявлены в обработке) или передать параметры аргументами в экспортную процедуру. При запуске через фоновое задание параметры передаются в метод фонового задания, а объект обработки создается уже внутри него.
Работает ли этот подход в файловой базе без сервера 1С?
Да, но серверный контекст в файловом варианте исполняется в процессе клиентского приложения. ВнешниеОбработки.Создать() доступен, однако пути к файлам будут интерпретироваться на компьютере пользователя, что упрощает разработку, но создает расхождения при переходе на клиент-серверный вариант.