Как задать тип документа в запросе 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С.

Анализ продаж определенного вида товара

Пусть нам нужно проанализировать продажи товаров отдельно по каждой товарной группе. Для этого мы можем воспользоваться документом "РеализацияТоваровУслуг" и задать его тип в запросе:

ВЫБРАТЬ Товары.ТоварнаяГруппа КАК ТоварнаяГруппа, СУММА(РеализацияТоваров.Количество * РеализацияТоваров.ЦенаЗаЕдиницу) КАК СуммаПродаж ИЗ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваров ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Товары КАК Товары ПО РеализацияТоваров.Номенклатура = Товары.Ссылка ГДЕ РеализацияТоваров.Ссылка ССЫЛКА Документ.РеализацияТоваровУслуг

Здесь мы выбираем суммы продаж по каждой товарной группе на основании документов реализации. А через оператор ССЫЛКА задаем необходимый нам тип этих документов.

Расчет средних сумм по разным документам

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

ВЫБРАТЬ ВЫБОР КОГДА ТИПЗНАЧЕНИЯ(Док) = ТИП(Документ.ПоступлениеТоваров) ТОГДА СРЕДНЕЕ(Поступление.СуммаДокумента) КОГДА ТИПЗНАЧЕНИЯ(Док) = ТИП(Документ.ВозвратТоваровПоставщику) ТОГДА СРЕДНЕЕ(Возврат.СуммаДокумента) КОНЕЦ КАК СредняяСумма ИЗ Документ.ПоступлениеТоваров КАК Поступление ОБЪЕДИНИТЬ ВСЕ Документ.ВозвратТоваровПоставщику КАК Возврат ;

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

Формирование печатных форм на основании типа документа

Еще один распространенный пример - автоматическое формирование печатных форм для различных документов. В обработке "Печать" можно реализовать такой механизм:

  1. Запросить у пользователя выбор типа документа
  2. Сформировать динамически запрос с фильтрацией по этому типу через оператор ТИП или ССЫЛКА
  3. Вызвать печатную форму, соответствующую типу документа

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

8. Отбор по нескольким типам в рамках одного запроса

Иногда требуется получить в одном запросе сразу несколько типов документов. Конечно, это можно реализовать через конструкцию ОБЪЕДИНИТЬ ВСЕ. Но есть и еще один эффективный прием - использование нескольких операторов ВЫБОР подряд.

Например, чтобы выбрать в одном запросе документы "Реализация" и "Поступление", не объединяя их данные, можно сделать так:

ВЫБОР КОГДА ТИПЗНАЧЕНИЯ(Док) = ТИП(Документ.РеализацияТоваровУслуг) ТОГДА Реализация КОНЕЦ КАК Реализация ОБЪЕДИНИТЬ ВСЕ ВЫБОР КОГДА ТИПЗНАЧЕНИЯ(Док) = ТИП(Документ.ПоступлениеТоваровУслуг) ТОГДА Поступление КОНЕЦ КАК Поступление ИЗ Документ.РеализацияТоваровУслуг КАК Реализация ОБЪЕДИНИТЬ ВСЕ Документ.ПоступлениеТоваровУслуг КАК Поступление

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

Комментарии