Внешняя обработка в серверном контексте: права, код, регламентные задания
Содержание
Чтобы запустить обработку на сервере 1С, нужно не «открыть файл на сервере», а передать код обработки в серверный контекст. Самый надёжный путь — поместить файл .epf во временное хранилище, на сервере вызвать ВнешниеОбработки.Подключить() и затем ВнешниеОбработки.Создать(). В типовых конфигурациях то же самое делает механизм «Дополнительные отчёты и обработки»: он хранит обработку в базе и умеет запускать её по расписанию.
Способов три, и выбирают их по задаче. Разово проверить или поправить данные — интерактивное открытие через Файл → Открыть. Регулярно запускать у пользователей — регистрация в справочнике дополнительных обработок. Ночные пересчёты без участия человека — регламентное задание.
Почему обработку нельзя просто «открыть на сервере»
Платформа 1С:Предприятие 8.3 делит код на клиентский и серверный. В управляемом приложении модуль объекта обработки исполняется только на сервере, а форма живёт на клиенте. Процедуры формы с директивой &НаСервере или &НаСервереБезКонтекста уходят на сервер, процедуры с &НаКлиенте — остаются у пользователя.
Отсюда несколько практических следствий:
- 🖥️ Файл видят разные компьютеры. Путь
C:\Users\Ivan\Desktop\proverka.epfесть на машине пользователя, но не на сервере. Серверный код ищет файл в своей файловой системе. - 🔐 Сервер работает под служебной учётной записью. Обычно это пользователь службы агента сервера (по умолчанию
USR1CV8). Права на сетевые папки и диски проверяются для него, а не для бухгалтера. - 🪟 На сервере нет интерфейса. Формы, вопросы, диалоги выбора файла там недоступны. Всё общение с пользователем — через клиент.
- 🧪 Безопасный режим. Подключённая внешняя обработка по умолчанию может работать в безопасном режиме: без доступа к файлам, COM-объектам и внешним компонентам.
В файловом варианте базы «сервер» и «клиент» — один процесс на компьютере пользователя. Контексты всё равно разделены, директивы компиляции работают так же. Но путь к файлу совпадает, поэтому многие ошибки проявляются только после перевода базы в клиент-серверный режим.
| Способ | Когда выбирать | Ограничения |
|---|---|---|
Файл → Открыть | Разовая проверка, исправление данных администратором | Нужна роль на интерактивное открытие, пользователь сидит у экрана |
| Дополнительная обработка (БСП) | Регулярный запуск пользователями, команды в разделах | Нужна функция регистрации в модуле объекта |
| Программное подключение | Своя доработка, запуск из другой обработки | Код пишет разработчик, следить за безопасным режимом |
| Регламентное задание | Ночные пересчёты, выгрузки по расписанию | Только серверный код, без форм |
Права и роли для запуска внешних обработок
Без прав пользователь получит Нарушение прав доступа! ещё до того, как откроется форма. В метаданных за это отвечает право «Интерактивное открытие внешних обработок» у роли. В конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) для этого есть готовая роль, и выдавать её удобнее через профили групп доступа.
Как выдать право в типовой конфигурации
- Откройте
Администрирование → Настройки пользователей и прав. - Перейдите в «Профили групп доступа» и создайте копию нужного профиля, например «Бухгалтер». Поставляемые профили менять нельзя.
- На вкладке ролей отбором по слову «внешн» найдите роль открытия внешних отчётов и обработок и отметьте её.
- Включите новый профиль в группу доступа пользователя.
- Пусть пользователь перезапустит сеанс: роли перечитываются при входе.
Право открывать внешние обработки — это фактически право выполнить любой код в базе. Обработка может удалить документы или выгрузить персональные данные. Давайте его только тем, кто понимает, что запускает.
Защита от опасных действий
С платформы 8.3.9 при открытии внешнего файла платформа предупреждает о возможных опасных действиях. Флаг «Защита от опасных действий» стоит в свойствах пользователя: в Конфигураторе через Администрирование → Пользователи или в карточке пользователя в режиме предприятия. Для доверенных администраторов его можно снять. В коде вместо снятия флага передают объект ОписаниеЗащитыОтОпасныхДействий — об этом ниже.
Регистрация в справочнике дополнительных обработок
Для конфигураций на БСП это основной способ. Обработка хранится внутри базы, файл на диске не нужен, серверная часть выполняется штатно.
Включить механизм
В Бухгалтерии 3.0 откройте Администрирование → Печатные формы, отчеты и обработки и установите флажок «Дополнительные отчеты и обработки». После этого там же появится ссылка на сам справочник.
Подготовить обработку
Справочник принимает только обработки с экспортной функцией СведенияОВнешнейОбработке() в модуле объекта. Минимальный вариант для серверной команды:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Наименование = "Пересчёт остатков по складам";
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.БезопасныйРежим = Ложь;
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = "Пересчитать остатки";
Команда.Идентификатор = "Пересчет";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Возврат ПараметрыРегистрации;
КонецФункции
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения) Экспорт
Если ИдентификаторКоманды = "Пересчет" Тогда
// серверная логика обработки
КонецЕсли;
КонецПроцедуры
Тип команды «Вызов серверного метода» и есть ответ на вопрос, как выполнить обработку именно на сервере: форма не открывается, платформа вызывает ВыполнитьКоманду() в модуле объекта.
Загрузить в базу
- Откройте справочник дополнительных обработок и нажмите «Создать».
- Выберите файл
.epf. Программа прочитает параметры регистрации. - На вкладке команд укажите, каким пользователям показывать команду.
- Установите публикацию «Используется» и запишите элемент.
💡 Если поставили БезопасныйРежим = Ложь, программа при записи попросит подтвердить разрешения. Это нормально: обработка заявляет, что ей нужен доступ за пределы базы.
Программный запуск из своего кода
Когда БСП нет или нужна своя кнопка, обработку подключают вручную. Схема из двух шагов: клиент передаёт файл на сервер, сервер подключает и создаёт объект.
&НаКлиенте
Процедура ЗапуститьОбработку(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
ВыполнитьНаСервере(Адрес);
ПоказатьПредупреждение(, "Обработка выполнена");
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере(Адрес)
Защита = Новый ОписаниеЗащитыОтОпасныхДействий;
Защита.ПредупреждатьОбОпасныхДействиях = Ложь;
ИмяОбработки = ВнешниеОбработки.Подключить(Адрес, , Ложь, Защита);
Обработка = ВнешниеОбработки.Создать(ИмяОбработки, Ложь, Защита);
Обработка.Выполнить();
КонецПроцедуры
Здесь Выполнить() — экспортная процедура в модуле объекта вашей внешней обработки. Назовите её как угодно, главное — с ключевым словом Экспорт.
Что важно в этом коде:
- 📦
Подключить()принимает адрес во временном хранилище, а не путь к файлу. Поэтому не важно, на каком компьютере лежит.epf. - 🧷 Третий параметр
Ложьотключает безопасный режим. Без него обращение к файлам и COM упадёт с ошибкой безопасного режима. - 🏷️
Подключить()возвращает имя, под которым обработка зарегистрирована в сеансе. Его и передают вСоздать().
Если файл уже лежит на сервере
Иногда обработку кладут в папку, доступную серверу, например \\fileserver\1c\epf\. Тогда временное хранилище не нужно:
&НаСервереБезКонтекста
Процедура ЗапуститьИзПапки()
Обработка = ВнешниеОбработки.Создать("\\fileserver\1c\epf\proverka.epf", Ложь);
Обработка.Выполнить();
КонецПроцедуры
Путь указывается так, как его видит служба сервера. Дайте учётной записи службы (USR1CV8 или той, под которой запущен агент) право чтения на папку. Сопоставленные диски вида Z:\ у службы обычно не существуют — пишите UNC-путь.
Запуск по расписанию через регламентное задание
Регламентное задание выполняется только на сервере, без клиента. Это лучший вариант для ночных пересчётов, выгрузок и чисток, но и самый строгий: в коде обработки не должно быть форм, Вопрос(), ОткрытьФорму() и прочего интерфейса.
В типовой конфигурации на БСП
Для зарегистрированной дополнительной обработки с командой «Вызов серверного метода» расписание задают прямо в карточке, на вкладке команд: в строке команды есть колонка расписания. Программа сама создаст задание, которое в конце концов вызовет ВыполнитьКоманду().
Проверьте после настройки:
- Регламентные задания в базе не заблокированы. Флаг блокировки — в свойствах информационной базы в консоли кластера.
- Задание появилось в списке:
Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания. - Первый запуск завершился без ошибки — статус и текст ошибки видны в том же списке.
В нетиповой конфигурации
Здесь придётся доработать конфигурацию. Метод регламентного задания должен быть экспортной процедурой общего модуля, поэтому внешнюю обработку вызывают через «обёртку»:
- В Конфигураторе создайте общий модуль с флажком «Сервер».
- Напишите в нём экспортную процедуру, которая создаёт обработку из файла на сервере или из хранилища значения в базе и вызывает её метод.
- Создайте объект метаданных «Регламентное задание», укажите эту процедуру как метод и задайте расписание.
- Обновите конфигурацию базы данных.
💡 В файловом варианте регламентные задания выполняются, только пока работает хотя бы один клиентский сеанс или публикация на веб-сервере. На ночь без пользователей они не стартуют. В клиент-серверном варианте их исполняет кластер сам.
Диагностика: журнал регистрации и отладка на сервере
Серверный код ошибается молча: у регламентного задания нет экрана, куда вывести сообщение. Поэтому первое правило — логировать.
Запись в журнал регистрации
Оберните основную логику в Попытка … Исключение и пишите ошибку с подробностями:
Попытка
Обработка.Выполнить();
Исключение
ЗаписьЖурналаРегистрации("ВнешняяОбработка.Пересчет",
УровеньЖурналаРегистрации.Ошибка, , ,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение;
КонецПопытки;
ВызватьИсключение в конце нужен, чтобы задание получило статус «Завершено аварийно», а не «Завершено». Иначе ошибку увидит только тот, кто полезет в журнал.
Журнал в Бухгалтерии 3.0 открывается через Администрирование → Обслуживание → Журнал регистрации. Поставьте отбор по имени события — то, что вы указали первым параметром. Так записи обработки не утонут среди тысяч служебных.
Отладка серверной части
Остановиться точкой останова в серверном коде можно, только если отладка разрешена на сервере.
- Сервер 1С должен быть запущен с параметром
-debug. Его добавляют в командную строку службы агента; после изменения службу перезапускают. - В Конфигураторе откройте файл
.epfчерезФайл → Открытьи поставьте точки останова в модуле объекта. - Запустите клиент из Конфигуратора в режиме отладки и выполните обработку из того же файла.
Перезапуск службы агента сервера обрывает сеансы всех пользователей базы. Делайте это вне рабочего времени и предупредите людей заранее. На рабочем кластере включённую отладку после разбора лучше снова выключить.
Для сложных случаев, когда журнала мало, включают технологический журнал через файл logcfg.xml в каталоге настроек сервера. Он показывает исключения и долгие запросы рабочих процессов, но быстро растёт — включайте его на время и с фильтрами по событиям.