Внешняя обработка в серверном контексте: права, код, регламентные задания

· 9 мин

Содержание

Чтобы запустить обработку на сервере 1С, нужно не «открыть файл на сервере», а передать код обработки в серверный контекст. Самый надёжный путь — поместить файл .epf во временное хранилище, на сервере вызвать ВнешниеОбработки.Подключить() и затем ВнешниеОбработки.Создать(). В типовых конфигурациях то же самое делает механизм «Дополнительные отчёты и обработки»: он хранит обработку в базе и умеет запускать её по расписанию.

Способов три, и выбирают их по задаче. Разово проверить или поправить данные — интерактивное открытие через Файл → Открыть. Регулярно запускать у пользователей — регистрация в справочнике дополнительных обработок. Ночные пересчёты без участия человека — регламентное задание.

Почему обработку нельзя просто «открыть на сервере»

Платформа 1С:Предприятие 8.3 делит код на клиентский и серверный. В управляемом приложении модуль объекта обработки исполняется только на сервере, а форма живёт на клиенте. Процедуры формы с директивой &НаСервере или &НаСервереБезКонтекста уходят на сервер, процедуры с &НаКлиенте — остаются у пользователя.

Отсюда несколько практических следствий:

  • 🖥️ Файл видят разные компьютеры. Путь C:\Users\Ivan\Desktop\proverka.epf есть на машине пользователя, но не на сервере. Серверный код ищет файл в своей файловой системе.
  • 🔐 Сервер работает под служебной учётной записью. Обычно это пользователь службы агента сервера (по умолчанию USR1CV8). Права на сетевые папки и диски проверяются для него, а не для бухгалтера.
  • 🪟 На сервере нет интерфейса. Формы, вопросы, диалоги выбора файла там недоступны. Всё общение с пользователем — через клиент.
  • 🧪 Безопасный режим. Подключённая внешняя обработка по умолчанию может работать в безопасном режиме: без доступа к файлам, COM-объектам и внешним компонентам.

В файловом варианте базы «сервер» и «клиент» — один процесс на компьютере пользователя. Контексты всё равно разделены, директивы компиляции работают так же. Но путь к файлу совпадает, поэтому многие ошибки проявляются только после перевода базы в клиент-серверный режим.

СпособКогда выбиратьОграничения
Файл → ОткрытьРазовая проверка, исправление данных администраторомНужна роль на интерактивное открытие, пользователь сидит у экрана
Дополнительная обработка (БСП)Регулярный запуск пользователями, команды в разделахНужна функция регистрации в модуле объекта
Программное подключениеСвоя доработка, запуск из другой обработкиКод пишет разработчик, следить за безопасным режимом
Регламентное заданиеНочные пересчёты, выгрузки по расписаниюТолько серверный код, без форм

Права и роли для запуска внешних обработок

Без прав пользователь получит Нарушение прав доступа! ещё до того, как откроется форма. В метаданных за это отвечает право «Интерактивное открытие внешних обработок» у роли. В конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) для этого есть готовая роль, и выдавать её удобнее через профили групп доступа.

Как выдать право в типовой конфигурации

  1. Откройте Администрирование → Настройки пользователей и прав.
  2. Перейдите в «Профили групп доступа» и создайте копию нужного профиля, например «Бухгалтер». Поставляемые профили менять нельзя.
  3. На вкладке ролей отбором по слову «внешн» найдите роль открытия внешних отчётов и обработок и отметьте её.
  4. Включите новый профиль в группу доступа пользователя.
  5. Пусть пользователь перезапустит сеанс: роли перечитываются при входе.

Право открывать внешние обработки — это фактически право выполнить любой код в базе. Обработка может удалить документы или выгрузить персональные данные. Давайте его только тем, кто понимает, что запускает.

Защита от опасных действий

С платформы 8.3.9 при открытии внешнего файла платформа предупреждает о возможных опасных действиях. Флаг «Защита от опасных действий» стоит в свойствах пользователя: в Конфигураторе через Администрирование → Пользователи или в карточке пользователя в режиме предприятия. Для доверенных администраторов его можно снять. В коде вместо снятия флага передают объект ОписаниеЗащитыОтОпасныхДействий — об этом ниже.

Регистрация в справочнике дополнительных обработок

Для конфигураций на БСП это основной способ. Обработка хранится внутри базы, файл на диске не нужен, серверная часть выполняется штатно.

Включить механизм

В Бухгалтерии 3.0 откройте Администрирование → Печатные формы, отчеты и обработки и установите флажок «Дополнительные отчеты и обработки». После этого там же появится ссылка на сам справочник.

Подготовить обработку

Справочник принимает только обработки с экспортной функцией СведенияОВнешнейОбработке() в модуле объекта. Минимальный вариант для серверной команды:

Функция СведенияОВнешнейОбработке() Экспорт
	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
	ПараметрыРегистрации.Наименование = "Пересчёт остатков по складам";
	ПараметрыРегистрации.Версия = "1.0";
	ПараметрыРегистрации.БезопасныйРежим = Ложь;

	Команда = ПараметрыРегистрации.Команды.Добавить();
	Команда.Представление = "Пересчитать остатки";
	Команда.Идентификатор = "Пересчет";
	Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();

	Возврат ПараметрыРегистрации;
КонецФункции

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения) Экспорт
	Если ИдентификаторКоманды = "Пересчет" Тогда
		// серверная логика обработки
	КонецЕсли;
КонецПроцедуры

Тип команды «Вызов серверного метода» и есть ответ на вопрос, как выполнить обработку именно на сервере: форма не открывается, платформа вызывает ВыполнитьКоманду() в модуле объекта.

Загрузить в базу

  1. Откройте справочник дополнительных обработок и нажмите «Создать».
  2. Выберите файл .epf. Программа прочитает параметры регистрации.
  3. На вкладке команд укажите, каким пользователям показывать команду.
  4. Установите публикацию «Используется» и запишите элемент.

💡 Если поставили БезопасныйРежим = Ложь, программа при записи попросит подтвердить разрешения. Это нормально: обработка заявляет, что ей нужен доступ за пределы базы.

Программный запуск из своего кода

Когда БСП нет или нужна своя кнопка, обработку подключают вручную. Схема из двух шагов: клиент передаёт файл на сервер, сервер подключает и создаёт объект.

&НаКлиенте
Процедура ЗапуститьОбработку(Команда)
	Оповещение = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
	НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
	Если Не Результат Тогда
		Возврат;
	КонецЕсли;
	ВыполнитьНаСервере(Адрес);
	ПоказатьПредупреждение(, "Обработка выполнена");
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере(Адрес)
	Защита = Новый ОписаниеЗащитыОтОпасныхДействий;
	Защита.ПредупреждатьОбОпасныхДействиях = Ложь;

	ИмяОбработки = ВнешниеОбработки.Подключить(Адрес, , Ложь, Защита);
	Обработка = ВнешниеОбработки.Создать(ИмяОбработки, Ложь, Защита);
	Обработка.Выполнить();
КонецПроцедуры

Здесь Выполнить() — экспортная процедура в модуле объекта вашей внешней обработки. Назовите её как угодно, главное — с ключевым словом Экспорт.

Что важно в этом коде:

  • 📦 Подключить() принимает адрес во временном хранилище, а не путь к файлу. Поэтому не важно, на каком компьютере лежит .epf.
  • 🧷 Третий параметр Ложь отключает безопасный режим. Без него обращение к файлам и COM упадёт с ошибкой безопасного режима.
  • 🏷️ Подключить() возвращает имя, под которым обработка зарегистрирована в сеансе. Его и передают в Создать().

Если файл уже лежит на сервере

Иногда обработку кладут в папку, доступную серверу, например \\fileserver\1c\epf\. Тогда временное хранилище не нужно:

&НаСервереБезКонтекста
Процедура ЗапуститьИзПапки()
	Обработка = ВнешниеОбработки.Создать("\\fileserver\1c\epf\proverka.epf", Ложь);
	Обработка.Выполнить();
КонецПроцедуры

Путь указывается так, как его видит служба сервера. Дайте учётной записи службы (USR1CV8 или той, под которой запущен агент) право чтения на папку. Сопоставленные диски вида Z:\ у службы обычно не существуют — пишите UNC-путь.

Запуск по расписанию через регламентное задание

Регламентное задание выполняется только на сервере, без клиента. Это лучший вариант для ночных пересчётов, выгрузок и чисток, но и самый строгий: в коде обработки не должно быть форм, Вопрос(), ОткрытьФорму() и прочего интерфейса.

В типовой конфигурации на БСП

Для зарегистрированной дополнительной обработки с командой «Вызов серверного метода» расписание задают прямо в карточке, на вкладке команд: в строке команды есть колонка расписания. Программа сама создаст задание, которое в конце концов вызовет ВыполнитьКоманду().

Проверьте после настройки:

  1. Регламентные задания в базе не заблокированы. Флаг блокировки — в свойствах информационной базы в консоли кластера.
  2. Задание появилось в списке: Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания.
  3. Первый запуск завершился без ошибки — статус и текст ошибки видны в том же списке.

В нетиповой конфигурации

Здесь придётся доработать конфигурацию. Метод регламентного задания должен быть экспортной процедурой общего модуля, поэтому внешнюю обработку вызывают через «обёртку»:

  1. В Конфигураторе создайте общий модуль с флажком «Сервер».
  2. Напишите в нём экспортную процедуру, которая создаёт обработку из файла на сервере или из хранилища значения в базе и вызывает её метод.
  3. Создайте объект метаданных «Регламентное задание», укажите эту процедуру как метод и задайте расписание.
  4. Обновите конфигурацию базы данных.

💡 В файловом варианте регламентные задания выполняются, только пока работает хотя бы один клиентский сеанс или публикация на веб-сервере. На ночь без пользователей они не стартуют. В клиент-серверном варианте их исполняет кластер сам.

Диагностика: выберите симптом

Диагностика: журнал регистрации и отладка на сервере

Серверный код ошибается молча: у регламентного задания нет экрана, куда вывести сообщение. Поэтому первое правило — логировать.

Запись в журнал регистрации

Оберните основную логику в Попытка … Исключение и пишите ошибку с подробностями:

Попытка
	Обработка.Выполнить();
Исключение
	ЗаписьЖурналаРегистрации("ВнешняяОбработка.Пересчет",
		УровеньЖурналаРегистрации.Ошибка, , ,
		ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
	ВызватьИсключение;
КонецПопытки;

ВызватьИсключение в конце нужен, чтобы задание получило статус «Завершено аварийно», а не «Завершено». Иначе ошибку увидит только тот, кто полезет в журнал.

Журнал в Бухгалтерии 3.0 открывается через Администрирование → Обслуживание → Журнал регистрации. Поставьте отбор по имени события — то, что вы указали первым параметром. Так записи обработки не утонут среди тысяч служебных.

Отладка серверной части

Остановиться точкой останова в серверном коде можно, только если отладка разрешена на сервере.

  1. Сервер 1С должен быть запущен с параметром -debug. Его добавляют в командную строку службы агента; после изменения службу перезапускают.
  2. В Конфигураторе откройте файл .epf через Файл → Открыть и поставьте точки останова в модуле объекта.
  3. Запустите клиент из Конфигуратора в режиме отладки и выполните обработку из того же файла.

Перезапуск службы агента сервера обрывает сеансы всех пользователей базы. Делайте это вне рабочего времени и предупредите людей заранее. На рабочем кластере включённую отладку после разбора лучше снова выключить.

Для сложных случаев, когда журнала мало, включают технологический журнал через файл logcfg.xml в каталоге настроек сервера. Он показывает исключения и долгие запросы рабочих процессов, но быстро растёт — включайте его на время и с фильтрами по событиям.

Частые вопросы

Можно ли запустить внешнюю обработку на сервере без участия пользователя?
Да, через регламентное задание. В конфигурациях на БСП достаточно зарегистрировать дополнительную обработку с серверной командой и задать расписание. В остальных — нужна общая процедура-обёртка в конфигурации.
Чем внешняя обработка отличается от расширения конфигурации для серверных задач?
Внешняя обработка не меняет конфигурацию и подключается в любой момент. Расширение встраивается в базу и может перехватывать типовые методы. Для разовых и периодических задач обычно хватает обработки.
Почему в файловой базе всё работает, а на сервере падает?
В файловом варианте клиент и сервер — один процесс на одном компьютере, поэтому пути к файлам и права совпадают. На сервере код выполняется под учётной записью службы и видит только её диски и папки.
Нужно ли отключать безопасный режим для каждой обработки?
Нет. Если обработка работает только с данными базы — запросами, документами, справочниками — безопасный режим ей не мешает. Отключать его нужно для работы с файлами, COM-объектами и внешними компонентами.
Работает ли этот способ в веб-клиенте?
Да. Схема с временным хранилищем как раз подходит для веб-клиента: файл передаётся через браузер, а исполняется на сервере.