Разработка отчетов по НДС в 1С:ERP (и аналогичных конфигурациях, таких как КА 2 или УТ 11) часто осложняется тем, что информация может быть распределена по разным табличным частям и типам документов. Задача вывести СуммаНДС и СуммаСНДС для Счетов-фактур, имеющих более одного основания, требует понимания того, как система хранит эти связи и как эффективно агрегировать данные в Системе Компоновки Данных (СКД). Рассмотрим детально несколько подходов к решению этой задачи.
Основная сложность заключается в том, что в качестве основания для Счета-фактуры могут выступать различные документы: ПриобретениеТоваровУслуг, ВозвратТоваровОтКлиента, ОтчетКомиссионера и другие. В одном случае сумма НДС хранится в реквизите шапки, в другом — рассчитывается как итог по табличной части Товары, а в третьем — по табличной части Услуги или Расходы. Проанализируем список типичных источников данных:
Если пытаться написать один запрос, объединяющий все эти таблицы через ЛЕВОЕ СОЕДИНЕНИЕ, он получится громоздким и трудночитаемым. Разберем основные стратегии решения.
Этот способ является самым быстрым в реализации, особенно если знаний в написании сложных запросов СКД недостаточно. Идея заключается в том, чтобы делегировать расчет суммы программному коду 1С.
Для начала создадим в общем модуле (с установленным флагом «Сервер» и «Вызов сервера») экспортную функцию. Рассмотрим пример функции для получения суммы НДС из реализации:
Функция ПолучитьСуммуНДСДокумента(Ссылка) Экспорт
Рез = 0;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", Ссылка);
// Объединяем данные из всех возможных табличных частей конкретного типа документа
Запрос.Текст =
"ВЫБРАТЬ
| СУММА(ТЧ.СуммаНДС) КАК СуммаНДС
|ИЗ
| (ВЫБРАТЬ
| РеализацияТовары.СуммаНДС КАК СуммаНДС
| ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТовары
| ГДЕ
| РеализацияТовары.Ссылка = &Ссылка
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| РеализацияУслуги.СуммаНДС
| ИЗ
| Документ.РеализацияТоваровУслуг.Услуги КАК РеализацияУслуги
| ГДЕ
| РеализацияУслуги.Ссылка = &Ссылка) КАК ТЧ";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Рез = Выборка.СуммаНДС;
КонецЕсли;
Возврат Рез;
КонецФункции
После создания функции, в схеме компоновки данных на закладке Вычисляемые поля добавим новое поле, например, СуммаНДС_Вычисленная. В колонке Выражение пропишем вызов нашей функции:
ИмяВашегоМодуля.ПолучитьСуммуНДСДокумента(ДокументОснование)
Важно: Этот метод имеет существенный минус — он значительно замедляет формирование отчета при большом количестве строк, так как запрос будет выполняться для каждой строки отдельно. Также это может ограничить возможности стандартной расшифровки (drill-down).
В конфигурации 1С:ERP данные по НДС при проведении документов транслируются в специализированные регистры. Это «золотой стандарт» получения данных для налоговых отчетов. Рассмотрим подробнее, почему это удобно:
СуммаНДС.НДС Записи книги продаж.НДС Записи книги покупок.Проанализируем пример запроса для получения данных из регистра с фильтром по документам, у которых более одного основания:
ВЫБРАТЬ
НДСПродажи.Регистратор КАК СчетФактура,
НДСПродажи.ДокументОснование КАК ДокументОснование,
НДСПродажи.СуммаБезНДС КАК СуммаБезНДС,
НДСПродажи.НДС КАК СуммаНДС,
НДСПродажи.СуммаБезНДС + НДСПродажи.НДС КАК СуммаСНДС
ИЗ
РегистрНакопления.НДСЗаписиКнигиПродаж КАК НДСПродажи
ГДЕ
НДСПродажи.Регистратор В (
ВЫБРАТЬ
Основания.Ссылка
ИЗ
Документ.СчетФактураВыданный.ДокументыОснования КАК Основания
СГРУППИРОВАТЬ ПО
Основания.Ссылка
ИМЕЮЩИЕ
КОЛИЧЕСТВО(Основания.ДокументОснование) > 1
)
В этом запросе мы сначала находим все Счета-фактуры, у которых в табличной части ДокументыОснования числится более одной записи (используя условие ИМЕЮЩИЕ КОЛИЧЕСТВО(...) > 1). Затем мы выбираем все данные по этим документам из регистра сведений или накопления, где суммы уже посчитаны системой при проведении.
Часто в задании требуется вывести дополнительные сведения из документа-основания, например, Категорию закупки. Поскольку документов-оснований может быть несколько, нам нужно решить, как их отображать.
Если мы хотим видеть категорию в детальных записях, мы можем просто добавить поле ДокументОснование.КатегорияЗакупки в набор данных. Если же категория является дополнительным реквизитом, в СКД стоит использовать механизм характеристик или левое соединение с таблицей ДополнительныеРеквизиты.
Пример соединения для получения доп. реквизита в запросе:
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПриобретениеТоваровУслуг.ДополнительныеРеквизиты КАК ДопРеквизиты
ПО НДСПродажи.ДокументОснование = ДопРеквизиты.Ссылка
И ДопРеквизиты.Свойство = &СвойствоКатегория
Чтобы отчет поддерживал полную расшифровку, старайтесь избегать вычисляемых полей на основе функций общих модулей. Если вы строите отчет на основе запроса к регистрам (Решение 2), расшифровка будет работать «из коробки». Пользователь сможет дважды кликнуть на сумму и выбрать «Расшифровать по...», увидев детальные записи регистра, из которых сложился итог.
Для корректного суммирования в СКД не забудьте настроить ресурсы. Поля СуммаНДС и СуммаСНДС должны быть добавлены на закладку Ресурсы с выражением Сумма(СуммаНДС).
Для реализации сложного отчета в СКД по документам с несколькими основаниями в 1С:ERP, мы рекомендуем придерживаться следующего алгоритма:
ДокументыОснования для фильтрации нужных Счетов-фактур.Такой подход обеспечит высокую производительность отчета и позволит пользователям полноценно анализировать данные с использованием всех инструментов СКД.