В мире 1С:Предприятие работа с данными — основа любой автоматизации. Но когда речь заходит о сложных отчетах, динамических выборках или интеграции с внешними системами, стандартные запросы на языке 1С могут оказаться недостаточно гибкими. Здесь на помощь приходят схемы запросов — мощный инструмент, который позволяет описывать структуру данных независимо от их источника и трансформировать их по заданным правилам.
Если вы когда-нибудь сталкивались с необходимостью создать универсальный отчет, который должен работать с разными конфигурациями, или интегрировать 1С с внешней системой через REST API, то схемы запросов станут вашим спасением. Они позволяют абстрагироваться от конкретных таблиц базы данных, описывая логику выборки на более высоком уровне. В этой статье мы разберем, что такое схемы запросов, как они устроены, где применяются и чем отличаются от привычных запросов на встроенном языке.
Материал будет полезен как начинающим разработчикам 1С, так и опытным специалистам, которые хотят оптимизировать работу с данными. Мы не только дадим теоретическую базу, но и покажем практические примеры, а также раскроем ключевое отличие схем запросов от традиционных механизмов выборки: они позволяют описывать не только сами данные, но и их структуру, связи и правила трансформации в едином формате.
Что такое схема запроса в 1С и зачем она нужна
Схема запроса в 1С:Предприятие — это описание структуры данных, их источников, связей между ними и правил трансформации, представленное в виде специального объекта конфигурации. В отличие от обычного запроса, который выполняется "здесь и сейчас" с фиксированными параметрами, схема запроса является шаблоном, который можно многократно использовать с разными входными данными.
Основное назначение схем запросов:
- 📊 Унификация отчетов — создание шаблонов, которые работают в разных конфигурациях или для разных организаций.
- 🔄 Трансформация данных — преобразование структуры выборки (например, сводная таблица из детализированных данных).
- 🌐 Интеграция с внешними системами — описание структуры данных для обмена через
HTTP-сервисыилиREST API. - 📈 Динамические выборки — генерация запросов на основе пользовательских параметров без изменения кода.
Простым языком: если обычный запрос в 1С — это "дай мне список всех документов за месяц", то схема запроса — это "вот правила, по которым ты должен строить любой список документов, независимо от того, какие поля и таблицы для этого понадобятся". Это особенно ценно в крупных проектах, где конфигурация может меняться, а логика выборки данных должна оставаться стабильной.
Структура схемы запроса: из чего она состоит
Любая схема запроса в 1С:Предприятие 8 состоит из нескольких ключевых элементов, которые определяют её поведение. Рассмотрим основные компоненты:
| Компонент | Описание | Пример использования |
|---|---|---|
| Источники данных | Описание таблиц, виртуальных таблиц или внешних источников, откуда берутся данные. | Документ.ЗаказПокупателя, ВиртуальнаяТаблица.ОстаткиТоваров |
| Поля выборки | Список полей, которые должны попасть в результат, включая вычисляемые. | СуммаДокумента, Количество * Цена как СуммаПозиции |
| Связи между источниками | Описание условий соединения таблиц (аналог JOIN в SQL). |
Связь ЗаказПокупателя.Контрагент = Контрагенты.Ссылка |
| Параметры | Внешние переменные, которые можно передавать в схему при выполнении. | ДатаНачала, Организация |
| Условия отбора | Фильтры, которые применяются к данным (аналог WHERE). |
Дата >= &ДатаНачала, Статус = "Проведен" |
Важно понимать, что схема запроса сама по себе не выполняет выборку — она только описывает, как эту выборку нужно сделать. Фактическое выполнение происходит при вызове метода Выполнить() с передачей конкретных параметров. Это позволяет использовать одну и ту же схему для разных сценариев.
Пример структуры схемы запроса в формате JSON
{
"Источники": [
{
"Имя": "Заказы",
"Тип": "Документ.ЗаказПокупателя",
"Псевдоним": "Заказ"
}
],
"Поля": [
{
"Источник": "Заказ",
"Имя": "Номер",
"Псевдоним": "НомерДокумента"
},
{
"Выражение": "Заказ.Дата",
"Псевдоним": "ДатаЗаказа",
"Тип": "Дата"
}
],
"Параметры": [
{
"Имя": "ДатаНачала",
"Тип": "Дата"
}
]
}
Отличия схем запросов от обычных запросов на языке 1С
На первый взгляд может показаться, что схемы запросов дублируют функционал обычных запросов на встроенном языке. Однако между ними есть принципиальные различия, которые определяют сферы применения каждого инструмента.
Основные отличия:
- 🔧 Декларативность vs императивность. Обычный запрос — это инструкция ("сделай так"), а схема запроса — это описание ("вот что должно получиться").
- 🔄 Многократное использование. Схему можно вызвать с разными параметрами, тогда как обычный запрос приходится переписывать или оборачивать в функции.
- 📂 Хранение в конфигурации. Схемы запросов сохраняются как объекты метаданных, что упрощает их поддержку и модификацию.
- 🌍 Независимость от структуры БД. Схема может работать с виртуальными таблицами или внешними источниками, не привязываясь к физическим таблицам 1С.
Пример: если вам нужно создать отчет по продажам, который должен работать и в 1С:УТ, и в 1С:ERP, то схема запроса позволит описать логику один раз, а затем адаптировать её под конкретную конфигурацию через параметры. Обычный запрос пришлось бы переписывать полностью для каждой базы.
Используйте схемы запросов, когда вам нужно создать "универсальный" отчет, который будет работать в разных конфигурациях или с разными настройками. Например, для франчайзинговых сетей, где одна и та же логика должна применяться ко многим базам с небольшими вариациями.
Где применяются схемы запросов: практические примеры
Схемы запросов — это не просто теоретическая фича 1С, а инструмент, который решает конкретные задачи. Рассмотрим наиболее распространенные сценарии их применения:
1. Универсальные отчеты для разных конфигураций
Если у вас есть холдинг с разными конфигурациями (1С:Бухгалтерия, 1С:УТ, 1С:ЗУП), но нужно формировать единый отчет по всем базам, схемы запросов позволят описать логику один раз, а затем адаптировать её под каждую конфигурацию через параметры. Например, отчет по дебиторской задолженности может использовать разные источники данных в Бухгалтерии и ERP, но при этом иметь одинаковую структуру вывода.
2. Интеграция с внешними системами
При обмене данными через REST API или JSON часто требуется преобразовать внутреннюю структуру 1С в формат, понятный внешней системе. Схемы запросов позволяют описать это преобразование один раз и затем использовать его для генерации данных в нужном виде. Например, при интеграции с 1С-Битрикс или CRM-системой.
3. Динамические дашборды
Если вам нужно создать аналитический дашборд, где пользователь может самостоятельно выбирать, какие данные и в каком виде отображать (например, сводная таблица или диаграмма), схемы запросов позволят гибко настраивать выборку без изменения кода.
4. Миграция данных между базами
При переносе данных из одной конфигурации в другую (например, при обновлении версии 1С или слиянии баз) схемы запросов помогают описать правила трансформации полей, чтобы данные из старой структуры корректно попали в новую.
Один и тот же отчет нужен в разных конфигурациях|Требуется гибкая настройка выборки без изменения кода|Нужно интегрироваться с внешней системой через API|Данные должны трансформироваться перед выводом-->
Как создать и настроить схему запроса в конфигураторе
Создание схемы запроса в 1С:Предприятие происходит в режиме конфигуратора. Рассмотрим пошаговую инструкцию:
Шаг 1. Добавление нового объекта
Откройте конфигуратор, перейдите в дерево метаданных и выберите ветку Общие → Схемы запросов. Нажмите правой кнопкой мыши и выберите Добавить. Укажите имя новой схемы (например, ОтчетПоПродажам).
Шаг 2. Описание источников данных
В открывшемся окне редактирования схемы перейдите на вкладку Источники. Здесь нужно добавить таблицы или виртуальные таблицы, которые будут использоваться в запросе. Например:
// Пример добавления источника
Источники.Добавить("Документ.ЗаказПокупателя", "Заказы");
Источники.Заказы.Псевдоним = "Заказ";
Шаг 3. Настройка полей выборки
На вкладке Поля опишите, какие данные должны попасть в результат. Можно добавлять поля из источников или создавать вычисляемые поля. Например:
// Пример добавления полей
Поля.Добавить("Заказ.Номер", "НомерЗаказа");
Поля.Добавить("Заказ.Дата", "ДатаЗаказа");
Поля.Добавить("Заказ.СуммаДокумента", "Сумма", ТипЗначения("Число"));
Шаг 4. Задание параметров
Если схема должна быть гибкой, добавьте параметры на вкладке Параметры. Например, параметры ДатаНачала и ДатаОкончания для фильтрации данных по периоду.
Шаг 5. Условия отбора и связи
Настройте фильтры (вкладка Условия) и связи между источниками (вкладка Связи). Например, можно добавить условие Заказ.Дата >= &ДатаНачала.
Шаг 6. Сохранение и использование
Сохраните схему и используйте её в коде через объект СхемаЗапроса:
Схема = СхемыЗапросов.ОтчетПоПродажам.СоздатьЗапрос();
Схема.УстановитьПараметр("ДатаНачала", НачалоМесяца(ТекущаяДата()));
Результат = Схема.Выполнить();
Схемы запросов хранятся в конфигурации как объекты метаданных, что позволяет изменять их без модификации кода программных модулей. Это особенно удобно для поддержки и обновлений.
Типичные ошибки при работе со схемами запросов и как их избежать
Несмотря на гибкость схем запросов, при их использовании разработчики часто сталкиваются с типичными проблемами. Рассмотрим наиболее распространенные ошибки и способы их решения:
1. Неправильное описание источников данных
Если в схеме указан несуществующий источник (например, опечатка в имени таблицы), при выполнении возникнет ошибка. Всегда проверяйте правильность написания имен таблиц и полей.
Как проверить источники данных
Откройте схему запроса в конфигураторе и нажмите кнопку "Проверить". Система покажет все ошибки в описании источников и полей.
2. Отсутствие обработки параметров
Если схема ожидает параметр (например, ДатаНачала), но он не передан при выполнении, возникнет исключение. Всегда проверяйте передачу параметров:
Если Не Схема.Параметры.Найти("ДатаНачала") Тогда
Схема.УстановитьПараметр("ДатаНачала", НачалоДня(ТекущаяДата()));
КонецЕсли;
3. Избыточные данные в результате
Если не настроены условия отбора или связи между таблицами, схема может возвращать слишком много данных, что замедлит её работу. Используйте фильтры и ограничивайте выборку только необходимыми полями.
4. Игнорирование типов данных
При описании полей важно указывать правильные типы (например, Число, Дата, Строка). Если тип не совпадает с реальными данными, могут возникнуть ошибки при обработке результата.
5. Неучет особенностей виртуальных таблиц
Виртуальные таблицы (например, ОстаткиТоваров) могут вести себя не так, как обычные. Всегда проверяйте их структуру в документации или через Метаданные.
Перед использованием схемы запроса в боевой базе протестируйте её на копии с реальными данными. Это поможет выявить ошибки в логике или производительности.
Продвинутые приемы работы со схемами запросов
Когда вы освоили базовые принципы работы со схемами запросов, можно переходить к более сложным сценариям, которые раскрывают их полный потенциал.
1. Динамическое формирование схем
Схемы запросов можно создавать и модифицировать программно. Это полезно, когда структура выборки зависит от пользовательских настроек или внешних условий. Например:
Схема = Новый СхемаЗапроса;
Источник = Схема.Источники.Добавить("Документ.ЗаказПокупателя");
Источник.Псевдоним = "Заказ";
// Добавляем поля в зависимости от настроек пользователя
Если НастройкиПользователя.ПоказыватьСумму Тогда
Схема.Поля.Добавить("Заказ.СуммаДокумента", "Сумма");
КонецЕсли;
2. Использование схем для генерации отчетов в SDS (Система компоновки данных)
Схемы запросов можно интегрировать с СКД, чтобы создавать сложные отчеты с группировками, диаграммами и другими элементами. Для этого результат схемы передается как источник данных для компоновщика:
Схема = СхемыЗапросов.ОтчетПоПродажам.СоздатьЗапрос();
Результат = Схема.Выполнить();
Компоновщик = Новый КомпоновщикМакета;
Компоновщик.ИсточникДанных = Результат;
3. Трансформация данных на лету
Схемы запросов позволяют не только выбирать данные, но и трансформировать их. Например, можно добавить вычисляемое поле, которое преобразует дату в строку нужного формата:
Поле = Схема.Поля.Добавить();
Поле.Выражение = "Формат(Заказ.Дата, ""ДФ=dd.MM.yyyy"")";
Поле.Псевдоним = "ДатаСтрокой";
4. Кэширование результатов
Если схема запроса выполняется часто с одними и теми же параметрами, можно кэшировать её результат, чтобы снизить нагрузку на базу. Например:
Кэш = Новый Структура;
Если Не Кэш.Содержит("ОтчетПоПродажам_2023") Тогда
Схема = СхемыЗапросов.ОтчетПоПродажам.СоздатьЗапрос();
Схема.УстановитьПараметр("Год", 2023);
Кэш.Вставить("ОтчетПоПродажам_2023", Схема.Выполнить());
КонецЕсли;
5. Интеграция с HTTP-сервисами
Схемы запросов можно использовать для генерации данных, которые затем отправляются через REST API. Например, так можно сформировать JSON-ответ для внешней системы:
Схема = СхемыЗапросов.ДанныеДляAPI.СоздатьЗапрос();
Результат = Схема.Выполнить();
Ответ = Новый Структура;
Ответ.Вставить("data", Результат.Выгрузить());
Запрос = Новый HTTPЗапрос("https://api.example.com/data");
Запрос.УстановитьТелоИзСтроки(СериализоватьJSON(Ответ));
Схемы запросов можно комбинировать с другими механизмами 1С, такими как СКД, HTTP-сервисы или фоновые задания, чтобы создавать комплексные решения для работы с данными.
FAQ: Ответы на частые вопросы о схемах запросов в 1С
Можно ли использовать схемы запросов в управляемых формах?
Да, схемы запросов можно использовать в управляемых формах. Для этого нужно создать экземпляр схемы в модуле формы, выполнить её и привязать результат к элементу формы (например, табличному полю). Пример:
Схема = СхемыЗапросов.СписокЗаказов.СоздатьЗапрос();
Схема.УстановитьПараметр("Организация", Объект.Организация);
Результат = Схема.Выполнить();
ЭлементыФормы.ТаблицаЗаказов.Значение = Результат.Выгрузить();
Как передавать параметры в схему запроса из отчета?
Параметры передаются через метод УстановитьПараметр(). Например, если в схеме объявлен параметр ДатаНачала, его можно установить так:
Схема = СхемыЗапросов.ОтчетПоПродажам.СоздатьЗапрос();
Схема.УстановитьПараметр("ДатаНачала", НачалоМесяца(ТекущаяДата()));
Схема.УстановитьПараметр("Организация", ВыбраннаяОрганизация);
Результат = Схема.Выполнить();
Если параметр не передан, но он обязательный, возникнет ошибка.
В чем разница между схемой запроса и обычным запросом с параметрами?
Основные различия:
- Схема запроса — это объект метаданных, который хранится в конфигурации и может использоваться повторно без дублирования кода.
- Обычный запрос с параметрами — это программный код, который нужно писать заново или выносить в функции/процедуры.
- Схемы запросов поддерживают трансформацию данных (например, сводные таблицы), тогда как обычные запросы возвращают только "плоские" выборки.
- Схемы можно модифицировать без изменения кода (например, добавить новое поле через конфигуратор).
Можно ли экспортировать/импортировать схемы запросов между базами?
Да, схемы запросов, как и другие объекты метаданных, можно экспортировать через Конфигуратор → Файл → Сохранить конфигурацию в файл (формат .cf) или выгрузить отдельно через Файл → Выгрузить внешнюю обработку. Также можно использовать Сравнение и объединение конфигураций для переноса схем между базами.
Обратите внимание, что при импорте могут возникнуть конфликты, если в целевой базе уже есть объекты с такими же именами.
Как отлаживать схемы запросов?
Для отладки схем запросов можно использовать следующие приемы:
- В конфигураторе нажмите
Проверитьв окне редактирования схемы — это покажет синтаксические ошибки. - Выполните схему в отладочном режиме и посмотрите результат через
Результат.Выгрузить(). - Используйте
Сообщить()для вывода промежуточных значений:
Результат = Схема.Выполнить();
Сообщить(Результат.Количество()); // Проверяем количество строк
Отладка в настройках 1С:Предприятия.Также полезно тестировать схемы на небольших объемах данных, чтобы быстрее находить ошибки.