Как задать тип документа в запросе 1С: полезные советы для бухгалтеров
Многие разработчики и пользователи 1С сталкиваются с необходимостью задать тип документа в запросе - например, чтобы отобрать только определенные документы для анализа или обработки. В этой статье мы подробно рассмотрим, как можно задать тип документа в запросе 1С на платформе 8.3 с помощью различных операторов и функций.
1. Почему важно уметь задавать тип документа в запросе 1С
Задание типа документа в запросе 1С может потребоваться в различных ситуациях.
- Анализ документов определенного вида, например только реализаций или только поступлений товаров
- Расчет итоговых сумм отдельно по приходным и расходным документам
- Отбор документов для дальнейшей обработки в программном модуле
Если не задавать тип документа в запросе, то в выборку могут попасть совершенно разные документы. А это осложняет дальнейшую работу - приходится проводить дополнительную сортировку и фильтрацию уже после выборки.
Возможность задания типа документа в запросе позволяет:
- Получать из базы данных только необходимые документы
- Оптимизировать работу запросов и избежать лишней нагрузки на СУБД
- Автоматизировать отбор документов для отчетов и обработок
2. Как задать тип с помощью оператора ТИП
Один из способов задания типа документа в запросе - использование оператора ТИП. Синтаксис:
ТИП(имя_типа)
Где в качестве имя_типа можно указать либо имя примитивного типа данных (Строка, Число, Булево, Дата), либо имя типа таблицы в формате Документ.НазваниеДокумента или Справочник.НазваниеСправочника.
Например, чтобы получить в запросе только документы «Реализация товаров и услуг», можно написать так:
ВЫБРАТЬ * ИЗ Документ.РеализацияТоваровУслуг КАК Реализация ГДЕ Реализация.Дата МЕЖДУ Датой("1.1.2023") И Датой("1.2.2023") И ТИПЗНАЧЕНИЯ(Реализация) = ТИП(Документ.РеализацияТоваровУслуг)
Здесь в условии отбора мы проверяем, что тип значения поля Реализация (то есть самого документа) совпадает с типом документа РеализацияТоваровУслуг.
3. Оператор ВЫБОР
Другой распространенный способ задания типа - оператор ВЫБОР. Он позволяет выбрать объекты одного из указанных типов.
Синтаксис:
ВЫБОР КОГДА ТипЗначения = Тип(НазваниеТипа1) ТОГДА Объект1 КОГДА ТипЗначения = Тип(НазваниеТипа2) ТОГДА Объект2 // другие варианты КОНЕЦ
Например, чтобы получить в одном запросе отдельно приходные и расходные документы, можно сделать так:
ВЫБОР КОГДА ТИПЗНАЧЕНИЯ(Док) = ТИП(Документ.ПоступлениеТоваровУслуг) ТОГДА Поступление КОГДА ТИПЗНАЧЕНИЯ(Док) = ТИП(Документ.РеализацияТоваровУслуг) ТОГДА Реализация ИЗ Документ.ПоступлениеТоваровУслуг КАК Поступление ОБЪЕДИНИТЬ ВСЕ Документ.РеализацияТоваровУслуг КАК Реализация ;
Таким образом в рамках одного запроса мы выбираем сразу два типа документов, не объединяя их в одну выборку.
4. Использование функции ТИПЗНАЧЕНИЯ
Функция ТИПЗНАЧЕНИЯ возвращает тип значения, переданного в нее как параметр. Синтаксис:
ТИПЗНАЧЕНИЯ(Значение)
Эту функцию также можно использовать для задания типа документа в запросе, как показано в одном из предыдущих примеров. Повторим его еще раз:
ВЫБРАТЬ * ИЗ Документ.РеализацияТоваровУслуг КАК Реализация ГДЕ Реализация.Дата МЕЖДУ Датой("1.1.2023") И Датой("1.2.2023") И ТИПЗНАЧЕНИЯ(Реализация) = ТИП(Документ.РеализацияТоваровУслуг)
Здесь в условии ГДЕ мы проверяем тип выбранного документа с помощью функций ТИПЗНАЧЕНИЯ и ТИП.
5. Задание типа документа через оператор ССЫЛКА
Еще один распространенный вариант - это использование оператора ССЫЛКА. Он проверяет, ссылается ли значение слева на тип справа.
Синтаксис:
Значение ССЫЛКА Тип
Например:
ВЫБРАТЬ * ИЗ Документ.РасходТоваров КАК Расход ГДЕ Расход ССЫЛКА Документ.РасходТоваров
Здесь мы отберем только документы РасходТоваров, проверив, что реквизит Расход является ссылкой на этот документ.
6. Достоинства и недостатки
Итак, мы рассмотрели несколько способов задания типа документа в запросе на языке 1С:
- Оператор ТИП
- Оператор ВЫБОР
- Функция ТИПЗНАЧЕНИЯ
- Оператор ССЫЛКА
У каждого из вариантов есть свои достоинства и недостатки. Например, ТИП и ВЫБОР позволяют относительно просто отобрать объекты нужного типа. Но при этом они не убирают лишние неявные соединения, которые могут снизить быстродействие.
Оператор же ССЫЛКА и функция ТИПЗНАЧЕНИЯ лишены этого недостатка. Но зато их синтаксис чуть сложнее.
Поэтому при выборе способа задания типа в запросе я бы рекомендовал учитывать также и особенности решаемой задачи.
- Если критична скорость работы, лучше отдать предпочтение ТИПЗНАЧЕНИЯ и ССЫЛКА
- Если же скорость не принципиальна, а важнее наглядность и простота кода, можно использовать ВЫБОР и ТИП
7. Примеры практических задач по заданию типа документа
Давайте рассмотрим несколько практических кейсов, где может потребоваться задание типа документа в запросе 1С.
Анализ продаж определенного вида товара
Пусть нам нужно проанализировать продажи товаров отдельно по каждой товарной группе. Для этого мы можем воспользоваться документом "РеализацияТоваровУслуг" и задать его тип в запросе:
ВЫБРАТЬ Товары.ТоварнаяГруппа КАК ТоварнаяГруппа, СУММА(РеализацияТоваров.Количество * РеализацияТоваров.ЦенаЗаЕдиницу) КАК СуммаПродаж ИЗ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваров ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Товары КАК Товары ПО РеализацияТоваров.Номенклатура = Товары.Ссылка ГДЕ РеализацияТоваров.Ссылка ССЫЛКА Документ.РеализацияТоваровУслуг
Здесь мы выбираем суммы продаж по каждой товарной группе на основании документов реализации. А через оператор ССЫЛКА задаем необходимый нам тип этих документов.
Расчет средних сумм по разным документам
Предположим, нам нужно посчитать средние суммы документов "Поступление товаров" и "Возврат товаров поставщику". Для этого мы можем объединить документы в запросе и задать тип каждого через функцию ТИПЗНАЧЕНИЯ:
ВЫБРАТЬ ВЫБОР КОГДА ТИПЗНАЧЕНИЯ(Док) = ТИП(Документ.ПоступлениеТоваров) ТОГДА СРЕДНЕЕ(Поступление.СуммаДокумента) КОГДА ТИПЗНАЧЕНИЯ(Док) = ТИП(Документ.ВозвратТоваровПоставщику) ТОГДА СРЕДНЕЕ(Возврат.СуммаДокумента) КОНЕЦ КАК СредняяСумма ИЗ Документ.ПоступлениеТоваров КАК Поступление ОБЪЕДИНИТЬ ВСЕ Документ.ВозвратТоваровПоставщику КАК Возврат ;
Таким образом мы в рамках одного запроса сможем посчитать средние суммы для разных документов, задав их тип явно через функцию ТИПЗНАЧЕНИЯ.
Формирование печатных форм на основании типа документа
Еще один распространенный пример - автоматическое формирование печатных форм для различных документов. В обработке "Печать" можно реализовать такой механизм:
- Запросить у пользователя выбор типа документа
- Сформировать динамически запрос с фильтрацией по этому типу через оператор ТИП или ССЫЛКА
- Вызвать печатную форму, соответствующую типу документа
Такое решение позволяет гибко настроить печать различных документов в рамках одной обработки без лишнего дублирования кода.
8. Отбор по нескольким типам в рамках одного запроса
Иногда требуется получить в одном запросе сразу несколько типов документов. Конечно, это можно реализовать через конструкцию ОБЪЕДИНИТЬ ВСЕ. Но есть и еще один эффективный прием - использование нескольких операторов ВЫБОР подряд.
Например, чтобы выбрать в одном запросе документы "Реализация" и "Поступление", не объединяя их данные, можно сделать так:
ВЫБОР КОГДА ТИПЗНАЧЕНИЯ(Док) = ТИП(Документ.РеализацияТоваровУслуг) ТОГДА Реализация КОНЕЦ КАК Реализация ОБЪЕДИНИТЬ ВСЕ ВЫБОР КОГДА ТИПЗНАЧЕНИЯ(Док) = ТИП(Документ.ПоступлениеТоваровУслуг) ТОГДА Поступление КОНЕЦ КАК Поступление ИЗ Документ.РеализацияТоваровУслуг КАК Реализация ОБЪЕДИНИТЬ ВСЕ Документ.ПоступлениеТоваровУслуг КАК Поступление
Такой подход может быть полезен, когда нужно обработать сразу несколько типов документов в рамках одной задачи.