К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как выполнить произвольный код в 1С

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

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

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

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

Функция Выполнить() — программный запуск кода из строки

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

Пример простейшего использования:

СтрокаКода = "Сообщить(ТекущаяДата())";

Выполнить(СтрокаКода);

Код, переданный в Выполнить(), выполняется в том же контексте, где вызвана функция: если вызов идёт в серверной процедуре общего модуля — код исполнится на сервере, если в клиентской форме — на клиенте. Это принципиально важно: серверный код не имеет доступа к интерактивным возможностям (диалогам, предупреждениям), а клиентский — к прямым запросам к базе в некоторых режимах.

Функция Выполнить() выполняет именно операторы, а не выражения. Если нужно вычислить выражение и получить результат, используется функция Вычислить(Выражение):

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

Консоль кода — самый удобный способ разового выполнения

Консоль кода — это внешняя обработка (файл .epf), которая открывается в режиме 1С:Предприятие и предоставляет текстовое поле для ввода произвольного кода с кнопкой выполнения. Такие обработки входят в состав популярных инструментов разработчика, а также поставляются на дисках ИТС и в типовых подсистемах (например, в БСП есть механизмы для выполнения произвольных алгоритмов).

Типовой сценарий работы выглядит так:

Порядок действий с консолью кода
  1. 1
    Сделайте резервную копию базы или работайте на копии
  2. 2
    Запустите 1С:Предприятие под пользователем с полными правами
  3. 3
    Откройте файл консоли кода через Файл → Открыть
  4. 4
    Введите код в текстовое поле обработки
  5. 5
    Выберите режим выполнения: клиент или сервер (если консоль это поддерживает)
  6. 6
    Нажмите «Выполнить» и проверьте результат в окне сообщений

Пример кода, который часто выполняют через консоль, — массовое изменение данных без написания обработки:

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ Номенклатура.Ссылка КАК Ссылка

|ИЗ Справочник.Номенклатура КАК Номенклатура

|ГДЕ Номенклатура.ПометкаУдаления";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

Объект = Выборка.Ссылка.ПолучитьОбъект();

Объект.УстановитьПометкуУдаления(Ложь);

КонецЦикла;

Многие консоли кода поддерживают передачу параметров, сохранение текста алгоритмов в файл и выполнение на сервере. Если консоль выполняет код на клиенте, а вам нужны серверные операции (например, запросы в тонком клиенте без права прямого доступа), выбирайте консоль с серверным режимом или используйте толстый клиент.

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

Конфигуратор позволяет выполнить произвольные выражения прямо в процессе отладки, не меняя код конфигурации. Для этого используется окно «Вычислить выражение» (Ctrl+F9) и табло (Shift+F9).

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

Этот способ незаменим, когда нужно посмотреть значения переменных в живом сеансе, проверить гипотезу о причине ошибки или разово дернуть серверную функцию с конкретными параметрами. Для серверного кода отладка должна быть разрешена на сервере 1С (параметр запуска сервера или настройка кластера).

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

Внешние обработки и отчеты как контейнер кода

Если код нужно выполнять регулярно или передавать другим пользователям, разовая консоль неудобна — правильнее оформить алгоритм как внешнюю обработку (.epf) или внешний отчет (.erf). Файл открывается через меню «Файл → Открыть» или подключается через механизм «Дополнительные отчеты и обработки» в типовых конфигурациях.

Минимальная внешняя обработка создаётся в конфигураторе: «Файл → Новый → Внешняя обработка», в модуле формы или в модуле объекта размещается нужный код. Для выполнения на сервере в клиент-серверной базе код размещают в серверных процедурах модуля объекта обработки.

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

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

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

Другой вариант — выполнение кода извне через COM-соединение (V83.COMConnector) или через HTTP-сервисы, опубликованные в конфигурации. COM-подключение позволяет из внешнего скрипта (например, на OneScript или PowerShell) соединиться с базой и вызвать Выполнить() в контексте соединения:

// Пример для OneScript / внешнего скрипта

Коннектор = Новый COMОбъект("V83.COMConnector");

Соединение = Коннектор.Connect("File=""C:\Bases\Trade"";");

Соединение.Выполнить("Сообщить(""Привет из базы"")");

Этот способ требует установленного COM-коннектора соответствующей версии платформы и работает только в Windows-окружении. Для веб-сценариев правильнее публиковать HTTP-сервисы с явно заданной логикой, а не универсальную точку выполнения произвольного кода — это серьёзная дыра в безопасности.

Сравнение способов выполнения кода

У каждого механизма есть свои условия применения, ограничения по контексту выполнения и требования к правам. Сводная таблица поможет выбрать подходящий вариант.

СпособГде выполняетсяКогда подходитОграничения
Консоль кода (epf)Клиент или серверРазовые операции, исправление данныхНужны полные права, файл консоли
Отладка, «Вычислить выражение»Контекст точки остановаДиагностика, проверка гипотезТолько выражения, нужна отладка
Внешняя обработкаКлиент/серверПовторяющиеся задачи, передача коллегамБезопасный режим, профили доступа
Регламентное заданиеСервер, фоновый сеансАвтоматизация по расписаниюНет интерактива, нужна настройка
COM / внешнее соединениеКонтекст соединенияСкрипты обслуживания, интеграцииWindows, версия коннектора
Маршрут решения

Как выбрать действие

Нужно разово исправить данные или проверить запросИспользуйте консоль кода на копии базы
Нужно понять, почему алгоритм работает неправильноИспользуйте отладку и окно «Вычислить выражение»
Код выполняется регулярно или нужен другим пользователямОформите внешнюю обработку и подключите через дополнительные обработки
Код должен запускаться автоматически по расписаниюНастройте регламентное задание или внешний скрипт через COM/HTTP

Безопасность и типичные ошибки

Главный риск произвольного кода — прямая модификация данных в обход прикладной логики. Обработчики «ПередЗаписью», проверки заполнения и бизнес-правила срабатывают только если код использует объектную модель (ПолучитьОбъект(), Записать()) — а прямые запросы ИЗМЕНИТЬ или установка значений через запросы их обходят полностью.

Типичные ошибки
01
Выполнение кода в рабочей базе без копии — ошибка в алгоритме приводит к необратимой порче данных
02
Выполнение на клиенте кода, требующего сервера — ошибки вида «Операция не доступна» или обращение к недоступному контексту
03
Игнорирование транзакций — при сбое посередине цикла часть объектов изменена, часть нет, база в несогласованном состоянии
04
Использование Выполнить() с текстом, полученным от пользователя или из внешнего источника — прямой путь к внедрению вредоносного кода
05
Забытый Объект.Записать() после изменений — код отработал без ошибок, но данные не сохранились

Для массовых изменений оборачивайте цикл в транзакцию (НачатьТранзакцию() … ЗафиксироватьТранзакцию() с обработкой исключения и ОтменитьТранзакцию()) — тогда сбой откатит все изменения целиком. И всегда сначала выполняйте код в режиме «только прочитать и показать, что будет изменено», а потом уже с реальной записью.

Контрольные точки

Как проверить результат

Данные после выполнения
Норма

Запрос к изменённым объектам возвращает ожидаемые значения

Тревожный признак

Значения не изменились или изменились частично

Окно сообщений
Норма

Нет сообщений об ошибках, выведены ожидаемые уведомления

Тревожный признак

Ошибки транзакции, «Объект не найден», обрыв выполнения

Целостность связанных данных
Норма

Проводки, движения и связанные объекты соответствуют изменениям

Тревожный признак

Документы ссылаются на удалённые или изменённые объекты некорректно

Часто задаваемые вопросы

Чем Выполнить() отличается от Вычислить()?

Выполнить() исполняет блок операторов (присваивания, циклы, вызовы процедур) и ничего не возвращает. Вычислить() вычисляет одно выражение и возвращает его значение — например, результат арифметики или вызова функции. Для получения результата из произвольного кода через Выполнить() используют промежуточные переменные или параметры.

Можно ли выполнить код в 1С без конфигуратора?

Да. Консоль кода и внешние обработки открываются прямо в режиме 1С:Предприятие через меню «Файл → Открыть». Конфигуратор нужен только для создания самих обработок и для отладки, но не для их запуска.

Почему консоль кода выдаёт ошибку «Операция не доступна»?

Чаще всего код выполняется не в том контексте: серверные операции (запросы, обращение к объектам базы) недоступны в клиентском контексте управляемого приложения, а интерактивные вызовы (Предупреждение, ОткрытьЗначение) недоступны на сервере. Переключите консоль в серверный режим или разделите код на клиентскую и серверную части.

Безопасно ли использовать Выполнить() в прикладном решении?

Только если текст кода полностью контролируется разработчиком и не собирается из вводимых пользователем данных. Динамическое выполнение строк из внешних источников — классическая уязвимость внедрения кода. В сертифицируемых и облачных решениях использование Выполнить() часто запрещено стандартами разработки.

Как выполнить код на сервере, если база файловая?

В файловом варианте разделения клиент/сервер как такового нет: код выполняется в процессе клиентского приложения (или веб-сервера, если база опубликована). Поэтому для файловой базы достаточно обычной консоли кода — вопрос выбора контекста возникает только в клиент-серверном варианте.

Можно ли отменить изменения, сделанные произвольным кодом?

Штатной кнопки «отменить» нет. Если код выполнялся в транзакции и завершился ошибкой — изменения откатятся автоматически. Если транзакции не было и код зафиксировал изменения, восстановить данные можно только из резервной копии. Поэтому копия базы перед экспериментами — обязательное условие.

Итог

Что важно запомнить

Произвольный код в 1С выполняется через Выполнить()/Вычислить(), консоль кода, отладку, внешние обработки, регламентные задания и внешние соединения. Для разовых задач удобнее консоль кода, для регулярных — внешняя обработка. Всегда работайте на копии базы, используйте транзакции при массовых изменениях и никогда не исполняйте код из недоверенных источников.