Запуск произвольного кода в 1С:Предприятии — от Выполнить() до фоновых заданий
Содержание
Отдельной «консоли кода» в 1С:Предприятии 8.3 нет: произвольный код на встроенном языке запускают одним из пяти способов — операторами Выполнить() и Вычислить(), из внешней обработки (.epf), через вычисление выражений в отладчике, из командной строки и по COM-соединению, либо фоновым или регламентным заданием. Какой выбрать — зависит от того, нужен разовый запуск, отладка или код по расписанию.
Ниже разберём каждый способ с рабочими примерами, а в конце — как безопасный режим и профили безопасности ограничивают выполнение кода на сервере.
Операторы Выполнить и Вычислить: запуск кода из строки
Встроенный язык умеет исполнять код, собранный в строку, прямо во время работы. Это два разных оператора.
Выполнить(Строка)— исполняет строку как последовательность операторов. Значение не возвращает.Вычислить(Строка)— вычисляет выражение и возвращает результат.
Простейший пример Выполнить — внутренние двойные кавычки удваиваются:
Выполнить("Сообщить(""Привет, мир!"")");
Вычислить удобен, когда имя реквизита или формула заранее не известны:
Результат = Вычислить("2 + 2 * 2"); // вернёт 6
ИмяРеквизита = "Код";
Значение = Вычислить("Объект." + ИмяРеквизита); // обращение к Объект.Код
Код исполняется в контексте того метода, откуда вызван: на клиенте видит клиентские переменные, на сервере — серверные. Передать объект «через границу» клиент-сервер нельзя.
Частый случай — вычислить выражение, собранное из настройки. Например, пользователь задаёт формулу скидки в реквизите справочника, а код считает её Вычислить для каждой строки документа. Так формулу можно менять без перепрограммирования. Обратная сторона та же: формулу должен задавать только тот, кому вы доверяете писать код.
В типовых конфигурациях на БСП вместо «голого» Вычислить используют обёртку ОбщегоНазначения.ВычислитьВБезопасномРежиме — она считает выражение с уже включённым безопасным режимом. Если ваша конфигурация на БСП, предпочитайте её: меньше риск, что в формулу протащат опасный вызов.
Выполнить и Вычислить из строки, собранной по данным пользователя, — это внедрение кода. Никогда не склеивайте в такую строку то, что ввёл пользователь или пришло из обмена. Строку для Выполнить формируйте только из проверенных значений.
На сервере в безопасном режиме у этих операторов урезаны права — об этом в разделе про ограничения.
Внешняя обработка — рабочий способ запустить свой код
Когда кода больше одной строки или его нужно запускать регулярно, делают внешнюю обработку
. Это файл .epf, который открывается в режиме «1С:Предприятие» без изменения конфигурации.
Порядок такой:
- В Конфигураторе:
Файл → Новый → Внешняя обработка. - Добавьте реквизит формы-кнопку или команду, в обработчике которой — ваш код. Либо разместите код в модуле объекта, если запуск будет пакетным.
- Сохраните файл (
Файл → Сохранить) как.epf. - В режиме «1С:Предприятие»:
Файл → Открыть, выберите.epf, нажмите свою кнопку.
В типовых конфигурациях на БСП есть отдельный механизм — справочник дополнительных отчётов и обработок (Администрирование → Печатные формы, отчёты и обработки → Дополнительные отчёты и обработки). Туда обработку подключают один раз, и дальше она доступна из списка, без ручного открытия файла каждый раз.
Директивы компиляции решают, где выполнится код. &НаКлиенте — на машине пользователя, &НаСервере — на сервере 1С. Запрос к базе и работа с объектами — почти всегда на сервере.
Вычисление выражений в отладчике
Отладчик не «прогоняет выделенный фрагмент» как отдельный скрипт, но позволяет вычислить любое выражение в точке останова — это и есть интерактивное исполнение кода на месте.
Как это работает:
- В Конфигураторе поставьте точку останова на нужной строке — клавиша
F9или клик на левом поле. - Запустите отладку (
Отладка → Начать отладку,F5) и доведите выполнение до точки останова. - Когда выполнение остановилось, откройте
Отладка → Вычислить выражение(Shift+F9). - Впишите выражение — обращение к реквизиту, вызов функции, арифметику — и нажмите «Рассчитать».
Параллельно держите открытым окно «Табло»: туда добавляют переменные и выражения, значения которых обновляются на каждом шаге. Пошаговое исполнение — 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С похож на SQL, но это не SQL: ВЫБРАТЬ ... ИЗ ... ГДЕ ... СГРУППИРОВАТЬ ПО. Прямой SQL к таблицам СУБД из встроенного языка не выполняют — работают только через объект Запрос и язык запросов.
Пример текста запроса, который можно вставить в консоль:
ВЫБРАТЬ
Номенклатура.Наименование КАК Товар,
ОстаткиОстаток.ВНаличииОстаток КАК Остаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки КАК ОстаткиОстаток
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
ПО ОстаткиОстаток.Номенклатура = Номенклатура.Ссылка
Консоль с правами администратора читает всю базу в обход ограничений доступа. Не давайте её рядовым пользователям и не оставляйте на рабочем сервере «на всякий случай».
Фоновые и регламентные задания: код по расписанию
Когда код должен выполняться без пользователя — ночной обмен, пересчёт итогов, выгрузка, — его оформляют заданием.
Фоновое задание запускают из кода. Оно выполняет экспортную процедуру серверного общего модуля:
Параметры = Новый Массив;
Параметры.Добавить(ВыбраннаяДата);
ФоновоеЗадание = ФоновыеЗадания.Выполнить(
"ОбменДанными.ЗагрузитьЗаПериод",
Параметры,
УникальныйИдентификатор,
"Загрузка обмена");
Метод в первом параметре — строка вида ОбщийМодуль.Метод; модуль должен быть неглобальным, а процедура — экспортной и серверной.
Регламентное задание — это объект метаданных с расписанием. Его создают в Конфигураторе (ветка «Регламентные задания»), указывают вызываемый метод, а расписание настраивают либо в Конфигураторе, либо в работающей базе.
Различие по режиму работы базы важно:
| Режим базы | Как исполняются регламентные задания |
|---|---|
| Клиент-серверный | Автоматически на сервере, пользователь не нужен |
| Файловый | Только пока открыт сеанс; нужен отдельный сеанс-«планировщик» |
В типовых конфигурациях список и расписание доступны в Администрирование → Обслуживание → Регламентные и фоновые задания. Там же видно, какое задание когда отработало и с какой ошибкой завершилось.
Долгую операцию из формы не запускают синхронно — она «подвесит» сеанс. Её выносят в фоновое задание и показывают пользователю индикатор, периодически опрашивая состояние задания.
Безопасный режим и ограничения на выполнение кода
Выполнение произвольного кода — это и дыра в безопасности, поэтому платформа его ограничивает на нескольких уровнях.
Безопасный режим. Вызов УстановитьБезопасныйРежим(Истина) отключает для текущего участка кода опасные возможности:
- создание COM-объектов и загрузку внешних компонент;
- запуск внешних приложений (
ЗапуститьПриложение); - доступ к файловой системе сервера;
- переход в привилегированный режим.
В этом же режиме исполняется код внешних обработок, подключённых через стандартный механизм БСП, — поэтому «лишнего» он сделать не сможет.
Профили безопасности задаются на стороне кластера серверов. Профиль централизованно разрешает или запрещает COM, внешние компоненты, обращения к файлам и адресам сети для сеансов, которым он назначен. Если профиль запрещает COM — V83.COMConnector внутри кода не создастся, как бы ни были настроены права пользователя.
Права и роли. Чтобы пользователь вообще мог открыть .epf, в его роли должно стоять право «Интерактивное открытие внешних отчётов» и «Интерактивное открытие внешних обработок». Без них меню Файл → Открыть не выполнит стороннюю обработку.
Снимать эти ограничения ради удобства — плохая идея. Внешняя обработка с полными правами делает с базой всё: читает защищённые данные, меняет проводки, выгружает информацию наружу. Право на открытие обработок давайте точечно и только тем, кому оно нужно по работе.
Как выбрать способ
Выполнить/Вычислить в коде либо «Вычислить выражение» в отладчике..epf с кнопкой; в типовой — через справочник дополнительных обработок.1cv8 ... /Execute или COM-соединение V83.COMConnector.Частые ошибки
comcntr.dll. Зарегистрируйте нужную версию через regsvr32, разрядность должна совпадать с вызывающей программой.Символы.ПС и конкатенацию вместо длинного литерала.Частые вопросы
Чем `Выполнить` отличается от `Вычислить`?
Выполнить исполняет строку как набор операторов и ничего не возвращает. Вычислить считает выражение и возвращает его результат. Для «посчитать и получить значение» — Вычислить, для «сделать действие» — Выполнить.Можно ли выполнить код прямо в режиме «1С:Предприятие» без Конфигуратора?
.epf и запускается у пользователя кнопкой, менять конфигурацию для этого не нужно.Выполняется ли SQL-запрос к базе напрямую?
Запрос и язык запросов 1С. Прямой SQL к таблицам СУБД платформа не даёт выполнять.