К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как получить вид субконто в запросе 1С

Как получить вид субконто в запросе 1С: обращение к таблице ВидыСубконто плана счетов, виртуальной таблице Обороты, примеры кода, ошибки и проверка результата.

В бухгалтерских регистрах 1С аналитика хранится в полях вида «Субконто1», «Субконто2», «Субконто3», а сведения о том, какой именно вид субконто стоит за каждым из этих полей, лежат отдельно — в табличной части «ВидыСубконто» плана счетов. Поэтому, когда в запросе нужно не просто значение субконто, а его вид (например, «Номенклатура», «Контрагенты», «Статьи затрат»), требуется отдельное соединение с этой таблицей.

Задача встречается в двух типовых ситуациях: при построении универсальных отчётов по регистру бухгалтерии и при программной обработке проводок, где логика зависит от вида аналитики. Ниже разобраны рабочие способы получить вид субконто в запросе, их ограничения, типичные ошибки и способы проверки результата.

Где хранится вид субконто и почему его нет в регистре

В типовых конфигурациях на базе бухгалтерского учёта (БП, УПП, КА, ERP) каждый счёт плана счетов имеет табличную часть «ВидыСубконто». В её строках хранятся ссылки на план видов характеристик «ВидыСубконтоХозрасчетный» (в типовых решениях) и признаки учёта: только обороты, суммовой, количественный, валютный. Сам регистр бухгалтерии хранит только значения субконто — ссылки на конкретные элементы справочников и документов.

Из этого следует главное ограничение: по значению субконто нельзя однозначно узнать его вид без обращения к плану счетов. Одно и то же поле «Субконто1» на разных счетах означает разную аналитику: на счёте 10.01 это номенклатура, на счёте 60.01 — контрагент. Поэтому любой запрос, которому нужен вид аналитики, должен знать счёт и номер субконто.

Способ 1: соединение с табличной частью ВидыСубконто

Основной и самый надёжный способ — левое соединение движений регистра бухгалтерии с табличной частью плана счетов по двум условиям: ссылка на счёт и номер строки видов субконто. Номер строки в табличной части соответствует порядковому номеру субконто в проводке: первая строка — Субконто1, вторая — Субконто2 и так далее.

Пример запроса, который выводит движения по счёту с видом первого субконто:

ВЫБРАТЬ

Движения.СчетДт КАК Счет,

Движения.СубконтоДт1 КАК Субконто,

ВидыСубконто.ВидСубконто КАК ВидСубконто

ИЗ

РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(

, , СчетДт = &Счет, , ) КАК Движения

ЛЕВОЕ СОЕДИНЕНИЕ ПланСчетов.Хозрасчетный.ВидыСубконто КАК ВидыСубконто

ПО Движения.СчетДт = ВидыСубконто.Ссылка

И ВидыСубконто.НомерСтроки = 1

Обратите внимание на два момента. Во-первых, табличная часть в языке запросов адресуется через точку: ПланСчетов.Хозрасчетный.ВидыСубконто. Во-вторых, поле НомерСтроки у табличной части доступно в запросе и используется как номер субконто. Если нужен вид второго субконто — добавьте второе соединение с псевдонимом и условием НомерСтроки = 2.

bsl
ВЫБРАТЬ
	ВидыСубконто.Ссылка КАК Счет,
	ВидыСубконто.НомерСтроки КАК НомерСубконто,
	ВидыСубконто.ВидСубконто КАК ВидСубконто
ИЗ
	ПланСчетов.Хозрасчетный.ВидыСубконто КАК ВидыСубконто
ГДЕ
	ВидыСубконто.Ссылка = &Счет

Способ 2: получить виды субконто счёта отдельным запросом

Часто вид субконто нужен не в каждой строке отчёта, а один раз — чтобы построить заголовки колонок, проверить настройки счёта или организовать цикл в коде. В этом случае проще выполнить отдельный запрос к табличной части плана счетов и обойти результат.

Такой запрос возвращает список видов субконто конкретного счёта в правильном порядке. Сортировка по номеру строки важна: порядок видов субконто определяет, какое поле регистра (Субконто1, Субконто2, Субконто3) соответствует каждому виду. В коде результат удобно поместить в соответствие, где ключ — номер субконто, значение — вид.

Если нужно получить именно тип значения субконто (например, «СправочникСсылка.Номенклатура»), а не вид, используйте функцию ТИПЗНАЧЕНИЯ() в запросе — она работает с самим значением субконто и не требует соединения с планом счетов. Это альтернатива, когда вид субконто как объект не нужен, а важен лишь тип данных.

Сравнение вариантов

Соединение с ВидыСубконто

Подходит, когда вид субконто нужен в каждой строке выборки. Требует знания счёта и номера субконто, увеличивает сложность запроса.

Отдельный запрос к плану счетов

Оптимален для построения структуры отчёта или проверки настроек счёта. Выполняется один раз, результат кэшируется в коде.

ТИПЗНАЧЕНИЯ(Субконто)

Даёт тип значения без обращения к плану счетов. Не возвращает вид субконто как объект, подходит только для проверки типа данных.

Работа с виртуальными таблицами Обороты и Остатки

Виртуальные таблицы регистра бухгалтерии «Обороты» и «Остатки» содержат поля Субконто1…СубконтоN, но не содержат видов субконто. При этом у таблицы «Обороты» есть параметр «ВидыСубконто», который позволяет отфильтровать обороты по конкретным видам аналитики — это полезно, когда нужно получить данные только по счетам с определённым набором аналитики.

Если в отчёте по оборотам нужно вывести вид субконто, соединение строится по полю счёта виртуальной таблицы и фиксированному номеру строки. Пример для первого субконто:

ВЫБРАТЬ

Обороты.Счет КАК Счет,

Обороты.Субконто1 КАК Субконто,

ВидыСубконто.ВидСубконто КАК ВидСубконто,

Обороты.СуммаОборот КАК Сумма

ИЗ

РегистрБухгалтерии.Хозрасчетный.Обороты(

&НачалоПериода, &КонецПериода, , , , , ) КАК Обороты

ЛЕВОЕ СОЕДИНЕНИЕ ПланСчетов.Хозрасчетный.ВидыСубконто КАК ВидыСубконто

ПО Обороты.Счет = ВидыСубконто.Ссылка

И ВидыСубконто.НомерСтроки = 1

Учтите, что в выборке по нескольким счетам с разной аналитикой один и тот же номер субконто даст разные виды в разных строках — это нормально и именно так отражается настройка плана счетов. Если отчёт предполагает единую колонку «Вид субконто», убедитесь, что пользователь понимает: значение в ней зависит от счёта строки.

Получение вида субконто в коде без запроса

Когда запрос избыточен, вид субконто можно получить через объектную модель. У объекта счёта (ПланСчетовОбъект или ссылка с обращением через точку) доступна табличная часть ВидыСубконто, а у строки — свойство ВидСубконто. Для одиночного счёта это быстрее и читабельнее запроса.

СчетОбъект = Счет.ПолучитьОбъект();

Для Каждого СтрокаВида Из СчетОбъект.ВидыСубконто Цикл

Сообщить("Субконто " + СтрокаВида.НомерСтроки + ": " + СтрокаВида.ВидСубконто);

КонецЦикла;

Для массовой обработки (сотни счетов или тысячи проводок) объектный способ проигрывает запросу по производительности: каждое обращение ПолучитьОбъект() — отдельное чтение из базы. Правило простое: один счёт — объектная модель, набор данных — запрос с соединением.

Маршрут решения

Как выбрать действие

Вид субконто нужен в каждой строке отчёта по региструИспользуйте левое соединение с ПланСчетов.<Имя>.ВидыСубконто по счёту и номеру строки
Нужно один раз узнать аналитику конкретного счётаВыполните запрос к табличной части ВидыСубконто или обратитесь к объекту счёта в коде
Нужен только тип данных значения субконтоПримените ТИПЗНАЧЕНИЯ(Субконто) без соединения с планом счетов

Типичные ошибки и как их избежать

Самая частая ошибка — соединение только по счёту без условия на номер строки. В этом случае каждая строка движений задваивается (или застраивается) по числу видов субконто счёта, суммы в отчёте увеличиваются кратно, и пользователь получает неверные итоги. Всегда добавляйте условие НомерСтроки = <номер субконто>.

Вторая ошибка — использование внутреннего соединения вместо левого. Если у счёта меньше субконто, чем запрашивается (например, у счёта два вида аналитики, а соединение идёт по третьему номеру), внутреннее соединение отфильтрует такие строки полностью, и данные по счёту исчезнут из отчёта. Левое соединение сохранит строку с пустым видом субконто.

Третья группа проблем — путаница между дебетовыми и кредитовыми субконто. В таблице «ДвиженияССубконто» поля называются СубконтоДт1 и СубконтоКт1, и вид для каждого нужно получать соединением с соответствующим счётом (СчетДт или СчетКт). Соединение по неверному счёту даст вид субконто чужой аналитики.

Типичные ошибки
01
Соединение без условия на НомерСтроки — задвоение строк и завышенные итоги
02
Внутреннее соединение вместо левого — потеря строк по счетам с меньшим числом субконто
03
Соединение по СчетДт при выводе СубконтоКт — отображается вид чужой аналитики
04
Ожидание поля ВидСубконто в виртуальных таблицах Обороты/Остатки — его там нет, нужно соединение

Проверка результата

После построения запроса проверьте его на счёте с известной аналитикой. Например, для типового плана счетов у счёта 60.01 первый вид субконто — «Контрагенты», второй — «Договоры». Если запрос возвращает эти значения в правильном порядке — соединение построено корректно.

Дополнительная проверка — сравнить количество строк результата с количеством строк исходной выборки без соединения. Совпадение означает, что соединение не размножило данные. Расхождение — признак пропущенного условия по номеру строки или дублей в настройках плана счетов.

Контрольные точки

Как проверить результат

Вид субконто для известного счёта
Норма

Совпадает с настройкой счёта в плане счетов

Тревожный признак

Пустое значение или вид от другого счёта

Количество строк до и после соединения
Норма

Количество строк не изменилось

Тревожный признак

Строки задвоились или исчезли

Порядок видов субконто
Норма

Номер строки 1 соответствует Субконто1 и т.д.

Тревожный признак

Виды перепутаны местами

Ограничения и особенности

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

При работе с корреспондирующими наборами субконто (таблица движений с полями вида СубконтоДт/СубконтоКт) помните, что количество видов субконто по дебету и кредиту может различаться. Универсальные отчёты, перебирающие субконто в цикле, должны получать реальное количество видов для каждого счёта отдельным запросом, а не жёстко зашитым числом.

Итог

Что важно запомнить

Вид субконто хранится в табличной части плана счетов ВидыСубконто, а не в регистре. В запросе его получают левым соединением по счёту и номеру строки табличной части. Всегда задавайте условие на номер строки, используйте левое соединение и проверяйте результат на счёте с известной аналитикой.

Частые вопросы

Можно ли получить вид субконто прямо из виртуальной таблицы Обороты?

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

Чем отличается вид субконто от типа значения субконто?

Вид субконто — это объект плана видов характеристик, описывающий аналитический разрез счёта (например, «Номенклатура»). Тип значения — это конкретный тип данных ссылки в проводке. Вид может описывать составной тип (несколько видов справочников), поэтому для проверки конкретного типа значения используйте ТИПЗНАЧЕНИЯ(), а для получения настройки счёта — соединение с ВидыСубконто.

Почему после соединения суммы в отчёте удвоились?

Почти всегда причина — отсутствие условия на номер строки табличной части ВидыСубконто. Без него каждая строка движений соединяется со всеми видами субконто счёта, и строки размножаются. Добавьте условие НомерСтроки = 1 (или нужный номер) в соединение.

Как получить виды субконто сразу для всех трёх полей в одном запросе?

Добавьте три левых соединения с одной и той же табличной частью под разными псевдонимами, с условиями НомерСтроки = 1, 2 и 3 соответственно. Каждое соединение даст вид своего субконто в отдельном поле выборки.

Работает ли этот подход в запросах к СКД и динамическим спискам?

Да, соединение с табличной частью плана счетов корректно работает в наборах данных СКД. Учитывайте, что в СКД дополнительные соединения влияют на производительность отчёта, поэтому при больших объёмах данных имеет смысл выносить виды субконто во временную таблицу пакетного запроса.