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

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При формировании бухгалтерских проводок разработчики нередко сталкиваются с ситуацией, когда на счете настроено несколько субконто, и требуется установить конкретное значение (например, статью затрат или контрагента). Частая ошибка начинающих программистов — попытка привязаться к жесткому номеру позиции (1, 2 или 3) или ручной поиск индекса вида субконто на счете. Разберем принципы работы с субконто и рассмотрим правильные варианты решения этой задачи.

Принцип хранения субконто в строках регистра бухгалтерии

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

  1. Ключ: Ссылка на элемент плана видов характеристик (например, ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.СтатьиЗатрат).
  2. Значение: Ссылка на объект или значение соответствующего типа (элемент справочника, документа, перечисления и т.д.).

Именно поэтому для установки значения субконто нет необходимости определять, под каким именно номером (первым, вторым или третьим) данный вид субконто привязан к конкретному счету в плане счетов.

Способ 1. Прямая установка субконто через коллекцию проводки

Рассмотрим самый простой и надежный платформенный механизм. Коллекции СубконтоДт и СубконтоКт поддерживают метод Вставить(). Достаточно передать вид субконто и требуемое значение:


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

Если на выбранном счете такой вид субконто отсутствует, ошибки выполнения не произойдет. При вызове метода Записать() платформа автоматически отсечет лишние виды субконто и сохранит в базу данных только те, которые фактически предусмотрены настройками счета в плане счетов.

Способ 2. Использование типовой процедуры установки субконто

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


Проводка.СчетДт = СчетЗатрат;

// Установка по имени предопределенного элемента ПВХ
БухгалтерскийУчет.УстановитьСубконто(Проводка.СчетДт, Проводка.СубконтоДт, "СтатьиЗатрат", НужнаяСтатья);

// Либо прямая передача ссылки на вид субконто
БухгалтерскийУчет.УстановитьСубконто(Проводка.СчетДт, Проводка.СубконтоДт, ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.НоменклатурныеГруппы, НужнаяНоменклатурнаяГруппа);

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

Способ 3. Определение индекса вида субконто на счете

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


ВидСубконтоИскомый = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.СтатьиЗатрат;
СтрокаСубконто = СчетЗатрат.ВидыСубконто.Найти(ВидСубконтоИскомый, "ВидСубконто");

Если СтрокаСубконто <> Неопределено Тогда
    ИндексСубконто = СчетЗатрат.ВидыСубконто.Индекс(СтрокаСубконто); // Нумерация с 0
    НомерСубконто = ИндексСубконто + 1; // Порядковый номер (1, 2, 3)
    Сообщить("Вид субконто найден на позиции: " + НомерСубконто);
КонецЕсли;

Способ 4. Поиск субконто по типу хранимых данных

Рассмотрим ситуацию, когда требуется найти субконто, тип значения которого соответствует определенному типу данных (например, справочнику СтатьиЗатрат). Для этого обойдем коллекцию ВидыСубконто счета и проверим свойство ТипЗначения:


ИскомыйТип = Тип("СправочникСсылка.СтатьиЗатрат");

Для Каждого СтрВидСубконто Из СчетЗатрат.ВидыСубконто Цикл
    Если СтрВидСубконто.ВидСубконто.ТипЗначения.СодержитТип(ИскомыйТип) Тогда
        // Заполняем субконто по найденному виду
        Проводка.СубконтоДт.Вставить(СтрВидСубконто.ВидСубконто, НужнаяСтатья);
    КонецЕсли;
КонецЦикла;

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

← На главную