При разработке отчетов и обработок на платформе 1С:Предприятие 8 часто возникает необходимость получить данные из документа-регистратора, записавшего данные в регистр накопления или регистр сведений. Неправильное построение запроса может привести к серьезным проблемам с производительностью из-за генерации неявных левых соединений (Left Join) со всеми возможными типами регистраторов. В данной статье разберем правильный образец запроса к регистратору, основанный на лучших практиках сообщества и рекомендациях экспертов.
Проблема неявных соединений
Поле Регистратор в регистрах имеет составной тип (ссылается на множество таблиц документов). При прямом обращении к атрибуту регистратора через точку (например, Регистр.Регистратор.Контрагент) платформа вынуждена сгенерировать LEFT JOIN ко всем таблицам документов, которые могут выступать регистраторами для данного регистра.
- Это приводит к раздуванию плана запроса.
- Увеличивается время выполнения запроса.
- Снижается общая производительность системы при больших объемах данных.
Пример неоптимального кода:
ВЫБРАТЬ
Регистр.Регистратор.Контрагент КАК Контрагент
ИЗ
РегистрНакопления.НашРегистр КАК Регистр
ГДЕ
Регистр.Регистратор = &СсылкаНаДокумент Решение: Использование оператора ВЫРАЗИТЬ (CAST)
Профессиональное сообщество 1С (в частности, эксперты вроде * на курсах * и *) давно рекомендуют использовать оператор ВЫРАЗИТЬ для явного приведения типа регистратора к конкретному виду документа. Это позволяет платформе сделать только одно необходимое соединение (Inner Join) с таблицей конкретного документа.
Правильный образец запроса
ВЫБРАТЬ
ВЫРАЗИТЬ(НашРегистр.Регистратор КАК Документ.ПоступлениеТоваровУслуг).Контрагент КАК Контрагент
ИЗ
РегистрНакопления.НашРегистр КАК НашРегистр
ГДЕ
НашРегистр.Регистратор = &СсылкаНаДокумент Разбор синтаксиса
- ВЫРАЗИТЬ( … КАК Тип), оператор приведения типа. Он сообщает платформе: «Считай, что в этом поле лежит именно Документ.ПоступлениеТоваровУслуг».
- НашРегистр.Регистратор — поле составного типа.
- Документ.ПоступлениеТоваровУслуг — конкретный тип документа, атрибуты которого нам нужны (в данном случае
Контрагент). - После приведения типа мы спокойно обращаемся к атрибуту через точку:
.Контрагент.
Когда и какой документ указывать в CAST?
Важный нюанс: в запросе можно указать любой из возможных типов регистраторов, который гарантированно имеет нужный атрибут (в примере, Контрагент).
Если запрос отбирает записи по конкретному документу (в условии ГДЕ), то тип в ВЫРАЗИТЬ должен соответствовать типу этого документа. Если запрос выбирает записи сразу по нескольким документам разного типа, но у всех них есть общий реквизит (например, Контрагент), можно привести к любому из этих типов — результат будет корректным, а план запроса оптимальным.
Преимущества подхода
- Производительность: Исключаются лишние соединения с таблицами документов, которые не участвуют в выборке.
- Читаемость: Код явно показывает, с каким типом документа мы работаем в данном контексте.
- Поддержка: При добавлении новых регистраторов в регистр план запроса не будет меняться кардинально (не будет добавляться новые JOIN’ы автоматически).
Пример из практики (Форум Инфостарт)
На форуме Инфостарт (тема от , пользователь ) обсуждался именно этот прием. Участник указал, что на курсах * (или ) этот вариант называли «самым правильным».
«Самый правильный вариант (на курсах, кажись, (или *..) говорилось):
ВЫРАЗИТЬ(НашРегистр.Регистратор КАК Документ.ПоступлениеТоваровУслуг).Контрагент КАК Контрагент
При этом не появляются в запросе неявные ненужные левые соединения со всеми типами регистраторов.»
Данный подход подтвержден практикой и признан стандартом де-факто для профессиональной разработки на 1С.
Чек-лист: Как написать правильный запрос к регистратору
- Определите, из какого регистра выбираете данные.
- Определите, атрибут какого именно документа-регистратора вам нужен (реквизит, табличная часть).
- Используйте конструкцию
ВЫРАЗИТЬ(Регистр.Регистратор КАК Документ.ИмяДокумента). - Обращайтесь к нужному полю через точку после закрывающей скобки
ВЫРАЗИТЬ(...). - Проверьте план запроса (Консоль запросов -> План запроса) — должно быть только одно соединение (Join) с таблицей нужного документа.
Использование ВЫРАЗИТЬ при работе с полем Регистратор, это признак качественного кода 1С-разработчика. Это позволяет избежать скрытых проблем с производительностью, которые проявляются только на реальных базах с большими объемами данных. Всегда следуйте данному образцу при доступе к реквизитам регистратора в запросах.
Статья подготовлена на основе материалов форума Инфостарт от и лучших практик разработки на платформе 1С:Предприятие 8.