Как получить корректные остатки по основным средствам с детализацией по периодам и регистратору в 1С

Программист 1С v8.3 (Управляемые формы) Бухгалтерский учет Промышленность, строительство и АПК
← На главную

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

Механика работы виртуальной таблицы ОстаткиИОбороты

Основная ошибка при работе с виртуальной таблицей РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты заключается в неправильном наложении фильтров. Рассмотрим ситуацию: нам нужно получить данные по конкретной группе ОС (например, «Дойное стадо»). Если мы просто выберем таблицу и добавим условие в секцию ГДЕ, результат будет некорректным.

Проанализируем причину: когда условие по Субконто1 (само ОС) или счету учета ставится в блоке ГДЕ, система сначала рассчитывает итоги по всем записям регистра, а затем просто отсекает лишние строки. В итоге начальный остаток на начало периода может «потеряться» или отобразиться неверно. Правильный подход — передавать все фильтры в параметры самой виртуальной таблицы.

Рассмотрим пример правильного вызова виртуальной таблицы:


ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.Период КАК Период,
    ХозрасчетныйОстаткиИОбороты.Регистратор КАК Регистратор,
    ХозрасчетныйОстаткиИОбороты.Субконто1 КАК ОсновноеСредство,
    ХозрасчетныйОстаткиИОбороты.КоличествоНачальныйОстаток КАК НачОст,
    ХозрасчетныйОстаткиИОбороты.КоличествоОборотДт КАК Приход,
    ХозрасчетныйОстаткиИОбороты.КоличествоОборотКт КАК Расход,
    ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстаток КАК КонОст
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, , Счет В (&МассивСчетовОС), &ВидыСубконтоОС, Субконто1 В (&ГруппаОС)) КАК ХозрасчетныйОстаткиИОбороты

В данном примере мы передаем &ВидыСубконтоОС (массив, содержащий ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ОсновныеСредства) и фильтр по конкретным объектам прямо в параметры таблицы. Это гарантирует, что 1С рассчитает остатки именно по этим объектам, начиная с самых ранних итогов в базе.

Проблема периодичности и регистратора

Выясним, почему остатки могут «ломаться» при использовании периодичности Регистратор. Если в запросе указана периодичность Регистратор, то в таблицу попадут только те моменты времени, когда были реальные движения. Если в 2019 году по корове не было документов, то и строки за 2019 год в выборке не будет, хотя остаток на ней числится.

Для корректного вывода данных по годам (даже при отсутствии оборотов) рекомендуется:

  1. Использовать периодичность Год, если важны только итоговые цифры за год.
  2. Если нужны и документы, и итоги по годам, используйте дополнение периодов в СКД или программное объединение таблиц.
  3. Помните, что Остаток + Оборот Дт - Оборот Кт = Конечный остаток — это формула, которая корректно работает внутри виртуальной таблицы только при условии правильной передачи параметров счета и субконто.

Реализация «нарастающего итога» вручную

Иногда требуется реализовать логику «предыдущее значение + текущее движение» вне рамок стандартной таблицы. Рассмотрим метод соединения таблицы самой с собой. Это полезно, когда нужно вычислить остаток на каждую дату документа, не полагаясь на виртуальные остатки.

Разберем алгоритм:

  1. Выгружаем все обороты (приходы и расходы) во временную таблицу ВТ_Обороты.
  2. Присоединяем ВТ_Обороты (как Т1) к этой же ВТ_Обороты (как Т2) по условию Т2.Период <= Т1.Период.
  3. Группируем по Т1.Период и суммируем обороты из Т2.

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


ВЫБРАТЬ
    Т1.ОсновноеСредство,
    Т1.Период,
    Т1.Регистратор,
    СУММА(Т2.Оборот) КАК НарастающийОстаток
ИЗ
    ВТ_Движения КАК Т1
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Движения КАК Т2
    ПО Т1.ОсновноеСредство = Т2.ОсновноеСредство
    И Т1.Период >= Т2.Период
СГРУППИРОВАТЬ ПО
    Т1.ОсновноеСредство,
    Т1.Период,
    Т1.Регистратор

Этот метод позволяет получить остаток на любой момент времени, сложив все движения от начала времен до текущей точки.

Специфика учета ОС в сельском хозяйстве (БСХП)

Проанализируем ситуацию, описанную в теме: учет 244 голов скота. В конфигурации «Бухгалтерия сельскохозяйственного предприятия» учет животных имеет свои особенности, которые влияют на запрос:

Использование типовых решений

Если задача кажется слишком сложной, всегда стоит обратиться к опыту разработчиков типовых конфигураций. В специализированных решениях (таких как БСХП) есть отчеты по движению скота или ведомости ОС (например, форма СП-51). Рассмотрим, как программно получить их запрос:

  1. Откройте отчет в конфигураторе.
  2. Найдите основную схему компоновки данных (СКД).
  3. Изучите текст запроса в наборе данных.

Как правило, там уже реализованы механизмы связи регистра бухгалтерии с регистрами сведений (например, МестонахождениеОСБухгалтерскийУчет), что позволяет видеть не только остатки, но и ответственных лиц, подразделения и текущее состояние объекта.

Резюме

Для получения корректных остатков ОС в запросе: используйте параметры виртуальной таблицы для фильтрации, следите за периодичностью и учитывайте специфику счетов учета (01, 03, 11). Если стандартная таблица ОстаткиИОбороты не дает нужной детализации по годам без движений, используйте метод объединения с таблицей периодов или нарастающий итог через соединение.

← На главную