Как получить сумму документа в запросе 1С: все способы от простого к сложному

Забудьте о рутине: узнайте все секреты выборки суммы в 1С — от реквизитов шапки до агрегации табличных частей и вирттаблиц.

Бесплатная консультация юриста

+7 (800) 302-87-29

Реклама jurik.ru

Работа с языком запросов 1С — базовый навык любого разработчика и администратора. Одной из самых частых задач является получение итоговой суммы документа (суммы по табличной части или реквизиту шапки). В этой статье мы подробно разберем все способы решения этой задачи: от простого чтения реквизита до сложных агрегаций по табличным частям и виртуальным таблицам.

Структура хранения суммы в документе

Прежде чем писать запрос, нужно понять, где именно хранится сумма в вашей конфигурации. Обычно есть два варианта:

  • Реквизит шапки документа (например, СуммаДокумента, Сумма, Total). Сумма записывается при проведении или изменении табличной части. Это самый быстрый способ получения данных.

Важно: Всегда проверяйте метаданные конкретного документа в конфигураторе (дерево метаданных -> Документы -> ИмяДокумента -> Реквизиты / Табличные части).

Способ 1: Чтение реквизита шапки (Самый быстрый)

Если в документе есть реквизит, хранящий итоговую сумму, запрос тривиален. Допустим, документ — РеализацияТоваровУслуг, реквизит — СуммаДокумента.

Пример запроса:

ВЫБРАТЬ
 РеализацияТоваровУслуг.Ссылка КАК Документ,
 РеализацияТоваровУслуг.Номер КАК Номер,
 РеализацияТоваровУслуг.Дата КАК Дата,
 РеализацияТоваровУслуг.СуммаДокумента КАК СуммаДокумента
ИЗ
 Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
 РеализацияТоваровУслуг.Ссылка = &СсылкаНаДокумент

В коде 1С:

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ СуммаДокумента ИЗ Документ.РеализацияТоваровУслуг ГДЕ Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", СсылкаНаДокумент);
Результат = Запрос.Выполнить.Выбрать;
Если Результат.Следующий Тогда
 Сообщить("Сумма: " + Результат.СуммаДокумента);
КонецЕсли;

Способ 2: Агрегация по табличной части (Универсальный)

Если реквизита суммы в шапке нет, или нужно пересчитать сумму «на лету» (например, для не проведенного документа), используем агрегатную функцию СУММА по табличной части.

ВЫБРАТЬ
 РеализацияТоваровУслуг.Ссылка КАК Документ,
ИЗ
 Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
 ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
 ПО РеализацияТоваровУслугТовары.Ссылка = РеализацияТоваровУслуг.Ссылка
ГДЕ
 РеализацияТоваровУслуг.Ссылка = &СсылкаНаДокумент
СГРУППИРОВАТЬ ПО
 РеализацияТоваровУслуг.Ссылка

Разбор ключевых моментов:

  1. Источник данных: Мы выбираем из Документ.Имя.ТабличнаяЧасть (в примере Документ.РеализацияТоваровУслуг.Товары).
  2. Соединение (JOIN): Делаем ВНУТРЕННЕЕ СОЕДИНЕНИЕ с шапкой документа (Документ.РеализацияТоваровУслуг), чтобы получить доступ к полям шапки (Номер, Дата, Контрагент) и отфильтровать по конкретной ссылке.
  3. Группировка: Обязательно СГРУППИРОВАТЬ ПО РеализацияТоваровУслуг.Ссылка, иначе запрос вернет одну строку на все документы сразу.

Способ 3: Получение сумм сразу для списка документов

Часто нужно получить суммы для множества документов (например, для отчета или динамического списка). Здесь параметр &СсылкаНаДокумент заменяется на условие отбора по периоду, организации, контрагенту и т.д.

Пример для отчета за период:

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

Способ 4: Использование виртуальных таблиц регистров накопления

Если задача — получить сумму, по которой документ провелся (сгенерировал движения), правильнее обращаться не к табличной части документа, а к виртуальным таблицам регистров накопления (например, РегистрНакопления.ТоварыНаСкладах.Обороты или РегистрНакопления.РасчетыСПокупателями.Обороты).

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

Пример (Сумма продаж по регистру расчетов):

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

Преимущества: Учет всех измерений регистра, корректная работа с мультивалютностью, производительность на больших объемах.

Нюансы и лучшие практики

НДС: Включен в цену или нет?

Часто в табличной части есть колонки: Сумма (без НДС), СуммаНДС, СуммаВсего (с НДС). Внимательно читайте метаданные колонок табличной части. Обычно:

  • Сумма, база налогообложения (без НДС).
  • СуммаНДС — сумма налога.
  • СуммаВсего, Сумма + СуммаНДС (то, что платит покупатель).

Выбирайте нужное поле в функции СУММА.

Обработка NULL

Если у документа нет строк в табличной части, СУММА вернет NULL. В 1С это значение типа NULL, а не 0. При выводе в отчете или дальнейших расчетах используйте функцию ЕСТЬNULL:

ВЫБРАТЬ
 Документ.Ссылка,
ИЗ ...

Производительность и индексы

  • Для единичного документа разница в скорости между способом 1 (реквизит шапки) и способом 2 (агрегация) минимальна.
  • Для отчетов по тысячам документов способ 1 (реквизит шапки) на порядки быстрее, так как не требует чтения и суммирования строк табличных частей.
  • Если реквизита суммы в шапке нет, но отчеты нужны часто, рассмотрите возможность добавления реквизита СуммаДокумента и его заполнения в процедуре ОбработкаПроведения или ПередЗаписью.

Мультивалютность

Если конфигурация поддерживает несколько валют, в табличной части могут быть колонки: СуммаВВалюте, Сумма (в валюте учета/базовой). Суммируйте именно то поле, которое соответствует требуемой валюте отчета.

Типовые ошибки

Ошибка Последствие Решение
Забыли СГРУППИРОВАТЬ ПО полю ссылки шапки Запрос вернет одну строку со суммой по всем документам в базе Всегда добавляйте СГРУППИРОВАТЬ ПО Документ.Ссылка
Использование ЛЕВОЕ СОЕДИНЕНИЕ без необходимости Дублирование строк, если в табличной части несколько строк на один документ (хотя для агрегации это не критично, но логичнее ВНУТРЕННЕЕ) Для получения суммы по строкам документа используйте ВНУТРЕННЕЕ СОЕДИНЕНИЕ (INNER JOIN)
Суммирование Цена * Количество в запросе вместо колонки Сумма Риск расхождений из-за округления, скидок, ручного изменения суммы в строке Всегда суммируйте готовую колонку Сумма (или СуммаВсего)
Игнорирование флага Проведен В отчет попадают не проведенные (черновые) документы Добавляйте условие ГДЕ Документ;Проведен = ИСТИНА

Резюме: какой способ выбрать?

  1. Есть реквизит «СуммаДокумента» в шапке? → Способ 1 (Чтение реквизита). Максимальная скорость, минимальный код.
  2. Реквизита нет, нужно для 1-2 документов «здесь и сейчас»? → Способ 2 (Агрегация по табличной части).
  3. Нужен отчет по тысячам документов и реквизита в шапке нет? → Добавьте реквизит в шапку (лучшее архитектурное решение) или используйте Способ 2 с правильными индексами/условиями отбора.
  4. Нужна «бухгалтерская правда» — сумма проводок? → Способ 4 (Виртуальные таблицы регистров накопления).

Понимание структуры хранения данных в 1С и умение писать эффективные запросы, залог быстрых отчетов и корректных обработок. Всегда начинайте с изучения метаданных конкретного документа в конфигураторе.