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