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