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