При работе с регистром бухгалтерии в конфигурациях 1С (особенно в «Бухгалтерии государственного учреждения» — БГУ или «Бухгалтерии предприятия») разработчики часто сталкиваются с задачей получения списка аналитики, по которой зафиксированы хозяйственные операции за определенный период. Например, необходимо выбрать все договоры, по которым велись расчеты в текущем году.
Попытка решить эту задачу «в лоб» через виртуальную таблицу ОстаткиИОбороты приводит к двум серьезным проблемам: низкой производительности запроса и риску получить неверные данные из-за смещения индексов субконто. В этой статье мы подробно разберем эти проблемы и построим оптимальный и безопасный запрос.
Рассмотрим типичные ошибки, которые совершают начинающие разработчики при решении этой задачи:
ОстаткиИОбороты является наиболее «тяжелой» для СУБД. При обращении к ней система тратит колоссальные ресурсы на расчет остатков на каждую из границ указанного периода. Если нам нужны только договоры, по которым были движения (операции), расчет остатков становится абсолютно избыточной операцией.Субконто1), где-то вторым (Субконто2) или третьим (Субконто3). Если в запросе напрямую обратиться к полю Субконто1, система вернет контрагентов, номенклатуру или другие виды аналитики вместо ожидаемых договоров.Выясним причину, почему таблица Обороты работает быстрее. Она выбирает исключительно факты хозяйственной жизни (обороты) за указанный интервал дат, не обращаясь к таблицам итогов для расчета остатков. Это значительно сокращает время выполнения запроса на СУБД.
Для нашей задачи идеально подходит таблица РегистрБухгалтерии.ЖурналПроводокЕПСБУ.Обороты (или аналогичный регистр бухгалтерии в вашей конфигурации).
Чтобы обойти ограничение разного порядка следования субконто на счетах, воспользуемся специальным механизмом платформы 1С. В пятый параметр виртуальной таблицы (параметр Субконто) мы передадим массив, содержащий конкретный вид характеристики. Для этого в коде 1С сформируем массив, содержащий ссылку на нужный вид субконто (например, ПланыВидовХарактеристик.ВидыСубконтоБюджет.Договоры).
Когда мы передаем этот фильтр в параметры таблицы, платформа автоматически проецирует данный вид аналитики в поле Субконто1 результирующей таблицы запроса, независимо от того, каким по счету этот субконто назначен в настройках конкретных счетов плана счетов.
Проанализируем структуру оптимального запроса. Мы будем использовать ключевое слово РАЗЛИЧНЫЕ для исключения дубликатов договоров и наложим отбор по организации и периоду непосредственно в параметрах виртуальной таблицы, чтобы задействовать индексы СУБД.
Посмотрим на пример построения запроса:
ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
ЖурналПроводокОбороты.Субконто1 КАК Договор,
ЖурналПроводокОбороты.Организация КАК Организация
ИЗ
РегистрБухгалтерии.ЖурналПроводокЕПСБУ.Обороты(
&НачалоПериода,
&КонецПериода,
,
,
&СписокВидовСубконто,
,
Организация = &Организация
) КАК ЖурналПроводокОбороты
Разберем параметры виртуальной таблицы по шагам:
Субконто1 результата запроса окажутся только ссылки на справочник договоров.ГДЕ итогового запроса.Если перед вами стоит задача получить договоры только по определенным направлениям деятельности (например, только по расчетам со сторонними контрагентами или только по принятым обязательствам), то обращаться к универсальному регистру бухгалтерии может быть не лучшей идеей.
В этом случае эффективнее использовать специализированные регистры накопления (например, регистры расчетов с контрагентами или регистры учета обязательств). Таблицы оборотов специализированных регистров накопления содержат значительно меньше измерений и рассчитываются СУБД в разы быстрее, чем тяжелый журнал проводок бухгалтерии.