При разработке отчетов или обработок на платформе 1С часто возникает задача получить данные из РегистрНакопления, ограничив выборку только определенными типами документов-регистраторов. Поскольку поле Регистратор имеет составной тип данных, простой оператор В(&Массив) с массивом ссылок не всегда удобен или применим (особенно если нужно отобрать все документы конкретного вида, а не конкретные экземпляры). Давайте разберем наиболее эффективные способы решения этой задачи.
Это самый классический и интуитивно понятный способ. Оператор ССЫЛКА предназначен именно для проверки типа данных в запросе. Если количество типов документов небольшое, вы можете перечислить их в секции ГДЕ через логический оператор ИЛИ.
Рассмотрим пример реализации:
ВЫБРАТЬ
Регистр.Регистратор
ИЗ
РегистрНакопления.ВашРегистр КАК Регистр
ГДЕ
Регистр.Регистратор ССЫЛКА Документ.ПриходнаяНакладная
ИЛИ Регистр.Регистратор ССЫЛКА Документ.РасходнаяНакладная
ИЛИ Регистр.Регистратор ССЫЛКА Документ.ВозвратТоваров
Этот метод очень читаем, но стоит помнить: при большом количестве условий ИЛИ производительность запроса может снизиться, так как СУБД может потребоваться выполнить полное сканирование таблицы.
Более компактный и современный способ — это использование сравнения типов. Мы берем функцию ТИПЗНАЧЕНИЯ() для поля Регистратор и сравниваем её с перечнем типов, используя литерал ТИП(). Этот подход позволяет избежать множественных условий ИЛИ.
Пример реализации:
ВЫБРАТЬ
Регистр.Регистратор
ИЗ
РегистрНакопления.ВашРегистр КАК Регистр
ГДЕ
ТИПЗНАЧЕНИЯ(Регистр.Регистратор) В (
ТИП(Документ.ПриходнаяНакладная),
ТИП(Документ.РасходнаяНакладная),
ТИП(Документ.ВозвратТоваров)
)
Этот вариант считается оптимальным с точки зрения чистоты кода и легкости его восприятия. Конструкция В работает быстро и делает запрос гораздо более лаконичным, чем цепочка из ССЫЛКА ... ИЛИ.
Если логика отбора для разных типов документов требует добавления каких-то уникальных условий или вы хотите гарантированно разделить потоки данных, можно воспользоваться оператором ОБЪЕДИНИТЬ ВСЕ. Однако, стоит помнить, что это заставляет систему выполнять запрос несколько раз, что может быть избыточным.
Пример реализации:
ВЫБРАТЬ
Регистр.Регистратор
ИЗ
РегистрНакопления.ВашРегистр КАК Регистр
ГДЕ
Регистр.Регистратор ССЫЛКА Документ.ПриходнаяНакладная
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Регистр.Регистратор
ИЗ
РегистрНакопления.ВашРегистр КАК Регистр
ГДЕ
Регистр.Регистратор ССЫЛКА Документ.РасходнаяНакладная
Разбирая данные методы, важно учитывать следующие моменты:
ТИПЗНАЧЕНИЯ() В (...), так как это наиболее профессиональный и лаконичный стиль написания запросов в 1С.ИЛИ, так как они могут негативно влиять на план выполнения запроса в SQL.В(&МассивТипов) потребует, чтобы элементы массива были типами (полученными через функцию Тип() в коде 1С), а не ссылками.Подводя итог, можно сказать, что выбор метода зависит от конкретной задачи. Для стандартных отчетов лучше всего подходит Способ 2, который обеспечивает отличный баланс между производительностью и читаемостью кода. Помните, что чистота кода — это ключ к легкому сопровождению вашей конфигурации в будущем!