Разработка и Конфигурация · 11 мин
Как получить значение субконто в 1С
Способы получить значение субконто в 1С: через запрос к виртуальным таблицам регистра бухгалтерии, обход проводок документа, отбор в СКД. Примеры кода и типичные ошибки.
Субконто — это аналитические разрезы счёта бухгалтерского учёта: контрагенты, договоры, номенклатура, подразделения. Когда нужно программно получить значение субконто из проводки, остатка или оборота, разработчик выбирает между тремя основными подходами: запросом к виртуальным таблицам регистра бухгалтерии, обходом движений документа и чтением данных через СКД. Правильный выбор зависит от задачи: разовая проверка, отчёт или массовая обработка.
Главная сложность в том, что количество и типы субконто задаются в плане счетов и меняются от счёта к счёту. Поэтому обращение к субконто почти всегда идёт либо по порядковому номеру (Субконто1, Субконто2, Субконто3), либо по виду субконто через соответствие. Оба способа рассмотрены ниже с примерами кода.
Материал ориентирован на управляемые формы и типовые конфигурации на базе БСП (Бухгалтерия предприятия, ERP, Комплексная автоматизация), но принципы одинаковы для любого регистра бухгалтерии, созданного вручную.
Где хранятся субконто и как к ним обращаться
Физически значения субконто хранятся в таблицах регистра бухгалтерии, а их состав определяется планом счетов через план видов характеристик «Виды субконто». У каждого счёта есть табличная часть «Виды субконто», где заданы разрезы учёта и их очерёдность. Максимальное количество субконто на счёте ограничено настройкой плана счетов (в типовых — обычно три).
В коде к субконто обращаются двумя способами. Первый — по индексу: Движение.СубконтоДт1 или через коллекцию Движение.СубконтоДт[1]. Второй — по виду субконто через соответствие: Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура]. Второй способ надёжнее: если в плане счетов изменят порядок субконто, код по виду продолжит работать, а код по индексу начнёт возвращать чужие данные.
Получение субконто запросом к виртуальным таблицам
Самый производительный способ получить значения субконто по множеству проводок — запрос к виртуальным таблицам регистра бухгалтерии. Например, таблица РегистрБухгалтерии.Хозрасчетный.Остатки возвращает остатки в разрезе субконто, а Обороты — обороты за период. Поля субконто в результате называются Субконто1, Субконто2, Субконто3 — по порядку, заданному в плане счетов.
Чтобы запрос не зависел от порядка субконто, используют параметр виртуальной таблицы «Субконто» — отбор по видам. Тогда в выборке гарантированно будут только нужные аналитики. Ниже пример получения остатков по счёту 60 в разрезе контрагентов и договоров.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ХозрасчетныйОстатки.Субконто1 КАК Контрагент,
| ХозрасчетныйОстатки.Субконто2 КАК Договор,
| ХозрасчетныйОстатки.СуммаОстаток КАК Сумма
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(
| &Период,
| Счет = &Счет,
| &ВидыСубконто,
| ) КАК ХозрасчетныйОстатки";
ВидыСубконто = Новый Массив;
ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты);
ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры);
Запрос.УстановитьПараметр("Период", КонецДня(ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("Счет", ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками);
Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто);
Результат = Запрос.Выполнить().Выгрузить();
Порядок полей Субконто1 и Субконто2 в выборке соответствует порядку видов субконто на счёте, а не порядку элементов массива. Перед использованием результата проверьте фактический порядок в плане счетов через конфигуратор или запросом к табличной части счёта.
- 1Откройте план счетов и определите, какие виды субконто назначены нужному счёту и в каком порядке
- 2Сформируйте запрос к виртуальной таблице Остатки или Обороты регистра бухгалтерии
- 3Передайте параметры: период, счёт, массив видов субконто, условие отбора при необходимости
- 4Выполните запрос и обойдите выборку, обращаясь к полям Субконто1–Субконто3
- 5Проверьте результат на контрольном примере, сверив с стандартным отчётом ОСВ по счёту
Получение субконто из проводок конкретного документа
Когда нужно узнать, какие субконто проставил конкретный документ, запрос к виртуальным таблицам избыточен. Достаточно получить набор записей регистра бухгалтерии по регистратору и обойти его. У каждой записи есть поля СчетДт, СчетКт и соответствия СубконтоДт, СубконтоКт.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Хозрасчетный.СчетДт,
| Хозрасчетный.СчетКт,
| Хозрасчетный.СубконтоДт1,
| Хозрасчетный.СубконтоДт2,
| Хозрасчетный.Сумма
|ИЗ
| РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
|ГДЕ
| Хозрасчетный.Регистратор = &Регистратор";
Запрос.УстановитьПараметр("Регистратор", ДокументСсылка);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Контрагент = Выборка.СубконтоДт1;
КонецЦикла;
Альтернатива без запроса — работа через объект документа: Движения = ДокументОбъект.Движения.Хозрасчетный; и обход коллекции. Здесь удобно обращаться к субконто по виду: Строка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты]. Если у счёта нет такого вида субконто, обращение вернёт Неопределено — это нужно учитывать в проверках.
Субконто в отчётах на СКД
В отчётах на системе компоновки данных получать значения субконто вручную обычно не требуется: достаточно в наборе данных использовать виртуальную таблицу с параметром субконто, а поля Субконто1–Субконто3 вынести в ресурсы и группировки. Пользователь сам выберет нужную аналитику в настройках отчёта.
Если заголовки полей должны быть человекочитаемыми («Контрагент» вместо «Субконто1»), в схеме компоновки полям задают произвольные представления, либо используют вычисляемые поля. В типовых конфигурациях для таких задач есть готовые механизмы бухгалтерских отчётов, где разрезы настраиваются без изменения запроса.
Когда в отчёте нужен отбор по конкретному значению субконто, его накладывают через параметры виртуальной таблицы (условие в четвёртом параметре), а не через отбор СКД по полю Субконто1. Отбор на уровне виртуальной таблицы выполняется быстрее, потому что сокращает объём выбираемых данных до соединения с другими таблицами.
Способы получить значение субконто
Подходит для отчётов и массовых выборок по остаткам и оборотам. Требует корректной передачи периода, счёта и видов субконто
Подходит для анализа проводок одного регистратора. Простой код, но не даёт итогов по периоду
Подходит для настраиваемых отчётов. Не требует ручного кода, но менее гибок при сложной логике обработки значений
Типичные ошибки и ограничения
Самая частая ошибка — обращение к субконто по индексу без учёта фактического порядка видов на счёте. После доработки плана счетов код молча начинает возвращать договор вместо контрагента. Диагностируется это сравнением результата запроса со стандартной оборотно-сальдовой ведомостью по счёту.
Вторая группа ошибок связана с параметрами виртуальных таблиц. Если не передать счёт или передать счёт-группу без учёта иерархии, выборка окажется пустой или неполной. Для счетов-групп используйте условие Счет В ИЕРАРХИИ (&Счет). Также помните, что остатки на дату берутся на начало следующего дня: для получения остатка на конец дня передавайте границу с типом «Включая» или конец дня.
Третья ошибка — игнорирование типа значения субконто. Поле субконто составного типа, и прямое сравнение в запросе вида Субконто1 = &Контрагент может работать медленно или не срабатывать при несовпадении типов. Надёжнее передавать отбор через параметр виртуальной таблицы.
Проверка результата
После реализации любого способа получения субконто результат нужно сверить с эталоном. Эталоном служит стандартный отчёт «Оборотно-сальдовая ведомость по счёту» с группировкой по той же аналитике: суммы и состав значений субконто должны совпадать построчно.
Для проводок конкретного документа эталон — отчёт «Проводки» или «Анализ проводок» по регистратору. Откройте движения документа из формы самого документа (кнопка «Дт/Кт» в типовых конфигурациях) и сравните каждое субконто с тем, что вернул ваш код.
Как проверить результат
Совпадает с аналитикой в ОСВ по счёту
Значения сдвинуты или подставлены из другого разреза — неверный порядок видов субконто
Сходятся с ОСВ на ту же дату до копейки
Расхождение на день — неверная граница периода в параметре виртуальной таблицы
Пусто только там, где вид субконто не ведётся на счёте
Пусто везде — счёт или вид субконто передан неверно
FAQ
Как узнать, какие виды субконто назначены счёту, программно?
Получите объект счёта и обойдите табличную часть: СчетОбъект = ПланыСчетов.Хозрасчетный.НайтиПоКоду("60.01").ПолучитьОбъект(); затем переберите СчетОбъект.ВидыСубконто. У каждой строки есть поле ВидСубконто и признаки Суммовой, Количественный, Валютный.
Можно ли получить субконто без запроса, прямо из формы документа?
Да, если документ уже записан и проведён: обратитесь к набору движений через объект документа — ДокументОбъект.Движения.Хозрасчетный — и обойдите коллекцию записей. Для непроведённого документа движений ещё нет, и субконто взять неоткуда.
Почему запрос к таблице Остатки возвращает пустой результат?
Чаще всего причины три: передана неверная дата (остатки на начало дня вместо конца), счёт передан как группа без условия В ИЕРАРХИИ, либо условие отбора в параметре виртуальной таблицы отсекает все записи. Проверяйте параметры по одному, начав с запроса без отборов.
Как обратиться к субконто, если оно называется не СубконтоДт, а иначе?
В регистре бухгалтерии признак «Балансовый» у измерений определяет имена полей: для балансовых счетов поле просто Субконто, для забалансовых с корреспонденцией — СубконтоДт и СубконтоКт. В регистрах без корреспонденции (признак «Корреспонденция» снят) используется одно поле Субконто без суффиксов.
Что быстрее: запрос к виртуальной таблице или прямой запрос к физической таблице регистра?
Для итогов — виртуальные таблицы, потому что они читают предрассчитанные итоговые данные. Прямой запрос к таблице движений оправдан только когда нужны сами проводки с номерами строк и реквизитами, а не итоги по аналитике.
Как получить представление субконто для вывода пользователю?
Значение субконто — это ссылка на справочник или документ, поэтому достаточно функции Строка() или обращения к реквизиту Наименование через точку в запросе: ХозрасчетныйОстатки.Субконто1.Наименование. Учтите, что разыменование составного поля работает, только если тип значения это позволяет.
Что важно запомнить
Значение субконто получают запросом к виртуальным таблицам регистра бухгалтерии для итогов и обходом движений для отдельного документа. Обращайтесь к субконто по виду, а не по индексу, передавайте в виртуальную таблицу счёт, период и массив видов субконто, а результат всегда сверяйте с оборотно-сальдовой ведомостью.