Как правильно получить остатки и обороты из регистра бухгалтерии в 1С?

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

Работа с бухгалтерскими итогами — одна из наиболее часто встречающихся задач при разработке на платформе 1С:Предприятие. Несмотря на кажущуюся простоту, существует множество нюансов, связанных с производительностью системы, правильностью наложения фильтров и выбором виртуальных таблиц. В этой статье мы проведем профессиональную оптимизацию запросов к виртуальным таблицам (в этом поможет консоль запросов и инструменты отладки в 1С), рассмотрим, как строится универсальная оборотно-сальдовая ведомость в современных конфигурациях, и подробно проанализируем механизмы получения данных из регистра бухгалтерии, разберем типичные ошибки и рассмотрим наиболее эффективные способы решения задачи.

Понятие виртуальных таблиц регистра бухгалтерии

Для начала разберем, почему в 1С для получения итогов не рекомендуется использовать реальные таблицы движений. Регистр бухгалтерии хранит записи в физической таблице, но для удобства программиста платформа предоставляет ВиртуальныеТаблицы. Эти таблицы не существуют в базе данных постоянно, а формируются на лету в момент обращения к ним. Основное преимущество такого подхода — автоматический расчет остатков на любую дату без необходимости пересчитывать все движения с начала времен. Понимание того, как работают эти механизмы на уровне СУБД, позволяет значительно повысить скорость выполнения операций.

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

  1. Остатки — позволяет получить остатки (дебетовые, кредитовые, развернутые) на определенный момент времени.
  2. Обороты — возвращает обороты за выбранный период.
  3. ОстаткиИОбороты — самая универсальная таблица, позволяющая получить и начальный остаток, и обороты, и конечный остаток в рамках одного запроса.

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

Давайте проанализируем параметры, которые принимает эта таблица. Правильное использование параметров — залог того, что ваш запрос будет работать быстро и не приведет к блокировкам базы данных. Проанализируем структуру параметров:


РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, &Периодичность, &МетодДополнения, &УсловиеСчета, &Субконто, &Условие, &Организация)

Рассмотрим подробнее каждый из них:

  1. НачалоПериода и КонецПериода. Определяют временные рамки. Важно помнить, что если КонецПериода не указан, итоги будут рассчитаны на текущий момент.
  2. Периодичность. Позволяет сгруппировать данные по дням, месяцам, годам или регистраторам. Например, если вам необходимо сформировать остатки и обороты по счетам с субконто по месяцам, в этом параметре следует указать Месяц.
  3. УсловиеСчета. Один из важнейших параметров. Если мы заранее знаем, по какому счету нам нужны данные, мы обязательно должны передать это условие в параметры виртуальной таблицы, а не фильтровать результат в секции ГДЕ.
  4. Субконто. Здесь мы указываем массив видов субконто, по которым хотим получить аналитику.
  5. Условие. Сюда можно передать произвольные фильтры, например, по конкретному значению Субконто1.

Практический пример запроса

Теперь разберем ситуацию, когда нам необходимо получить остатки и обороты по счету 60 "Расчеты с поставщиками и подрядчиками" в разрезе контрагентов. Подобный подход часто применяется, когда разрабатывается анализ реализации и расчетов с покупателями, где требуется высокая детализация данных — для решения этой задачи подойдёт отчет по анализу расчетов с контрагентами с расшифровкой по документам. Посмотрим на пример кода запроса:


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

Запрос.УстановитьПараметр("НачПериода", НачалоМесяца(ТекущаяДата()));
Запрос.УстановитьПараметр("КонПериода", КонецМесяца(ТекущаяДата()));
Запрос.УстановитьПараметр("Счет60", ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками);

РезультатЗапроса = Запрос.Выполнить();

Выясним причину, почему мы использовали параметр УсловиеСчета. Если бы мы написали условие ГДЕ ХозрасчетныйОстаткиИОбороты.Счет = &Счет60, система сначала рассчитала бы итоги по всем счетам плана счетов, а потом просто "отрезала" бы лишнее. Это крайне неэффективно для больших баз данных.

Оптимизация при работе с Субконто

Часто возникает вопрос: как правильно фильтровать данные по конкретному субконто? Рассмотрим ситуацию, когда нам нужны данные только по определенному договору. В 1С 8.3 порядок следования субконто в плане счетов может меняться, поэтому обращение к Субконто1 или Субконто2 напрямую считается плохим тоном. Чтобы построить качественный расширенный анализ субконто Контрагенты, используя определенные секреты и нюансы работы с субконто, проанализируем, как сделать это правильно с помощью параметров виртуальной таблицы.

Посмотрим на пример правильного наложения фильтра:


МассивСубконто = Новый Массив;
МассивСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты);
МассивСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры);

Запрос.Текст = 
"ВЫБРАТЬ
|	ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Контрагент,
|	ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Договор,
|	ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстаток
|ИЗ
|	РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(,, , , Счет = &Счет, &МассивСубконто, Субконто2 = &Договор, ) КАК ХозрасчетныйОстаткиИОбороты";

Запрос.УстановитьПараметр("Счет", ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками);
Запрос.УстановитьПараметр("МассивСубконто", МассивСубконто);
Запрос.УстановитьПараметр("Договор", НужныйДоговор);

В данном случае платформа гарантирует, что во второй колонке Субконто2 будет именно Договор, так как мы явно передали порядок в массив субконто. Это делает код устойчивым к изменениям в настройках плана счетов.

Использование временных таблиц для ускорения сложных отчетов

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

  1. Сначала мы выбираем нужные нам остатки во временную таблицу.
  2. Индексируем временную таблицу по ключевым полям (например, по Контрагенту).
  3. Соединяем проиндексированную временную таблицу с другими данными.

Такой подход позволяет СУБД построить более оптимальный план выполнения запроса. Выясним, почему это важно: при прямом соединении виртуальной таблицы с реальной таблицей (например, Справочником), оптимизатор SQL не всегда может правильно оценить объем данных, что приводит к "тормозам".

Рассмотрим пример создания временной таблицы:


МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;

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

Запрос.Выполнить();

Типичные ошибки при получении итогов

В процессе совместной работы над задачами часто выявляются типичные ошибки при получении бухгалтерских итогов, которых следует избегать:

Подведение итогов

Мы проанализировали основные методы получения данных из регистра бухгалтерии в 1С 8.3. Подводя итог, можно сказать, что наиболее эффективным инструментом является виртуальная таблица ОстаткиИОбороты с обязательным заполнением параметров УсловиеСчета и Субконто. При разработке сложных аналитических систем всегда отдавайте приоритет временным таблицам и индексации. Это обеспечит высокую скорость работы программы даже при значительном росте объема данных.

← На главную