Каждый разработчик 1С рано или поздно сталкивается с ситуацией, когда в процессе пошаговой отладки сложного алгоритма проведения документа или расчета себестоимости необходимо "на лету" проверить состояние данных в информационной базе. Обычное табло отладчика или окно вычисления выражений (вызываемое по горячим клавишам Shift+F9) отлично справляются с простыми переменными, но не позволяют комфортно писать и выполнять объемные многострочные запросы. Кроме того, лимит символов в поле ввода выражения накладывает существенные ограничения.
В этой статье мы подробно разберем несколько проверенных и эффективных способов, которые помогут вам обойти эти ограничения, выполнять абсолютно любые произвольные запросы непосредственно в точке останова и даже заглядывать внутрь временных таблиц.
Это классический, надежный и максимально гибкий подход, который не требует сторонних инструментов. Суть метода заключается в создании специальной внешней обработки, код которой мы можем вызывать прямо из окна вычисления выражений отладчика.
Давайте разберем этот процесс по шагам:
C:\temp\temp.epf.Рассмотрим пример кода в модуле объекта обработки:
Функция ВыполнитьЗапрос() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Товар,
| Номенклатура.Код КАК Код,
| Штрихкоды.Штрихкод КАК Штрихкод
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШтрихкодыНоменклатуры КАК Штрихкоды
| ПО Штрихкоды.Номенклатура = Номенклатура.Ссылка
|ГДЕ
| НЕ Номенклатура.ЭтоГруппа";
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
Важный нюанс безопасности: Начиная с версии платформы 8.3, при открытии внешних обработок программным способом система по умолчанию запрашивает подтверждение пользователя (защита от опасных действий). При выполнении кода в точке останова это диалоговое окно может намертво заблокировать или аварийно завершить сеанс отладки. Чтобы этого избежать, обязательно откройте настройки вашего пользователя в Конфигураторе (меню Администрирование - Пользователи) и снимите флажок Защита от опасных действий.
Теперь выясним, как запустить этот механизм во время отладки:
ВнешниеОбработки.Создать("C:\temp\temp.epf").ВыполнитьЗапрос()
Нажмем кнопку "Вычислить". Платформа мгновенно загрузит обработку, выполнит ваш произвольный запрос на сервере и вернет таблицу значений. Нам останется лишь нажать клавишу F2 на полученном результате, чтобы открыть его в удобном визуальном окне просмотра коллекций.
Если вам не хочется каждый раз вручную править код внешней обработки на диске, мы можем использовать готовую консоль запросов, адаптированную для вызова из отладки. Многие современные консоли поддерживают специальный метод инициализации прямо из контекста точки останова.
Проанализируем пример вызова такой консоли. Допустим, у нас есть скачанная консоль запросов, сохраненная по пути C:\Tools\QueryConsole.epf. Во время отладки в окне вычисления выражений пишем:
ВнешниеОбработки.Создать("C:\Tools\QueryConsole.epf").ОткрытьДляОтладки(Запрос, Истина, Истина)
Давайте подробно разберем назначение передаваемых параметров в этом методе:
Запрос или ПостроительЗапроса, состояние которого вы хотите проанализировать. Консоль автоматически подтянет его текст и все установленные параметры.Использование готовых консолей значительно экономит время, так как они позволяют не только просматривать результат, но и редактировать текст запроса на лету, тестируя различные варианты соединений и условий.
Очень часто программистам требуется посмотреть не просто произвольный запрос, а содержимое промежуточных временных таблиц, которые были созданы ранее в рамках текущей транзакции или пакета. Начиная с версии платформы 8.3.8, для этого больше не требуются сложные обходные пути.
В объекте МенеджерВременныхТаблиц появилось доступное для отладчика свойство Таблицы. Мы можем обращаться к ним напрямую из табло.
Рассмотрим, как получить данные конкретной временной таблицы по ее индексу:
Запрос.МенеджерВременныхТаблиц.Таблицы[0].ПолучитьДанные().Выгрузить()
Если в менеджере создано много таблиц и их индексы могут динамически меняться в зависимости от условий, надежнее использовать поиск по имени временной таблицы:
Запрос.МенеджерВременныхТаблиц.Таблицы.Найти("ВТ_Продажи").ПолучитьДанные().Выгрузить()
После вычисления этого выражения в окне отладчика вы получите стандартную таблицу значений, которую можно открыть для детального просмотра кнопкой F2.
Если же вы работаете на более старых версиях платформы или хотите написать универсальный экспортный метод в общем модуле для вывода временной таблицы, можно использовать следующий шаблон кода:
Функция ПолучитьСодержимоеВременнойТаблицы(МенеджерВремТаблиц, ИмяТаблицы) Экспорт
НовыйЗапрос = Новый Запрос;
НовыйЗапрос.МенеджерВременныхТаблиц = МенеджерВремТаблиц;
НовыйЗапрос.Текст = "ВЫБРАТЬ * ИЗ " + ИмяТаблицы + " КАК ВременнаяТаблица";
Возврат НовыйЗапрос.Выполнить().Выгрузить();
КонецФункции
Этот метод можно вызвать в табло отладчика в любой момент времени, передав туда менеджер из вашего отлаживаемого запроса и строковое имя таблицы.
Если вы ведете разработку в современной типовой конфигурации (например, 1С:ERP, Управление торговлей 11, Комплексная автоматизация или Бухгалтерия предприятия), то в вашем распоряжении уже есть готовые инструменты, встроенные разработчиками фирмы "1С". Нет никакой необходимости изобретать велосипед.
Например, в БСП присутствует замечательная функция быстрой сериализации запроса в формат XML. В окне вычисления выражений (Shift+F9) выполните команду:
ОбщегоНазначения.ЗапросВСтрокуXML(Запрос)
Полученную XML-строку, содержащую в себе текст запроса и все его параметры со значениями, можно скопировать и вставить в любую современную консоль запросов, которая умеет импортировать данные из этого формата.
Для быстрого вывода временных таблиц в конфигурациях, использующих подсистемы торговли (УТ, ERP, КА), предусмотрена специальная готовая функция общего модуля. Вы можете написать в табло выражение:
ОбщегоНазначенияУТ.ПоказатьВременнуюТаблицу(Запрос.МенеджерВременныхТаблиц, "ИмяВременнойТаблицы")
Данная функция выполнит всю черновую работу за вас, самостоятельно сформирует запрос к менеджеру и вернет готовую таблицу значений прямо на экран.
Для специалистов, занимающихся постоянной и глубокой оптимизацией запросов и анализом производительности систем, идеальным выбором станет использование сторонних профессиональных расширений, таких как комплекс "Инструменты разработчика" (ИР).
Эти инструменты интегрируются непосредственно в интерфейс платформы 1С и предоставляют специализированные глобальные функции быстрого вызова. Например, функция ду() позволяет выполнять произвольный код на встроенном языке прямо из строки вычисления выражений:
ду("П1.Текст = П2", Построитель, "ВЫБРАТЬ * ИЗ Константы")
А с помощью функции Оперировать() вы можете передавать целые многострочные блоки управляющего кода на исполнение как серверной, так и клиентской части приложения без необходимости открывать дополнительные сеансы 1С.
Подводя итог, можно с уверенностью сказать, что отсутствие встроенного интерактивного редактора запросов в отладчике 1С не является непреодолимой преградой. Используя комбинацию внешних обработок, встроенных возможностей платформы по анализу временных таблиц и функций БСП, мы можем легко анализировать любые объемы данных в режиме реального времени, что значительно повышает скорость и качество разработки приложений.