Запуск произвольного кода в 1С:Предприятии — от Выполнить() до фоновых заданий

· 9 мин

Содержание

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

Ниже разберём каждый способ с рабочими примерами, а в конце — как безопасный режим и профили безопасности ограничивают выполнение кода на сервере.

Операторы Выполнить и Вычислить: запуск кода из строки

Встроенный язык умеет исполнять код, собранный в строку, прямо во время работы. Это два разных оператора.

  • Выполнить(Строка) — исполняет строку как последовательность операторов. Значение не возвращает.
  • Вычислить(Строка) — вычисляет выражение и возвращает результат.

Простейший пример Выполнить — внутренние двойные кавычки удваиваются:

Выполнить("Сообщить(""Привет, мир!"")");

Вычислить удобен, когда имя реквизита или формула заранее не известны:

Результат = Вычислить("2 + 2 * 2"); // вернёт 6

ИмяРеквизита = "Код";
Значение = Вычислить("Объект." + ИмяРеквизита); // обращение к Объект.Код

Код исполняется в контексте того метода, откуда вызван: на клиенте видит клиентские переменные, на сервере — серверные. Передать объект «через границу» клиент-сервер нельзя.

Частый случай — вычислить выражение, собранное из настройки. Например, пользователь задаёт формулу скидки в реквизите справочника, а код считает её Вычислить для каждой строки документа. Так формулу можно менять без перепрограммирования. Обратная сторона та же: формулу должен задавать только тот, кому вы доверяете писать код.

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

Выполнить и Вычислить из строки, собранной по данным пользователя, — это внедрение кода. Никогда не склеивайте в такую строку то, что ввёл пользователь или пришло из обмена. Строку для Выполнить формируйте только из проверенных значений.

На сервере в безопасном режиме у этих операторов урезаны права — об этом в разделе про ограничения.

Внешняя обработка — рабочий способ запустить свой код

Когда кода больше одной строки или его нужно запускать регулярно, делают внешнюю обработку . Это файл .epf, который открывается в режиме «1С:Предприятие» без изменения конфигурации.

Порядок такой:

  1. В Конфигураторе: Файл → Новый → Внешняя обработка.
  2. Добавьте реквизит формы-кнопку или команду, в обработчике которой — ваш код. Либо разместите код в модуле объекта, если запуск будет пакетным.
  3. Сохраните файл (Файл → Сохранить) как .epf.
  4. В режиме «1С:Предприятие»: Файл → Открыть, выберите .epf, нажмите свою кнопку.
Что проверить перед запуском внешней обработки
Выполнено: 0 / 4

В типовых конфигурациях на БСП есть отдельный механизм — справочник дополнительных отчётов и обработок (Администрирование → Печатные формы, отчёты и обработки → Дополнительные отчёты и обработки). Туда обработку подключают один раз, и дальше она доступна из списка, без ручного открытия файла каждый раз.

Директивы компиляции решают, где выполнится код. &НаКлиенте — на машине пользователя, &НаСервере — на сервере 1С. Запрос к базе и работа с объектами — почти всегда на сервере.

Вычисление выражений в отладчике

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

Как это работает:

  1. В Конфигураторе поставьте точку останова на нужной строке — клавиша F9 или клик на левом поле.
  2. Запустите отладку (Отладка → Начать отладку, F5) и доведите выполнение до точки останова.
  3. Когда выполнение остановилось, откройте Отладка → Вычислить выражение (Shift+F9).
  4. Впишите выражение — обращение к реквизиту, вызов функции, арифметику — и нажмите «Рассчитать».

Параллельно держите открытым окно «Табло»: туда добавляют переменные и выражения, значения которых обновляются на каждом шаге. Пошаговое исполнение — F11 (с заходом в процедуры) и F10 (без захода).

В окне «Вычислить выражение» можно вызвать функцию, которая меняет данные (например, записывает объект). В рабочей базе это реальная запись, а не «пробный прогон». Отлаживайте на копии.

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

Запуск кода из командной строки и по COM-соединению

Два способа выполнить код без интерактивного сеанса — пакетный запуск и внешнее соединение.

Пакетный запуск 1cv8. Внешнюю обработку можно выполнить при старте, не открывая окон:

"C:\Program Files\1cv8\8.3.24.1234\bin\1cv8.exe" ENTERPRISE /S"server\base" /N"User" /P"pass" /Execute"C:\scripts\obrabotka.epf" /C"параметр"
  • /Execute — путь к .epf; 1С откроет её и выполнит код из модуля.
  • /C — произвольная строка, доступная внутри через ПараметрЗапуска.
  • /DisableStartupMessages подавляет служебные окна, чтобы запуск не завис на диалоге.

Это основа для планировщика Windows или bat-файла: код по расписанию без участия человека. Чтобы узнать, прошёл запуск или упал с ошибкой, добавляют /Out"C:\scripts\log.txt" — служебный протокол платформы запишется в указанный файл, и его можно разобрать в bat-скрипте.

Пакетный запуск входит в базу под указанной учётной записью и с её правами. Логин и пароль в /N и /P видны в командной строке и планировщике. Заведите для таких задач отдельного пользователя с минимально необходимыми правами, а не администратора.

COM-соединение. Из внешней программы (другой 1С, скрипта VBScript/PowerShell) к базе подключаются через V83.COMConnector:

Коннектор = Новый COMОбъект("V83.COMConnector");
Соединение = Коннектор.Connect("Srvr=""server"";Ref=""base"";Usr=""Администратор"";Pwd=""""");

// вызов экспортной функции серверного общего модуля
Данные = Соединение.ОбщийМодульОбмена.ПолучитьОстатки();

Через объект соединения доступен глобальный контекст базы: менеджеры объектов, константы, экспортные методы общих модулей с установленным флагом «Внешнее соединение».

Если V83.COMConnector не создаётся с ошибкой регистрации класса — зарегистрируйте comcntr.dll из каталога bin установленной платформы командой regsvr32. Разрядность COM-компоненты должна совпадать с разрядностью вызывающей программы.

Консоль запросов: выполнить запрос к базе

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

Готовые консоли запросов распространяются как внешние обработки; подключаются они так же, как любая другая .epf (через Файл → Открыть или справочник дополнительных обработок). Внутри:

  1. В поле запроса пишете текст на языке запросов 1С.
  2. Задаёте значения параметров запроса.
  3. Нажимаете «Выполнить» и разбираете результат.

Язык запросов 1С похож на SQL, но это не SQL: ВЫБРАТЬ ... ИЗ ... ГДЕ ... СГРУППИРОВАТЬ ПО. Прямой SQL к таблицам СУБД из встроенного языка не выполняют — работают только через объект Запрос и язык запросов.

Пример текста запроса, который можно вставить в консоль:

ВЫБРАТЬ
    Номенклатура.Наименование КАК Товар,
    ОстаткиОстаток.ВНаличииОстаток КАК Остаток
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки КАК ОстаткиОстаток
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
    ПО ОстаткиОстаток.Номенклатура = Номенклатура.Ссылка

Консоль с правами администратора читает всю базу в обход ограничений доступа. Не давайте её рядовым пользователям и не оставляйте на рабочем сервере «на всякий случай».

Фоновые и регламентные задания: код по расписанию

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

Фоновое задание запускают из кода. Оно выполняет экспортную процедуру серверного общего модуля:

Параметры = Новый Массив;
Параметры.Добавить(ВыбраннаяДата);

ФоновоеЗадание = ФоновыеЗадания.Выполнить(
    "ОбменДанными.ЗагрузитьЗаПериод",
    Параметры,
    УникальныйИдентификатор,
    "Загрузка обмена");

Метод в первом параметре — строка вида ОбщийМодуль.Метод; модуль должен быть неглобальным, а процедура — экспортной и серверной.

Регламентное задание — это объект метаданных с расписанием. Его создают в Конфигураторе (ветка «Регламентные задания»), указывают вызываемый метод, а расписание настраивают либо в Конфигураторе, либо в работающей базе.

Различие по режиму работы базы важно:

Режим базыКак исполняются регламентные задания
Клиент-серверныйАвтоматически на сервере, пользователь не нужен
ФайловыйТолько пока открыт сеанс; нужен отдельный сеанс-«планировщик»

В типовых конфигурациях список и расписание доступны в Администрирование → Обслуживание → Регламентные и фоновые задания. Там же видно, какое задание когда отработало и с какой ошибкой завершилось.

Долгую операцию из формы не запускают синхронно — она «подвесит» сеанс. Её выносят в фоновое задание и показывают пользователю индикатор, периодически опрашивая состояние задания.

Безопасный режим и ограничения на выполнение кода

Выполнение произвольного кода — это и дыра в безопасности, поэтому платформа его ограничивает на нескольких уровнях.

Безопасный режим. Вызов УстановитьБезопасныйРежим(Истина) отключает для текущего участка кода опасные возможности:

  • создание COM-объектов и загрузку внешних компонент;
  • запуск внешних приложений (ЗапуститьПриложение);
  • доступ к файловой системе сервера;
  • переход в привилегированный режим.

В этом же режиме исполняется код внешних обработок, подключённых через стандартный механизм БСП, — поэтому «лишнего» он сделать не сможет.

Профили безопасности задаются на стороне кластера серверов. Профиль централизованно разрешает или запрещает COM, внешние компоненты, обращения к файлам и адресам сети для сеансов, которым он назначен. Если профиль запрещает COM — V83.COMConnector внутри кода не создастся, как бы ни были настроены права пользователя.

Права и роли. Чтобы пользователь вообще мог открыть .epf, в его роли должно стоять право «Интерактивное открытие внешних отчётов» и «Интерактивное открытие внешних обработок». Без них меню Файл → Открыть не выполнит стороннюю обработку.

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

Как выбрать способ

Что нужно сделать с кодом?

Частые ошибки

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

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

Чем `Выполнить` отличается от `Вычислить`?
Выполнить исполняет строку как набор операторов и ничего не возвращает. Вычислить считает выражение и возвращает его результат. Для «посчитать и получить значение» — Вычислить, для «сделать действие» — Выполнить.
Можно ли выполнить код прямо в режиме «1С:Предприятие» без Конфигуратора?
Да — через внешнюю обработку. Код пишется один раз в Конфигураторе или расширении, сохраняется в .epf и запускается у пользователя кнопкой, менять конфигурацию для этого не нужно.
Выполняется ли SQL-запрос к базе напрямую?
Нет. Из встроенного языка работают только через объект Запрос и язык запросов 1С. Прямой SQL к таблицам СУБД платформа не даёт выполнять.
Почему мой код в фоновом задании «не видит» клиентские переменные?
Фоновое задание всегда выполняется на сервере в отдельном сеансе. Клиентского контекста у него нет — все данные передаются через параметры метода.
Как запретить пользователям запускать чужой код?
Уберите из их ролей права на интерактивное открытие внешних отчётов и обработок, а на сервере настройте профиль безопасности, запрещающий COM и внешние компоненты.