Разработка и Конфигурация · 11 мин
Как сравнить два запроса в 1С
Как сравнить два запроса 1С: консоль запросов, сравнение текстов, временные таблицы, схема компоновки данных и проверка результатов выборки.
Сравнение двух запросов в 1С встречается в двух типовых ситуациях: нужно сопоставить текст запросов (что изменилось после правки или при переносе между конфигурациями) либо сравнить результаты выполнения (выдают ли два варианта запроса одинаковые данные). Инструменты для этих задач разные, и выбор зависит от цели: рефакторинг, поиск ошибки в отчёте или проверка оптимизации.
Чаще всего задача возникает при доработке отчётов и обработок: программист переписал запрос, и нужно убедиться, что новый вариант возвращает те же данные, что и старый. Реже требуется сравнить тексты запросов из двух версий конфигурации, чтобы найти расхождения после обновления. Ниже разобраны оба сценария с конкретными приёмами.
Определите, что именно нужно сравнить
Прежде чем выбирать инструмент, сформулируйте задачу. Сравнение текстов показывает синтаксические различия: изменённые поля, условия, соединения. Сравнение результатов отвечает на вопрос, одинаковые ли данные возвращают оба запроса. Это независимые проверки: два разных по тексту запроса могут давать идентичный результат, а внешне похожие запросы — расходиться на одной строке из-за тонкостей соединения.
Отдельный случай — сравнение производительности. Запрос может быть логически эквивалентен, но работать в разы медленнее из-за другого порядка соединений или отсутствия индекса. Тогда к сравнению результатов добавляется замер времени выполнения и анализ плана запроса.
Как выбрать подход
Сравнение текстов запросов в конфигураторе
Если запросы хранятся в разных версиях конфигурации или в разных объектах, удобнее всего выгрузить их в текстовые файлы и сравнить. В конфигураторе есть встроенный механизм: меню «Файл» — «Сравнить файлы». Откроется окно построчного сравнения, где добавленные, удалённые и изменённые строки подсвечиваются цветом.
Для сравнения запросов из двух версий конфигурации используйте «Конфигурация» — «Сравнить и объединить с конфигурацией из файла». Механизм покажет различия по объектам, включая тексты запросов в модулях и схемах компоновки данных. Это основной способ при анализе изменений после обновления типовой конфигурации.
Внешние инструменты (Notepad++ с плагином Compare, WinMerge, VS Code) дают более удобную подсветку для длинных запросов, особенно когда текст сохранён из консоли запросов. Сохраните оба варианта в файлы с расширением .txt или .bsl и сравните — так проще отследить изменения в секциях ГДЕ и СОЕДИНЕНИЕ.
Сравнение результатов через консоль запросов
Консоль запросов — основной рабочий инструмент. Для управляемых форм подходят типовые консоли из состава инструментов разработчика (ИР) или аналогичные обработки с публичных репозиториев. Порядок действий простой: выполните первый запрос, сохраните результат (например, выгрузите в табличный документ или скопируйте в Excel), затем выполните второй и сравните выборки.
Ручное сравнение подходит для небольших выборок — до нескольких сотен строк. Обратите внимание на три вещи: количество строк (расхождение сразу указывает на проблему в соединениях или отборах), состав колонок (совпадают ли типы и набор полей) и значения в ключевых колонках. Сортировку задавайте явно через УПОРЯДОЧИТЬ ПО, иначе порядок строк может отличаться без реальных расхождений в данных.
Для больших выборок ручное сравнение ненадёжно. Выгрузите оба результата в табличные документы и сравните их программно, либо используйте приём со сведением двух выборок в один проверочный запрос — он описан в следующем разделе.
- 1Откройте консоль запросов в той базе, где лежат реальные данные
- 2Выполните первый запрос с явной сортировкой и зафиксируйте количество строк
- 3Выгрузите результат в табличный документ или таблицу значений
- 4Выполните второй запрос с той же сортировкой и параметрами
- 5Сравните количество строк и значения по ключевым полям
- 6При расхождении сокращайте запросы до минимального фрагмента, где различие проявляется
Проверочный запрос с полным соединением
Самый надёжный способ доказать эквивалентность двух запросов — свести их результаты в один запрос через полное соединение и найти строки, где одна из сторон пуста. Оба запроса помещаются во временные таблицы, затем соединяются по всем ключевым полям. Если итоговая выборка пуста — результаты идентичны.
ВЫБРАТЬ
Т.Номенклатура,
Т.Количество
ПОМЕСТИТЬ Вариант1
ИЗ ... ; // первый запрос
ВЫБРАТЬ
Т.Номенклатура,
Т.Количество
ПОМЕСТИТЬ Вариант2
ИЗ ... ; // второй запрос
ВЫБРАТЬ
ЕСТЬNULL(В1.Номенклатура, В2.Номенклатура) КАК Ключ,
В1.Количество КАК Количество1,
В2.Количество КАК Количество2
ИЗ Вариант1 КАК В1
ПОЛНОЕ СОЕДИНЕНИЕ Вариант2 КАК В2
ПО В1.Номенклатура = В2.Номенклатура
ГДЕ
В1.Номенклатура ЕСТЬ NULL
ИЛИ В2.Номенклатура ЕСТЬ NULL
ИЛИ В1.Количество <> В2.Количество
Условие в секции ГДЕ ловит три вида расхождений: строка есть только в первом варианте, только во втором, либо значения мер различаются. Если запрос возвращает строки — это и есть список расхождений с конкретными ключами, по которым легко найти причину.
Ограничение метода: он требует, чтобы у выборок был однозначный ключ соединения. Если в результатах возможны дубли по ключевым полям, добавьте в ключ все измерения или предварительно сгруппируйте обе выборки. Также проверяйте расхождения на данных, близких к реальным, — на пустой тестовой базе два неэквивалентных запроса могут совпасть случайно.
// Программное сравнение двух таблиц значений
Запрос = Новый Запрос;
Запрос.Текст = ТекстПроверочногоЗапроса; // полное соединение двух вариантов
Расхождения = Запрос.Выполнить().Выгрузить();
Если Расхождения.Количество() = 0 Тогда
Сообщить("Результаты запросов идентичны");
Иначе
Сообщить("Найдено расхождений: " + Расхождения.Количество());
КонецЕсли;Сравнение запросов в схеме компоновки данных
В отчётах на СКД запрос живёт внутри схемы, и сравнивать его удобнее через консоль СКД или через выгрузку схемы в XML. Откройте схему отчёта (в конфигураторе — закладка «Основная схема компоновки данных»), скопируйте текст запроса из набора данных и перенесите в консоль запросов вместе с параметрами.
Нюанс: СКД дополняет запрос своими отборами, поэтому результат в отчёте может отличаться от результата в консоли даже при идентичном тексте. Чтобы сравнение было честным, либо отключите все отборы в настройках отчёта, либо перенесите их в параметры консоли. Для сравнения двух вариантов отчёта выгрузите обе схемы в XML-файлы и сравните их как тексты — так видны изменения не только в запросе, но и в ресурсах, группировках и параметрах.
При переносе запроса из СКД в консоль проверьте параметры виртуальных таблиц (период, отбор по организации). Их легко потерять, и тогда консоль покажет другой результат не из-за ошибки в запросе, а из-за отсутствующего ограничения периода.
Сравнение производительности двух вариантов
Когда оба запроса дают одинаковый результат, следующий вопрос — какой из них быстрее. Простой замер делается программно: зафиксируйте время до выполнения и после через ТекущаяУниверсальнаяДатаВМиллисекундах() и повторите замер несколько раз, так как первый запуск обычно медленнее из-за кэша.
Для глубокого анализа используйте план запроса. В консоли запросов некоторых инструментов есть кнопка получения плана, а на уровне СУБД план снимается штатными средствами (для MS SQL — через SQL Server Management Studio). Смотрите на сканирования таблиц вместо поиска по индексу, соединения вложенными циклами по большим таблицам и лишние соединения, которых нет во втором варианте.
Сравнивайте производительность на данных, близких по объёму к рабочей базе. Запрос, который выигрывает на тысяче строк, может проиграть на миллионе, если оптимизатор выберет другой план.
Типичные ошибки при сравнении запросов
Первая ошибка — сравнение только текстов. Два запроса могут отличаться в одном условии, и на глаз это легко пропустить в длинном тексте, особенно если отличается порядок полей в соединении. Всегда подтверждайте выводы проверкой результатов на реальных данных.
Вторая — сравнение на разных параметрах. Если первый запрос выполнен с отбором по одной организации, а второй по всем, расхождение результатов ничего не говорит о логике. Фиксируйте параметры перед сравнением и используйте одинаковый период, особенно для виртуальных таблиц остатков и оборотов.
Третья — игнорирование дублей. Левое соединение к таблице с несколькими совпадениями размножает строки, и выборка «почти совпадает» с эталоном, отличаясь только количеством. Именно поэтому количество строк проверяется в первую очередь.
Как проверить результат сравнения
Количество совпадает
Разное число строк — ищите проблему в соединениях и отборах
Результат пустой — расхождений нет
Есть строки — это конкретные ключи расхождений
Период, организация и прочие параметры идентичны
Параметры различаются — сравнение некорректно
Замер повторён несколько раз, разброс небольшой
Вывод сделан по одному запуску на холодном кэше
Частые вопросы
Можно ли сравнить два запроса без консоли запросов?
Да. Небольшие выборки можно вывести в табличный документ прямо из отладчика, остановившись после выполнения запроса и посмотрев результат через Выгрузить(). Для текстов достаточно встроенного сравнения файлов конфигуратора. Но консоль заметно ускоряет работу, особенно с параметрами и временными таблицами.
Тексты запросов совпадают, а результаты разные. Почему?
Почти всегда причина в окружении, а не в тексте: разные параметры, разные базы или периоды, отборы СКД, наложенные поверх запроса, либо различия в правах доступа (RLS добавляет скрытые условия). Проверьте, что оба запуска выполняются в одной базе, под одним пользователем и с одинаковыми параметрами.
Как сравнить запросы из двух разных баз?
Тексты — через выгрузку в файлы и diff-инструмент. Результаты корректно сравнивать только если данные в базах синхронизированы (например, одна база — копия другой). Иначе расхождения будут отражать разницу в данных, а не в логике запросов.
Чем полное соединение лучше сравнения в Excel?
Полное соединение выполняется на сервере СУБД и обрабатывает выборки любого размера без выгрузки, а также сразу показывает ключи расхождающихся строк. Excel подходит только для небольших выборок и требует ручного сопоставления, где легко ошибиться с типами данных и дублями.
Как понять, что запросы эквивалентны, а не совпали случайно?
Проверяйте на данных с пограничными случаями: пустые значения, документы без движений, дублирующиеся ключи, разные периоды. Полезно выполнить проверочный запрос на нескольких разных отборах — например, по нескольким организациям и за разные месяцы. Если расхождений нет ни в одном срезе, эквивалентность можно считать подтверждённой.
Что важно запомнить
Тексты запросов сравнивайте diff-инструментами после приведения форматирования, результаты — через консоль запросов или проверочный запрос с полным соединением по уникальному ключу. Всегда фиксируйте параметры и сортировку, проверяйте количество строк и подтверждайте эквивалентность на реальных данных с пограничными случаями. Производительность оценивайте отдельно, серией замеров на объёме, близком к рабочему.