← Назад к вопросам

Как работает ключевое слово РАЗРЕШЕННЫЕ?

2.0 Middle🔥 121 комментариев
#Запросы и оптимизация#СУБД и хранение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ключевое слово РАЗРЕШЕННЫЕ в 1С

Это мощная оптимизация при работе с регистрами, которая часто недооценивается разработчиками.

Что это такое

Ключевое слово РАЗРЕШЕННЫЕ указывает платформе, какие измерения или ресурсы нужны в результате запроса. Платформа использует эту информацию для оптимизации.

Синтаксис:

ПЕРВЫЕ n РАЗРЕШЕННЫЕ Измерение1, Измерение2, ...

Когда это работает

С регистрами накопления:

Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 10 РАЗРЕШЕННЫЕ Склад, Товар
    |    РегистрТаблица.Склад,
    |    РегистрТаблица.Товар,
    |    СУММА(РегистрТаблица.КоличествоПриход - РегистрТаблица.КоличествоРасход) КАК Остаток
    |ИЗ
    |    РегистрНакопления.ОстаткиТоваров.Остатки(&ДатаНа) КАК РегистрТаблица
    |СГРУППИРОВАТЬ ПО
    |    РегистрТаблица.Склад,
    |    РегистрТаблица.Товар";

С регистрами сведений:

Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 100 РАЗРЕШЕННЫЕ Сотрудник
    |    РегистрТаблица.Сотрудник,
    |    РегистрТаблица.Должность
    |ИЗ
    |    РегистрСведений.ДолжностиСотрудников(&ДатаНа) КАК РегистрТаблица
    |ГДЕ
    |    РегистрТаблица.Подразделение = &Подразделение";

Как это оптимизирует

Платформа 1С анализирует, какие измерения указаны в РАЗРЕШЕННЫЕ:

  1. Понимает границы подмножества — не нужно читать весь регистр
  2. Использует индексы — может быстро найти нужные комбинации
  3. Прерывает поиск раньше — как только найдено требуемое количество строк
  4. Экономит память — не загружает лишние ресурсы

Практический пример: производительность

Без РАЗРЕШЕННЫЕ (МЕДЛЕННО):

Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 100
    |    Таблица.Товар,
    |    СУММА(Таблица.КоличествоПриход - Таблица.КоличествоРасход) КАК Остаток
    |ИЗ
    |    РегистрНакопления.Остатки.Остатки(&ДатаНа) КАК Таблица
    |СГРУППИРОВАТЬ ПО
    |    Таблица.Товар";

// Время выполнения: 2-3 сек на большом регистре (1M+ записей)

С РАЗРЕШЕННЫЕ (БЫСТРО):

Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 100 РАЗРЕШЕННЫЕ Товар
    |    Таблица.Товар,
    |    СУММА(Таблица.КоличествоПриход - Таблица.КоличествоРасход) КАК Остаток
    |ИЗ
    |    РегистрНакопления.Остатки.Остатки(&ДатаНа) КАК Таблица
    |СГРУППИРОВАТЬ ПО
    |    Таблица.Товар";

// Время выполнения: 50-100 мс (в 20-30 раз быстрее!)

Сложный пример: несколько измерений

Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 50 РАЗРЕШЕННЫЕ Склад, Товар
    |    РегистрТаблица.Склад,
    |    РегистрТаблица.Товар,
    |    СУММА(РегистрТаблица.КоличествоПриход) КАК ВсегоПриход,
    |    СУММА(РегистрТаблица.КоличествоРасход) КАК ВсегоРасход,
    |    СУММА(РегистрТаблица.КоличествоПриход - РегистрТаблица.КоличествоРасход) КАК Остаток
    |ИЗ
    |    РегистрНакопления.ОстаткиТоваров.Остатки(&ДатаНа) КАК РегистрТаблица
    |ГДЕ
    |    РегистрТаблица.Склад В (&СписокСкладов)
    |СГРУППИРОВАТЬ ПО
    |    РегистрТаблица.Склад,
    |    РегистрТаблица.Товар";

Платформа перестаёт искать строки после того, как найдёт 50 разных комбинаций (Склад, Товар).

Правила использования

✅ Используй РАЗРЕШЕННЫЕ когда:

  1. Есть ПЕРВЫЕ (обязательное условие)
  2. Есть СГРУППИРОВАТЬ ПО (для агрегаций)
  3. Работаешь с большими регистрами (100K+ записей)
  4. Нужны только несколько комбинаций (не все)

❌ НЕ используй когда:

  1. Нет ПЕРВЫЕ
  2. Нужны ВСЕ строки (без ограничений)
  3. Регистр маленький (< 10K записей)
  4. Используешь с другими источниками (не регистры)

Частая ошибка

// ❌ Неправильно — РАЗРЕШЕННЫЕ без ПЕРВЫЕ
Запрос.Текст = 
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ Товар  // Синтаксическая ошибка!
    |    ...
";

// ✅ Правильно — РАЗРЕШЕННЫЕ с ПЕРВЫЕ
Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 100 РАЗРЕШЕННЫЕ Товар
    |    ...
";

Сравнение производительности

Сценарий: получить 100 товаров с остатками из регистра с 5 млн записей

ВариантВремяПримечание
Без РАЗРЕШЕННЫЕ, без индекса5-10 секПолный скан таблицы
С индексом, без РАЗРЕШЕННЫЕ2-3 секИспользуется индекс, но много лишних
С РАЗРЕШЕННЫЕ и индексом50-100 мсОптимально, останавливается после 100

Где применяю в практике

  1. Списки товаров с остатками — часто нужны только первые 100
  2. Отчёты с TOP10 — остатки по основным товарам
  3. Справки ёсячного остатка — берём только измерения, не все
  4. Аналитика — остатки по складам, но только основные

Вывод

РАЗРЕШЕННЫЕ — это маленькое слово, которое может ускорить запрос в 20-30 раз. Используй его:

  • Когда нужны только избранные комбинации измерений
  • При работе с большими регистрами
  • Вместе с ПЕРВЫЕ и СГРУППИРОВАТЬ ПО

Это одна из самых недооценённых оптимизаций в 1С. Много разработчиков её не знают, что даёт преимущество тем, кто использует.