Приветствую, коллеги, меня зовут Люлюк Евгений, работаю ведущим программистом крупной транспортной компании GLT. Мой опыт разработки на платформе 1С более 15 лет.
Расскажу про управляемую консоль отчетов – новый функциональный инструмент для работы с запросами и СКД в управляемых формах. Это, наверное, самый близкий программистам и разработчикам доклад, который есть на Infostart Event.
«Некогда пилу точить, нужно дерево пилить!»
Этой ироничной фразой подмечено, насколько важен инструмент в нашей работе. Время выполнения задачи зависит от инструмента. А время у нас стоит дорого.
Сложность конфигураций растет – для получения данных часто используются пакетные запросы, временные таблицы, в качестве параметров запроса может использоваться уникальный идентификатор, таблица значений, тип. А инструментов для удобной работы с этим в управляемых формах практически нет.
Все знают, что есть консоль отчетов, консоль запросов от 1С, но в них уже как минимум пять лет ничего не изменяется, функциональность остается на том же уровне. Уже идут годы, и 1С вряд ли изменится. Воспринимаю, как посыл фирмы «1С» о том, что улучшение этих инструментов нам нужно взять в свои руки, потому что без боли ими пользоваться становится все сложнее и сложнее. Это, так сказать, мой Inception на этой конференции, что дорабатывать и улучшать эти инструменты должны мы сами.
Что такое «Управляемая консоль отчетов»
- Инструмент совмещает в себе консоль запросов и консоль отчетов СКД в одном окне. Эти инструменты имеют много общего, соответственно, удобно их совместить, чтобы все сохранялось в одном файле, и можно было все составлять в одном дереве. На слайде видно, что можно в дереве создать группу, создать запрос или схему – все работает в одном инструменте. При этом здесь очень много общих функций (сохранение, вывод). Их можно функционально развить, чтобы они приносили пользу – как для консоли отчетов, так и для консоли запросов.
- Разработка нацелена на будущее. Только управляемые формы, отказ от модальности и синхронных вызовов, поддержка выполнения в несколько потоков и т.д. Все самое новое, что есть в 1С.
- Поддержка английского языка (в т.ч. как языка разработки)
- Разработка имеет сертификат «1С-Совместимо», к ней есть документация
- И в этом году она номинирована на премию в категории «Лучшая разработка Infostart 2019 года».
Разберем подробнее, какие возможности разработки «Управляемая консоль отчетов» могут быть вам полезны.
Получение данных запроса из отладки
Механизм получения данных в момент выполнения запроса известен достаточно давно. Очень удобно: ставим точку останова на строке, где выполняется запрос, вызываем определенную функцию, которая прописана в инструменте, и получаем из отладки весь контекст запроса – все его данные, временные таблицы, заполненные параметры.
В чем особенность? В обычных формах можно было в момент отладки просто открыть форму консоли и сразу же работать с этим запросом. А в управляемых формах в контексте сервера открыть форму нельзя, приходится где-то сохранять данные, и потом производить с ними работу. Это можно назвать «Отложенной отладкой».
- Полностью поддерживаются все типы параметров. В последних версиях платформы появились параметры типа «Уникальный идентификатор», «Тип значения» и т.д. Консоль поддерживает все эти типы параметров.
- Считываются данные временных таблиц. Нет такого запроса, который бы не заработал в консоли после того, как вы его загрузили из отладки.
- Еще одна особенность – помимо сохранения в файл, есть возможность сохранять данные в настройках. Исторически сложилось, что обычно сами запросы сохраняются в файлах. Но в новой платформе их более удобно сохранять в системных настройках (в хранилище настроек самой конфигурации). Сервер и клиент у нас зачастую – отдельные машины, имея папку на сервере, мы будем сохранять в серверную папку, которую должно быть видно с клиента. Есть и маленький недостаток, который был мною обнаружен, что если вы ставите точку останова, сохраняете данные, и это было в транзакции, которая впоследствии будет отменена, то данные не сохраняются. Тогда выход – использовать файл.
Для упрощения запуска есть инструмент «Конструктор строки отладки» – он позволит вам посмотреть, какой вызов необходимо прописать. Для СКД этот вызов будет одним, для запроса – другим. На верхнем скриншоте слайда видно, как будет выглядеть команда отладки для запроса – ставим точку останова и прописываем эту команду.
И потом в последних использованных файлах/настройках можно данные этого запроса найти, выбрать – и сразу же все появляется, можно работать.
Анализ планов запросов
Тема анализа планов запросов достаточно актуальна. Производительность нужна всем, ее постоянно не хватает. В консоль встроен механизм анализа планов запросов (основан на технологическом журнале)
Концепция анализа близка к стандартной консоли запросов от 1С, улучшено:
- Простая разовая настройка. Консоль запросов с ИТС постоянно лезет в технологический журнал, копирует его, убирает, переименовывает. Здесь – один раз настраиваем конфигурационный файл технологического журнала, сохраняем его, закидываем в папку на сервере, и теперь при каждом выполнении запроса в консоли будет возможность нажимать и смотреть его план. Журнал пополняется только теми планами, которые исполняются в консоли, поэтому он не сильно растет.
- Повышенное быстродействие.Технологический журнал растет, он может занимать 100 Мб, а через 10 минут после выполнения 10 запросов в нем добавляется еще 2-3 Мб. Стандартная консоль от 1С, читает все 100 Мб, прежде чем дойти до конца. Напрашивается читать с конца, потому что нужный нам план обычно находится в конце, а не в начале. Теперь любые планы открываются в разы быстрее.
- Улучшенный визуализатор – есть выделение жирным, красным, которые позволяют легче понять, какая проблема конкретно в этом плане. Есть возможность наложить какие-то сортировки.
- Поддерживаются планы запросов MS SQL, PostgreSQL и анализ планов файловой СУБД
Улучшения консоли СКД
Аналогично консоли СКД 1С, есть просмотр схемы компоновки данных, можно добавлять варианты, пользовательские настройки.
- Реализована работа с внешними источниками – консоль позволяет в интерактивном режиме задать внешние источники компоновки данных. Можно загрузить из Excel, через буфер обмена, можно получить кодом на встроенном языке, можно даже описать таблицу значений интерактивно в свободной форме.
- Отладка СКД аналогично запросу
- Поддержка импорта формата DCR – формат стандартной консоли СКД от 1С
- Анализ исполняемых запросов на СКД. Эта возможность может вам пригодиться. Все мы знаем, что те запросы, которые прописаны в схеме компоновки данных, и те, которые будут реально исполнены – это совсем не одно и то же. СКД работает специфичным образом – добавляет, убирает поля, и это не всегда очевидно. И часто решаемая задача – посмотреть, почему это поле пропадает из отчета – видимо, на него нет доступа. Анализ исполняемых запросов позволяет наглядно определить, какие наборы данных есть в запросе и как они изменяются при выполнении в СКД. Например, можно отследить, что какой-то набор данных вычеркивается. После любого исполнения СКД можно посмотреть, какой же был запрос в итоге исполнен – отображается дерево, можно сравнивать запрос схемы с исполняемым запросом СКД. Если какие-то элементы дерева были удалены СКД, будет видно, что они вычеркнуты. И можно запускать только анализ запросов, без их выполнения. Получается, не выводя данные, мы видим, какой будет запрос. Бывает такое, что сама СКД выполняется минуту, но, чтобы посмотреть исполняемый запрос, нет необходимости ждать минуту – достаточно нажать кнопку, и все будет готово.
- Импорт/экспорт схемы из внешних отчетов erf. Обычно мы открываем внешний отчет, заходим в схему запроса, нажимаем сохранить в XML, потом идем в консоль, нажимаем «Загрузить из XML». Можно упростить – открыть схему «в один щелчок».
- Сравнение результатов и XML схем – с помощью обычного сравнения файлов отображается сравнение результатов и XML-схем для СКД.
Групповая обработка
В разработке есть очень простая и удобная групповая обработка, которая позволяет решать большинство задач простым способом. На вход этого инструмента подается таблица значений. Нам необходимо прописать код, который будет выполняться для каждой строки.
- Помощь в написании кода, вы видите дерево на скриншоте справа. Мы знаем, что в управляемых формах нет возможности подсветки кода, контекстной подсказки и т.д. Это – некий помощник, который позволяет чуть легче написать код.
- Вставка ссылки на объект БД – это некий конструктор, который позволяет вставить какую-то ссылку в виде кода. Программа открывает интерактивное окно, в котором мы выбираем, допустим, из справочника Организации организацию «Основная». И в код уже вставляется НайтиПоИдентификатору(). Если это предопределенный элемент, то вставляется именно предопределенный элемент.
- Транзакция: «На все объекты», «По строке» и «Без транзакции». Здесь могу привести следующий пример. Когда мы обрабатываем строки и часто бывает необходимо, чтобы изменилась реализация и поступление – естественно, это лучше делать в одной транзакции, так как одновременно меняются оба документа.
- Прерывание по ошибке – иногда обработка уже бессмысленна, если произошла какая-то ошибка.
- Переход к месту ошибки – по щелчку переходит.
- И выполнение в фоне с помощью длительных операций (отсутствует в последних версиях)
Есть подробная индикация с возможностью прерывания.
- Показывается общее количество объектов и количество обработанных. Оценивается остаток времени – сколько прошло, когда приблизительно закончится
- Отображение количества ошибок. В случае, если идет обработка и, допустим, нужно обработать тысячу объектов, а обработано 100, и какие-то из них обработаны с ошибкой. То как раз в этом окне индикации будет отображено, что 100 обработано, 4 из них с ошибкой.
- И есть возможность прервать процесс.
После выполнения, нужен какой-то журнал, протокол этих выполненных действий. Не все может всегда завершаться успешно, по некоторым элементам могут возникнуть проблемы. Поэтому инструмент поддерживает:
- Получение сообщений пользователю и привязку к обрабатываемой строке. Здесь, когда у нас проводится документ или обрабатывается какая-то строка, программа собирает все сообщения, которые были выведены. Допустим, сообщения «Не хватает остатка» или о том, что что-то не заполнено, или какие-то другие сообщения, которые были выведены пользователю – они привязываются к обрабатываемой строке. Их можно выбирать отдельно на закладке «Сообщения» или смотреть на закладке «Журнал».
- Журнал выполнения с возможностью обработать повторно группу объектов. Результат группируется. Если была какая-то ошибка (допустим, конфликт транзакции), то объекты, которые обработаны с конфликтом транзакции, группируются в отдельную ветку дерева, и можно нажать правой кнопкой и повторно их обработать. Скорее всего, это повторно обработается уже без конфликта.
Еще важно, что когда мы пишем запрос, необходимо его построить таким образом, чтобы при повторном выполнении он нам не давал в результате те объекты, которые уже были обработаны. Допустим, я запускаю обработку, а там 10 тысяч объектов – 5 тысяч из них обработано, потом у меня программа вылетела (администратор выкинул). Чтобы она в следующий раз уже не пыталась обрабатывать обрабатываемые объекты. Это зачастую легко делается. Допустим, если мы хотим заполнить незаполненное поле, мы прописываем в запрос «Выбрать все объекты, где это поле пустое», он нам получает, заполняем его. И, соответственно, повторное выполнение запроса уже не даст те строки, в которых это поле заполнено.
Поддержка пакетных запросов и временных таблиц
- Можно выполнять запрос с результатом временных таблиц и без.
- Редактирование временных таблиц менеджера. Аналогично возможности редактировать внешние источники СКД можно редактировать существующие временные таблицы запроса.
- Работа с параметром типа «Таблица значений».
- Автоматический вывод содержимого временных таблиц.
Бывают такие запросы, в которых есть только временные таблицы, и бессмысленно выводить результат без временных таблиц – он просто будет пустой. Поэтому когда инструмент видит, что в запросе используются только временные таблицы, он их выводит автоматически.
Обратите внимание, мы на экране видим, что сначала идет запрос №3, потом – запрос №2, а потом – запрос №1. Пакеты запросов так устроены, что обычно идут вначале временные таблицы, а результат где-то в конце. И я счел нужным записать это в обратную сторону. Но если для кого-то это непривычно, есть настройка, чтобы записать результат в прямом порядке.
Работа с параметрами запроса
В разработке реализовано автоматическое получение параметров. При изменении текста запроса вручную или конструктором новые параметры считываются автоматически, все определяется без дополнительных действий со стороны пользователя.
- Поддерживаются все типы параметров – Граница, МоментВремени, УникальныйИдентификатор, ТипЗначения, ТаблицаЗначений.
- У параметров есть возможность задать тип «Список» и «Выражение». Список – понятно, я думаю. Выражение – это код на встроенном языке. При изменении типа параметра («Список», «Значение» и «Выражение») то значение, которое у вас было, не теряется. Есть специальный механизм генерации кода на встроенном языке, который может таблицу значений, момент времени просто записать кодом на встроенном языке.
- Заполнение значений параметров из других запросов. Вы уже видели, что в дереве запросов может быть несколько запросов (отладочный, дополнительный, первая, вторая версии). И иногда необходимо заполнить параметры из первого запроса во второй.
- Переименование имени параметра – во всем запросе. Часто бывает такое – я, допустим, создаю запрос, в нем называю параметр «Дата1», «Дата2», отлаживаю, результат меня устраивает. Дальше я понимаю, что чтобы это вставить в компоновку данных, этот параметр должен называться «НачалоПериода», «КонецПериода». И с помощью этой функции можно одним щелчком исправить наименование параметра во всем тексте запроса, который тоже может быть большим. Касательно этого инструмента важно, что он закрывает тонкости работы с огромными запросами, с большими данными. Когда у тебя запрос состоит из пяти строк – ничего не надо. Все на экране, все ясно, никаких инструментов не надо, все понятно.
- Вставка значения битой ссылки по представлению. Битую ссылку в качестве значения нельзя подставить просто так – программа ее не понимает, для нее это просто текст. Когда у вас значение – битая ссылка, чтобы его вставить, надо писать код. Очень неудобно. Поэтому реализована функциональность, которая позволяет вставить ссылку через представление ссылки или через GUID. Это очень важно, потому что иначе это никак не сделаешь. Допустим, если у вас есть регистр, в котором есть поле «Контрагент», в котором вставлена битая ссылка. Обычным способом узнать, какие строки этого регистра принадлежат этой битой ссылке нельзя, без этой функции просто не получишь эти строки.
Редактирование текста запроса вручную
Для тех, кто редактирует текст запроса вручную, есть несколько помощников:
- Переход к месту ошибки в запросе. Если в запросе имеется ошибка, внизу появляется гиперссылка с ошибкой, которая позволяет нам перейти к тексту запроса. Очень удобно при больших текстах запроса. Плюс – разработка различает ошибки выполнения запроса и синтаксические ошибки в тексте запроса и корректно отрабатывает и сообщает о них. Если там маленький зеленый треугольник около восклицательного знака – это значит, что ошибка возникла именно при выполнении.
- Вставка функций и предопределенных значений. В инструменте есть интерактивная форма, которая позволяет удобно вставить предопределенный элемент справочника или просто ссылку на элемент справочника (операторы ССЫЛКА, ЗНАЧЕНИЕ() и т.д.)
- Преобразование выделенного запроса во вложенный. Вроде бы все просто – выделяем запрос, выбираем пункт в контекстном меню (или нажимаем горячую клавишу), он спрашивает, как мы хотим назвать вложенный запрос, и формирует запрос сверху (один в другой вкладывает). Но во вложенном запросе есть свои ограничения – там нельзя писать ИТОГИ, АВТОУПОРЯДОЧИВАНИЕ, ПОМЕСТИТЬ и т.д. И разработка этот вопрос берет на себя, все эти операторы корректно выносит из текста запроса. Нажимаем – и все готово.
- Конструктор запроса для выделенного текста, думаю, понятно – можно вызвать штатный конструктор запроса только для выделенного текста.
Разбор запроса на составляющие
Есть возможность разобрать запрос на маленькие кусочки, преобразовать его в дерево, чтобы он стал более понятен.
- Разбор производится с помощью объекта «Схема запроса». У него есть свои недостатки, но главный плюс здесь в том, что это все очень быстро работает – у вас постоянно есть разобранный в дерево запрос.
- С помощью этой функциональности вы можете получить результат отдельного элемента. Можно зайти в самый глубокий запрос, выполнить его и посмотреть, какой у него был результат. Это позволяет разобраться с какими-то проблемами.
Поддержка английского языка разработки
Про поддержку английского языка разработки – имеется в виду не только англоязычный интерфейс инструмента (синонимы, которые есть у кнопок и т.д.), но и то, что разработка поддерживает генерацию кода в на английском языке.
Подход к разработке
Проект доступен как расширение или как внешняя обработка.
Все привыкли, что консоль запросов – это внешняя обработка. Но расширение, разрабатывать намного удобнее – можно структурировать: создавать модули, картинки, общие макеты и т.д. Поэтому разработка ведется именно в расширении, а внешняя обработка получается путем автоматической генерации.
«Не думай о секундах свысока»
Дальше я немного расскажу про простые улучшения, повышающие удобство работы
Ограничение количества выводимых строк
Часто бывает, что мы выполняем пакет запросов, в нем может быть 40 таблиц с большим количеством строк. Такой результат никогда нормально не выведется, придется ждать очень долго. Сделано ограничение строк – больше 3000 строк по умолчанию он не выводит. Пишет, что выведено 3000 из 3125. И дальнейший результат не выводится, пишет «не все выведены». При желании можно нажать «Вывести все», и выведутся все строки.
Этот механизм позволяет работать с большими данными, где у вас обычная консоль или какие-то другие аналогичные инструменты просто зависнут.
Выделение особых значений – NULL и др.
Выделение особых значений – тоже достаточно важная функция. Выделяются значения: «NULL», «Пустая строка», «Пустая дата», «Пустая ссылка», «Неопределено».
Достаточно тяжелая функция, потому что это реализуется пост-обработкой после вывода результата. Соответственно, нагрузка большая. Если у нас имеется 10 тысяч строк и 5 колонок, это получается уже цикл в 50 тысяч итераций. При необходимости эту функцию можно отключить, и все будет выводиться еще быстрее.
Сравнение данных
Когда это использовать? Например, когда нам необходимо изменить запрос или оптимизировать запрос. Тогда мы в дереве консоли создаем первый запрос – это у нас эталон. А второй – это у нас разрабатываемый запрос. И, допустим, если нам необходимо, чтобы колонка «Выручка» считалась по-другому, мы реализуем этот механизм, а потом впоследствии наглядно сравниваем результаты и видим, соответствуют они нашим ожиданиям или нет.
Другой пример, если мы оптимизируем какой-то запрос – слева у нас эталон, а справа – оптимизируемый запрос. Мы его оптимизировали, закончили, можем наглядно сравнить тексты запроса. Бывает такое, что в конструкторе запроса, почему-то удалилось какое-то поле, и текст уже изменился, а это было сразу непонятно.
И другой пример – если получается, что при оптимизации эталонный запрос выдает другие данные, нежели наш, это значит, что-то не так – мы что-то слишком перемудрили с оптимизацией.
Расшифровка таблиц значений
Наверняка вы сталкивались с тем, что строки результата запроса иногда могут содержать таблицу значений. По умолчанию ее посмотреть невозможно, но в стандартной консоли ИТС есть подобный механизм – можно посмотреть, какая таблица значений в какой конкретной строке лежит.
Тяжелый механизм, который создает временные хранилища, туда таблицы закладывает. Иногда его лучше отключить.
Форма выбора типа
В разработке сделана своя форма выбора типа.
Форма выбора типа у 1С, мне кажется, не менялась с версии 8.0 – она просто вываливает список значений со всеми доступными типами, очень ненаглядно. Единственный помощник в стандартной форме выбора типа – это Ctrl+F.
Наша форма выбора типа:
- позволяет искать по подстроке
- отображается в виде дерева
- быстро работает – в ERP, где очень много объектов, она открывается мгновенно, поскольку считывает не все метаданные, а только раскрытые ветки.
Вставка значений ссылки по UID и по представлению битой ссылки
Я уже упоминал об этой функциональности, но важно, что сейчас на картинках наглядно видно, как происходит эта вставка. И этот механизм работает везде, где у нас используется ссылка – при вставке ссылки на объект и т.д.
Генерация кода на встроенном языке
Позволяет «обернуть» запрос, чтобы перенести код на встроенном языке в конфигуратор. Как мы видим, внизу можно переключить язык, если кому-то необходимо, чтобы код генерировался на английском.
Примечание к типу поля
Вы уже заметили, что у каждой колонки в заголовке таблицы есть картинка. Это – для отображения ее типа. Очень удобно видеть, какого типа колонка – дата или составной тип, как приведено на примере.
В дополнение к этому, если колонка содержит составной тип, то в примечании к ячейке табличного документа отображаются все типы, которые она содержит. И видно на скриншоте, что больше 10 он не старается отобразить, не нагружает систему этим примечанием.
Экспорт результата
Думаю, понятно – если необходимо выполнить экспорт результата в Excel, MXL, PDF, то нужно воспользоваться этой функцией.
Здесь важная особенность – он делает внутри какие-то мелкие полезности. Допустим, для MXL он устанавливает защиту ячеек, чтобы при открытии MXL в 1С можно было работать с расшифровками. Такие вещи, которые вы можете даже не заметить.
Замер времени выполнения
Думаю, что замер времени это стандартная функция, которая есть во многих консолях запросов. При запуске запроса на выполнение открывается новый отсчет, замер производится в миллисекундах.
Но в чем здесь особенность? Здесь особенность, что по кнопке «Обновить замер времени выполнения» мы можем видеть не время вывода результата, а только время выполнения запроса. Потому что так бывает, что запрос выполняется три миллисекунды, а вывод данных занимает одну минуту. Эта кнопка производит замер только времени выполнения, замер времени вывода результата она не производит.
Выделение активированной строки
Вот это – тоже простая функция. Тоже «стильно, модно, молодежно». Активированная строка выделяется нашим самым любимым цветом – желтым.
Информирование об обновлении
Есть функциональность информирования об обновлении.
Немного об оптимизации
Оптимизации:
- Вывод производится в табличный документ. Например, 10 тысяч строк, 5 колонок. Если выводить их через «Присоединить секцию», то это получается 50 тысяч операций. Поэтому я сначала собираю область «Строка», в которой находятся сразу все колонки одной области – выводим через Вывести
- Вывод результата с источником во временном хранилище. Нигде не нашел этого описания. В чем особенность новой платформы? Если у вас, допустим, значение табличного документа хранится во временном хранилище, и вы его отображаете на форме, то временное хранилище связывается с табличным документом, и не происходит полной перегрузки данных. Табличный документ загружается с сервера постепенно, по мере листания. Получается динамическое считывание – это очень серьезно поднимает скорость вывода. Для примера, если взять штатной консолью 1С вывести 50 тысяч строк, она может выводить минуту, и прокачать при этом 25 Мб трафика через клиент-сервер. Но при этом выведется сразу все, и на клиенте будут сразу все данные. Здесь будет чуть по-другому. Он выведет результат буквально за 5 секунд, прокачает через клиент-сервер мало трафика, но по мере листания он будет подгружаться, будет производиться считывание данных.
- Выделение особых значений (NULL, Неопределено) в результате. Упоминал, что это – тяжелая функция. Если поиск из множества значений организовать через соответствие, то это не замедляет алгоритм, в отличие от банального цикла с условием «Если... ИначеЕсли» (также не требуется проверка типа).
- Форма выбора типа – используется динамическое считывание метаданных по мере раскрытия веток.
Обновление и поддержка
Проект развивается. Внимательно отношусь к пожеланиям пользователей, стараюсь реализовывать все пожелания, которые есть. Почти все планы на 2019 год, которые у меня были до этого, сделаны, хотя, казалось, это нереально.
Ссылка на управляемую консоль отчетов
****************
Данная статья написана по итогам доклада (видео), прочитанного на конференции INFOSTART EVENT 2019.