Как получить остаток по оборотному субконто в 1С?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

В процессе разработки отчетов или написания запросов в 1С программисты часто сталкиваются с ситуацией, когда по определенному счету (например, затратному или счету денежных средств) необходимо получить остаток в разрезе аналитики, у которой в Плане счетов установлена галочка «Только обороты». Попытка стандартно использовать колонки СуммаНачальныйОстаток или СуммаКонечныйОстаток в виртуальных таблицах регистра бухгалтерии приводит к получению пустых значений или нулей. Разберем детально, почему так происходит и какими способами можно решить эту задачу.

Техническая природа оборотного субконто

Для начала проанализируем, как 1С хранит данные на уровне СУБД. Ресурс РегистрБухгалтерии при включенном признаке «Только обороты» для субконто ведет себя специфически. В системе существуют основные таблицы:

  1. Таблица итогов (остатков): Здесь хранятся рассчитанные на каждый месяц актуальные остатки. Если у субконто стоит признак «Только обороты», платформа физически не записывает данные по этому измерению в таблицу остатков.
  2. Таблица оборотов: Здесь фиксируются движения между счетами. Данные об оборотном субконто попадают только сюда.

Следовательно, когда мы обращаемся к виртуальной таблице ОстаткиИОбороты, система пытается взять данные из итогов, но не находит их там для данной аналитики. Это сделано в целях оптимизации: если бы система хранила остатки по каждой статье затрат за десятилетия, объем базы данных рос бы в геометрической прогрессии, а скорость проведения документов катастрофически снизилась бы.

Метод 1: Расчет остатка «от сотворения мира»

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


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

В данном примере мы используем виртуальную таблицу Обороты. Важный момент: первый параметр (Дата начала) оставляем пустым, а во второй параметр (Дата окончания) передаем границу, на которую нам нужен остаток. Таким образом, мы принудительно заставляем систему просканировать все записи и вычислить сумму.

Метод 2: Использование временных таблиц для оптимизации

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

  1. Создадим временную таблицу, в которую поместим обороты с пустой даты начала до &ДатаНачала. Это будет наш начальный остаток.
  2. Во второй временной таблице соберем обороты за текущий период (от &ДатаНачала до &ДатаОкончания).
  3. Объединим результаты левым или полным соединением.

Посмотрим на пример реализации такого подхода:


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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВТ_НачальныеОстатки.Аналитика,
	ВТ_НачальныеОстатки.НачОстаток,
	ЕСТЬNULL(ТекущиеОбороты.СуммаОборотДт, 0) КАК ОборотДт,
	ЕСТЬNULL(ТекущиеОбороты.СуммаОборотКт, 0) КАК ОборотКт,
	ВТ_НачальныеОстатки.НачОстаток + ЕСТЬNULL(ТекущиеОбороты.СуммаОборотДт, 0) - ЕСТЬNULL(ТекущиеОбороты.СуммаОборотКт, 0) КАК КонОстаток
ИЗ
	ВТ_НачальныеОстатки КАК ВТ_НачальныеОстатки
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Типовой.Обороты(&ДатаНачала, &ДатаОкончания, , Счет = &Счет, , , , ) КАК ТекущиеОбороты
		ПО ВТ_НачальныеОстатки.Аналитика = ТекущиеОбороты.Субконто1

Методологические нюансы

Проанализируем ситуацию, описанную в вопросе автора. Речь идет о счете АдминистративныеРасходы. В типовых конфигурациях затратные счета (такие как 26, 44 или 90) закрываются в конце каждого месяца в ноль. Это означает, что даже если мы будем рассчитывать остаток по статьям затрат от начала времен, на начало любого месяца он все равно будет равен нулю, так как регламентная операция закрытия месяца «схлопнула» все обороты.

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

Когда остаток по оборотному субконто действительно нужен?

Чаще всего эта задача возникает в разрезе Статей движения денежных средств (ДДС) на 51 или 50 счетах. Бухгалтеры часто просят отчет: «Сколько денег на текущем счету осталось по конкретной статье ДДС?». С точки зрения методологии 1С — это некорректная постановка вопроса, так как деньги не «красятся» статьями в остатке. Деньги — это общий ресурс, а статья ДДС — это лишь характеристика их движения (прихода или расхода).

Если бизнес-логика все же требует такого разделения, возможны два пути:

  1. Использование Регистров накопления: В конфигурациях уровня ERP или Комплексная автоматизация параллельно с проводками данные записываются в специализированные регистры, где аналитика (статьи) является полноценным измерением, по которому хранятся остатки.
  2. Смена настройки в Плане счетов: Можно снять галочку «Только обороты». Внимание: это приведет к необходимости полного пересчета итогов и значительно увеличит размер базы данных. Делать это на работающей базе без согласования с архитектором системы категорически не рекомендуется.

Подведем итог: получить остаток напрямую через СуммаНачальныйОстаток у оборотного субконто невозможно. Для решения задачи используйте суммирование оборотов через виртуальную таблицу Обороты с неограниченной нижней границей даты, предварительно убедившись, что накопление такого остатка имеет методологический смысл для выбранного счета.

← На главную