2 подписчика
Язык запросов 1С для начинающих: структура, JOIN и типичные ошибки производительности
Запросы в 1С — это фундамент любой отчётности и обработки данных. Несмотря на внешнее сходство с SQL, у языка запросов 1С есть своя специфика. Разберём базовые принципы и ловушки, в которые попадают новички.
🔹 Структура запроса
Минимальный рабочий запрос выглядит так:
ВЫБРАТЬ
Номенклатура.Наименование,
Номенклатура.Артикул
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ЭтоГруппа = ЛОЖЬ
Ключевое отличие от SQL: в 1С мы работаем с объектами метаданных (Справочник, Документ, Регистр), а не с таблицами БД напрямую.
🔹 Соединения: ЛЕВОЕ, ПРАВОЕ, ВНУТРЕННЕЕ
- ЛЕВОЕ → берём все записи из левой таблицы, даже если в правой нет совпадений (подставляем ПУСТО).
- ВНУТРЕННЕЕ → только строки, где есть совпадение в обеих таблицах.
- ПРАВОЕ → аналогично ЛЕВОМУ, но приоритет у правой таблицы.
Пример: список товаров + остатки на складах
1c
ВЫБРАТЬ
Товары.Наименование,
ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК Остаток
ИЗ
Справочник.Номенклатура КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки КАК Остатки
ПО Товары.Ссылка = Остатки.Номенклатура
🔹 Ошибка №1: Запросы внутри цикла
Самая частая причина «тормозов»:
1c
❌ ПЛОХО
Для каждого Элемента Из Выборка Цикл
Запрос = Новый Запрос("ВЫБРАТЬ ... ГДЕ Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", Элемент.Ссылка);
Результат = Запрос.Выполнить();
КонецЦикла;
Каждая итерация = новый запрос к СУБД. При 1000 элементах это 1000 обращений к диску.
✅ Правильно один запрос с условием `В (&СписокСсылок)` или объединение через `ОБЪЕДИНИТЬ ВСЕ`.
🔹 Ошибка №2: Игнорирование индексов
1С автоматически создаёт индексы по основным полям (Ссылка, Код, Наименование). Но если вы фильтруете по реквизиту без индекса (`ГДЕ ДополнительныйРеквизит = ...`), платформа выполнит полное сканирование таблицы.
Проверить индексы можно в конфигураторе: свойства объекта → закладка «Индексы». Добавляйте индексы только на часто фильтруемые поля — избыток индексов замедляет запись.
🔹 Виртуальные таблицы регистров
Регистры накопления и сведений хранят данные в виде движений. Для отчётов используются виртуальные таблицы:
- `Остатки` → текущие остатки на момент запроса
- `Обороты` → суммы прихода/расхода за период
- `СрезПоследних` → последние записи по измерениям
Пример остатков на дату:
1c
ВЫБРАТЬ
Остатки.Номенклатура,
Остатки.КоличествоОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладе.Остатки(&НаДату, ) КАК Остатки
Параметр `&НаДату` критически важен: без него платформа вернёт остатки на текущий момент, что исказит исторические отчёты.
✅ Итог
Язык запросов 1С оптимизирован под работу с бизнес-логикой, а не с сырыми таблицами. Понимание принципов соединения, работы с индексами и виртуальными таблицами позволяет писать отчёты, которые выполняются за секунды, а не минуты. Регулярная практика чтения планов выполнения запросов (через `Консоль запросов`) ускоряет отладку в разы.
#1С #программирование #бизнес #студенты #автоматизация #удаленнаяработа
2 минуты
10 апреля