Консоль кода в 1С 8.3: от открытия обработки до замера скорости запроса
Содержание
Консоль кода в 1С 8.3 — это внешняя обработка (.epf), которую открывают через главное меню Файл → Открыть (Ctrl+O). В поле вводят текст на встроенном языке и жмут «Выполнить»: внутри обработка передаёт текст в метод Выполнить() на клиенте или на сервере. В типовые конфигурации консоль кода не встроена, её берут готовой или собирают сами за 10 минут.
Типичная ситуация: бухгалтер просит «поправить реквизит у 300 документов», а писать под это отдельную обработку долго. Разработчик открывает консоль, запускает пять строк кода на копии базы, проверяет результат и только потом повторяет на рабочей. Как работать с консолью 1С так, чтобы она экономила время, а не ломала данные, — по шагам ниже.
Где взять консоль кода и как запустить её в 1С 8.3
Есть три источника, и у каждого свои плюсы.
| Вариант | Что это | Когда выбирать |
|---|---|---|
| 🧰 Подсистема «Инструменты разработчика» | Бесплатный набор от сообщества: консоль кода, консоль запросов, исследователь объектов | Нужна мощная консоль с подсветкой, автодополнением и историей |
| 📦 Отдельная обработка из открытых репозиториев | Одна .epf, только консоль кода | Нужен быстрый инструмент без установки подсистемы |
| ✍️ Своя минимальная консоль | Форма с полем текста и одной командой | Политика безопасности не разрешает чужой код в базе |
Открытие обработки в режиме 1С:Предприятие
- Запустите базу в режиме 1С:Предприятие под пользователем с полными правами.
- Откройте главное меню (кнопка с тремя полосками слева вверху) →
Файл → Открыть. - Выберите файл
.epf. - Платформа покажет предупреждение о безопасности: файл получен извне. Подтвердите открытие, если файл ваш или проверенный.
Если пункта Файл → Открыть нет или файл не открывается, у пользователя нет права на интерактивное открытие внешних обработок. В типовых конфигурациях на базе БСП оно есть у роли с полными правами.
Чтобы консоль открывалась сразу при входе, запустите клиент с параметром /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", ТекущаяДата()).ПолучитьОбъект();
Объект.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Проведение прошло без ошибок");
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
ОтменитьТранзакцию();
Номер документа подставьте свой: формат номера зависит от настроек префиксов. Если документ не найдётся, ПолучитьОбъект() у пустой ссылки вернёт Неопределено, и ошибка честно выведется в сообщения.
Пока транзакция открыта, затронутые записи заблокированы. Не оставляйте в консоли код, который выполняется минутами внутри транзакции, на рабочей базе в рабочее время: пользователи получат ошибки блокировки.
Пошаговая отладка
Код, переданный строкой в Выполнить(), отладчик пошагово не проходит. Точку останова внутри такой строки не поставить. Если нужно смотреть значения на каждой строке:
- Откройте в Конфигураторе ту же
.epf:Файл → Открыть. - Перенесите проверяемый код в модуль обработки (например, в серверную процедуру формы).
- Поставьте точку останова (F9).
- Запустите отладку:
Отладка → Начать отладку → 1С:Предприятие. - В открывшемся клиенте откройте этот же файл обработки и запустите команду.
На остановке нажмите 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"));
КонецЦикла;
Найти объект метаданных по полному имени: Метаданные.НайтиПоПолномуИмени("Документ.РеализацияТоваровУслуг"). Если вернулось Неопределено, такого объекта в конфигурации нет.
Универсальное обращение к менеджеру
Когда имя объекта приходит строкой, используйте индексатор менеджера: Справочники["Контрагенты"].НайтиПоНаименованию("ООО Ромашка"). Так один и тот же сниппет работает для разных справочников.
Запись без проверок
Иногда объект не записывается из-за проверок в модуле, а поправить нужно одно служебное поле. Для этого ставят Объект.ОбменДанными.Загрузка = Истина; перед Записать().
Режим загрузки отключает обработчики и проверки заполнения. Документ, записанный так, не перепроводится, а связанные данные не обновляются. Применяйте его только для полей, которые не влияют на движения, и только когда понимаете, какие подписки на события вы пропускаете.
Библиотека сниппетов: как хранить проверенный код
Через полгода работы с консолью у разработчика набирается 30-50 полезных фрагментов. Без порядка их ищут по истории чатов. Рабочая схема:
- 📁 Храните каждый сниппет отдельным файлом
.bslв папке, разложенной по задачам:запросы,правка-данных,метаданные,диагностика. - 🏷 В первых строках файла пишите комментарий: что делает код, для какой конфигурации проверен, меняет ли данные.
- 🧪 Отмечайте в имени файла опасные сниппеты, например префиксом
ЗАПИСЬ_. Такие файлы открывают внимательнее. - 🔁 Кладите папку в Git. История изменений покажет, почему сниппет переписали и что сломалось в прошлый раз.
- ⚙️ Выносите изменяемые значения в первые строки:
ДатаНачала = '20250101';,ИмяСправочника = "Контрагенты";. Так сниппет не правят по всему тексту.
Многие консоли умеют сохранять тексты в свои файлы настроек. Это удобно для повседневной работы, но держите «эталон» всё равно в обычных текстовых файлах: формат настроек консоли меняется от версии к версии, а .bsl откроется всегда.
Пример шапки сниппета:
// Назначение: снять пометку удаления с контрагентов, помеченных за период
// Проверено: БП 3.0, копия базы
// Меняет данные: ДА
ДатаНачала = '20250101';
ДатаОкончания = '20250131';
Частые вопросы
Можно ли запускать консоль кода в рабочей базе?
Почему консоль открылась, но код не выполняется на сервере?
Выполнить() в серверной процедуре.Работает ли консоль кода в 1С:Фреш и других облачных сервисах?
Чем консоль кода отличается от консоли запросов?
Можно ли ограничить, что делает код в консоли?
Выполнить() установите УстановитьБезопасныйРежим(Истина). В безопасном режиме запрещены работа с файлами, COM-объектами и внешними компонентами, а также привилегированный режим.