Работа с бухгалтерскими итогами — одна из наиболее часто встречающихся задач при разработке на платформе 1С:Предприятие. Несмотря на кажущуюся простоту, существует множество нюансов, связанных с производительностью системы, правильностью наложения фильтров и выбором виртуальных таблиц. В этой статье мы проведем профессиональную оптимизацию запросов к виртуальным таблицам (в этом поможет консоль запросов и инструменты отладки в 1С), рассмотрим, как строится универсальная оборотно-сальдовая ведомость в современных конфигурациях, и подробно проанализируем механизмы получения данных из регистра бухгалтерии, разберем типичные ошибки и рассмотрим наиболее эффективные способы решения задачи.
Для начала разберем, почему в 1С для получения итогов не рекомендуется использовать реальные таблицы движений. Регистр бухгалтерии хранит записи в физической таблице, но для удобства программиста платформа предоставляет ВиртуальныеТаблицы. Эти таблицы не существуют в базе данных постоянно, а формируются на лету в момент обращения к ним. Основное преимущество такого подхода — автоматический расчет остатков на любую дату без необходимости пересчитывать все движения с начала времен. Понимание того, как работают эти механизмы на уровне СУБД, позволяет значительно повысить скорость выполнения операций.
Рассмотрим основные виртуальные таблицы, которые мы будем использовать:
Остатки — позволяет получить остатки (дебетовые, кредитовые, развернутые) на определенный момент времени.Обороты — возвращает обороты за выбранный период.ОстаткиИОбороты — самая универсальная таблица, позволяющая получить и начальный остаток, и обороты, и конечный остаток в рамках одного запроса.Давайте проанализируем параметры, которые принимает эта таблица. Правильное использование параметров — залог того, что ваш запрос будет работать быстро и не приведет к блокировкам базы данных. Проанализируем структуру параметров:
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, &Периодичность, &МетодДополнения, &УсловиеСчета, &Субконто, &Условие, &Организация)
Рассмотрим подробнее каждый из них:
КонецПериода не указан, итоги будут рассчитаны на текущий момент.Месяц.ГДЕ.Субконто1.Теперь разберем ситуацию, когда нам необходимо получить остатки и обороты по счету 60 "Расчеты с поставщиками и подрядчиками" в разрезе контрагентов. Подобный подход часто применяется, когда разрабатывается анализ реализации и расчетов с покупателями, где требуется высокая детализация данных — для решения этой задачи подойдёт отчет по анализу расчетов с контрагентами с расшифровкой по документам. Посмотрим на пример кода запроса:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Контрагент,
| ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстаток КАК НачОстаток,
| ХозрасчетныйОстаткиИОбороты.СуммаОборотДт КАК ОборотДт,
| ХозрасчетныйОстаткиИОбороты.СуммаОборотКт КАК ОборотКт,
| ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстаток КАК КонОстаток
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачПериода, &КонПериода, , , Счет = &Счет60, , , ) КАК ХозрасчетныйОстаткиИОбороты";
Запрос.УстановитьПараметр("НачПериода", НачалоМесяца(ТекущаяДата()));
Запрос.УстановитьПараметр("КонПериода", КонецМесяца(ТекущаяДата()));
Запрос.УстановитьПараметр("Счет60", ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками);
РезультатЗапроса = Запрос.Выполнить();
Выясним причину, почему мы использовали параметр УсловиеСчета. Если бы мы написали условие ГДЕ ХозрасчетныйОстаткиИОбороты.Счет = &Счет60, система сначала рассчитала бы итоги по всем счетам плана счетов, а потом просто "отрезала" бы лишнее. Это крайне неэффективно для больших баз данных.
Часто возникает вопрос: как правильно фильтровать данные по конкретному субконто? Рассмотрим ситуацию, когда нам нужны данные только по определенному договору. В 1С 8.3 порядок следования субконто в плане счетов может меняться, поэтому обращение к Субконто1 или Субконто2 напрямую считается плохим тоном. Чтобы построить качественный расширенный анализ субконто Контрагенты, используя определенные секреты и нюансы работы с субконто, проанализируем, как сделать это правильно с помощью параметров виртуальной таблицы.
Посмотрим на пример правильного наложения фильтра:
МассивСубконто = Новый Массив;
МассивСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты);
МассивСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры);
Запрос.Текст =
"ВЫБРАТЬ
| ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Контрагент,
| ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Договор,
| ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстаток
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(,, , , Счет = &Счет, &МассивСубконто, Субконто2 = &Договор, ) КАК ХозрасчетныйОстаткиИОбороты";
Запрос.УстановитьПараметр("Счет", ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками);
Запрос.УстановитьПараметр("МассивСубконто", МассивСубконто);
Запрос.УстановитьПараметр("Договор", НужныйДоговор);
В данном случае платформа гарантирует, что во второй колонке Субконто2 будет именно Договор, так как мы явно передали порядок в массив субконто. Это делает код устойчивым к изменениям в настройках плана счетов.
При построении сложных отчетов, где данные регистра бухгалтерии соединяются с данными других регистров, мы рекомендуем использовать временные таблицы для ускорения процесса обработки. Разберем по шагам этот процесс:
Такой подход позволяет СУБД построить более оптимальный план выполнения запроса. Выясним, почему это важно: при прямом соединении виртуальной таблицы с реальной таблицей (например, Справочником), оптимизатор SQL не всегда может правильно оценить объем данных, что приводит к "тормозам".
Рассмотрим пример создания временной таблицы:
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст =
"ВЫБРАТЬ
| ХозрасчетныйОстатки.Субконто1 КАК Контрагент,
| ХозрасчетныйОстатки.СуммаОстатокДт КАК Остаток
|ПОМЕСТИТЬ ВТ_Остатки
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет = &Счет, , ) КАК ХозрасчетныйОстатки
|ИНДЕКСИРОВАТЬ ПО
| Контрагент";
Запрос.Выполнить();
В процессе совместной работы над задачами часто выявляются типичные ошибки при получении бухгалтерских итогов, которых следует избегать:
КонецПериода дату без времени (например, 31.12.2023 00:00:00), то движения самого этого дня не попадут в расчет. Используйте КонецДня().СуммаРазвернутыйОстатокДт и СуммаРазвернутыйОстатокКт, чтобы видеть реальную картину задолженности, а не свернутую разницу.Мы проанализировали основные методы получения данных из регистра бухгалтерии в 1С 8.3. Подводя итог, можно сказать, что наиболее эффективным инструментом является виртуальная таблица ОстаткиИОбороты с обязательным заполнением параметров УсловиеСчета и Субконто. При разработке сложных аналитических систем всегда отдавайте приоритет временным таблицам и индексации. Это обеспечит высокую скорость работы программы даже при значительном росте объема данных.