В процессе разработки на платформе 1С:Предприятие каждый программист сталкивается с ситуацией, когда стандартного окна «Вычислить выражение» (Shift+F9) становится недостаточно. Например, когда нужно не просто посмотреть значение переменной, а быстро сериализовать сложную структуру в JSON, выгрузить таблицу значений в файл или трансформировать данные для анализа, не прерывая сеанс отладки. Стандартное поле ввода выражения принимает только одиночные функции или обращения к свойствам, что ограничивает наши возможности.
В этой статье мы подробно разберем, как обойти эти ограничения, рассмотрим несколько продвинутых методик выполнения произвольного кода «на лету».
Многие знают о существовании оператора Выполнить(), который позволяет исполнять произвольный код, переданный в виде строки. Однако при попытке вызвать его в окне отладки возникает проблема: эта функция не возвращает результат. Чтобы получить данные обратно в окно отладчика, мы можем использовать временный объект-контейнер, доступный в текущем контексте.
Рассмотрим ситуацию: нам нужно сериализовать структуру СтруктураПараметров в JSON, как просил автор темы. Если в текущем коде у нас есть доступ к какой-либо структуре или объекту (например, ПараметрыСеанса, реквизит формы или любая временная структура), мы можем «подселить» туда результат.
Проанализируем пример кода, который можно вставить в окно вычисления выражения:
Выполнить("Запись = Новый ЗаписьJSON; Запись.УстановитьСтроку(); ЗаписатьJSON(Запись, СтруктураПараметров); РезультатОтладки = Запись.Закрыть();")
Поскольку Выполнить() не возвращает значение, после выполнения этой строки нам нужно будет в этом же окне (или в новом) обратиться к переменной РезультатОтладки. ВАЖНО: это сработает только в том случае, если переменная уже была определена в коде или если платформа позволяет динамическое создание переменных в данном контексте (что бывает не всегда). Если прямая запись в переменную не проходит, используйте вставку в структуру, которая точно существует:
Выполнить("Запись = Новый ЗаписьJSON; Запись.УстановитьСтроку(); ЗаписатьJSON(Запись, СтруктураПараметров); Объект.ИмяСлужебногоРеквизита = Запись.Закрыть();")
Теперь достаточно просто посмотреть значение Объект.ИмяСлужебногоРеквизита в отладчике.
Если ваша задача — быстро оценить содержимое сложной таблицы значений, массива или структуры без строгого требования к формату JSON, рассмотрим самый быстрый способ. Функция ЗначениеВСтрокуВнутр() работает мгновенно и доступна в любом контексте (и на клиенте, и на сервере).
Просто введите в окне Shift+F9:
ЗначениеВСтрокуВнутр(МойСложныйОбъект)
Вы получите текстовое представление объекта в системном формате 1С. Несмотря на то, что он менее читаем, чем JSON, он позволяет увидеть все вложенные свойства и типы данных, не прибегая к написанию кода сериализации.
Выясним, как автоматизировать процесс отладки на постоянной основе. Опытные разработчики создают в конфигурации или расширении общий модуль с максимально коротким именем (например, д_) и экспортной функцией. Это позволяет вызывать сложные алгоритмы анализа данных одной короткой командой.
Создадим функцию в общем модуле д_ (серверном):
Функция п(Значение) Экспорт
ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(,,, ЭнумерацияВариантовСериализацииОбъектов.Вариант1);
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписи);
ЗаписатьJSON(ЗаписьJSON, Значение);
Результат = ЗаписьJSON.Закрыть();
Возврат Результат;
КонецФункции
Теперь в любой точке отладки, когда вы стоите на паузе, вы просто пишете в вычислении выражения:
д_.п(СтруктураПараметров)
Это вернет вам готовую строку JSON. Такой подход универсален, так как внутри функции п() вы можете реализовать любую логику: запись в текстовый файл, вывод в Сообщить() или даже отправку данных во внешнюю систему мониторинга.
Одним из самых мощных решений является использование внешних библиотек, таких как «Инструменты разработчика» (ИР) от TormozIT. Рассмотрим подробнее функцию От*(), которая упоминалась в обсуждении.
Эта функция представляет собой «супер-сериализатор». Она умеет обрабатывать объекты, которые штатный JSON-сериализатор 1С может проигнорировать или выдать ошибку (например, специфические ссылки, наборы записей или менеджеры). Порядок работы следующий:
Это избавляет от необходимости писать какой-либо код вообще. Если вам нужно часто анализировать ТабличныйДокумент или РезультатЗапроса, данный метод является наиболее эффективным.
Разберем ситуацию, когда вы не хотите вносить изменения в основную конфигурацию. В этом случае на помощь приходят расширения. Вы можете создать расширение «DebugTools», добавить туда форму с текстовым полем и метод, который будет принимать любой объект и открывать эту форму в модальном (или блокирующем) режиме.
Преимущество этого метода в том, что в расширении можно реализовать полноценный «Инспектор JSON» с подсветкой синтаксиса. В режиме отладки вы просто вызываете:
Расш_Отладка.ПоказатьОбъект(СтруктураПараметров)
Программа приостановит выполнение (так как форма откроется модально), вы изучите данные в удобном виде, закроете форму и продолжите отладку.
Если вы используете современную среду разработки EDT, то возможности отладки там значительно шире, чем в классическом Конфигураторе. В EDT присутствует панель Debug Shell (консоль отладки).
В этой консоли можно писать многострочный код на языке 1С, выполнять его и сразу видеть результат в интерактивном окне. Это максимально приближено к разработке на языках типа Python или JavaScript, где REPL-цикл (Read-Eval-Print Loop) является стандартом. Если ваша разработка позволяет переход на EDT, это снимет большинство вопросов по выполнению произвольного кода при отладке.
Подводя итог, выделим основные сценарии:
ЗначениеВСтрокуВнутр().Выполнить() и записью в существующий объект.д_.От*().Помните, что отладка — это не просто поиск ошибок, но и исследование поведения системы. Наличие под рукой удобного способа визуализации данных экономит часы времени, затрачиваемые на повторные запуски тяжелых процедур.