Работа с запросами в 1С:Предприятие — одна из самых востребованных задач среди разработчиков и аналитиков. Без умения правильно просматривать результаты запросов невозможно отладить код, проверить корректность выборки или оптимизировать производительность. Однако даже опытные специалисты иногда сталкиваются с ситуациями, когда результат запроса отображается не так, как ожидалось, или вообще не виден.
Эта статья поможет разобраться, как в 1С 8.3 и других актуальных версиях платформы просматривать данные, возвращаемые запросами. Мы рассмотрим все доступные методы — от элементарных (через отладчик) до продвинутых (с использованием временных таблиц и внешних обработок). Особое внимание уделим типичным ошибкам, которые мешают увидеть результат, и нюансам работы с разными типами запросов: выборками, пакетными запросами и запросами с параметрами.
Материал будет полезен как новичкам, которые только осваивают язык 1С:Запросы, так и опытным разработчикам, ищущим способы оптимизации своей работы. Все примеры приведены с учетом последних обновлений платформы и проверены на актуальных конфигурациях (Бухгалтерия 3.0, Управление торговлей 11, Зарплата и управление персоналом 3.1).
1. Базовый способ: вывод результата в отладчике
Самый простой и универсальный метод — использование отладчика 1С. Он подходит для быстрой проверки запросов прямо в процессе написания кода. Чтобы увидеть результат, достаточно установить точку останова и воспользоваться встроенными инструментами платформы.
Алгоритм действий:
- 📝 Напишите запрос в модуле (например, в обработке или отчете). Пример:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Наименование КАК Товар,
| СУММА(Документ.Количество) КАК Количество
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Документ
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
| ПО Документ.Номенклатура = Номенклатура.Ссылка
|ГДЕ
| Документ.Дата МЕЖДУ &НачалоПериода И &КонецПериода
|СГРУППИРОВАТЬ ПО
| Номенклатура.Наименование";
Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(ТекущаяДата()));
Запрос.УстановитьПараметр("КонецПериода", КонецДня(ТекущаяДата()));
Результат = Запрос.Выполнить(); (кликните левой кнопкой мыши слева от номера строки в редакторе кода).F5 или значок "Начать отладку" на панели инструментов).Отладка появится вкладка Результаты. Кликните по ней, чтобы увидеть таблицу с данными.Преимущества этого метода:
- ⚡ Мгновенный просмотр без дополнительных обработок.
- 🔧 Возможность анализировать промежуточные результаты (например, после выполнения части запроса).
- 📌 Поддержка всех типов запросов, включая пакетные и запросы с временными таблицами.
⚠️ Внимание: Если в результате запроса более 10 000 строк, отладчик может не показать все данные из-за ограничений интерфейса. В этом случае используйте альтернативные методы (см. разделы ниже).
Чтобы быстро скопировать результат из отладчика в Excel, выделите таблицу с данными, нажмите правой кнопкой мыши и выберите "Копировать". Затем вставьте в Excel с помощью комбинации Ctrl+V
2. Использование метода Выгрузить() для экспорта в табличный документ
Когда нужно не только посмотреть, но и сохранить или распечатать результат запроса, удобно использовать метод Выгрузить(). Он преобразует результат в табличный документ, который можно открыть в отдельном окне, экспортировать в Excel или PDF.
Пример кода:
РезультатЗапроса = Запрос.Выполнить();
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.Вывести(РезультатЗапроса.Выгрузить());
// Открываем документ в отдельном окне
ТабличныйДокумент.Показать("Результат запроса");
Особенности метода:
- 📄 Поддерживает форматирование (цвета, шрифты, выравнивание).
- 📥 Позволяет экспортировать данные в
Excel,PDF,HTMLчерез контекстное меню табличного документа. - 🔄 Можно программно настраивать ширину колонок, заголовки и даже добавлять диаграммы.
| Формат экспорта | Как сохранить | Ограничения |
|---|---|---|
Excel (.xlsx) |
ПКМ → "Сохранить как" → Выбрать формат | Максимум 1 048 576 строк |
| Файл → Печать → "Сохранить как PDF" | Нет интерактивности (нельзя сортировать) | |
| HTML | ПКМ → "Сохранить как" → Выбрать .html |
Поддерживает не все стили |
Текстовый файл (.txt) |
Копировать данные вручную или через скрипт | Теряется форматирование |
⚠️ Внимание: При выгрузке больших объемов данных (более 50 000 строк) табличный документ может тормозить. В этом случае лучше использовать Построитель отчета или временные таблицы (см. раздел 4).
3. Просмотр через временные таблицы (для сложных запросов)
Если запрос возвращает огромный объем данных или нужно сохранить промежуточные результаты для дальнейшей обработки, оптимальное решение — временные таблицы. Они позволяют:
- 🔄 Разбивать сложные запросы на части.
- 📊 Анализировать данные пошагово.
- ⚡ Ускорять выполнение за счет кэширования.
Пример использования:
// Создаем временную таблицу
ВременнаяТаблица = Новый ТаблицаЗначений;
ВременнаяТаблица.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка"));
ВременнаяТаблица.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
// Заполняем ее результатом запроса
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Строка = ВременнаяТаблица.Добавить();
Строка.Товар = Выборка.Товар;
Строка.Количество = Выборка.Количество;
КонецЦикла;
// Просматриваем данные
ВременнаяТаблица.Показать("Промежуточный результат");
Преимущества временных таблиц:
- 🛠️ Гибкость: можно добавлять столбцы, фильтровать данные, сортировать.
- 📈 Поддержка большого объема данных (миллионы строк).
- 🔗 Возможность передачи между процедурами и функциями.
Как очистить временную таблицу после использования?
Чтобы освободить память, используйте метод Очистить():
ВременнаяТаблица.Очистить();
Это особенно важно при работе с циклами, где таблицы создаются многократно.
4. Применение внешних обработок для визуализации
Для регулярной работы с запросами удобно создать внешнюю обработку с готовым интерфейсом для просмотра результатов. Это сэкономит время и позволит стандартизировать вывод данных.
Пример структуры обработки:
- 📋 Поле ввода для текста запроса (тип
Строкас многострочным режимом). - 🔄 Кнопка "Выполнить" с обработчиком, который выполняет запрос.
- 📊 Табличное поле для вывода результата (привязанное к динамическому списку или таблице значений).
- 💾 Кнопки экспорта в Excel/PDF.
Код обработчика кнопки "Выполнить":
Процедура ВыполнитьЗапрос(Команда)
Попытка
Запрос = Новый Запрос;
Запрос.Текст = ЭлементыФормы.ТекстЗапроса.Значение;
Результат = Запрос.Выполнить();
ЭлементыФормы.ТаблицаРезультатов.Значение = Результат.Выгрузить();
Исключение
Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;
КонецПроцедуры
Где взять готовую обработку?
- 🔍 На сайте Infostart (раздел "Обработки для 1С").
- 📦 В каталоге 1С:ИТС (для пользователей с действующей подпиской).
- 🛠️ Создать самостоятельно (шаблоны есть в документации 1С).
⚠️ Внимание: При использовании внешних обработок из ненадежных источников проверяйте код на наличие вредоносных вставок. Особенно опасно запускать обработки с правами "Полные права".
☑️ Подготовка внешней обработки для запросов
5. Работа с пакетными запросами и запросами с параметрами
Пакетные запросы и запросы с параметрами требуют особого подхода при просмотре результатов. Рассмотрим ключевые нюансы.
Пакетные запросы возвращают несколько результатов (по одному на каждый запрос в пакете). Чтобы их увидеть, нужно обработать коллекцию Результаты:
Пакет = Новый ПакетЗапросов;
Пакет.Добавить("ВЫБРАТЬ Топ(10) Наименование ИЗ Справочник.Номенклатура");
Пакет.Добавить("ВЫБРАТЬ Топ(5) Контрагент ИЗ Справочник.Контрагенты");
Результаты = Пакет.Выполнить();
// Просматриваем первый результат
Результаты[0].Выгрузить().Показать("Товары");
// Просматриваем второй результат
Результаты[1].Выгрузить().Показать("Контрагенты");
Запросы с параметрами обязательно требуют установки значений перед выполнением. Если параметр не задан, запрос вернет ошибку:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ * ИЗ Документ.ЗаказПокупателя ГДЕ Дата = &Дата";
Запрос.УстановитьПараметр("Дата", ТекущаяДата()); // Обязательная строка!
Результат = Запрос.Выполнить();
Типичные ошибки при работе с параметрами:
- 🚫 Забыли установить параметр → ошибка "Параметр &Имя не найден".
- 🔄 Перепутали типы данных (например, передали строку вместо даты).
- 📅 Неправильный формат даты (нужно использовать
НачалоДня()илиКонецДня()).
Всегда проверяйте соответствие типов параметров в запросе и передаваемых значений. Например, если в запросе параметр объявлен как &Дата, передавайте значение типа Дата, а не строку.
6. Просмотр результатов в консоли запросов (для 1С:EDT)
Разработчики, использующие 1С:Enterprise Development Tools (EDT), могут воспользоваться встроенной консолью запросов. Это мощный инструмент для тестирования и отладки, который поддерживает:
- 📝 Подсветку синтаксиса.
- 🔍 Автодополнение имен таблиц и полей.
- 📊 Визуализацию результатов в виде таблицы или дерева.
- 📤 Экспорт в CSV/JSON.
Как открыть консоль:
- В 1С:EDT откройте перспективу
1С:Enterprise. - В меню выберите
Window → Show View → Query Console. - Напишите запрос и нажмите
Execute (F5).
Преимущества консоли запросов в EDT:
- 🛠️ Интеграция с системой контроля версий (можно сохранять часто используемые запросы).
- 🔧 Поддержка транзакций и отката изменений.
- 📌 История выполненных запросов.
⚠️ Внимание: Консоль запросов в EDT доступна только в режиме "Отладка" или при подключении к информационной базе с полными правами. В пользовательском режиме этот функционал может быть ограничен.
7. Типичные ошибки и их решения
Даже опытные разработчики иногда сталкиваются с проблемами при попытке посмотреть результат запроса. Разберем самые распространенные случаи.
| Ошибка | Причина | Решение |
|---|---|---|
| Пустой результат (нет данных) | Неверные условия в секции ГДЕ или отсутствуют данные в базе |
Проверьте параметры запроса и убедитесь, что данные существуют |
| "Поле не найдено" | Опечатка в имени поля или таблицы | Используйте автодополнение в EDT или проверьте структуру метаданных |
| Запрос выполняется слишком долго | Отсутствуют индексы или запрос не оптимизирован | Добавьте индексы, разбивайте запрос на части, используйте временные таблицы |
| "Недостаточно прав" | У пользователя нет прав на чтение данных | Запустите отладку с правами "Администратор" или настройте роли |
| Результаты обрезаны (не все строки) | Ограничение отладчика (10 000 строк) | Используйте Выгрузить() или временные таблицы |
Если запрос возвращает неожиданные данные, проверьте:
- 🔍 Секцию
ГДЕ: возможно, условия фильтрации слишком жесткие или, наоборот, отсутствуют. - 🔗 Соединения таблиц:
ЛЕВОЕ СОЕДИНЕНИЕиВНУТРЕННЕЕ СОЕДИНЕНИЕдают разные результаты. - 📅 Параметры дат: часто ошибки возникают из-за неверного указания границ периода (например,
Дата = &ДатавместоДата >= НачалоДня(&Дата)).
8. Продвинутые техники: отладка сложных запросов
Для анализа сложных запросов (с вложенными выборками, объединениями или рекурсией) полезны следующие приемы:
1. Пошаговое выполнение
Разбивайте запрос на части и выполняйте их отдельно. Например:
// Шаг 1: получаем список номенклатуры
Запрос1 = Новый Запрос("ВЫБРАТЬ РазрешенныеНаименования ИЗ Справочник.Номенклатура");
Результат1 = Запрос1.Выполнить();
// Шаг 2: фильтруем документы по полученному списку
Запрос2 = Новый Запрос(
"ВЫБРАТЬ *
|ИЗ Документ.РеализацияТоваровУслуг
|ГДЕ Номенклатура В (&СписокНоменклатуры)");
Запрос2.УстановитьПараметр("СписокНоменклатуры", Результат1.Выгрузить().ВыгрузитьКолонку("РазрешенныеНаименования"));
Результат2 = Запрос2.Выполнить();
2. Логирование промежуточных результатов
Используйте ЗаписьЖурналаРегистрации или Сообщить() для отслеживания значений параметров:
Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(ТекущаяДата()));
ЗаписьЖурналаРегистрации("ОтладкаЗапросов", УровеньЖурналаРегистрации.Информация,
, , "Параметр ДатаНачала = " + Формат(НачалоДня(ТекущаяДата()), "ДЛФ=DT"));
3. Анализ плана выполнения
В 1С:EDT можно посмотреть план выполнения запроса, который покажет, как СУБД обрабатывает запрос и где могут быть "узкие места":
Запрос = Новый Запрос("ВЫБРАТЬ * ИЗ Документ.ЗаказПокупателя");
План = Запрос.ПолучитьПланВыполнения();
План.Показать();
Если запрос выполняется более 30 секунд, обязательно анализируйте план выполнения. Часто проблема кроется в отсутствии индексов или неоптимальных соединениях таблиц.
Для запросов с рекурсией или сложными объединениями также полезно:
- 🧩 Использовать
ОБЪЕДИНИТЬ ВСЕвместоОБЪЕДИНИТЬ, чтобы избежать дубликатов. - 🔄 Проверять результаты промежуточных выборок с помощью
ВТ_Результат(временные таблицы). - 📊 Визуализировать связи между таблицами на бумаге или в Lucidchart.
FAQ: Ответы на частые вопросы
Как посмотреть результат запроса, если он возвращает более 100 000 строк?
Для больших выборок используйте:
- Временные таблицы с постраничным выводом (
ПолучитьСтраницу()). - Экспорт в
CSVчерезЗаписьТекста. - Специальные обработки, оптимизированные для работы с большими данными (например, "Универсальный отчет" из 1С:ИТС).
Пример кода для постраничного вывода:
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.Постранично, 1000);
Пока Выборка.Следующий() Цикл
// Обработка данных
КонецЦикла;
Почему в отладчике не показываются все колонки результата?
Это ограничение интерфейса отладчика. Чтобы увидеть все колонки:
- Используйте
Выгрузить()и табличный документ. - В настройках отладчика (
Сервис → Параметры → Отладка) увеличьте параметрМаксимальное количество колонок(по умолчанию — 50). - Экспортируйте данные в
Excelи анализируйте там.
Можно ли сохранить результат запроса в файл без использования внешних обработок?
Да, можно использовать встроенные механизмы 1С:
Результат = Запрос.Выполнить();
Текст = Новый ЗаписьТекста;
Текст.Открыть("C:\Temp\РезультатЗапроса.csv", КодировкаТекста.UTF8);
// Записываем заголовки
Для Каждого Колонка Из Результат.Колонки Цикл
Текст.Записать(Колонка.Имя + ";");
КонецЦикла;
Текст.Записать(Символы.ПС);
// Записываем данные
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Для Каждого Колонка Из Результат.Колонки Цикл
Текст.Записать(?(Выборка[Колонка.Имя] = Неопределено, "", Выборка[Колонка.Имя]) + ";");
КонецЦикла;
Текст.Записать(Символы.ПС);
КонецЦикла;
Текст.Закрыть();
Для больших файлов (>100 МБ) лучше использовать ДвоичныеДанные и запись порциями.
Как сравнить результаты двух запросов?
Используйте один из методов:
- Временные таблицы: сохраните результаты обоих запросов во временные таблицы и сравните их с помощью третьего запроса.
- Таблицы значений: выгрузите результаты в таблицы значений и используйте метод
Сравнить(). - Внешние инструменты: экспортируйте данные в
Excelи используйте функциюВПРилиPower Query.
Пример кода для сравнения через таблицы значений:
ТЗ1 = РезультатЗапроса1.Выгрузить();
ТЗ2 = РезультатЗапроса2.Выгрузить();
Различия = Новый ТаблицаЗначений;
ТЗ1.Сравнить(ТЗ2, Различия,, Истина); // Последний параметр - сравнивать значения
Различия.Показать("Отличия в данных");
Почему запрос в отладчике работает, а в рабочей базе — нет?
Разница в поведении запроса может быть связана с:
- Правами доступа: в рабочей базе у пользователя может не хватать прав на чтение данных.
- Версией платформы: некоторые функции запросов доступны только в последних версиях 1С:Предприятие.
- Данными: в рабочей базе могут отсутствовать тестовые данные, которые есть в отладочной.
- Настройками СУБД: ограничения на размер пакета данных или таймауты.
Чтобы диагностировать проблему:
- Проверьте права пользователя в рабочей базе.
- Сравните версии платформы (
Помощь → О программе). - Выполните запрос под администратором в рабочей базе.
- Используйте
План выполнения, чтобы найти различия.