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

Ситуация усложняется тем, что в языке запросов отсутствует прямое ключевое слово для проверки типа объекта в конструкции WHERE, как это может быть интуитивно понятно новичкам. Вместо этого используется специальный оператор ТИПЗНАЧЕНИЯ и конструкция ОПРЕДЕЛЕНИЕ ТИПА. Понимание механизма работы этих операторов критически важно для написания производительного кода.

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

Синтаксис оператора ТИПЗНАЧЕНИЯ

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

Сравнение происходит с использованием ключевого слова ЕСТЬ В или знака равенства, в зависимости от того, проверяем ли мы точное совпадение или вхождение в группу типов. Базовый синтаксис выглядит следующим образом:

ВЫБРАТЬ

Ссылка

ИЗ

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

ГДЕ

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

Обратите внимание, что тип указывается в виде строки внутри функции ТИП. Это позволяет движку запросов корректно интерпретировать мета-данные конфигурации. Использование строкового представления типа является стандартом для платформы 1С:Предприятие 8.

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

Использование конструкции ОПРЕДЕЛЕНИЕ ТИПА

Альтернативным и часто более читаемым способом фильтрации является использование конструкции ОПРЕДЕЛЕНИЕ ТИПА. Этот оператор позволяет явно указать, к какому типу должно относиться значение поля, и отсечь все остальные записи на уровне двигателя базы данных.

Синтаксис ОПРЕДЕЛЕНИЕ ТИПА позволяет проверить, является ли значение экземпляром указанного типа или его наследником. Это особенно удобно, когда в базе данных используется наследование объектов или когда нужно охватить группу схожих документов.

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

ВЫБРАТЬ

Ссылка,

Номер

ИЗ

Документ.ВсяДокументация КАК Док

ГДЕ

Док.Ссылка ЕСТЬ В ОПРЕДЕЛЕНИЕ ТИПА (ДокументСсылка.Накладная)

Конструкция ЕСТЬ В ОПРЕДЕЛЕНИЕ ТИПА работает быстрее ручного перебора в коде, так как фильтрация происходит на стороне СУБД. Это снижает нагрузку на сервер приложений и уменьшает объем передаваемых данных.

⚠️ Внимание: Конструкция ОПРЕДЕЛЕНИЕ ТИПА чувствительна к иерархии. Если вы укажете базовый тип, в выборку попадут все наследники. Для строгой фильтрации используйте точное имя типа документа.

Если поле может хранить разные типы данных, оператор корректно обработает только те записи, где тип совпадает с указанным.

📊 Какой способ фильтрации вы используете чаще?
ТИПЗНАЧЕНИЯ = ТИП
ЕСТЬ В ОПРЕДЕЛЕНИЕ ТИПА
Фильтрация в коде 1С
Не использую фильтрацию по типу

Работа с составными типами данных

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

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

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

  • 📄 Используйте ТИПЗНАЧЕНИЯ для строгой проверки перед обращением к реквизитам.
  • 📄 Применяйте ОПРЕДЕЛЕНИЕ ТИПА для оптимизации выборки на уровне SQL.
  • 📄 Избегайте приведения типов в коде 1С, если это можно сделать в запросе.

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

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

Сравнение точного типа и иерархии

Разработчики часто путаются в вопросах наследования типов в 1С. Платформа поддерживает иерархию, где, например, ДокументСсылка является родителем для ДокументСсылка.СчетФактура.

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

В то же время, оператор ЕСТЬ В учитывает иерархию. Если вы проверяете вхождение в базовый тип ДокументСсылка, то все конкретные документы будут удовлетворять условию.

Оператор Учитывает наследование Производительность Сценарий использования
= ТИП(..) Нет Высокая Строгая фильтрация одного вида
ЕСТЬ В.. Да Высокая Групповая выборка по родителю
ТИПЗНАЧЕНИЯ.Вид Нет Средняя Динамический анализ типов
Проверка в коде Да Низкая Сложная бизнес-логика

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

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

💡

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

Оптимизация производительности запросов

Фильтрация по типу документа является одним из самых эффективных способов оптимизации запросов в 1С. Движок системы умеет преобразовывать такие условия в эффективные SQL-выражения, которые используют индексы таблиц базы данных.

Когда вы используете ОПРЕДЕЛЕНИЕ ТИПА, сервер 1С передает в СУБД условие, которое позволяет отсеять ненужные записи до того, как они будут загружены в оперативную память. Это экономит ресурсы сервера приложений.

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

⚠️ Внимание: Избегайте использования функций над полями в условии ГДЕ, если это возможно. Однако ТИПЗНАЧЕНИЯ является исключением, так как оно оптимизировано платформой.

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

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

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

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

Частые ошибки и способы их решения

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

Еще одна распространенная проблема — неверное указание имени типа. Имя типа должно точно соответствовать синониму или имени объекта в метаданных, с учетом регистра и префиксов (например, ДокументСсылка, а не просто Документ).

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

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

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

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

Почему запрос возвращает пустую таблицу?

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

Практические примеры кода

Рассмотрим реальный пример задачи: необходимо получить список всех движений регистра продаж, где документом-основанием является именно ЧекККМ, игнорируя ЗаказКлиента.

ВЫБРАТЬ

Продажи.Период,

Продажи.Номенклатура,

Продажи.Количество

ИЗ

РегистрНакопления.Продажи КАК Продажи

ГДЕ

Продажи.ДокументДвижения ЕСТЬ В ОПРЕДЕЛЕНИЕ ТИПА (ДокументСсылка.ЧекККМ)

В этом примере мы гарантируем, что в выборку попадут только строки, сформированные кассовыми чеками. Это упрощает дальнейшую обработку данных в отчете.

Другой пример — получение списка документов из общей таблицы истории, где нужно отобрать только накладные:

ВЫБРАТЬ

История.Ссылка,

История.Дата

ИЗ

Таблица.ИсторияДокументов КАК История

ГДЕ

ТИПЗНАЧЕНИЯ(История.Ссылка) = ТИП("ДокументСсылка.Накладная")

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

💡

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

В чем разница между ТИПЗНАЧЕНИЯ и ОПРЕДЕЛЕНИЕ ТИПА?

ТИПЗНАЧЕНИЯ возвращает объект описания типа, который можно сравнивать на равенство. ОПРЕДЕЛЕНИЕ ТИПА — это синтаксическая конструкция языка запросов, которая проверяет вхождение типа с учетом иерархии наследования. Вторая конструкция часто предпочтительнее для чтения кода.

Можно ли использовать переменные в условии проверки типа?

Да, в запрос можно передать параметр, содержащий описание типа (объект ОписаниеТипов или строку имени типа), и использовать его в условии ГДЕ. Это позволяет делать запросы универсальными.

Как проверить тип в произвольном запросе через консоль?

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

Почему фильтр по типу не работает для ХранилищаЗначения?

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

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

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