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