Работа с документами в 1С:Предприятие — одна из самых востребованных задач при разработке отчётов, обработок и интеграционных решений. Однако даже опытные программисты иногда сталкиваются с трудностями при необходимости задать конкретный вид документа в запросе. Почему это важно? Потому что неправильно указанный вид может привести к ошибкам выполнения, лишним данным в выборке или даже падению производительности при работе с большими объёмами.
В этой статье мы разберём все актуальные способы фильтрации документов по виду — от простого синтаксиса ВИДДОКУМЕНТА() до сложных конструкций с присоединением таблиц и использованием параметров. Особое внимание уделим типичным ошибкам, которые допускают разработчики, и покажем, как их избежать. Материал будет полезен как новичкам, так и тем, кто хочет оптимизировать существующие запросы.
Все примеры приведены для актуальных версий платформы 1С:Предприятие 8.3 и проверены на конфигурациях Управление торговлей 11, Бухгалтерия предприятия 3.0 и Зарплата и управление персоналом 3.1. Если вы работаете с другой конфигурацией, принципы останутся теми же, но названия видов документов могут отличаться.
1. Базовый синтаксис: функция ВИДДОКУМЕНТА()
Самый простой и распространённый способ указать вид документа в запросе — использовать встроенную функцию ВИДДОКУМЕНТА(). Она позволяет отфильтровать документы по их метаданным без необходимости присоединять дополнительные таблицы.
Пример базового запроса, который выбирает все документы вида РеализацияТоваровУслуг:
ВЫБРАТЬ
РеализацияТоваровУслуг.Ссылка КАК Ссылка,
РеализацияТоваровУслуг.Дата КАК Дата,
РеализацияТоваровУслуг.Номер КАК Номер
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
ВИДДОКУМЕНТА(РеализацияТоваровУслуг.Ссылка) = ВИД("Документ.РеализацияТоваровУслуг")
Обратите внимание на ключевые моменты:
- 📌 Функция
ВИДДОКУМЕНТА()принимает в качестве аргумента ссылку на документ и возвращает его метаданные. - 🔍 Для сравнения используется функция
ВИД(), которая преобразует строку с именем вида документа в соответствующий объект метаданных. - ⚡ Этот метод работает во всех конфигурациях на базе 1С:Предприятие 8.3, но может отличаться производительностью в зависимости от объёма данных.
⚠️ Внимание: Если в вашей конфигурации есть документы с одинаковыми именами в разных подсистемах (например, ЗаказПокупателя в торговле и производстве), всегда уточняйте полное имя вида, включая пространство имён: ВИД("Документ.Торговля.ЗаказПокупателя").
2. Альтернативные способы: фильтрация по ссылке и присоединение таблиц
Функция ВИДДОКУМЕНТА() удобна, но не всегда оптимальна. Рассмотрим альтернативные подходы, которые могут быть полезны в специфических сценариях.
2.1. Фильтрация по префиксу ссылки
Каждый документ в 1С имеет уникальную ссылку, которая включает префикс вида. Например, ссылка на документ ПоступлениеТоваров может выглядеть так: Документ.ПоступлениеТоваров.000000001. Это позволяет фильтровать документы по подстроке:
ВЫБРАТЬ
Документы.Ссылка КАК Ссылка
ИЗ
Документ.Ссылка КАК Документы
ГДЕ
СТРНАЧИНАЕТСЯ(Документы.Ссылка.УникальныйИдентификатор(), "Документ.ПоступлениеТоваров.")
Этот метод не рекомендуется для производственного кода, так как:
- 🔄 Он зависит от внутренней структуры ссылок, которая может измениться в новых версиях платформы.
- 🐢 Работает медленнее, чем
ВИДДОКУМЕНТА(), из-за необходимости анализировать строки. - 🚫 Не учитывает наследуемые виды документов (например, если у вас есть расширение стандартного документа).
2.2. Присоединение таблицы видов документов
Для сложных запросов, где нужно получить дополнительные атрибуты вида (например, имя на разных языках или признаки подсистемы), можно присоединить таблицу ВидДокумента:
ВЫБРАТЬ
Документы.Ссылка КАК Ссылка,
ВидыДокументов.Наименование КАК ВидДокумента
ИЗ
Документ.Ссылка КАК Документы
ЛЕВОЕ СОЕДИНЕНИЕ ВидДокумента КАК ВидыДокументов
ПО Документы.Вид = ВидыДокументов.Ссылка
ГДЕ
ВидыДокументов.Наименование = "РеализацияТоваровУслуг"
Такой подход полезен, если:
- 📊 Вам нужны дополнительные поля вида документа (например,
ПометкаУдаленияилиПредупреждениеОбУдалении). - 🔄 Вы работаете с динамическими видами документов, которые могут изменяться в процессе выполнения запроса.
- 🛠️ Требуется отладка или анализ структуры документов в базе.
3. Работа с параметрами: динамический выбор вида документа
В реальных задачах часто требуется динамически задавать вид документа в запросе — например, при создании универсальных отчётов или обработок. Для этого используются параметры запроса.
Пример запроса с параметром &ВидДокумента:
ВЫБРАТЬ
Документы.Ссылка КАК Ссылка,
Документы.Дата КАК Дата
ИЗ
Документ.Ссылка КАК Документы
ГДЕ
ВИДДОКУМЕНТА(Документы.Ссылка) = &ВидДокумента
Чтобы передать значение параметра из кода 1С, используйте следующий синтаксис:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ... ГДЕ ВИДДОКУМЕНТА(...) = &ВидДокумента";
Запрос.УстановитьПараметр("ВидДокумента", ВидДокумента.РеализацияТоваровУслуг);
Результат = Запрос.Выполнить();
Важные нюансы:
- 🔑 Параметр
&ВидДокументадолжен иметь типВидДокумента, а не строку. Иначе сравнение не сработает. - 📌 Если вид документа передаётся извне (например, из формы отчёта), предварительно преобразуйте его с помощью функции
ВИД():
Запрос.УстановитьПараметр("ВидДокумента", ВИД(ИмяВидаДокументаИзФормы));
Дата или Номер) в условии ГДЕ.Убедиться, что параметр имеет тип ВидДокумента|Проверить наличие документа данного вида в базе|Ограничить период выборки по дате|Протестировать запрос на небольшом объёме данных-->
4. Типичные ошибки и как их избежать
Даже опытные разработчики иногда допускают ошибки при работе с видами документов в запросах. Разберём самые распространённые из них и способы их решения.
4.1. Ошибка: "Неопределённое имя вида документа"
Эта ошибка возникает, когда вы пытаетесь использовать функцию ВИД() с несуществующим именем документа. Например:
ГДЕ ВИДДОКУМЕНТА(Документ.Ссылка) = ВИД("Документ.НесуществующийДокумент")
Как исправить:
- 🔍 Проверьте точное имя вида документа в конфигураторе (раздел
Объекты → Документы). - 📝 Учитывайте регистр:
РеализацияТоваровУслугиреализациятоваровуслуг— разные вещи. - 🛠️ Если документ принадлежит подсистеме, укажите полный путь:
ВИД("Документ.Торговля.ЗаказПокупателя").
4.2. Ошибка: "Некорректное сравнение типов"
Эта ошибка появляется, когда вы сравниваете ВидДокумента со строкой или другим несовместимым типом. Например:
ГДЕ ВИДДОКУМЕНТА(Документ.Ссылка) = "РеализацияТоваровУслуг" // Ошибка!
Решение:
ГДЕ ВИДДОКУМЕНТА(Документ.Ссылка) = ВИД("Документ.РеализацияТоваровУслуг") // Правильно
4.3. Ошибка: медленное выполнение запроса
Если запрос с ВИДДОКУМЕНТА() выполняется слишком долго, проблема может быть в:
- 📉 Отсутствии индексов на поле
Видв таблице документов. - 🔄 Слишком широком периоде выборки (например, за 10 лет).
- 🛑 Использовании
ВИДДОКУМЕНТА()в соединениях (СОЕДИНЕНИЕ) вместо фильтрации вГДЕ.
Оптимизируйте запрос так:
ВЫБРАТЬ
Документы.Ссылка
ИЗ
Документ.РеализацияТоваровУслуг КАК Документы
ГДЕ
Документы.Дата МЕЖДУ &НачалоПериода И &КонецПериода
⚠️ Внимание: В некоторых конфигурациях (например, Управление торговлей 11.4+) для ускорения работы с документами рекомендуется использовать виртуальные таблицы вместо прямых запросов к Документ.Ссылка. Проверьте актуальные рекомендации в документации вашей версии.
5. Продвинутые техники: работа с наследуемыми видами и расширениями
В современных конфигурациях 1С часто используются расширения документов или наследуемые виды. Например, документ ЗаказПокупателя может иметь расширение ЗаказПокупателяСПредоплатой. Как с ними работать в запросах?
5.1. Фильтрация по базовому виду
Если вам нужно выбрать все документы, наследуемые от определённого вида (например, все виды заказов), используйте функцию ЭТОГРУППАВИДОВ():
ВЫБРАТЬ
Документы.Ссылка
ИЗ
Документ.Ссылка КАК Документы
ГДЕ
ЭТОГРУППАВИДОВ(ВИДДОКУМЕНТА(Документы.Ссылка), ВИД("Документ.ЗаказПокупателя"))
5.2. Работа с расширениями документов
Если документ имеет расширение (например, РеализацияТоваровУслугСЧеками), его вид будет отличаться от базового. Чтобы получить все документы, включая расширения, используйте:
ВЫБРАТЬ
Документы.Ссылка
ИЗ
Документ.Ссылка КАК Документы
ГДЕ
ВИДДОКУМЕНТА(Документы.Ссылка) В (
ВИД("Документ.РеализацияТоваровУслуг"),
ВИД("Документ.РеализацияТоваровУслугСЧеками")
)
Для динамического получения всех расширений определенного документа можно использовать следующий код на встроенном языке:
ВидыДокументов = Новый Массив;
ВидыДокументов.Добавить(ВидДокумента.РеализацияТоваровУслуг);
// Получаем все расширения
Расширения = Метаданные.Документы.РеализацияТоваровУслуг.Расширения;
Для Каждого Расширение Из Расширения Цикл
ВидыДокументов.Добавить(Расширение.Вид);
КонецЦикла;
// Передаём в запрос
Запрос.УстановитьПараметр("Виды", ВидыДокументов);
Затем в запросе:
ГДЕ ВИДДОКУМЕНТА(Документы.Ссылка) В (&Виды)
Как узнать, есть ли у документа расширения?
Чтобы проверить наличие расширений у документа, откройте конфигуратор, найдите нужный документ в дереве метаданных и посмотрите раздел "Расширения". Если он не пуст, значит, у документа есть наследуемые виды. Также можно программно получить список расширений через свойство Метаданные.Документы.ИмяДокумента.Расширения
6. Примеры для популярных конфигураций
Разберём конкретные примеры запросов для наиболее востребованных конфигураций 1С.
6.1. Бухгалтерия предприятия 3.0
Запрос для выборки всех платежных поручений за текущий месяц:
ВЫБРАТЬ
ПлатежноеПоручение.Ссылка КАК Ссылка,
ПлатежноеПоручение.Дата КАК Дата,
ПлатежноеПоручение.Номер КАК Номер,
ПлатежноеПоручение.Сумма КАК Сумма
ИЗ
Документ.ПлатежноеПоручение КАК ПлатежноеПоручение
ГДЕ
ПлатежноеПоручение.Дата МЕЖДУ НачалоМесяца(ТЕКУЩАЯДАТА()) И КонецМесяца(ТЕКУЩАЯДАТА())
6.2. Управление торговлей 11
Запрос для выборки реализаций с группировкой по контрагентам:
ВЫБРАТЬ
Реализация.Контрагент КАК Контрагент,
СУММА(Реализация.СуммаДокумента) КАК Итого
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Дата >= &НачалоПериода
СГРУППИРОВАТЬ ПО
Реализация.Контрагент
6.3. Зарплата и управление персоналом 3.1
Запрос для выборки приказов на отпуск за последний год:
ВЫБРАТЬ
Отпуск.Сотрудник КАК Сотрудник,
Отпуск.ДатаНачала КАК ДатаНачала,
Отпуск.ДатаОкончания КАК ДатаОкончания
ИЗ
Документ.Отпуск КАК Отпуск
ГДЕ
Отпуск.Дата МЕЖДУ ДобавитьМесяц(ТЕКУЩАЯДАТА(), -12) И ТЕКУЩАЯДАТА()
| Конфигурация | Пример вида документа | Типичное использование |
|---|---|---|
| Бухгалтерия 3.0 | ПлатежноеПоручение |
Анализ денежных потоков, сверка с банком |
| Управление торговлей 11 | РеализацияТоваровУслуг |
Отчёты по продажам, анализ выручки |
| Зарплата и УП 3.1 | НачислениеЗарплаты |
Расчёт зарплаты, отчётность в фонды |
| ERP 2.4 | ЗаказПроизводства |
Планирование производства, контроль выполнения |
Перем мВидыДокументов;
Процедура ПриСозданииНаСервере()
мВидыДокументов = Новый Соответствие;
мВидыДокументов.Вставить("Реализация", ВидДокумента.РеализацияТоваровУслуг);
мВидыДокументов.Вставить("Поступление", ВидДокумента.ПоступлениеТоваров);
КонецПроцедуры
Теперь в запросах можно использовать мВидыДокументов["Реализация"] вместо длинных конструкций с ВИД()-->
7. Оптимизация запросов с фильтрацией по виду документа
Фильтрация по виду документа может существенно влиять на производительность, особенно в больших базах. Рассмотрим ключевые приёмы оптимизации.
7.1. Использование виртуальных таблиц
Вместо прямого обращения к таблице Документ.Ссылка используйте виртуальные таблицы, которые уже оптимизированы для конкретных задач. Например:
ВЫБРАТЬ
РеализацияТоваровУслуг.Ссылка КАК Ссылка
ИЗ
Документ.РеализацияТоваровУслуг.Обороты КАК РеализацияТоваровУслуг
ГДЕ
РеализацияТоваровУслуг.Период МЕЖДУ &Начало И &Конец
7.2. Ограничение периода выборки
Всегда ограничивайте выборку по дате, даже если вам нужны все документы. Это значительно ускорит выполнение запроса:
ГДЕ
Документы.Дата >= ДобавитьМесяц(ТЕКУЩАЯДАТА(), -6) // Последние 6 месяцев
7.3. Индексирование полей
Убедитесь, что в вашей базе созданы индексы на поля, используемые в условиях ГДЕ:
- 📅
Дата - 🔢
Номер - 🔗
Ссылка(для соединений) - 👤
Контрагент,Сотрудники другие справочники
Проверьте индексы в конфигураторе: Администрирование → Поддержка и обслуживание → Тестирование и исправление → Просмотр индексов.
Самый быстрый способ фильтрации документов по виду — использовать виртуальные таблицы конкретного документа (например, Документ.РеализацияТоваровУслуг вместо Документ.Ссылка с условием ВИДДОКУМЕНТА()).
8. Частые вопросы и решения
Разберём ответы на наиболее распространённые вопросы, связанные с работой вида документов в запросах 1С.
Если ваш запрос внезапно перестал работать после обновления конфигурации, в первую очередь проверьте, не изменились ли имена видов документов или их структура в новых версиях.
Как узнать точный вид документа по его ссылке?
Используйте функцию ВИДДОКУМЕНТА() в отладочном режиме:
Сообщить(ВИДДОКУМЕНТА(ДокументСсылка.ПолучитьСсылку()));
Или выполните запрос:
ВЫБРАТЬ
ВИДДОКУМЕНТА(&СсылкаНаДокумент) КАК ВидДокумента
Можно ли в одном запросе выбрать документы разных видов?
Да, используйте оператор В (IN) с перечислением видов:
ГДЕ ВИДДОКУМЕНТА(Документы.Ссылка) В (
ВИД("Документ.РеализацияТоваровУслуг"),
ВИД("Документ.ПоступлениеТоваров")
)
Или передавайте массив видов через параметр:
Запрос.УстановитьПараметр("Виды", МассивВидовДокументов);
Почему запрос с ВИДДОКУМЕНТА() работает медленно?
Возможные причины и решения:
- Отсутствуют индексы на поле
Видв таблице документов. Решение: Создайте индекс или используйте виртуальные таблицы. - Слишком широкий период выборки. Решение: Ограничьте даты в условии
ГДЕ. - Используется соединение (
СОЕДИНЕНИЕ) с фильтрацией по виду. Решение: Перенесите условие вГДЕ.
Как выбрать документы, у которых вид наследуется от заданного?
Используйте функцию ЭТОГРУППАВИДОВ():
ГДЕ ЭТОГРУППАВИДОВ(ВИДДОКУМЕНТА(Документы.Ссылка), ВИД("Документ.ЗаказПокупателя"))
Этот метод вернёт все документы, которые являются наследниками ЗаказПокупателя, включая его расширения.
Можно ли получить список всех видов документов в базе?
Да, выполните следующий запрос:
ВЫБРАТЬ РАЗЛИЧНЫЕ
ВИДДОКУМЕНТА(Документы.Ссылка) КАК ВидДокумента
ИЗ
Документ.Ссылка КАК Документы
Или программно:
Для Каждого Вид Из Метаданные.Документы Цикл
Сообщить(Вид.Имя);
КонецЦикла;