При формировании бухгалтерских проводок разработчики нередко сталкиваются с ситуацией, когда на счете настроено несколько субконто, и требуется установить конкретное значение (например, статью затрат или контрагента). Частая ошибка начинающих программистов — попытка привязаться к жесткому номеру позиции (1, 2 или 3) или ручной поиск индекса вида субконто на счете. Разберем принципы работы с субконто и рассмотрим правильные варианты решения этой задачи.
Проанализируем устройство коллекции СубконтоДт и СубконтоКт у строки движений регистра бухгалтерии. На уровне объектной модели платформы 1С субконто проводки представляют собой коллекцию, работающую по принципу соответствия (ключ-значение):
ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.СтатьиЗатрат).Именно поэтому для установки значения субконто нет необходимости определять, под каким именно номером (первым, вторым или третьим) данный вид субконто привязан к конкретному счету в плане счетов.
Рассмотрим самый простой и надежный платформенный механизм. Коллекции СубконтоДт и СубконтоКт поддерживают метод Вставить(). Достаточно передать вид субконто и требуемое значение:
Проводка.СчетДт = СчетЗатрат;
Проводка.СубконтоДт.Вставить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.СтатьиЗатрат, НужнаяСтатьяЗатрат);
Если на выбранном счете такой вид субконто отсутствует, ошибки выполнения не произойдет. При вызове метода Записать() платформа автоматически отсечет лишние виды субконто и сохранит в базу данных только те, которые фактически предусмотрены настройками счета в плане счетов.
В типовых конфигурациях (например, «1С:Бухгалтерия предприятия») для заполнения субконто часто используется общий модуль БухгалтерскийУчет. Проанализируем вызов процедуры БухгалтерскийУчет.УстановитьСубконто(). Вместо передачи порядкового номера в третий параметр можно передавать имя предопределенного вида субконто или ссылку на него:
Проводка.СчетДт = СчетЗатрат;
// Установка по имени предопределенного элемента ПВХ
БухгалтерскийУчет.УстановитьСубконто(Проводка.СчетДт, Проводка.СубконтоДт, "СтатьиЗатрат", НужнаяСтатья);
// Либо прямая передача ссылки на вид субконто
БухгалтерскийУчет.УстановитьСубконто(Проводка.СчетДт, Проводка.СубконтоДт, ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.НоменклатурныеГруппы, НужнаяНоменклатурнаяГруппа);
Типовая процедура самостоятельно проверит, есть ли на счете указанный вид субконто, определит его позицию и корректно заполнит значение проводки.
Если в силу специфики алгоритма вам все же требуется узнать порядковый индекс вида субконто на счете, разберем, как получить строку субконто из счета и вычислить ее индекс:
ВидСубконтоИскомый = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.СтатьиЗатрат;
СтрокаСубконто = СчетЗатрат.ВидыСубконто.Найти(ВидСубконтоИскомый, "ВидСубконто");
Если СтрокаСубконто <> Неопределено Тогда
ИндексСубконто = СчетЗатрат.ВидыСубконто.Индекс(СтрокаСубконто); // Нумерация с 0
НомерСубконто = ИндексСубконто + 1; // Порядковый номер (1, 2, 3)
Сообщить("Вид субконто найден на позиции: " + НомерСубконто);
КонецЕсли;
Рассмотрим ситуацию, когда требуется найти субконто, тип значения которого соответствует определенному типу данных (например, справочнику СтатьиЗатрат). Для этого обойдем коллекцию ВидыСубконто счета и проверим свойство ТипЗначения:
ИскомыйТип = Тип("СправочникСсылка.СтатьиЗатрат");
Для Каждого СтрВидСубконто Из СчетЗатрат.ВидыСубконто Цикл
Если СтрВидСубконто.ВидСубконто.ТипЗначения.СодержитТип(ИскомыйТип) Тогда
// Заполняем субконто по найденному виду
Проводка.СубконтоДт.Вставить(СтрВидСубконто.ВидСубконто, НужнаяСтатья);
КонецЕсли;
КонецЦикла;
Такой подход позволяет писать гибкий универсальный код, который не зависит от жестко заданного порядка видов субконто в плане счетов.