Разработка и Конфигурация · 12 мин
Как выполнить произвольный код в 1С
Как выполнить произвольный код в 1С: функция Выполнить(), консоль кода, внешние обработки, отладка. Примеры, ограничения безопасности и типичные ошибки.
Задача выполнить произвольный код в 1С возникает у разработчиков и администраторов постоянно: нужно быстро проверить запрос, исправить данные без написания полноценной обработки, протестировать алгоритм или разово выполнить административную операцию. Платформа 1С:Предприятие предоставляет для этого несколько штатных механизмов — от встроенной функции Выполнить() до консолей кода и внешних обработок.
Выбор инструмента зависит от контекста: код выполняется на клиенте или на сервере, в файловой базе или в клиент-серверном варианте, есть ли у вас права администратора и возможность запуска конфигуратора. Ниже разобраны основные способы с примерами, ограничениями и мерами предосторожности.
Важно понимать: произвольный код, выполняемый с полными правами, способен напрямую изменить или удалить данные информационной базы, минуя прикладную логику и проверки. Поэтому любые эксперименты следует проводить на копии базы, а не в рабочей среде.
Функция Выполнить() — программный запуск кода из строки
Встроенный язык 1С содержит функцию Выполнить(СтрокаКода), которая исполняет переданный ей текст как фрагмент программы. Это основной «внутренний» механизм динамического выполнения кода, на котором построены почти все консоли и инструменты разработчика.
Пример простейшего использования:
СтрокаКода = "Сообщить(ТекущаяДата())";
Выполнить(СтрокаКода);
Код, переданный в Выполнить(), выполняется в том же контексте, где вызвана функция: если вызов идёт в серверной процедуре общего модуля — код исполнится на сервере, если в клиентской форме — на клиенте. Это принципиально важно: серверный код не имеет доступа к интерактивным возможностям (диалогам, предупреждениям), а клиентский — к прямым запросам к базе в некоторых режимах.
Функция Выполнить() выполняет именно операторы, а не выражения. Если нужно вычислить выражение и получить результат, используется функция Вычислить(Выражение):
Результат = Вычислить("2 * 3 + 4"); // вернёт 10
Консоль кода — самый удобный способ разового выполнения
Консоль кода — это внешняя обработка (файл .epf), которая открывается в режиме 1С:Предприятие и предоставляет текстовое поле для ввода произвольного кода с кнопкой выполнения. Такие обработки входят в состав популярных инструментов разработчика, а также поставляются на дисках ИТС и в типовых подсистемах (например, в БСП есть механизмы для выполнения произвольных алгоритмов).
Типовой сценарий работы выглядит так:
- 1Сделайте резервную копию базы или работайте на копии
- 2Запустите 1С:Предприятие под пользователем с полными правами
- 3Откройте файл консоли кода через Файл → Открыть
- 4Введите код в текстовое поле обработки
- 5Выберите режим выполнения: клиент или сервер (если консоль это поддерживает)
- 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, версия коннектора |
Как выбрать действие
Безопасность и типичные ошибки
Главный риск произвольного кода — прямая модификация данных в обход прикладной логики. Обработчики «ПередЗаписью», проверки заполнения и бизнес-правила срабатывают только если код использует объектную модель (ПолучитьОбъект(), Записать()) — а прямые запросы ИЗМЕНИТЬ или установка значений через запросы их обходят полностью.
Для массовых изменений оборачивайте цикл в транзакцию (НачатьТранзакцию() … ЗафиксироватьТранзакцию() с обработкой исключения и ОтменитьТранзакцию()) — тогда сбой откатит все изменения целиком. И всегда сначала выполняйте код в режиме «только прочитать и показать, что будет изменено», а потом уже с реальной записью.
Как проверить результат
Запрос к изменённым объектам возвращает ожидаемые значения
Значения не изменились или изменились частично
Нет сообщений об ошибках, выведены ожидаемые уведомления
Ошибки транзакции, «Объект не найден», обрыв выполнения
Проводки, движения и связанные объекты соответствуют изменениям
Документы ссылаются на удалённые или изменённые объекты некорректно
Часто задаваемые вопросы
Чем Выполнить() отличается от Вычислить()?
Выполнить() исполняет блок операторов (присваивания, циклы, вызовы процедур) и ничего не возвращает. Вычислить() вычисляет одно выражение и возвращает его значение — например, результат арифметики или вызова функции. Для получения результата из произвольного кода через Выполнить() используют промежуточные переменные или параметры.
Можно ли выполнить код в 1С без конфигуратора?
Да. Консоль кода и внешние обработки открываются прямо в режиме 1С:Предприятие через меню «Файл → Открыть». Конфигуратор нужен только для создания самих обработок и для отладки, но не для их запуска.
Почему консоль кода выдаёт ошибку «Операция не доступна»?
Чаще всего код выполняется не в том контексте: серверные операции (запросы, обращение к объектам базы) недоступны в клиентском контексте управляемого приложения, а интерактивные вызовы (Предупреждение, ОткрытьЗначение) недоступны на сервере. Переключите консоль в серверный режим или разделите код на клиентскую и серверную части.
Безопасно ли использовать Выполнить() в прикладном решении?
Только если текст кода полностью контролируется разработчиком и не собирается из вводимых пользователем данных. Динамическое выполнение строк из внешних источников — классическая уязвимость внедрения кода. В сертифицируемых и облачных решениях использование Выполнить() часто запрещено стандартами разработки.
Как выполнить код на сервере, если база файловая?
В файловом варианте разделения клиент/сервер как такового нет: код выполняется в процессе клиентского приложения (или веб-сервера, если база опубликована). Поэтому для файловой базы достаточно обычной консоли кода — вопрос выбора контекста возникает только в клиент-серверном варианте.
Можно ли отменить изменения, сделанные произвольным кодом?
Штатной кнопки «отменить» нет. Если код выполнялся в транзакции и завершился ошибкой — изменения откатятся автоматически. Если транзакции не было и код зафиксировал изменения, восстановить данные можно только из резервной копии. Поэтому копия базы перед экспериментами — обязательное условие.
Что важно запомнить
Произвольный код в 1С выполняется через Выполнить()/Вычислить(), консоль кода, отладку, внешние обработки, регламентные задания и внешние соединения. Для разовых задач удобнее консоль кода, для регулярных — внешняя обработка. Всегда работайте на копии базы, используйте транзакции при массовых изменениях и никогда не исполняйте код из недоверенных источников.