Разработка и поддержка сложных запросов в системе «1С:Предприятие 8» — ежедневная задача для многих программистов. Ситуации, когда запрос состоит из десятков временных таблиц, содержит множество вложенных подзапросов, а на выходе неожиданно удваивает или утраивает строки, требуют надежных инструментов анализа. В этой статье мы подробно разберем, как автоматизировать процесс отладки сложных запросов, рассмотрим популярные инструменты и научимся исследовать промежуточные данные на лету.
Представим стандартную рабочую ситуацию: вам необходимо доработать чужой пакетный запрос, в котором создается около двадцати временных таблиц. На одном из этапов соединения данные начинают дублироваться или пропадать. Пытаться анализировать такой запрос визуально в текстовом редакторе или в стандартном Конструкторе запросов крайне неэффективно. Нам необходимо видеть содержимое каждой временной таблицы «вживую» в процессе выполнения кода.
Для решения этой задачи разработчики используют специализированные отладчики и консоли запросов. Рассмотрим наиболее эффективные методики и инструменты отладки подробнее.
Одним из самых мощных и популярных наборов инструментов в сообществе 1С является комплекс «Инструменты разработчика» (ИР) от Сергея Старых (tormozit). В отличие от простых консолей, этот комплекс предоставляет колоссальные возможности по интеграции непосредственно в процесс отладки.
Основные возможности Консоли запросов ИР при отладке:
F10).Выясним, как запустить отладку запроса прямо из точки останова в Конфигураторе с помощью портативной версии ИР. Для этого выполним следующие шаги:
Установим точку останова в конфигураторе на строке, где объект Запрос уже инициализирован и заполнен параметрами, но еще не выполнен (например, перед вызовом Запрос.Выполнить()).
В момент остановки платформы откроем окно «Вычислить выражение» (сочетание клавиш Shift + F9) и вызовем выполнение внешней обработки ИР, передав в нее наш объект запроса:
ВнешниеОбработки.Создать("C:\ПутьКПапке\ирПортативный.epf", Ложь).ОТ(Запрос)
Данная конструкция перехватит объект запроса на сервере, автоматически сериализует его вместе со всеми установленными параметрами (включая сложные типы, такие как Таблицы Значений, Границы, Моменты Времени) и откроет окно Консоли запросов ИР на клиенте. Теперь мы можем выполнять запрос пошагово, модифицировать его и искать логические ошибки.
Если разработка ведется в управляемом приложении, современные версии ИР поставляются в виде расширения конфигурации (формат .cfe). Это позволяет использовать сквозную отладку на управляемых формах без необходимости запуска базы в режиме обычного приложения.
Что делать, если использовать тяжелые сторонние инструменты вроде ИР в вашей закрытой среде разработки запрещено политикой безопасности? В этом случае на помощь приходит встроенный функционал Библиотеки стандартных подсистем (БСП), которая интегрирована практически во все типовые конфигурации (ERP, КА, УТ, БП, ЗУП).
Разберем этот метод по шагам:
Шаг 1. В точке останова на интересующем нас запросе открываем табло вычислений (Shift + F9) и вызываем экспортную функцию сериализации:
ОбщегоНазначения.ЗапросВСтрокуXML(Запрос)
Шаг 2. Платформа сформирует длинную XML-строку, содержащую текст запроса, имена параметров и их сериализованные значения. Копируем полученную строку в буфер обмена.
Шаг 3. Открываем любую современную консоль запросов, адаптированную под управляемые формы (например, «bm Консоль запросов» или «Запросник 2.0»). Во многих из них присутствует кнопка «Заполнить из XML» (или «Прочитать из XML»). Нажимаем её и вставляем скопированную строку.
Консоль автоматически восстановит исходный текст запроса и заполнит дерево параметров, избавив нас от необходимости ручного переноса сложных отборов.
Важное примечание: Если среди параметров вашего запроса есть заполненная Таблица Значений (ТЗ), стандартный механизм сериализации БСП может выдать ошибку при десериализации. Для обхода этого ограничения рекомендуется предварительно выгружать ТЗ во временную таблицу в коде или использовать современные расширения-помощники, умеющие корректно обрабатывать подобные типы данных.
Иногда разворачивать внешние консоли долго и нецелесообразно, особенно когда нужно быстро проверить содержимое конкретной временной таблицы в Менеджере Временных Таблиц (МВТ). В этом случае мы можем прочитать данные напрямую через встроенные механизмы платформы 1С.
Проанализируем ситуацию: наш запрос уже выполнен, и в коде доступен объект МенеджерВременныхТаблиц. Чтобы просмотреть содержимое конкретной таблицы прямо в табло отладчика, напишем специальное выражение.
Если мы знаем точный индекс интересующей нас временной таблицы, используем обращение по индексу коллекции:
Запрос.МенеджерВременныхТаблиц.Таблицы[0].ПолучитьДанные().Выгрузить()
Если таблиц много и нам нужно обратиться к конкретной таблице по ее имени (например, «ВТ_ОстаткиТоваров»), воспользуемся методом поиска:
Запрос.МенеджерВременныхТаблиц.Таблицы.Найти("ВТ_ОстаткиТоваров").ПолучитьДанные().Выгрузить()
Результатом вычисления этого выражения станет полноценная Таблица Значений. Дважды кликнув по ней в окне отладчика, мы сможем детально изучить колонки, типы данных и строки, которые сформировались на данном шаге выполнения запроса.
Чтобы минимизировать время, затрачиваемое на отладку в будущем, рекомендуется придерживаться простых правил при проектировании логики выборки данных:
ГДЕ или ИЗ. Старайтесь преобразовывать их во временные таблицы. Это не только повышает читаемость кода для ваших коллег, но и значительно ускоряет работу СУБД, позволяя оптимизатору строить более эффективные планы запросов.Использование правильного инструментария и знание платформенных механизмов отладки позволяют сэкономить часы работы программиста, превращая рутинный процесс поиска ошибок в быструю и понятную процедуру.