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

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

Как программно установить субконто в 1С

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

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

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

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

Что нужно знать перед установкой субконто

В типовых конфигурациях (Бухгалтерия предприятия, ERP, Комплексная автоматизация) виды субконто хранятся в плане видов характеристик «ВидыСубконтоХозрасчетные». Это предопределённые элементы: Контрагенты, Договоры, Номенклатура, Склады, Подразделения, СтатьиЗатрат и другие. В коде к ним обращаются через ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты.

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

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

Базовый синтаксис установки субконто в проводке

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

Движение = Движения.Хозрасчетный.Добавить();

Движение.Период = Дата;

Движение.Организация = Организация;

Движение.СчетДт = ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками; // 60.01

Движение.СчетКт = ПланыСчетов.Хозрасчетный.РасчетныеСчета; // 51

Движение.Сумма = СуммаДокумента;

Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты] = Контрагент;

Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры] = ДоговорКонтрагента;

Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты] = Контрагент;

Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.БанковскиеСчета] = СчетОрганизации;

Оба варианта записи — через квадратные скобки с присваиванием и через метод Вставить(ВидСубконто, Значение) — равнозначны. Метод Вставить удобен, когда вид субконто хранится в переменной и его нельзя указать литералом. Если вид субконто уже присутствует в коллекции, присваивание просто перезапишет значение.

Обратите внимание: коллекция «СубконтоДт» и «СубконтоКт» — это разные коллекции для сторон проводки. Частая ошибка новичка — заполнить только дебетовую аналитику и удивляться, почему в отчёте по кредиту счёта аналитика пустая.

bsl
Движение.СубконтоДт.Вставить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура, СтрокаТовары.Номенклатура);

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

Жёстко прописывать виды субконто в коде — нормальная практика для типовых счетов, но если код должен работать с разными счетами (например, счёт выбирает пользователь), виды субконто лучше получать динамически. У объекта счёта есть табличная часть «ВидыСубконто»:

Счет = ПланыСчетов.Хозрасчетный.НайтиПоКоду("60.01");

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

ВидСубконто = СтрокаВида.ВидСубконто;

// проверяем, есть ли значение для этого вида, и заполняем

КонецЦикла;

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

Динамический подход особенно уместен в универсальных обработках загрузки проводок из внешних файлов: вид субконто сопоставляется по имени или коду, а значение ищется в соответствующем справочнике по типу значения вида субконто.

Установка субконто в типовых сценариях

В обработке проведения документа

В модуле объекта документа движения обычно формируются в процедуре ОбработкаПроведения. Набор записей регистра добавляется через коллекцию «Движения» объекта. Перед записью набора не забудьте установить признак активности и, при необходимости, очистить предыдущие движения — при перепроведении платформа делает это автоматически, если движение записывается в режиме набора записей документа.

Если документ проводится по нескольким строкам табличной части (например, списание нескольких позиций номенклатуры), движение добавляется в цикле, и субконто заполняются для каждой строки отдельно. Нельзя создать одну проводку и «размазать» по ней разную аналитику — у каждой проводки свой набор субконто.

В операции, введённой вручную

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

Изменение субконто в уже существующей проводке

Чтобы поменять аналитику в готовом движении, набор записей читается методом Прочитать(), затем у нужной записи изменяется коллекция субконто, и набор записывается обратно. Удалить отдельное субконто можно методом Удалить(ВидСубконто) коллекции. Помните, что прямое изменение движений закрытых периодов может нарушить последовательность и результаты регламентных операций — такие правки выполняйте осознанно и желательно с перепроведением зависимых документов.

Проверка результата и контрольные точки

После записи движений убедитесь, что аналитика действительно сохранилась. Самый быстрый способ — открыть отчёт «Оборотно-сальдовая ведомость по счёту» с группировкой по нужному субконто или «Анализ субконто». Если субконто в отчёте пустое, а в коде оно заполнялось, почти всегда причина в одном из трёх: вид субконто не назначен счёту, значение имело неподходящий тип (и платформа его отбросила), либо проводка вообще не записалась из-за ошибки в другом месте.

Полезно добавить в отладочный код проверку наличия вида субконто у счёта перед установкой — это превращает непонятную ошибку исполнения в читаемое сообщение:

Если Счет.ВидыСубконто.Найти(ВидСубконто, "ВидСубконто") = Неопределено Тогда

ВызватьИсключение "У счета " + Счет.Код + " нет вида субконто " + ВидСубконто;

КонецЕсли;

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

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

ОСВ по счёту с группировкой по субконто
Норма

Аналитика заполнена, обороты и сальдо детализируются по значениям

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

Строка с пустым субконто или отсутствие детализации

Карточка счёта по проводке
Норма

В графах Дт/Кт видны значения аналитики

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

Аналитика пустая при наличии суммы

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

Ссылка на объект нужного справочника

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

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

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

Самая частая ошибка — обращение к виду субконто по имени, которого нет в плане видов характеристик конкретной конфигурации. В разных конфигурациях состав предопределённых видов отличается, поэтому код, перенесённый из Бухгалтерии в ERP, может не скомпилироваться. Проверяйте состав плана видов характеристик в конфигураторе.

Вторая группа ошибок связана с типами значений. Вид субконто «Договоры» ожидает ссылку на справочник «Договоры контрагентов», а не строку с номером договора. Если значение приходит из внешнего источника (Excel, CSV, обмен), его нужно сначала преобразовать в ссылку — поиском по коду, наименованию или реквизитам.

Третья типичная проблема — заполнение субконто до установки счёта. В ряде случаев при смене счёта платформа очищает коллекцию субконто, несовместимую с новым счётом. Надёжный порядок: сначала счёт, потом аналитика.

Типичные ошибки
01
Установка субконто до назначения счёта — при смене счёта коллекция может очиститься, аналитика теряется
02
Передача строки вместо ссылки на справочник — значение не записывается или портит аналитику
03
Заполнение только СубконтоДт при необходимости аналитики по кредиту — отчёты по Кт пустые
04
Использование вида субконто, не назначенного счёту — ошибка исполнения при записи

FAQ

Как установить субконто, если вид субконто известен только как строка?

Найдите вид субконто по имени предопределённого элемента или по наименованию: ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.НайтиПоНаименованию("Контрагенты"). Затем используйте найденную ссылку в методе Вставить. Для предопределённых элементов надёжнее обращение по имени через точку.

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

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

Почему при записи возникает ошибка «Поле объекта не обнаружено» или подобная?

Чаще всего вид субконто не назначен счёту в плане счетов или имя предопределённого вида отсутствует в конфигурации. Проверьте табличную часть «Виды субконто» у счёта и состав плана видов характеристик в конфигураторе.

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

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

Чем отличается СубконтоДт от СубконтоКт?

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

Как удалить одно субконто из проводки программно?

Используйте метод коллекции: Движение.СубконтоДт.Удалить(ВидСубконто). Если нужно очистить всю аналитику стороны проводки, вызовите Движение.СубконтоДт.Очистить().

Итог

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

Субконто устанавливается через коллекцию СубконтоДт/СубконтоКт по виду субконто из плана видов характеристик. Порядок действий: сначала счёт, затем аналитика; тип значения должен соответствовать типу вида субконто. Результат проверяется отчётами ОСВ по счёту и Анализ субконто.