При разработке отчетов оборотно-сальдовой ведомости (ОСВ) на базе системы компоновки данных (СКД) разработчики часто сталкиваются с неприятной ситуацией. Пока отчет выводится только в разрезе аналитики (например, номенклатура и склад), начальные и конечные остатки, а также обороты полностью сходятся со стандартными отчетами программы. Однако стоит добавить в структуру группировку по полю Регистратор, как итоговые суммы начального и конечного остатка перестают сходиться, многократно завышаются или задваиваются, хотя сами движения документов выводятся корректно.
Разберем детально механизм возникновения этой ошибки и пошагово настроим схему компоновки данных для правильного расчета итогов.
Проанализируем, как система компоновки данных работает с виртуальными таблицами остатков и оборотов:
Регистратор содержит только ссылку на документ. Платформа 1С не может однозначно определить точную хронологическую позицию на временной оси только по ссылке. Без поля точной даты (ПериодСекунда) СКД теряет иерархию периодов и вместо расчетного вычисления остатка на границу каждого документа переключается на простое суммирование остатков по строкам.Рассмотрим по шагам, какие изменения необходимо внести в схему компоновки данных, чтобы восстановить корректный расчет итогов.
Откроем схему компоновки данных и перейдем к набору данных-запросу. Проверим параметры виртуальной таблицы регистра бухгалтерии или регистра накопления. В параметре периодичности виртуальной таблицы необходимо указать Авто.
Посмотрим на пример правильного формирования выборки по регистру бухгалтерии:
ВЫБРАТЬ
ХозрасчетныйОстаткиИОбороты.Счет КАК Счет,
ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Номенклатура,
ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Склад,
ХозрасчетныйОстаткиИОбороты.ПериодСекунда КАК ПериодСекунда,
ХозрасчетныйОстаткиИОбороты.Регистратор КАК Регистратор,
ХозрасчетныйОстаткиИОбороты.НомерСтроки КАК НомерСтроки,
ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстаток КАК СуммаНачальныйОстаток,
ХозрасчетныйОстаткиИОбороты.СуммаОборотДт КАК СуммаОборотДт,
ХозрасчетныйОстаткиИОбороты.СуммаОборотКт КАК СуммаОборотКт,
ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстаток КАК СуммаКонечныйОстаток
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, , Счет В ИЕРАРХИИ (&Счет), , ) КАК ХозрасчетныйОстаткиИОбороты
Обратим внимание: в запросе обязательно должны присутствовать поля ПериодСекунда, Регистратор, НомерСтроки (если в одном документе возможно несколько строк с одинаковой аналитикой), а также парные поля остатков СуммаНачальныйОстаток и СуммаКонечныйОстаток.
Перейдем на вкладку Наборы данных и настроим колонку Роль для каждого ключевого поля:
Сумма.Сумма.Перейдем на вкладку Ресурсы. После правильной расстановки ролей СКД самостоятельно формирует корректные формулы расчета начальных и конечных сальдо по группировкам. Для оборотных полей (СуммаОборотДт, СуммаОборотКт) указываем стандартную агрегатную функцию Сумма(...).
Теперь перейдем на вкладку Настройки. В структуре отчета мы можем свободно комбинировать группировки: формировать отчет только по номенклатуре, раскрывать до складов или опускаться до конкретного Регистратора. Благодаря наличию поля ПериодСекунда и верно заданным ролям итоговые строки отчета на всех уровнях группировок будут рассчитываться корректно и полностью совпадут с типовыми бухгалтерскими отчетами.