Как правильно получить общее количество документов разных видов в одном запросе 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Разбор типичной ошибки: декартово произведение

Основная ошибка заключается в попытке соединить две таблицы документов «через запятую» в блоке ИЗ. Когда вы пишете запрос вида ИЗ Документ.А КАК А, Документ.Б КАК Б, система 1С выполняет так называемое декартово произведение. Это означает, что каждая строка первой таблицы будет соединена с каждой строкой второй таблицы.

Если в одной таблице у вас 100 документов, а во второй тоже 100, то результатом соединения станет таблица, содержащая 10 000 строк (100 * 100). Именно поэтому при попытке посчитать количество вы получаете колоссальные, ошибочные данные. Чтобы избежать этого, никогда не перечисляйте таблицы документов через запятую, если вы не планируете создавать их комбинацию.

Решение 1: использование оператора ОБЪЕДИНИТЬ ВСЕ

Самый надежный и классический способ — это использование оператора ОБЪЕДИНИТЬ ВСЕ. Этот подход позволяет сначала вычислить количество документов для каждого типа по отдельности, а затем объединить эти результаты в один поток данных.

Рассмотрим пошагово, как это реализовать:

  1. Создаем временную таблицу, в которую помещаем количество документов первого вида.
  2. Создаем временную таблицу для второго вида документов.
  3. Выполняем выборку с объединением и суммируем результат.

Пример реализации:


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

ОБЪЕДИНИТЬ ВСЕ

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

ВЫБРАТЬ
    СУММА(ВТ_Количество.Колво) КАК ОбщееКоличество
ИЗ
    ВТ_Количество КАК ВТ_Количество

Здесь важно помнить: для получения количества документов достаточно использовать КОЛИЧЕСТВО(Ссылка). Использование РАЗЛИЧНЫЕ в данном случае избыточно, так как Ссылка — это первичный ключ, который уникален по определению.

Решение 2: пакетный запрос и суммирование результатов

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

Разберем логику:

  1. В первом пакете считаем количество одного вида документа и помещаем результат во временную таблицу.
  2. Во втором пакете считаем количество второго вида документа.
  3. В итоговом запросе выбираем данные из обеих временных таблиц и складываем результаты.

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

Практические рекомендации

При работе с количеством документов в 1С всегда обращайте внимание на следующие моменты:

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

← На главную