Запросы и работа с данными: СКД, оптимизация, транзакции
В прошлых темах мы разобрали, из чего состоит конфигурация (справочники, документы, регистры, отчёты) и где живёт код (модули, события, формы, клиент/сервер). Теперь соберём это в практическую основу профессиональной разработки: как правильно получать данные запросами, как строить отчёты через СКД (Система компоновки данных), как думать про производительность, и как безопасно изменять данные через транзакции.
!Как запросы и СКД связывают интерфейс, серверный код и хранилище данных
Что такое запрос в 1С и зачем он нужен
Запрос в 1С — это способ получить данные из информационной базы на сервере, используя язык запросов 1С (по смыслу близок к SQL, но ориентирован на объекты 1С: справочники, документы, регистры, виртуальные таблицы).
Запрос используют, когда нужно:
получить выборку данных по условиям
агрегировать данные (суммы, количества, группировки)
быстро получить итоги по регистрам (остатки, обороты)
подготовить данные для отчёта, обработки, проверки проведенияКлючевая привычка разработчика: всё, что можно “достать” одним запросом, обычно лучше доставать запросом, чем циклами по объектам.
Базовая структура запроса в BSL
Минимальный рабочий шаблон состоит из:
объекта Запрос
текста запроса Запрос.Текст
параметров УстановитьПараметр
выполнения Выполнить()
получения результата через Выбрать() или Выгрузить()Пример: получить список номенклатуры по группе.
Почему параметры важнее, чем “склейка строк”
Параметр &Группа нужен не только для удобства.
это безопаснее, чем формировать текст запроса конкатенацией строк
сервер может лучше кешировать и оптимизировать выполнение запросов с параметрами
код проще читать и сопровождатьРезультат запроса: Выбрать() и Выгрузить()
В 1С два частых сценария работы с результатом.
Выбрать() возвращает выборку, по которой вы проходите циклом (подходит для потоковой обработки)
Выгрузить() сразу делает ТаблицаЗначений (удобно для передачи на клиент или в табличный документ)Пример с Выбрать():
Регистры и виртуальные таблицы: быстрый путь к итогам
В прошлой теме про регистры мы говорили: состояние учёта берут из регистров. На уровне запросов это выражается тем, что вы очень часто обращаетесь не к “сырым движениям”, а к виртуальным таблицам.
Примеры виртуальных таблиц регистра накопления:
Остатки(&НаДату) — остатки на дату
Обороты(&Нач, &Кон) — обороты за периодПример: остатки товаров на складе.
Практический смысл: виртуальные таблицы используют механизмы платформы для расчёта итогов и обычно работают быстрее и надёжнее, чем попытки “самостоятельно” суммировать движения запросом без понимания нюансов перепроведения.
СКД: Система компоновки данных как стандарт отчётности
СКД (Система компоновки данных) — это механизм 1С для построения отчётов, где вы описываете:
наборы данных (запросы и источники)
поля, ресурсы, группировки
параметры
варианты настроек…а платформа сама выполняет запросы, применяет отборы, группировки, вычисляет итоги и строит представление.
СКД особенно ценна тем, что позволяет:
делать отчёты, которые пользователь может настраивать без изменения кода
добавлять варианты отчёта (разные группировки и отборы)
унифицировать подход к отчётам в конфигурацииТиповая “анатомия” отчёта на СКД
В отчёте со СКД обычно есть три слоя.
Схема компоновки данных: метаданные отчёта (наборы данных, поля, ресурсы, параметры).
Настройки компоновки: вариант отчёта (как группировать, что выводить, какие отборы применить).
Форма отчёта: интерфейс, где пользователь задаёт параметры и нажимает “Сформировать”.Где появляется код, если СКД “и так всё умеет”
Код нужен, когда вы хотите:
программно установить значения параметров
подменить настройки варианта
добавить вычисляемые поля нестандартной логикой
сделать “обвязку” вокруг формирования (проверки прав, подготовка временных данных)Мини-шаблон установки параметров СКД в форме отчёта (идея, названия объектов формы зависят от конкретной формы):
Главная идея по архитектуре из прошлой статьи про формы: клиент инициирует, сервер читает данные и формирует результат.
Когда лучше СКД, а когда лучше “запрос + код”
| Подход | Сильные стороны | Когда выбирать |
|---|---|---|
| СКД | настраиваемость пользователем, стандартная отчётность, быстрый старт | большинство управленческих и регламентированных отчётов |
| Запрос + код | полный контроль формата и логики, нестандартные вычисления | сложные печатные формы, специфические выгрузки, нестандартные алгоритмы |
Важно: даже если отчёт делается “запрос + код”, сами данные почти всегда рационально получать запросом, а не чтением объектов в цикле.
Оптимизация запросов: как мыслит разработчик “на больших данных”
Оптимизация в 1С почти всегда начинается с простого вопроса: что именно делает запрос, сколько строк он читает, и можно ли прочитать меньше.
Правила, которые дают эффект чаще всего
Выбирайте только нужные поля: не делайте ВЫБРАТЬ * по привычке.
Фильтруйте как можно раньше: условия в ГДЕ уменьшают объём обрабатываемых данных.
Используйте параметры: это упрощает повторное выполнение и уменьшает риск ошибок.
Опирайтесь на регистры и их виртуальные таблицы: остатки и обороты берите через Остатки() и Обороты().
Не переносите расчёты в клиент: тяжелые запросы должны выполняться на сервере.
Осторожно с функциями в условиях: условие вида “преобразуй поле и сравни” часто мешает эффективной обработке.Частая ошибка: “вытащим всё и отфильтруем в цикле”
Антипаттерн:
запрос возвращает десятки тысяч строк “на всякий случай”
дальше на сервере или, хуже, на клиенте идёт фильтрация в циклеПравильнее:
уточнить ГДЕ
сделать группировку в запросе
использовать виртуальные таблицы регистровВременные таблицы: когда они полезны
В языке запросов 1С есть механизм временных таблиц (результат промежуточного запроса сохраняется и используется дальше в этом же запросе). Они полезны, когда:
сложный запрос состоит из нескольких этапов
нужно один раз посчитать набор данных и затем несколько раз к нему присоединиться
нужно повысить читаемость сложной логикиИспользовать их стоит осознанно: временная таблица — это тоже работа и память, но иногда она сильно упрощает план выполнения.
Транзакции: как безопасно изменять данные
Транзакция — это группа операций записи, которая выполняется как единое целое: либо всё записалось, либо ничего не записалось.
Это нужно, когда вы делаете несколько связанных изменений:
создаёте документ и сразу создаёте связанные записи
выполняете групповую обработку (много объектов)
выполняете обмен, где нельзя оставить “половину записанного”Для общего понимания термина можно ориентироваться на определение транзакции в информатике: Транзакция (информатика)).
Базовые команды транзакций в 1С
В серверном коде чаще всего используются:
НачатьТранзакцию()
ЗафиксироватьТранзакцию()
ОтменитьТранзакцию()Типовой безопасный шаблон (важно: делать откат в обработке исключения):
Где транзакции особенно важны
при массовых изменениях, чтобы не оставить базу “в полусостоянии”
при сложных алгоритмах проведения, где делаются дополнительные записи
в интеграциях, где один пакет данных должен быть применён целикомПрактическое правило про клиент/сервер
Транзакции — это про запись в базу, значит:
транзакция должна управляться серверным кодом
на клиенте транзакцию “держать” нельзя: клиент должен только инициировать действие и показать результат!Шаблон выполнения транзакции с фиксацией или откатом
Как связать запросы, СКД и транзакции с объектами и модулями
Связка с предыдущими темами выглядит так.
Форма (клиент): собирает параметры (период, организация, склад), вызывает сервер.
Общий модуль или модуль объекта (сервер): выполняет запросы, проверяет правила, при необходимости управляет транзакцией.
Регистры: основной источник итогов для отчётов и контрольных проверок.
СКД: стандартный путь построить отчёт, который пользователь сможет настраивать.Если вы удерживаете границы ответственности (клиент — интерфейс, сервер — данные и целостность), то и производительность, и надёжность становятся управляемыми.
Итоги
Запрос — основной инструмент чтения и агрегирования данных в 1С.
Параметры запроса — стандарт безопасной и сопровождаемой разработки.
Виртуальные таблицы регистров (остатки/обороты) — самый частый путь к правильным итогам.
СКД — стандартная система отчётности, где метаданные и настройки часто важнее кода.
Оптимизация начинается с сокращения объёма читаемых данных и правильного выбора источника (регистры, виртуальные таблицы).
Транзакции защищают целостность: либо записали всё, либо откатили всё.Для справки по платформе: Платформа 1С:Предприятие 8 (официальный сайт)