При разработке отчетов по движению денежных средств в конфигурациях уровня 1С:Управление торговлей 11, ERP или Комплексная автоматизация программисты часто сталкиваются с проблемой «пустых полей». Суть ситуации заключается в том, что в одних документах (например, поступление на счет) СтатьяДДС находится непосредственно в шапке, а в других (например, списание безналичных ДС) она вынесена в табличную часть РасшифровкаПлатежа. Это сделано для того, чтобы один платеж можно было разбить по нескольким статьям или разным договорам.
В этой статье мы подробно разберем, как правильно составить запрос, чтобы объединить эти данные в одну колонку отчета, рассмотрим типичные ошибки и выясним, какой метод является наиболее оптимальным с точки зрения производительности и архитектуры 1С.
Когда мы пишем запрос к виртуальной таблице ОстаткиИОбороты и пытаемся получить статью через обращение к регистратору (Регистратор.СтатьяДвиженияДенежныхСредств), система обращается к реквизитам шапки документа. Если документ предусматривает расшифровку в табличной части, реквизит в шапке может быть не заполнен или вовсе отсутствовать. Именно поэтому в отчете возникают пустые значения.
Рассмотрим по шагам основные способы решения этой задачи.
Это самый очевидный путь, если нам нужно получить статью именно из документа. Поскольку в табличной части может быть несколько строк, а в отчете нам чаще всего нужна хотя бы первая (или основная) статья для группировки, мы используем соединение с условием на номер строки.
Проанализируем пример запроса, в котором мы соединяем данные регистра с расшифровкой платежа документа СписаниеБезналичныхДенежныхСредств:
ВЫБРАТЬ
ДДС.Регистратор КАК Документ,
ДДС.СуммаПриход КАК Приход,
ДДС.СуммаРасход КАК Расход,
ВЫБОР
КОГДА ДДС.Регистратор.СтатьяДвиженияДенежныхСредств <> ЗНАЧЕНИЕ(Справочник.СтатьиДвиженияДенежныхСредств.ПустаяСсылка)
ТОГДА ДДС.Регистратор.СтатьяДвиженияДенежныхСредств
ИНАЧЕ ТЧ_Расшифровка.СтатьяДвиженияДенежныхСредств
КОНЕЦ КАК СтатьяДДС
ИЗ
РегистрНакопления.ДенежныеСредстваБезналичные.ОстаткиИОбороты(&Начало, &Конец, Авто, , ) КАК ДДС
ЛЕВОЕ СОЕДИНЕНИЕ Документ.СписаниеБезналичныхДенежныхСредств.РасшифровкаПлатежа КАК ТЧ_Расшифровка
ПО ДДС.Регистратор = ТЧ_Расшифровка.Ссылка
И ТЧ_Расшифровка.НомерСтроки = 1
Важные моменты этого подхода:
ТЧ_Расшифровка.НомерСтроки = 1 критически важно. Если его не указать, и в документе будет 5 строк расшифровки, сумма оборота по этому документу в вашем отчете увеличится в 5 раз (произойдет «размножение» строк из-за особенностей работы JOIN в SQL).Рассмотрим структуру регистров ДенежныеСредстваБезналичные или ДенежныеСредстваНаличные в современных типовых конфигурациях. В большинстве случаев СтатьяДвиженияДенежныхСредств уже является измерением самого регистра. Это означает, что система при проведении документа сама «достает» статью из табличной части и записывает ее в регистр.
Выясним причину, по которой многие программисты продолжают обращаться к Регистратор.СтатьяДДС. Это происходит по привычке, но для повышения производительности и точности данных следует обращаться напрямую к полю регистра. Посмотрим на правильный пример запроса:
ВЫБРАТЬ
ДДС.Регистратор КАК Документ,
ДДС.СуммаНачальныйОстаток КАК НачОстаток,
ДДС.СуммаПриход КАК Приход,
ДДС.СуммаРасход КАК Расход,
ДДС.СтатьяДвиженияДенежныхСредств КАК СтатьяДДС
ИЗ
РегистрНакопления.ДенежныеСредстваБезналичные.ОстаткиИОбороты(&Начало, &Конец, Авто, Движения, ) КАК ДДС
В этом случае, если в одном документе было две разные статьи ДДС, виртуальная таблица ОстаткиИОбороты при детализации до регистратора выдаст вам две строки. Это наиболее корректный вариант для финансового отчета, так как суммы будут распределены по статьям правильно.
В УТ 11 и ERP существует специализированный оборотный регистр РегистрНакопления.ДвиженияДенежныхСредств. Он предназначен специально для управленческой отчетности по статьям. Проанализируем его преимущества:
ОБЪЕДИНИТЬ ВСЕ.СтатьяДДС, так как это одно из ключевых измерений.НаправлениеДеятельности или ХозяйственнаяОперация.Если ваша задача — построить отчет по оборотам (Приход/Расход) в разрезе статей, лучше всего использовать именно его.
При написании условий ВЫБОР КОГДА... начинающие разработчики часто путают NULL, Неопределено и ПустаяСсылка. Посмотрим на различия:
Правильная проверка на заполненность статьи в запросе должна выглядеть так:
СтатьяДДС <> ЗНАЧЕНИЕ(Справочник.СтатьиДвиженияДенежныхСредств.ПустаяСсылка)
Подведем итоги нашего анализа. Для того чтобы статьи ДДС отображались корректно:
ДвиженияДенежныхСредств вместо прямых регистров остатков.НомерСтроки или группировку, чтобы избежать дублирования денежных сумм.Следуя этим правилам, вы получите точный и производительный отчет, который будет корректно отображать финансовые потоки компании вне зависимости от того, как заполнен первичный документ.