Как выполнить произвольный код и вычислить сложные значения в режиме отладки 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки на платформе 1С:Предприятие каждый программист сталкивается с ситуацией, когда стандартного окна «Вычислить выражение» (Shift+F9) становится недостаточно. Например, когда нужно не просто посмотреть значение переменной, а быстро сериализовать сложную структуру в JSON, выгрузить таблицу значений в файл или трансформировать данные для анализа, не прерывая сеанс отладки. Стандартное поле ввода выражения принимает только одиночные функции или обращения к свойствам, что ограничивает наши возможности.

В этой статье мы подробно разберем, как обойти эти ограничения, рассмотрим несколько продвинутых методик выполнения произвольного кода «на лету».

Метод 1. Использование функции Выполнить() с «хаком» контекста

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

Рассмотрим ситуацию: нам нужно сериализовать структуру СтруктураПараметров в JSON, как просил автор темы. Если в текущем коде у нас есть доступ к какой-либо структуре или объекту (например, ПараметрыСеанса, реквизит формы или любая временная структура), мы можем «подселить» туда результат.

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


Выполнить("Запись = Новый ЗаписьJSON; Запись.УстановитьСтроку(); ЗаписатьJSON(Запись, СтруктураПараметров); РезультатОтладки = Запись.Закрыть();")

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


Выполнить("Запись = Новый ЗаписьJSON; Запись.УстановитьСтроку(); ЗаписатьJSON(Запись, СтруктураПараметров); Объект.ИмяСлужебногоРеквизита = Запись.Закрыть();")

Теперь достаточно просто посмотреть значение Объект.ИмяСлужебногоРеквизита в отладчике.

Метод 2. Использование системной функции ЗначениеВСтрокуВнутр

Если ваша задача — быстро оценить содержимое сложной таблицы значений, массива или структуры без строгого требования к формату JSON, рассмотрим самый быстрый способ. Функция ЗначениеВСтрокуВнутр() работает мгновенно и доступна в любом контексте (и на клиенте, и на сервере).

Просто введите в окне Shift+F9:

ЗначениеВСтрокуВнутр(МойСложныйОбъект)

Вы получите текстовое представление объекта в системном формате 1С. Несмотря на то, что он менее читаем, чем JSON, он позволяет увидеть все вложенные свойства и типы данных, не прибегая к написанию кода сериализации.

Метод 3. Создание служебного модуля для «дампа» данных

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

Создадим функцию в общем модуле д_ (серверном):


Функция п(Значение) Экспорт
    ЗаписьJSON = Новый ЗаписьJSON;
    ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(,,, ЭнумерацияВариантовСериализацииОбъектов.Вариант1);
    ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписи);
    ЗаписатьJSON(ЗаписьJSON, Значение);
    Результат = ЗаписьJSON.Закрыть();
    Возврат Результат;
КонецФункции

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

д_.п(СтруктураПараметров)

Это вернет вам готовую строку JSON. Такой подход универсален, так как внутри функции п() вы можете реализовать любую логику: запись в текстовый файл, вывод в Сообщить() или даже отправку данных во внешнюю систему мониторинга.

Метод 4. Инструментарий «Инструменты разработчика» (ИР)

Одним из самых мощных решений является использование внешних библиотек, таких как «Инструменты разработчика» (ИР) от TormozIT. Рассмотрим подробнее функцию От*(), которая упоминалась в обсуждении.

Эта функция представляет собой «супер-сериализатор». Она умеет обрабатывать объекты, которые штатный JSON-сериализатор 1С может проигнорировать или выдать ошибку (например, специфические ссылки, наборы записей или менеджеры). Порядок работы следующий:

  1. Вы подключаете ИР к своему сеансу.
  2. В режиме отладки вызываете функцию инспекции.
  3. Инструмент делает «снимок» объекта и открывает его в отдельном удобном интерфейсе (исследователе объектов), где данные можно фильтровать, искать по ним и даже передавать в консоль запросов или консоль кода.

Это избавляет от необходимости писать какой-либо код вообще. Если вам нужно часто анализировать ТабличныйДокумент или РезультатЗапроса, данный метод является наиболее эффективным.

Метод 5. Использование расширений для отладки

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

Преимущество этого метода в том, что в расширении можно реализовать полноценный «Инспектор JSON» с подсветкой синтаксиса. В режиме отладки вы просто вызываете:

Расш_Отладка.ПоказатьОбъект(СтруктураПараметров)

Программа приостановит выполнение (так как форма откроется модально), вы изучите данные в удобном виде, закроете форму и продолжите отладку.

Метод 6. Возможности 1C:EDT (Enterprise Development Tools)

Если вы используете современную среду разработки EDT, то возможности отладки там значительно шире, чем в классическом Конфигураторе. В EDT присутствует панель Debug Shell (консоль отладки).

В этой консоли можно писать многострочный код на языке 1С, выполнять его и сразу видеть результат в интерактивном окне. Это максимально приближено к разработке на языках типа Python или JavaScript, где REPL-цикл (Read-Eval-Print Loop) является стандартом. Если ваша разработка позволяет переход на EDT, это снимет большинство вопросов по выполнению произвольного кода при отладке.

Итоги и рекомендации

Подводя итог, выделим основные сценарии:

Помните, что отладка — это не просто поиск ошибок, но и исследование поведения системы. Наличие под рукой удобного способа визуализации данных экономит часы времени, затрачиваемые на повторные запуски тяжелых процедур.

← На главную