Выполняем произвольный код в рабочей базе 1С 8.3: запуск консоли, запросы, отладка и замер скорости
Содержание
Консоль кода в 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 откатятся.
Перед массовой записью в рабочей базе сделайте резервную копию и прогоните код на копии. Откатить Записать() после фиксации транзакции нечем.
Проверка на копии и «сухой прогон»
Удобный приём — флаг в начале кода:
ТолькоПроверка = Истина;
// ...
Если Не ТолькоПроверка Тогда
Объект.Записать();
КонецЕсли;
Первый запуск с Истина показывает, сколько объектов попадёт под правку. Второй, с Ложь, — меняет данные.
Про ОбменДанными.Загрузка
В примерах с форумов часто встречается строка Объект.ОбменДанными.Загрузка = Истина перед записью. Она отключает обработчики ПередЗаписью и ПриЗаписи, проверки заполнения и часть подписок на события.
Запись идёт быстрее, но без контроля конфигурации. Для документов это опасно: движения не перезапишутся, а связанные данные могут остаться в старом состоянии. Используйте этот флаг только для простых реквизитов справочников и только если понимаете, какие обработчики пропускаете.
Отладка кода: точки останова и вычисление выражений
Встроенного отладчика в консоли нет. Отлаживают через Конфигуратор: код консоли — это код внешней обработки, к нему цепляется штатный отладчик платформы.
Отладка самого фрагмента
Самый простой путь — отладочный вывод через Сообщить(). Для коротких фрагментов этого хватает. Когда нужно смотреть значения переменных по шагам, подключают отладчик:
- Откройте базу в Конфигураторе.
- Запустите режим 1С:Предприятие с отладкой:
Отладка → Начать отладкуилиF5. - В запущенной базе откройте консоль и вставьте в код строку, на которой хотите остановиться.
- В Конфигураторе откройте тот же файл консоли через
Файл → Открытьи поставьте точку останова (F9) в процедуре, которая вызываетВыполнить(). - Запустите код в консоли — выполнение остановится на точке.
Код, переданный в Выполнить(), — это строка, у неё нет своего модуля. Поэтому точку останова внутри вашего фрагмента не поставить. Останавливайтесь на строке с Выполнить() и смотрите значения через Shift+F9, а сложный код, который нужно пройти по шагам, выносите в отдельную процедуру внешней обработки.
Горячие клавиши отладчика
| Клавиша | Действие |
|---|---|
F5 | начать отладку |
Shift+F5 | завершить отладку |
F9 | поставить или снять точку останова |
F10 | шагнуть через (не заходя в процедуру) |
F11 | шагнуть в процедуру |
Shift+F11 | шагнуть из процедуры |
Shift+F9 | вычислить выражение |
Окно Shift+F9 — по сути та же консоль, только в момент остановки. В нём видны все локальные переменные, можно раскрыть коллекцию или вызвать функцию.
Отладка на сервере
В файловой базе серверный код отлаживается сразу. В клиент-серверном варианте сервер 1С должен быть запущен с разрешённой отладкой — служба агента стартует с ключом -debug. Добавляет его администратор сервера.
Изменение параметров службы требует её перезапуска. Все сеансы пользователей на этом сервере оборвутся, поэтому делают это вне рабочего времени.
Способ подключения (протокол TCP или HTTP) задаётся в Конфигураторе: Сервис → Параметры → Запуск 1С:Предприятия. Он должен совпадать с тем, как запущен сервер.
Запуск внешних отчётов и обработок из консоли
Консоль кода умеет открывать другие внешние файлы программно. Это нужно, когда обработку надо вызвать с параметрами или проверить её поведение без интерфейса.
На клиенте файл сначала помещают во временное хранилище, затем на сервере подключают:
// на сервере, адрес получен после ПоместитьФайл на клиенте
ИмяОбработки = ВнешниеОбработки.Подключить(АдресВХранилище);
Обработка = ВнешниеОбработки.Создать(ИмяОбработки);
ВнешниеОбработки.Подключить() по умолчанию подключает файл в безопасном режиме. В безопасном режиме запрещены привилегированные операции: работа с файлами сервера, внешние компоненты, COM. Если обработка ругается на безопасный режим, это не баг консоли, а защита платформы.
В конфигурациях на БСП есть второй путь — справочник дополнительных обработок: Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки. Туда регистрируют постоянные инструменты. Для разового кода консоль удобнее: регистрация требует, чтобы обработка содержала описание для БСП.
Замер времени и поиск медленного места
Консоль кода — удобный стенд, чтобы сравнить два варианта алгоритма на реальных данных. Время меряют функцией ТекущаяУниверсальнаяДатаВМиллисекундах():
Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
// проверяемый фрагмент
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// ...
КонецЦикла;
Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало;
Сообщить("Выполнено за " + Формат(Длительность, "ЧН=0; ЧГ=0") + " мс");
Один замер ничего не доказывает: второй запуск обычно быстрее из-за кэша СУБД. Запускайте каждый вариант 3–5 раз и сравнивайте средние значения.
Замер производительности в Конфигураторе
Когда непонятно, какая строка тормозит, включите построчный замер:
- Запустите базу с отладкой из Конфигуратора (
F5). - В Конфигураторе выберите
Отладка → Замер производительности. - Выполните код в консоли.
- Снова выберите тот же пункт — замер остановится, откроется таблица.
В таблице видно, сколько раз выполнялась каждая строка и какую долю времени заняла. Обычно наверху оказывается одно из трёх:
- 🐢 запрос внутри цикла — сотня мелких запросов вместо одного;
- 🐢 обращение к реквизиту через точку от ссылки в цикле (
Выборка.Ссылка.Контрагент.ИНН) — каждое такое обращение читает объект из базы; - 🐢
Записать()документа с полным перепроведением.
💡 Лечение одинаковое: всё, что можно, забирайте одним запросом до цикла, а в цикле работайте с уже полученной выборкой.
Для разбора нагрузки на сервере в целом — блокировок, долгих запросов к СУБД — замера мало. Там нужен технологический журнал, его настраивает администратор сервера.
Ошибки при работе с консолью кода
Выполнить(). Чаще всего виноваты неудвоенные кавычки в тексте запроса или пропущенная точка с запятой.Файл → Открыть под пользователем с полными правами.Ctrl+Break, если в нём есть вызов ОбработкаПрерыванияПользователя(). Серверный вызов так не прервать: в клиент-серверной базе администратор завершает сеанс через консоль кластера. Пользователь этого сеанса потеряет несохранённые данные.Отдельно о блокировках. Массовая запись в одной транзакции держит блокировки на изменённые данные до её фиксации. Если правите 10 000 документов днём, остальные пользователи будут ловить ошибки блокировки. Большие правки делите на порции по 500–1 000 объектов, каждую в своей транзакции, или запускайте вечером.
Частые вопросы
Можно ли запустить консоль кода в базе, опубликованной через веб-клиент?
Работает ли консоль кода в 1С:Фреш или другом облачном сервисе?
Сохраняются ли изменения, если закрыть консоль посреди выполнения?
Видно ли в журнале регистрации, что данные меняли из консоли?
Чем консоль кода отличается от окна «Вычислить выражение»?
Shift+F9 работает только во время остановки отладчика и видит локальные переменные в этой точке. Консоль запускается в любой момент, без Конфигуратора, но о переменных чужих процедур ничего не знает.