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

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

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

Способы получить значение субконто в 1С: через запрос к виртуальным таблицам регистра бухгалтерии, обход проводок документа, отбор в СКД. Примеры кода и типичные ошибки.

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

Главная сложность в том, что количество и типы субконто задаются в плане счетов и меняются от счёта к счёту. Поэтому обращение к субконто почти всегда идёт либо по порядковому номеру (Субконто1, Субконто2, Субконто3), либо по виду субконто через соответствие. Оба способа рассмотрены ниже с примерами кода.

Материал ориентирован на управляемые формы и типовые конфигурации на базе БСП (Бухгалтерия предприятия, ERP, Комплексная автоматизация), но принципы одинаковы для любого регистра бухгалтерии, созданного вручную.

Где хранятся субконто и как к ним обращаться

Физически значения субконто хранятся в таблицах регистра бухгалтерии, а их состав определяется планом счетов через план видов характеристик «Виды субконто». У каждого счёта есть табличная часть «Виды субконто», где заданы разрезы учёта и их очерёдность. Максимальное количество субконто на счёте ограничено настройкой плана счетов (в типовых — обычно три).

В коде к субконто обращаются двумя способами. Первый — по индексу: Движение.СубконтоДт1 или через коллекцию Движение.СубконтоДт[1]. Второй — по виду субконто через соответствие: Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура]. Второй способ надёжнее: если в плане счетов изменят порядок субконто, код по виду продолжит работать, а код по индексу начнёт возвращать чужие данные.

Получение субконто запросом к виртуальным таблицам

Самый производительный способ получить значения субконто по множеству проводок — запрос к виртуальным таблицам регистра бухгалтерии. Например, таблица РегистрБухгалтерии.Хозрасчетный.Остатки возвращает остатки в разрезе субконто, а Обороты — обороты за период. Поля субконто в результате называются Субконто1, Субконто2, Субконто3 — по порядку, заданному в плане счетов.

Чтобы запрос не зависел от порядка субконто, используют параметр виртуальной таблицы «Субконто» — отбор по видам. Тогда в выборке гарантированно будут только нужные аналитики. Ниже пример получения остатков по счёту 60 в разрезе контрагентов и договоров.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ХозрасчетныйОстатки.Субконто1 КАК Контрагент,

| ХозрасчетныйОстатки.Субконто2 КАК Договор,

| ХозрасчетныйОстатки.СуммаОстаток КАК Сумма

|ИЗ

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

| &Период,

| Счет = &Счет,

| &ВидыСубконто,

| ) КАК ХозрасчетныйОстатки";

ВидыСубконто = Новый Массив;

ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты);

ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры);

Запрос.УстановитьПараметр("Период", КонецДня(ТекущаяДатаСеанса()));

Запрос.УстановитьПараметр("Счет", ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками);

Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто);

Результат = Запрос.Выполнить().Выгрузить();

Порядок полей Субконто1 и Субконто2 в выборке соответствует порядку видов субконто на счёте, а не порядку элементов массива. Перед использованием результата проверьте фактический порядок в плане счетов через конфигуратор или запросом к табличной части счёта.

Порядок получения субконто запросом
  1. 1
    Откройте план счетов и определите, какие виды субконто назначены нужному счёту и в каком порядке
  2. 2
    Сформируйте запрос к виртуальной таблице Остатки или Обороты регистра бухгалтерии
  3. 3
    Передайте параметры: период, счёт, массив видов субконто, условие отбора при необходимости
  4. 4
    Выполните запрос и обойдите выборку, обращаясь к полям Субконто1–Субконто3
  5. 5
    Проверьте результат на контрольном примере, сверив с стандартным отчётом ОСВ по счёту

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

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Хозрасчетный.СчетДт,

| Хозрасчетный.СчетКт,

| Хозрасчетный.СубконтоДт1,

| Хозрасчетный.СубконтоДт2,

| Хозрасчетный.Сумма

|ИЗ

| РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный

|ГДЕ

| Хозрасчетный.Регистратор = &Регистратор";

Запрос.УстановитьПараметр("Регистратор", ДокументСсылка);

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

Контрагент = Выборка.СубконтоДт1;

КонецЦикла;

Альтернатива без запроса — работа через объект документа: Движения = ДокументОбъект.Движения.Хозрасчетный; и обход коллекции. Здесь удобно обращаться к субконто по виду: Строка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты]. Если у счёта нет такого вида субконто, обращение вернёт Неопределено — это нужно учитывать в проверках.

Субконто в отчётах на СКД

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

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

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

Способы получить значение субконто

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

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

Обход движений документа

Подходит для анализа проводок одного регистратора. Простой код, но не даёт итогов по периоду

СКД с виртуальной таблицей

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

Типичные ошибки и ограничения

Самая частая ошибка — обращение к субконто по индексу без учёта фактического порядка видов на счёте. После доработки плана счетов код молча начинает возвращать договор вместо контрагента. Диагностируется это сравнением результата запроса со стандартной оборотно-сальдовой ведомостью по счёту.

Вторая группа ошибок связана с параметрами виртуальных таблиц. Если не передать счёт или передать счёт-группу без учёта иерархии, выборка окажется пустой или неполной. Для счетов-групп используйте условие Счет В ИЕРАРХИИ (&Счет). Также помните, что остатки на дату берутся на начало следующего дня: для получения остатка на конец дня передавайте границу с типом «Включая» или конец дня.

Третья ошибка — игнорирование типа значения субконто. Поле субконто составного типа, и прямое сравнение в запросе вида Субконто1 = &Контрагент может работать медленно или не срабатывать при несовпадении типов. Надёжнее передавать отбор через параметр виртуальной таблицы.

Типичные ошибки
01
Обращение СубконтоДт1 по индексу — после перестановки видов субконто в плане счетов код возвращает чужие значения без ошибки
02
Не передан массив видов субконто в виртуальную таблицу — итоги рассчитываются по всем аналитикам и запрос работает медленнее
03
Остатки запрошены на начало даты вместо конца дня — суммы расходятся с ОСВ на один день
04
Отбор по значению субконто наложен в секции ГДЕ вместо параметра виртуальной таблицы — запрос читает лишние данные
05
Сравнение с Неопределено пропущено: у счёта нет запрошенного вида субконто, и код падает или возвращает пустое значение

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

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

Для проводок конкретного документа эталон — отчёт «Проводки» или «Анализ проводок» по регистратору. Откройте движения документа из формы самого документа (кнопка «Дт/Кт» в типовых конфигурациях) и сравните каждое субконто с тем, что вернул ваш код.

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

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

Состав значений субконто в выборке
Норма

Совпадает с аналитикой в ОСВ по счёту

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

Значения сдвинуты или подставлены из другого разреза — неверный порядок видов субконто

Суммы остатков или оборотов
Норма

Сходятся с ОСВ на ту же дату до копейки

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

Расхождение на день — неверная граница периода в параметре виртуальной таблицы

Пустые значения субконто
Норма

Пусто только там, где вид субконто не ведётся на счёте

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

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

FAQ

Как узнать, какие виды субконто назначены счёту, программно?

Получите объект счёта и обойдите табличную часть: СчетОбъект = ПланыСчетов.Хозрасчетный.НайтиПоКоду("60.01").ПолучитьОбъект(); затем переберите СчетОбъект.ВидыСубконто. У каждой строки есть поле ВидСубконто и признаки Суммовой, Количественный, Валютный.

Можно ли получить субконто без запроса, прямо из формы документа?

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

Почему запрос к таблице Остатки возвращает пустой результат?

Чаще всего причины три: передана неверная дата (остатки на начало дня вместо конца), счёт передан как группа без условия В ИЕРАРХИИ, либо условие отбора в параметре виртуальной таблицы отсекает все записи. Проверяйте параметры по одному, начав с запроса без отборов.

Как обратиться к субконто, если оно называется не СубконтоДт, а иначе?

В регистре бухгалтерии признак «Балансовый» у измерений определяет имена полей: для балансовых счетов поле просто Субконто, для забалансовых с корреспонденцией — СубконтоДт и СубконтоКт. В регистрах без корреспонденции (признак «Корреспонденция» снят) используется одно поле Субконто без суффиксов.

Что быстрее: запрос к виртуальной таблице или прямой запрос к физической таблице регистра?

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

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

Значение субконто — это ссылка на справочник или документ, поэтому достаточно функции Строка() или обращения к реквизиту Наименование через точку в запросе: ХозрасчетныйОстатки.Субконто1.Наименование. Учтите, что разыменование составного поля работает, только если тип значения это позволяет.

Итог

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

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