Каталог решений - Консоль кода с поддержкой объявления процедур и функций, с дополнительными функциями отслеживания и вывода значений

Консоль кода с поддержкой объявления процедур и функций, с дополнительными функциями отслеживания и вывода значений

Консоль кода с поддержкой объявления процедур и функций, с дополнительными функциями отслеживания и вывода значений

В наличии

В статье представлено решение давней проблемы всех консолей кода, это невозможность объявлять в них процедуры и функции, а также использование метода Возврат для раннего выхода из исполняемого кода. Также затронута тема вывода результатов работы исполняемого кода, что зачастую ограничено функцией Сообщить. Попутно приводится моё видение того, как должно выглядеть и работать дерево объектов конфигурации в консоли запросов.
Обработки подходят для всех конфигураций, работающих в управляемых формах 1С версии 8.3.15 и выше (тестировалось в ЗУП 3.1, ERP 2.5, БП 3.0, УНФ 3.0).

Категория:

Описание

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

1. для консоли кода:

— вывод результата только через Сообщить

2. для консоли запросов:

— неудобный ввод запроса, но это субъективно, просто я не люблю пользоваться конструктором запросов;

— слабые генераторы кода обработки, но, возможно, я не все видел.

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

Представляю вам свою версию консоли кода.

Основные фишки:

— поддержка объявления процедур и функций, в том числе поддерживается рекурсия и ранние выходы из функций, объявление клиентских и серверных функций;

— минимальная поддержка макросов (замена кода, подключение внешнего файла);

— задание параметров для выполняемого кода;

— задание выражений для отслеживания результатов;

— функции для вывода таблицы значений, дерева значений, результата запроса, менеджера временных таблиц и др.

 

 

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

Запускать код можно как на клиенте, так и на сервере -> кнопка-переключатель на панели.

Параметры кода

Задание параметров кода идет подстановкой их значений в исполняемый код, работает и на клиенте и на сервере, но не сразу одновременно.

Если рядом с параметром поставить галочку Откл, то вместо указанного значения будет передаваться Неопределено.

Отслеживание переменных

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

Отслеживание можно использовать даже без основного кода, например, записать в выражение текст "Новый УникальныйИдентификатор".

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

Вывод результатов

Для вывода результатов на форме созданы 2 постоянных реквизита:

— Результат_Текст — текстовое поле, выводим в него так: Результат_Текст = "Любой текст"

— Результат_ТабДокумент — табличный документ, в него выводим, как в обычный табличный документ, либо функцией РезультатВТабДокумент.

Но эти реквизиты используются редко, основной вывод идет в динамически создаваемые табличные части, для этого предназначены 2 функции:

Вывести(ЗначениеДляВывода, ИмяТЗ = 1, ВывестиНомерСтроки = Ложь)

ЗначениеДляВывода — произвольное значение.  Допустимые типы: универсальные коллекции (таблица значений, дерево, массив, структура и др.), результат запроса, выборка, менеджер временных таблиц, строка ТЧ.

ИмяТЗ — число или строка (строка должна подходить для создания имени реквизита, т.е. нет пробелов, точек и т.п.)

ВывестиНомерСтроки — вывести номер строки в отдельном столбце

Выводит значение в отдельную страницу в группе Результат.

ВывестиТипыКолонок(ТЗ, ИмяТЗ = 1, ВывестиНомерСтроки = Ложь)

ТЗ — объект для вывода

ИмяТЗ — число или строка (строка должна подходить для создания имени реквизита, т.е. нет пробелов, точек и т.п.)

ВывестиНомерСтроки — вывести номер строки в отдельном столбце

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

Вспомогательные функции

Иногда возникает желание посмотреть таблицу значений или табличную часть с группировкой по реквизитам, но создавать отдельный запрос для этого долго и зачастую лень, чтобы решить эту задачу создана функция, которая создает запрос по переданным параметрам. 

ТЗвДерево(ТЗ, КолонкиИерархии, КолонкиДляВывода = Неопределено)

ТЗ — таблица значений

КолонкиИерархии — строка, список имен колонок через запятую для группировки строк и построения иерархии.

КолонкиДляВывода — строка, список имен колонок для вывода. Неопределено — все колонки, кроме иерархии, "" — только иерархия,

"*" — все колонки, включая иерархию. Можно использовать формат "ИмяКолонки КАК НовоеИмяКолонки" для переименования колонок дерева.

Преобразует таблицу значений в дерево значений, возвращает дерево значений.

В параметры КолонкиИерархии, КолонкиДляВывода можно передавать не только названия колонок ТЗ, но и переходить от значений к их реквизитам, например, "Номенклатура.ЕдиницаИзмерения". Также можно передать условие, и данные будут сгруппированы по этому условию ("Цена > 100").

 

 

Обратная функция создает из дерева таблицу значений, была создана для эксперимента, но возможно кто-то найдет ей достойное применение.

ДеревоВТЗ(Дерево, КолонкаИерархии = Неопределено, ПоляИерархии = Неопределено)

Дерево — дерево для преобразования

КолонкаИерархии — имя колонки иерархии, по-умолчанию используется первая колонка

ПоляИерархии — строка, список имен колонок через запятую для распределения значений иерархии. Каждый уровень иерархии помещается в соответствующую колонку, если поле не задано, то создается новая колонка с имененем "Уровень_" + СтрокаДерева.Уровень().

Преобразует дерево значений в таблицу значений, возвращает таблицу значений.

Для сохранения таблиц, созданных функцией Вывести, можно использовать пункт меню Результаты >> Сохранить, либо функции ТЗвТабДокумент и РезультатВТабДокумент.

ТЗвТабДокумент(ТЗ, Заголовок = Неопределено)

ТЗ — таблица значений

Заголовок — заголовок для таблицы, если не задан, то заголовок не выводится

Создает новый табличный документ и выводит в него таблицу значений. Возвращает табличный документ.

Пример: Результат_ТабДокумент = ТЗвТабДокумент(Запрос.Выполнить().Выгрузить(), "Результат запроса");

РезультатВТабДокумент(ИмяТЗ = Неопределено)

ИмяТЗ — имя ТЗ, которое использовалось для вывода результата. Если не задано, будут выведены все результаты.

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

Пример: 

Вывести(ТЗ, "ИмяТЗ", Истина);

Результат_ТабДокумент = РезультатВТабДокумент("ИмяТЗ");

Объявление процедур и функций

Разбор кода построен на парсере bsparser (https://github.com/lead-tools/bsparser), огромная благодарность автору.

Как это работает лучше смотреть в исходном коде.

Если кратко, то объявленные процедуры и функции вырезаются из кода в отдельные куски и сохраняются в таблицу, а их вызовы заменяются на вызов вспомогательной функции (одна для серверных и одна для клиентских).

Параметры метода переименуются по шаблону НовоеИмяПараметра = "п" + НомерПараметра, в коде они также заменяются на новое имя.

Возвраты значений заменяются на установку вспомогательной переменной и переход в конец метода. Для процедур возврат заменяется на переход в конец кода. Для основного кода теперь тоже можно использовать возврат для раннего его завершения.

Текст всех методов обрабатывается после обработки объявлений методов, это позволяет использовать рекурсию.

Существующие ограничения:

— параметры в методы передаются только по ссылке;

— вспомогательные функции принимают только 10 параметров, если нужно больше можно добавить в коде формы;

— директива &НаКлиенте ожидается сразу перед объявлением метода, если до этого будут комментарии, то метод будет определен как серверный;

— код метода компилируется при каждом вызове, поэтому в циклах возможны проблемы с производительностью (как вариант, можно подставлять код метода на место его вызова с переименованием параметров и локальных переменных, но это невозможно использовать при вызовах сервера с клиента; пока встраивание кода метода не реализовано).

 

has been added to your cart:
Оформление заказа