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

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

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

Попытка решить эту задачу «в лоб» через виртуальную таблицу ОстаткиИОбороты приводит к двум серьезным проблемам: низкой производительности запроса и риску получить неверные данные из-за смещения индексов субконто. В этой статье мы подробно разберем эти проблемы и построим оптимальный и безопасный запрос.

В чем сложность стандартного подхода?

Рассмотрим типичные ошибки, которые совершают начинающие разработчики при решении этой задачи:

  1. Использование таблицы ОстаткиИОбороты. Виртуальная таблица ОстаткиИОбороты является наиболее «тяжелой» для СУБД. При обращении к ней система тратит колоссальные ресурсы на расчет остатков на каждую из границ указанного периода. Если нам нужны только договоры, по которым были движения (операции), расчет остатков становится абсолютно избыточной операцией.
  2. Прямое обращение к Субконто1. План счетов ЕПСБУ в БГУ имеет динамическую настройку субконто. На разных счетах субконто «Договоры» может находиться на разных позициях: где-то оно назначено первым (Субконто1), где-то вторым (Субконто2) или третьим (Субконто3). Если в запросе напрямую обратиться к полю Субконто1, система вернет контрагентов, номенклатуру или другие виды аналитики вместо ожидаемых договоров.
  3. Дублирование записей. Запрос к регистру без использования группировки или отбора уникальных значений вернет столько строк с одним и тем же договором, сколько проводок по нему было сделано. Нам же нужен чистый список уникальных договоров.

Шаг 1. Переход на виртуальную таблицу «Обороты»

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

Для нашей задачи идеально подходит таблица РегистрБухгалтерии.ЖурналПроводокЕПСБУ.Обороты (или аналогичный регистр бухгалтерии в вашей конфигурации).

Шаг 2. Фиксация позиции субконто с помощью параметров таблицы

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

Когда мы передаем этот фильтр в параметры таблицы, платформа автоматически проецирует данный вид аналитики в поле Субконто1 результирующей таблицы запроса, независимо от того, каким по счету этот субконто назначен в настройках конкретных счетов плана счетов.

Шаг 3. Реализация оптимального запроса

Проанализируем структуру оптимального запроса. Мы будем использовать ключевое слово РАЗЛИЧНЫЕ для исключения дубликатов договоров и наложим отбор по организации и периоду непосредственно в параметрах виртуальной таблицы, чтобы задействовать индексы СУБД.

Посмотрим на пример построения запроса:


ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
    ЖурналПроводокОбороты.Субконто1 КАК Договор,
    ЖурналПроводокОбороты.Организация КАК Организация
ИЗ
    РегистрБухгалтерии.ЖурналПроводокЕПСБУ.Обороты(
        &НачалоПериода,
        &КонецПериода,
        ,
        ,
        &СписокВидовСубконто,
        ,
        Организация = &Организация
    ) КАК ЖурналПроводокОбороты

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

  1. &НачалоПериода и &КонецПериода — даты начала и окончания текущего года. Передача этих параметров позволяет базе данных быстро отсечь лишние записи по индексам дат.
  2. &СписокВидовСубконто — массив, в который перед выполнением запроса мы передаем вид субконто «Договоры». Именно это гарантирует, что в поле Субконто1 результата запроса окажутся только ссылки на справочник договоров.
  3. Организация = &Организация — условие в параметре «Условие» виртуальной таблицы. Отбор на этом уровне работает гораздо быстрее, чем отбор в секции ГДЕ итогового запроса.

Альтернативный вариант решения проблемы

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

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

← На главную