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