Найти в Дзене
2 подписчика

Язык запросов 1С для начинающих: структура, JOIN и типичные ошибки производительности


Запросы в 1С — это фундамент любой отчётности и обработки данных. Несмотря на внешнее сходство с SQL, у языка запросов 1С есть своя специфика. Разберём базовые принципы и ловушки, в которые попадают новички.

🔹 Структура запроса
Минимальный рабочий запрос выглядит так:

ВЫБРАТЬ
Номенклатура.Наименование,
Номенклатура.Артикул
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ЭтоГруппа = ЛОЖЬ

Ключевое отличие от SQL: в 1С мы работаем с объектами метаданных (Справочник, Документ, Регистр), а не с таблицами БД напрямую.

🔹 Соединения: ЛЕВОЕ, ПРАВОЕ, ВНУТРЕННЕЕ
- ЛЕВОЕ → берём все записи из левой таблицы, даже если в правой нет совпадений (подставляем ПУСТО).
- ВНУТРЕННЕЕ → только строки, где есть совпадение в обеих таблицах.
- ПРАВОЕ → аналогично ЛЕВОМУ, но приоритет у правой таблицы.

Пример: список товаров + остатки на складах
1c
ВЫБРАТЬ
Товары.Наименование,
ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК Остаток
ИЗ
Справочник.Номенклатура КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки КАК Остатки
ПО Товары.Ссылка = Остатки.Номенклатура

🔹 Ошибка №1: Запросы внутри цикла
Самая частая причина «тормозов»:
1c
❌ ПЛОХО
Для каждого Элемента Из Выборка Цикл
Запрос = Новый Запрос("ВЫБРАТЬ ... ГДЕ Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", Элемент.Ссылка);
Результат = Запрос.Выполнить();
КонецЦикла;

Каждая итерация = новый запрос к СУБД. При 1000 элементах это 1000 обращений к диску.

✅ Правильно один запрос с условием `В (&СписокСсылок)` или объединение через `ОБЪЕДИНИТЬ ВСЕ`.

🔹 Ошибка №2: Игнорирование индексов
1С автоматически создаёт индексы по основным полям (Ссылка, Код, Наименование). Но если вы фильтруете по реквизиту без индекса (`ГДЕ ДополнительныйРеквизит = ...`), платформа выполнит полное сканирование таблицы.

Проверить индексы можно в конфигураторе: свойства объекта → закладка «Индексы». Добавляйте индексы только на часто фильтруемые поля — избыток индексов замедляет запись.

🔹 Виртуальные таблицы регистров
Регистры накопления и сведений хранят данные в виде движений. Для отчётов используются виртуальные таблицы:
- `Остатки` → текущие остатки на момент запроса
- `Обороты` → суммы прихода/расхода за период
- `СрезПоследних` → последние записи по измерениям

Пример остатков на дату:
1c
ВЫБРАТЬ
Остатки.Номенклатура,
Остатки.КоличествоОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладе.Остатки(&НаДату, ) КАК Остатки

Параметр `&НаДату` критически важен: без него платформа вернёт остатки на текущий момент, что исказит исторические отчёты.

✅ Итог
Язык запросов 1С оптимизирован под работу с бизнес-логикой, а не с сырыми таблицами. Понимание принципов соединения, работы с индексами и виртуальными таблицами позволяет писать отчёты, которые выполняются за секунды, а не минуты. Регулярная практика чтения планов выполнения запросов (через `Консоль запросов`) ускоряет отладку в разы.

#1С #программирование #бизнес #студенты #автоматизация #удаленнаяработа
Язык запросов 1С для начинающих: структура, JOIN и типичные ошибки производительности  Запросы в 1С — это фундамент любой отчётности и обработки данных.
2 минуты