Консоль кода в 1С 8.3: от открытия обработки до замера скорости запроса

· 9 мин

Содержание

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

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

Где взять консоль кода и как запустить её в 1С 8.3

Есть три источника, и у каждого свои плюсы.

ВариантЧто этоКогда выбирать
🧰 Подсистема «Инструменты разработчика»Бесплатный набор от сообщества: консоль кода, консоль запросов, исследователь объектовНужна мощная консоль с подсветкой, автодополнением и историей
📦 Отдельная обработка из открытых репозиториевОдна .epf, только консоль кодаНужен быстрый инструмент без установки подсистемы
✍️ Своя минимальная консольФорма с полем текста и одной командойПолитика безопасности не разрешает чужой код в базе

Открытие обработки в режиме 1С:Предприятие

  1. Запустите базу в режиме 1С:Предприятие под пользователем с полными правами.
  2. Откройте главное меню (кнопка с тремя полосками слева вверху) → Файл → Открыть.
  3. Выберите файл .epf.
  4. Платформа покажет предупреждение о безопасности: файл получен извне. Подтвердите открытие, если файл ваш или проверенный.

Если пункта Файл → Открыть нет или файл не открывается, у пользователя нет права на интерактивное открытие внешних обработок. В типовых конфигурациях на базе БСП оно есть у роли с полными правами.

Чтобы консоль открывалась сразу при входе, запустите клиент с параметром /Execute: 1cv8.exe ENTERPRISE /F"D:\Base" /Execute "D:\Tools\Console.epf". Удобно для тестовой базы, которую вы открываете ради одной проверки.

Обычные или управляемые формы

Старые консоли сделаны на обычных формах. В тонком клиенте они не откроются. Есть два пути:

  • 🔄 взять версию консоли на управляемых формах;
  • 🖥 запустить толстый клиент в режиме обычного приложения: 1cv8.exe ENTERPRISE /RunModeOrdinaryApplication.

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

Своя консоль за 10 минут

Если сторонний код в базу нести нельзя, соберите обработку сами в Конфигураторе: Файл → Новый → Внешняя обработка. Добавьте реквизит ТекстКода (тип «Строка», неограниченной длины), выведите его на форму многострочным полем и добавьте команду ВыполнитьКод. Модуль формы:

&НаКлиенте
Процедура ВыполнитьКод(Команда)
	ВыполнитьКодНаСервере(ТекстКода);
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ВыполнитьКодНаСервере(Знач Текст)
	Попытка
		Выполнить(Текст);
	Исключение
		Сообщить("Ошибка: " + ОписаниеОшибки());
	КонецПопытки;
КонецПроцедуры

Сохраните обработку в .epf и откройте её через Файл → Открыть. Этого хватает для 80% повседневных задач: запросов, выборок, точечной правки объектов.

Как писать и выполнять код и запросы в консоли

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

Простой запрос с выводом результата

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

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

Запрос с параметрами

Параметры задают так же, как в модуле: Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДата()));. Не склеивайте значения в текст запроса строкой: так легко ошибиться с форматом даты и получить пустой результат.

Выполнить и Вычислить: в чём разница

МетодЧто делаетПример
Выполнить(Текст)Исполняет фрагмент кода, ничего не возвращаетВыполнить("Сообщить(1 + 2)")
Вычислить(Выражение)Считает одно выражение и возвращает значениеСумма = Вычислить("2 * 21")

Хорошие консоли сами решают, что вызвать. В своей обработке для быстрых проверок выражений добавьте вторую команду с Вычислить().

Длинный текст запроса удобно собрать в конструкторе запросов в Конфигураторе, скопировать и вставить в консоль. Конструктор сам расставит символы | в начале строк.

Клиент или сервер: где выполняется код консоли

Это главный вопрос, без которого половина кода «не работает ». Код в консоли выполняется там, где обработка вызывает Выполнить().

  • 🖥 На сервере доступны запросы, ПолучитьОбъект(), запись объектов, менеджеры справочников и документов. Это основной режим.
  • 💻 На клиенте доступны диалоги, ОткрытьФорму(), работа с файлами на компьютере пользователя. Запросов и записи объектов здесь нет.

Если консоль выдаёт ошибку вида Метод объекта не обнаружен или Тип не определен (Запрос), проверьте переключатель места выполнения. В своей консоли из примера выше весь код идёт на сервер — это сделано намеренно.

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

Исключения и отладка кода в консоли

Перехват ошибок

Оборачивайте рискованный код в Попытка … Исключение. Так одна сбойная запись не остановит обработку остальных:

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

Чтобы остановить код по своему условию, используйте ВызватьИсключение "Не найден контрагент";. Текст попадёт в ОписаниеОшибки() и в окно сообщений.

Безопасная проба записи через транзакцию

Сильный приём практика: выполнить запись и тут же её откатить. Так видно, пройдут ли проверки и обработчики, а данные не меняются.

НачатьТранзакцию();
Попытка
	Объект = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("0000-000123", ТекущаяДата()).ПолучитьОбъект();
	Объект.Записать(РежимЗаписиДокумента.Проведение);
	Сообщить("Проведение прошло без ошибок");
Исключение
	Сообщить(ОписаниеОшибки());
КонецПопытки;
ОтменитьТранзакцию();

Номер документа подставьте свой: формат номера зависит от настроек префиксов. Если документ не найдётся, ПолучитьОбъект() у пустой ссылки вернёт Неопределено, и ошибка честно выведется в сообщения.

Пока транзакция открыта, затронутые записи заблокированы. Не оставляйте в консоли код, который выполняется минутами внутри транзакции, на рабочей базе в рабочее время: пользователи получат ошибки блокировки.

Пошаговая отладка

Код, переданный строкой в Выполнить(), отладчик пошагово не проходит. Точку останова внутри такой строки не поставить. Если нужно смотреть значения на каждой строке:

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

На остановке нажмите Shift+F9 — откроется окно «Выражение», где можно вычислить любое значение в текущем контексте. В клиент-серверной базе отладка на сервере должна быть разрешена: агент сервера запускают с ключом -debug.

Производительность кода и план запроса

Замер времени прямо в консоли

Самый быстрый способ — засечь время до и после:

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

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

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

При пошаговой отладке включите Отладка → Замер производительности. После выполнения Конфигуратор покажет, сколько раз выполнялась каждая строка и какая доля времени на неё пришлась. Так видно, что тормозит: запрос, цикл или обращение через точку к реквизитам ссылки.

Где смотреть план запроса

В файловой базе SQL-плана нет. В клиент-серверной план получают на стороне СУБД:

  • 📄 через технологический журнал: в logcfg.xml добавляют элемент <plansql/> и собирают события DBMSSQL (MS SQL Server) или DBPOSTGRS (PostgreSQL);
  • 🛠 средствами самой СУБД: профайлер в MS SQL Server, EXPLAIN ANALYZE в PostgreSQL для перехваченного текста запроса.

Что чаще всего находится в плане и как это лечить:

СимптомПричинаЧто сделать
Сканирование всей таблицы регистраОтбор по периоду наложен в ГДЕ, а не в параметрах виртуальной таблицыПеренести условие в параметры Остатки(&Дата, Склад = &Склад)
Много мелких запросов в циклеОбращение через точку к реквизитам внутри циклаПолучить нужные поля одним запросом заранее
Долгое соединениеСоединение с подзапросомВынести подзапрос во временную таблицу с индексом

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

Работа с метаданными и массовые правки объектов

Через консоль удобно исследовать структуру конфигурации, не открывая Конфигуратор. Список справочников с числом реквизитов:

Для Каждого МД Из Метаданные.Справочники Цикл
	Сообщить(МД.Имя + " (" + МД.Синоним + "), реквизитов: " + Формат(МД.Реквизиты.Количество(), "ЧН=0; ЧГ=0"));
КонецЦикла;

Найти объект метаданных по полному имени: Метаданные.НайтиПоПолномуИмени("Документ.РеализацияТоваровУслуг"). Если вернулось Неопределено, такого объекта в конфигурации нет.

Универсальное обращение к менеджеру

Когда имя объекта приходит строкой, используйте индексатор менеджера: Справочники["Контрагенты"].НайтиПоНаименованию("ООО Ромашка"). Так один и тот же сниппет работает для разных справочников.

Запись без проверок

Иногда объект не записывается из-за проверок в модуле, а поправить нужно одно служебное поле. Для этого ставят Объект.ОбменДанными.Загрузка = Истина; перед Записать().

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

Перед запуском кода, который меняет данные
Выполнено: 0 / 6

Библиотека сниппетов: как хранить проверенный код

Через полгода работы с консолью у разработчика набирается 30-50 полезных фрагментов. Без порядка их ищут по истории чатов. Рабочая схема:

  1. 📁 Храните каждый сниппет отдельным файлом .bsl в папке, разложенной по задачам: запросы, правка-данных, метаданные, диагностика.
  2. 🏷 В первых строках файла пишите комментарий: что делает код, для какой конфигурации проверен, меняет ли данные.
  3. 🧪 Отмечайте в имени файла опасные сниппеты, например префиксом ЗАПИСЬ_. Такие файлы открывают внимательнее.
  4. 🔁 Кладите папку в Git. История изменений покажет, почему сниппет переписали и что сломалось в прошлый раз.
  5. ⚙️ Выносите изменяемые значения в первые строки: ДатаНачала = '20250101';, ИмяСправочника = "Контрагенты";. Так сниппет не правят по всему тексту.

Многие консоли умеют сохранять тексты в свои файлы настроек. Это удобно для повседневной работы, но держите «эталон» всё равно в обычных текстовых файлах: формат настроек консоли меняется от версии к версии, а .bsl откроется всегда.

Пример шапки сниппета:

// Назначение: снять пометку удаления с контрагентов, помеченных за период
// Проверено: БП 3.0, копия базы
// Меняет данные: ДА
ДатаНачала = '20250101';
ДатаОкончания = '20250131';

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

Можно ли запускать консоль кода в рабочей базе?
Можно, если код проверен на копии, а перед записью сделана резервная копия. Чтение данных запросами в рабочей базе безопасно, правку объектов лучше выполнять вне рабочего времени.
Почему консоль открылась, но код не выполняется на сервере?
Чаще всего консоль запущена в режиме выполнения на клиенте. Переключите место выполнения на сервер или проверьте, что ваша обработка вызывает Выполнить() в серверной процедуре.
Работает ли консоль кода в 1С:Фреш и других облачных сервисах?
Обычно нет: в облачных сервисах открытие произвольных внешних обработок ограничено настройками безопасности. Для таких баз используют выгрузку в локальную копию.
Чем консоль кода отличается от консоли запросов?
Консоль запросов выполняет только текст запроса и показывает результат таблицей. В консоли кода можно выполнить любой код: запрос, цикл, запись объектов, работу с файлами.
Можно ли ограничить, что делает код в консоли?
Да. Перед вызовом Выполнить() установите УстановитьБезопасныйРежим(Истина). В безопасном режиме запрещены работа с файлами, COM-объектами и внешними компонентами, а также привилегированный режим.