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

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

Рассмотрим детально синтаксические конструкции и лучшие практики, которые позволят вам писать эффективный и безопасный код. Понимание различий между ссылкой на объект и его представлением в регистрах — ключ к оптимизации производительности вашей конфигурации.

Базовый синтаксис фильтрации по типу документа

Самый простой и распространенный способ отфильтровать документы определенного вида — использование оператора ВИД в секции ГДЕ. Этот оператор позволяет сравнивать тип значения поля со значением перечисления или конкретной ссылкой. При этом важно понимать, что поле Ссылка в таблице документов содержит уникальный идентификатор, тип которого определяет вид документа.

Если вы обращаетесь напрямую к таблице конкретного документа, например, Документ.РеализацияТоваровУслуг, то явное указание вида часто избыточно, так как таблица уже содержит только этот тип. Однако, при работе с объединенными выборками или общими таблицами, такая проверка становится обязательной.

Для динамического определения типа в коде используется конструкция ТИПЗНАЧЕНИЯ. Она позволяет получить тип объекта программно и использовать его в тексте запроса через параметр. Это делает код более гибким и независимым от жесткой привязки к конкретным метаданным.

Пример правильного использования оператора для фильтрации:

ВЫБРАТЬ

РеализацияТоваровУслуг.Ссылка,

РеализацияТоваровУслуг.Дата,

РеализацияТоваровУслуг.Контрагент

ИЗ

Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

ГДЕ

ВИД(РеализацияТоваровУслуг.Ссылка) = ТИПЗНАЧЕНИЯ(ДокументСсылка.РеализацияТоваровУслуг)

💡

Использование оператора ВИД в условии WHERE может предотвратить использование индексов в некоторых старых версиях платформы, поэтому для высоконагруженных систем предпочтительнее явное сравнение типов или работа с конкретными таблицами.

Обратите внимание, что сравнение типа значения требует аккуратности. Если в условии указать неверный тип, запрос вернет пустую выборку, но не выдаст ошибку выполнения. Это может стать скрытой причиной некорректной работы отчетов в продакшене.

Работа с виртуальными таблицами регистров

Наиболее частая ситуация, требующая указания вида документа, возникает при выборке данных из регистров накопления или сведений. В таблицах движений регистров поле Регистратор хранит ссылку на документ, который вызвал это движение. Именно здесь фильтрация по виду становится критической для производительности.

При обращении к виртуальной таблице, например, РегистрНакопления.ТоварыНаСкладах.Остатки, система автоматически подставляет условия отбора. Однако, если вам нужны движения за период, сформированные строго определенным документом, необходимо добавить условие по полю Регистратор.

Использование оператора ВИД непосредственно в запросе к виртуальной таблице может быть неоптимальным. Платформа 1С рекомендует использовать параметры запроса для передачи типа документа. Это позволяет движку запросов построить более эффективный план выполнения.

Рассмотрим пример выборки остатков, сформированных только приходными ордерами:

ВЫБРАТЬ

ТоварыНаСкладахОстатки.Номенклатура,

ТоварыНаСкладахОстатки.КоличествоОстаток

ИЗ

РегистрНакопления.ТоварыНаСкладах.ОстатКИ(,,, Склад = &Склад) КАК ТоварыНаСкладахОстатки

ГДЕ

ВИД(ТоварыНаСкладахОстатки.Регистратор) = ТИПЗНАЧЕНИЯ(ДокументСсылка.ПриходныйОрдерТоваров)

☑️ Оптимизация запроса к регистру

Выполнено: 0 / 4

Убедитесь, что фильтр по виду документа не конфликтует с другими условиями отбора по периодам или измерениям регистра.

Использование параметров запроса для гибкости

Жесткая прописка типов документов в тексте запроса снижает переиспользуемость кода. Гораздо профессиональнее передавать необходимый вид документа через параметры. Это позволяет одной и той же функции обработки работать с разными видами документов в зависимости от переданных аргументов.

В коде встроенной процедуры или функции вы создаете объект запроса, устанавливаете значение параметра и затем выполняете его. Значением параметра в данном случае будет не сам документ, а его тип.

Пример установки параметра в коде 1С:

Запрос = Новый Запрос;

Запрос.Текст ="ВЫБРАТЬ.. ГДЕ ВИД(Таблица.Регистратор) = &ВидДокумента";

Запрос.УстановитьПараметр("ВидДокумента", ТипЗнч(ДокументСсылка.ЗаказКлиента));

Результат = Запрос.Выполнить;

Почему параметры лучше констант?

Использование параметров позволяет платформе кэшировать план выполнения запроса. При изменении текста запроса (даже замене значения в кавычках) план может перестраиваться, чтоет ресурсы сервера.

Такой подход особенно полезен в общих модулях, где одна процедура может обрабатывать документы движения товаров, денег или взаиморасчетов. Вы просто передаете нужный тип, и логика фильтрации работает универсально.

При передаче параметра убедитесь, что тип значения действительно соответствует типу ссылки на документ. Передача строкового представления типа приведет к ошибке выполнения запроса.

Сравнение ссылок и типизированных значений

Иногда разработчики пытаются фильтровать документы, сравнивая поле Регистратор со ссылкой на конкретный пустой документ-шаблон. Этот метод работает, но он менее производителен и более громоздок, чем использование оператора ВИД.

Сравнение ссылок требует, чтобы в базе существовал хотя бы один документ такого вида для создания эталонного объекта. Оператор же ВИД работает на уровне метаданных и не зависит от наличия конкретных записей в базе данных.

Ниже приведена таблица, сравнивающая различные подходы к фильтрации по виду документа в разных контекстах:

Метод фильтрации Производительность Читаемость кода Рекомендуемая область
Оператор ВИД Высокая Отличная Запросы к регистрам и общим таблицам
Сравнение с Новый ссылкой Средняя Низкая Устаревший код, специфические случаи
Выборка из конкретной таблицы Максимальная Высокая Работа с данными одного вида документа
Фильтрация в СКД (Система Компоновки Данных) Зависит от настроек Средняя Пользовательские отчеты
💡

Оператор ВИД является стандартом де-факто для фильтрации по типу объекта в запросах 1С благодаря балансу между производительностью и удобством чтения кода.

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

Особенности работы в СКД и пользовательских отчетах

При разработке отчетов с использованием Системы Компоновки Данных (СКД), вопрос фильтрации по виду документа решается на уровне настроек схемы запроса. Пользователь или разработчик отчета может добавить отбор по полю ВидДокумента или использовать предопределенные настройки.

В схеме запроса СКД часто используется автоматическое заполнение полей. Если вы добавляете поле Регистратор из регистра, СКД может автоматически предложить доступные виды документов для отбора. Это упрощает создание отчетов для конечных пользователей без глубоких знаний программирования.

Однако, если отчет должен работать строго с одним видом документа, лучше всего ограничить основной запрос на этапе формирования схемы. Это уменьшит объем передаваемых данных и ускорит компоновку результата.

📊 Как вы чаще всего фильтруете документы в отчетах?
Через оператор ВИД в запросе
Через отбор в настройках СКД
Программно перед выводом
Использую конкретные таблицы документов

Помните, что сложные условия отбора в СКД могут генерировать громоздкий SQL-код. Простая фильтрация по виду документа в тексте запроса схемы часто оказывается эффективнее, чем наложение множества условий в режиме пользователя.

Типичные ошибки и способы их устранения

Одной из самых распространенных ошибок является попытка использовать оператор ВИД к полям, которые не являются ссылками на объекты. Например, применение его к строковым полям или числам вызовет ошибку синтаксиса на этапе проверки запроса.

Также часто встречается ошибка, когда разработчик забывает, что в регистрах сведений поле периода может влиять на актуальность данных, и фильтрация только по виду документа без учета времени может выдать устаревшую информацию.

⚠️ Внимание: При использовании оператора ВИД убедитесь, что поле, к которому он применяется, действительно имеет тип"Ссылка". Применение к составным типам, где ссылка является лишь одним из возможных вариантов, требует дополнительной проверки через функцию ЕСТЬNULL или приведение типов.

Еще одна проблема возникает при обновлении конфигурации. Если вид документа был переименован или удален, жестко прописанные в запросах типы могут привести к ошибкам выполнения. Использование параметров и динамических типов смягчает эту проблему.

⚠️ Внимание: Если ваша конфигурация часто обновляется или является типовой, избегайте хардкода имен документов в текстах запросов внутри общих модулей. Используйте предопределенные элементы метаданных или параметры.

Для отладки сложных запросов используйте консоль запросов. Она позволяет визуально проверить, какие именно записи попадают в выборку при различных условиях фильтрации по виду документа.

Часто задаваемые вопросы

Можно ли использовать оператор ВИД для фильтрации по виду элемента справочника?

Да, оператор ВИД универсален и работает для любых объектов, имеющих тип"Ссылка". Вы можете фильтровать элементы справочников, планы счетов, виды расчетов и другие объекты метаданных аналогичным образом, используя конструкцию ВИД(Ссылка) = ТИПЗНАЧЕНИЯ(..).

Влияет ли фильтрация по виду документа на использование индексов?

Да, влияет. Современные версии платформы 1С оптимизируют запросы с оператором ВИД, используя специальные индексы по типу ссылки. Однако, если в условии используются сложные выражения или функции над полем, индекс может не сработать, что приведет к полному сканированию таблицы.

Как получить список всех видов документов, доступных в базе, через запрос?

Прямого системного таблицы со списком всех видов документов для запроса нет. Обычно для этого используют перебор объектов метаданных в коде или виртуальную таблицу ИнформацияОМетаданных, хотя последняя содержит больше технической информации, чем просто список документов для выборки данных.

Что делать, если запрос с ВИД работает медленно на большой базе?

Попробуйте заменить фильтрацию по виртуальной таблице регистра на выборку из конкретной таблицы движений с явным указанием периода. Также проверьте, не блокируется ли запрос транзакциями других пользователей, и рассмотрите возможность использования временных таблиц для промежуточной обработки.