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