Образец запроса регистратору

Не теряйте время на составление документов с нуля. Идеальный образец запроса регистратору в Word и PDF — заполните, распечатайте и подайте без ошибок и отказов.

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

При разработке отчетов и обработок на платформе 1С:Предприятие 8 часто возникает необходимость получить данные из документа-регистратора, записавшего данные в регистр накопления или регистр сведений. Неправильное построение запроса может привести к серьезным проблемам с производительностью из-за генерации неявных левых соединений (Left Join) со всеми возможными типами регистраторов. В данной статье разберем правильный образец запроса к регистратору, основанный на лучших практиках сообщества и рекомендациях экспертов.

Проблема неявных соединений

Поле Регистратор в регистрах имеет составной тип (ссылается на множество таблиц документов). При прямом обращении к атрибуту регистратора через точку (например, Регистр.Регистратор.Контрагент) платформа вынуждена сгенерировать LEFT JOIN ко всем таблицам документов, которые могут выступать регистраторами для данного регистра.

  • Это приводит к раздуванию плана запроса.
  • Увеличивается время выполнения запроса.
  • Снижается общая производительность системы при больших объемах данных.

Пример неоптимального кода:

ВЫБРАТЬ
 Регистр.Регистратор.Контрагент КАК Контрагент
ИЗ
 РегистрНакопления.НашРегистр КАК Регистр
ГДЕ
 Регистр.Регистратор = &СсылкаНаДокумент

Решение: Использование оператора ВЫРАЗИТЬ (CAST)

Профессиональное сообщество 1С (в частности, эксперты вроде * на курсах * и *) давно рекомендуют использовать оператор ВЫРАЗИТЬ для явного приведения типа регистратора к конкретному виду документа. Это позволяет платформе сделать только одно необходимое соединение (Inner Join) с таблицей конкретного документа.

Правильный образец запроса

ВЫБРАТЬ
 ВЫРАЗИТЬ(НашРегистр.Регистратор КАК Документ.ПоступлениеТоваровУслуг).Контрагент КАК Контрагент
ИЗ
 РегистрНакопления.НашРегистр КАК НашРегистр
ГДЕ
 НашРегистр.Регистратор = &СсылкаНаДокумент

Разбор синтаксиса

  1. ВЫРАЗИТЬ( … КАК Тип), оператор приведения типа. Он сообщает платформе: «Считай, что в этом поле лежит именно Документ.ПоступлениеТоваровУслуг».
  2. НашРегистр.Регистратор — поле составного типа.
  3. Документ.ПоступлениеТоваровУслуг — конкретный тип документа, атрибуты которого нам нужны (в данном случае Контрагент).
  4. После приведения типа мы спокойно обращаемся к атрибуту через точку: .Контрагент.

Когда и какой документ указывать в CAST?

Важный нюанс: в запросе можно указать любой из возможных типов регистраторов, который гарантированно имеет нужный атрибут (в примере, Контрагент).

Если запрос отбирает записи по конкретному документу (в условии ГДЕ), то тип в ВЫРАЗИТЬ должен соответствовать типу этого документа. Если запрос выбирает записи сразу по нескольким документам разного типа, но у всех них есть общий реквизит (например, Контрагент), можно привести к любому из этих типов — результат будет корректным, а план запроса оптимальным.

Преимущества подхода

  • Производительность: Исключаются лишние соединения с таблицами документов, которые не участвуют в выборке.
  • Читаемость: Код явно показывает, с каким типом документа мы работаем в данном контексте.
  • Поддержка: При добавлении новых регистраторов в регистр план запроса не будет меняться кардинально (не будет добавляться новые JOIN’ы автоматически).

Пример из практики (Форум Инфостарт)

На форуме Инфостарт (тема от , пользователь ) обсуждался именно этот прием. Участник указал, что на курсах * (или ) этот вариант называли «самым правильным».

«Самый правильный вариант (на курсах, кажись, (или *..) говорилось):
ВЫРАЗИТЬ(НашРегистр.Регистратор КАК Документ.ПоступлениеТоваровУслуг).Контрагент КАК Контрагент
При этом не появляются в запросе неявные ненужные левые соединения со всеми типами регистраторов.»

Данный подход подтвержден практикой и признан стандартом де-факто для профессиональной разработки на 1С.

Чек-лист: Как написать правильный запрос к регистратору

  1. Определите, из какого регистра выбираете данные.
  2. Определите, атрибут какого именно документа-регистратора вам нужен (реквизит, табличная часть).
  3. Используйте конструкцию ВЫРАЗИТЬ(Регистр.Регистратор КАК Документ.ИмяДокумента).
  4. Обращайтесь к нужному полю через точку после закрывающей скобки ВЫРАЗИТЬ(...).
  5. Проверьте план запроса (Консоль запросов -> План запроса) — должно быть только одно соединение (Join) с таблицей нужного документа.

Использование ВЫРАЗИТЬ при работе с полем Регистратор, это признак качественного кода 1С-разработчика. Это позволяет избежать скрытых проблем с производительностью, которые проявляются только на реальных базах с большими объемами данных. Всегда следуйте данному образцу при доступе к реквизитам регистратора в запросах.


Статья подготовлена на основе материалов форума Инфостарт от и лучших практик разработки на платформе 1С:Предприятие 8.