Выполняем произвольный код в рабочей базе 1С 8.3: запуск консоли, запросы, отладка и замер скорости

· 10 мин

Содержание

Консоль кода в 1С 8.3 — это внешняя обработка (файл .epf), которая выполняет написанный вами фрагмент на встроенном языке прямо в базе. Запускают её так: главное меню (значок ☰ в левом верхнем углу) → Файл → Открыть или Ctrl+O, выбираете файл, вставляете код и нажимаете кнопку выполнения. В типовых конфигурациях её нет, файл берут из набора инструментов разработчика.

Типичная ситуация: бухгалтер просит «найти все договоры без вида договора» или «проставить реквизит в 3 000 документах». Писать ради этого отдельную обработку долго, а в консоли такая задача занимает десять строк. Главное — знать, как пользоваться консолью кода 1С, запускать её с нужными правами и настраивать для отладки, чтобы не испортить рабочую базу.

Как запустить консоль кода и в каком режиме она работает

Консоль — платформенный механизм, она не зависит от конфигурации. Одна и та же обработка работает в Бухгалтерии 3.0, ЗУП 3.1 и УТ 11, если совпадает версия платформы.

Откуда взять обработку

Распространены три варианта:

  • 🧰 консоль из набора «Инструменты разработчика» — самая функциональная, с подсветкой и историей;
  • 📦 отдельные консоли кода с форумов разработчиков — простые, одна форма с полем ввода;
  • ✍️ своя обработка: форма с текстовым полем и кнопкой, которая передаёт текст в оператор Выполнить().

Оператор Выполнить() — сердце любой консоли. Он принимает строку с кодом и исполняет её в текущем контексте. Всё остальное — удобства вокруг него.

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

Права на открытие

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

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

Сервер или клиент

В большинстве консолей есть переключатель контекста выполнения:

КонтекстЧто доступноКогда выбирать
СерверЗапрос, объекты базы, Записать(), регистрывыборки, массовые изменения, расчёты
Клиентформы, диалоги, Сообщить(), работа с файлами на компьютерепроверка интерфейса, открытие форм

В тонком клиенте и веб-клиенте объектов базы на клиенте нет. Код с Новый Запрос на клиенте упадёт с ошибкой Тип не определен (Запрос). Для работы с данными почти всегда нужен сервер.

Выборка данных запросом из консоли кода

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

Пример: найти контрагентов без ИНН и вывести их список.

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 100
|	Контрагенты.Ссылка КАК Ссылка,
|	Контрагенты.Наименование КАК Наименование
|ИЗ
|	Справочник.Контрагенты КАК Контрагенты
|ГДЕ
|	НЕ Контрагенты.ЭтоГруппа
|	И Контрагенты.ИНН = """"";

Выборка = Запрос.Выполнить().Выбрать();
Счетчик = 0;
Пока Выборка.Следующий() Цикл
	Счетчик = Счетчик + 1;
	Сообщить(Выборка.Наименование);
КонецЦикла;
Сообщить("Найдено: " + Формат(Счетчик, "ЧН=0; ЧГ=0"));

Кавычки внутри строки запроса удваиваются: пустая строка в тексте запроса записывается как """". Это самая частая причина синтаксической ошибки у тех, кто переносит запрос из консоли запросов.

💡 Ставьте ВЫБРАТЬ ПЕРВЫЕ 100 при первом прогоне. Запрос без ограничения к регистру бухгалтерии на базе в 40 ГБ может работать минутами и нагрузит сервер для всех пользователей.

Когда лучше взять консоль запросов

ЗадачаЧем удобнее
Посмотреть результат таблицей, отсортировать, выгрузить в Excelконсоль запросов
Собрать запрос конструкторомконсоль запросов
Обработать результат кодом, записать измененияконсоль кода
Проверить работу функции общего модуляконсоль кода

Выполнение кода и изменение данных

Главное, зачем открывают консоль, — разовые исправления. Схема у любой такой правки одна: выбрать объекты запросом, получить объект через ПолучитьОбъект(), изменить и записать.

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	Договоры.Ссылка КАК Ссылка
|ИЗ
|	Справочник.ДоговорыКонтрагентов КАК Договоры
|ГДЕ
|	Договоры.Комментарий = """"";

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

НачатьТранзакцию();
Попытка
	Пока Выборка.Следующий() Цикл
		Объект = Выборка.Ссылка.ПолучитьОбъект();
		Объект.Комментарий = "Проверено";
		Объект.Записать();
		Изменено = Изменено + 1;
	КонецЦикла;
	ЗафиксироватьТранзакцию();
	Сообщить("Изменено: " + Формат(Изменено, "ЧН=0; ЧГ=0"));
Исключение
	ОтменитьТранзакцию();
	Сообщить(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;

Транзакция здесь нужна, чтобы правка прошла целиком или не прошла вовсе. Если на 1 200-м элементе запись упадёт, первые 1 199 откатятся.

Перед массовой записью в рабочей базе сделайте резервную копию и прогоните код на копии. Откатить Записать() после фиксации транзакции нечем.

Проверка на копии и «сухой прогон»

Удобный приём — флаг в начале кода:

ТолькоПроверка = Истина;
// ...
Если Не ТолькоПроверка Тогда
	Объект.Записать();
КонецЕсли;

Первый запуск с Истина показывает, сколько объектов попадёт под правку. Второй, с Ложь, — меняет данные.

Про ОбменДанными.Загрузка

В примерах с форумов часто встречается строка Объект.ОбменДанными.Загрузка = Истина перед записью. Она отключает обработчики ПередЗаписью и ПриЗаписи, проверки заполнения и часть подписок на события.

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

Перед запуском кода в рабочей базе
Выполнено: 0 / 6

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

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

Отладка самого фрагмента

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

  1. Откройте базу в Конфигураторе.
  2. Запустите режим 1С:Предприятие с отладкой: Отладка → Начать отладку или F5.
  3. В запущенной базе откройте консоль и вставьте в код строку, на которой хотите остановиться.
  4. В Конфигураторе откройте тот же файл консоли через Файл → Открыть и поставьте точку останова (F9) в процедуре, которая вызывает Выполнить().
  5. Запустите код в консоли — выполнение остановится на точке.

Код, переданный в Выполнить(), — это строка, у неё нет своего модуля. Поэтому точку останова внутри вашего фрагмента не поставить. Останавливайтесь на строке с Выполнить() и смотрите значения через Shift+F9, а сложный код, который нужно пройти по шагам, выносите в отдельную процедуру внешней обработки.

Горячие клавиши отладчика

КлавишаДействие
F5начать отладку
Shift+F5завершить отладку
F9поставить или снять точку останова
F10шагнуть через (не заходя в процедуру)
F11шагнуть в процедуру
Shift+F11шагнуть из процедуры
Shift+F9вычислить выражение

Окно Shift+F9 — по сути та же консоль, только в момент остановки. В нём видны все локальные переменные, можно раскрыть коллекцию или вызвать функцию.

Отладка на сервере

В файловой базе серверный код отлаживается сразу. В клиент-серверном варианте сервер 1С должен быть запущен с разрешённой отладкой — служба агента стартует с ключом -debug. Добавляет его администратор сервера.

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

Способ подключения (протокол TCP или HTTP) задаётся в Конфигураторе: Сервис → Параметры → Запуск 1С:Предприятия. Он должен совпадать с тем, как запущен сервер.

Запуск внешних отчётов и обработок из консоли

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

На клиенте файл сначала помещают во временное хранилище, затем на сервере подключают:

// на сервере, адрес получен после ПоместитьФайл на клиенте
ИмяОбработки = ВнешниеОбработки.Подключить(АдресВХранилище);
Обработка = ВнешниеОбработки.Создать(ИмяОбработки);

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

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

Замер времени и поиск медленного места

Консоль кода — удобный стенд, чтобы сравнить два варианта алгоритма на реальных данных. Время меряют функцией ТекущаяУниверсальнаяДатаВМиллисекундах():

Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();

// проверяемый фрагмент
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	// ...
КонецЦикла;

Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало;
Сообщить("Выполнено за " + Формат(Длительность, "ЧН=0; ЧГ=0") + " мс");

Один замер ничего не доказывает: второй запуск обычно быстрее из-за кэша СУБД. Запускайте каждый вариант 3–5 раз и сравнивайте средние значения.

Замер производительности в Конфигураторе

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

  1. Запустите базу с отладкой из Конфигуратора (F5).
  2. В Конфигураторе выберите Отладка → Замер производительности.
  3. Выполните код в консоли.
  4. Снова выберите тот же пункт — замер остановится, откроется таблица.

В таблице видно, сколько раз выполнялась каждая строка и какую долю времени заняла. Обычно наверху оказывается одно из трёх:

  • 🐢 запрос внутри цикла — сотня мелких запросов вместо одного;
  • 🐢 обращение к реквизиту через точку от ссылки в цикле (Выборка.Ссылка.Контрагент.ИНН) — каждое такое обращение читает объект из базы;
  • 🐢 Записать() документа с полным перепроведением.

💡 Лечение одинаковое: всё, что можно, забирайте одним запросом до цикла, а в цикле работайте с уже полученной выборкой.

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

Ошибки при работе с консолью кода

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

Отдельно о блокировках. Массовая запись в одной транзакции держит блокировки на изменённые данные до её фиксации. Если правите 10 000 документов днём, остальные пользователи будут ловить ошибки блокировки. Большие правки делите на порции по 500–1 000 объектов, каждую в своей транзакции, или запускайте вечером.

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

Можно ли запустить консоль кода в базе, опубликованной через веб-клиент?
Да, если у пользователя есть право на открытие внешних обработок. Файл загружается через браузер, код выполняется на сервере так же, как в тонком клиенте.
Работает ли консоль кода в 1С:Фреш или другом облачном сервисе?
Обычно нет. В облачных сервисах внешние обработки без проверки провайдером запрещены, а произвольный код — тем более.
Сохраняются ли изменения, если закрыть консоль посреди выполнения?
Закрыть форму во время выполнения серверного вызова нельзя: интерфейс ждёт ответа. Если сеанс оборвётся, незафиксированная транзакция откатится.
Видно ли в журнале регистрации, что данные меняли из консоли?
Видно, что объект записал конкретный пользователь в конкретное время. Источник — консоль или обычная форма — журнал не различает, поэтому правки стоит записывать в комментарий объекта.
Чем консоль кода отличается от окна «Вычислить выражение»?
Окно Shift+F9 работает только во время остановки отладчика и видит локальные переменные в этой точке. Консоль запускается в любой момент, без Конфигуратора, но о переменных чужих процедур ничего не знает.