Как в СКД получить данные по Счетам-фактурам с несколькими документами-основаниями

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Налоговый учет
← На главную

Разработка отчетов по НДС в 1С:ERP (и аналогичных конфигурациях, таких как КА 2 или УТ 11) часто осложняется тем, что информация может быть распределена по разным табличным частям и типам документов. Задача вывести СуммаНДС и СуммаСНДС для Счетов-фактур, имеющих более одного основания, требует понимания того, как система хранит эти связи и как эффективно агрегировать данные в Системе Компоновки Данных (СКД). Рассмотрим детально несколько подходов к решению этой задачи.

Анализ проблемы и структуры данных

Основная сложность заключается в том, что в качестве основания для Счета-фактуры могут выступать различные документы: ПриобретениеТоваровУслуг, ВозвратТоваровОтКлиента, ОтчетКомиссионера и другие. В одном случае сумма НДС хранится в реквизите шапки, в другом — рассчитывается как итог по табличной части Товары, а в третьем — по табличной части Услуги или Расходы. Проанализируем список типичных источников данных:

  1. Табличная часть Товары: Возвраты, Приобретения, Корректировки приобретения.
  2. Табличная часть Услуги/Начисления: Отчеты переработчика, Приобретение услуг по лизингу.
  3. Реквизиты шапки: Отчеты комитенту (вознаграждение).

Если пытаться написать один запрос, объединяющий все эти таблицы через ЛЕВОЕ СОЕДИНЕНИЕ, он получится громоздким и трудночитаемым. Разберем основные стратегии решения.

Решение 1: Использование функций общего модуля в вычисляемых полях

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

Для начала создадим в общем модуле (с установленным флагом «Сервер» и «Вызов сервера») экспортную функцию. Рассмотрим пример функции для получения суммы НДС из реализации:


Функция ПолучитьСуммуНДСДокумента(Ссылка) Экспорт
    Рез = 0;
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    
    // Объединяем данные из всех возможных табличных частей конкретного типа документа
    Запрос.Текст = 
    "ВЫБРАТЬ
    |	СУММА(ТЧ.СуммаНДС) КАК СуммаНДС
    |ИЗ
    |	(ВЫБРАТЬ
    |		РеализацияТовары.СуммаНДС КАК СуммаНДС
    |	ИЗ
    |		Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТовары
    |	ГДЕ
    |		РеализацияТовары.Ссылка = &Ссылка
    |
    |	ОБЪЕДИНИТЬ ВСЕ
    |
    |	ВЫБРАТЬ
    |		РеализацияУслуги.СуммаНДС
    |	ИЗ
    |		Документ.РеализацияТоваровУслуг.Услуги КАК РеализацияУслуги
    |	ГДЕ
    |		РеализацияУслуги.Ссылка = &Ссылка) КАК ТЧ";
    
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        Рез = Выборка.СуммаНДС;
    КонецЕсли;
    
    Возврат Рез;
КонецФункции

После создания функции, в схеме компоновки данных на закладке Вычисляемые поля добавим новое поле, например, СуммаНДС_Вычисленная. В колонке Выражение пропишем вызов нашей функции:

ИмяВашегоМодуля.ПолучитьСуммуНДСДокумента(ДокументОснование)

Важно: Этот метод имеет существенный минус — он значительно замедляет формирование отчета при большом количестве строк, так как запрос будет выполняться для каждой строки отдельно. Также это может ограничить возможности стандартной расшифровки (drill-down).

Решение 2: Использование регистров НДС (Рекомендуемый подход)

В конфигурации 1С:ERP данные по НДС при проведении документов транслируются в специализированные регистры. Это «золотой стандарт» получения данных для налоговых отчетов. Рассмотрим подробнее, почему это удобно:

Проанализируем пример запроса для получения данных из регистра с фильтром по документам, у которых более одного основания:


ВЫБРАТЬ
    НДСПродажи.Регистратор КАК СчетФактура,
    НДСПродажи.ДокументОснование КАК ДокументОснование,
    НДСПродажи.СуммаБезНДС КАК СуммаБезНДС,
    НДСПродажи.НДС КАК СуммаНДС,
    НДСПродажи.СуммаБезНДС + НДСПродажи.НДС КАК СуммаСНДС
ИЗ
    РегистрНакопления.НДСЗаписиКнигиПродаж КАК НДСПродажи
ГДЕ
    НДСПродажи.Регистратор В (
        ВЫБРАТЬ
            Основания.Ссылка
        ИЗ
            Документ.СчетФактураВыданный.ДокументыОснования КАК Основания
        СГРУППИРОВАТЬ ПО
            Основания.Ссылка
        ИМЕЮЩИЕ
            КОЛИЧЕСТВО(Основания.ДокументОснование) > 1
    )

В этом запросе мы сначала находим все Счета-фактуры, у которых в табличной части ДокументыОснования числится более одной записи (используя условие ИМЕЮЩИЕ КОЛИЧЕСТВО(...) > 1). Затем мы выбираем все данные по этим документам из регистра сведений или накопления, где суммы уже посчитаны системой при проведении.

Вывод дополнительных реквизитов (Категория закупки)

Часто в задании требуется вывести дополнительные сведения из документа-основания, например, Категорию закупки. Поскольку документов-оснований может быть несколько, нам нужно решить, как их отображать.

Если мы хотим видеть категорию в детальных записях, мы можем просто добавить поле ДокументОснование.КатегорияЗакупки в набор данных. Если же категория является дополнительным реквизитом, в СКД стоит использовать механизм характеристик или левое соединение с таблицей ДополнительныеРеквизиты.

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


ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПриобретениеТоваровУслуг.ДополнительныеРеквизиты КАК ДопРеквизиты
ПО НДСПродажи.ДокументОснование = ДопРеквизиты.Ссылка
И ДопРеквизиты.Свойство = &СвойствоКатегория

Настройка полной расшифровки

Чтобы отчет поддерживал полную расшифровку, старайтесь избегать вычисляемых полей на основе функций общих модулей. Если вы строите отчет на основе запроса к регистрам (Решение 2), расшифровка будет работать «из коробки». Пользователь сможет дважды кликнуть на сумму и выбрать «Расшифровать по...», увидев детальные записи регистра, из которых сложился итог.

Для корректного суммирования в СКД не забудьте настроить ресурсы. Поля СуммаНДС и СуммаСНДС должны быть добавлены на закладку Ресурсы с выражением Сумма(СуммаНДС).

Резюме

Для реализации сложного отчета в СКД по документам с несколькими основаниями в 1С:ERP, мы рекомендуем придерживаться следующего алгоритма:

  1. Выясним, какие регистры НДС (Книга покупок/продаж) содержат нужные суммы.
  2. Сформируем вложенный запрос к табличной части ДокументыОснования для фильтрации нужных Счетов-фактур.
  3. Объединим данные в основном наборе данных СКД.
  4. Добавим дополнительные реквизиты через обращения через точку (если это реквизиты объекта) или через соединения (если это доп. сведения).

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

← На главную