Как программно заполнить вид субконто, созданный в пользовательском режиме

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

При разработке и доработке учетных решений в 1С разработчики часто сталкиваются с необходимостью программного формирования проводок. Если для предопределенных видов субконто достаточно обратиться к ним через точку от имени плана видов характеристик (например, ПланыВидовХарактеристик.ВидыСубконто.Договоры), то для видов субконто, созданных пользователями непосредственно в режиме «1С:Предприятие», такой синтаксис недоступен. Разберем по шагам, как правильно обратиться к пользовательскому виду субконто, создать или найти аналитику и корректно записать значение в проводку регистра бухгалтерии.

Причина проблемы: отличие предопределенных элементов от пользовательских

Когда вид субконто создан разработчиком в дереве метаданных конфигуратора как предопределенный элемент, платформа 1С автоматически создает свойство с соответствующим именем. Пользовательские же элементы добавляются динамически, поэтому обращаться к ним по предопределенному имени невозможно. Для работы с ними необходимо выполнять поиск по наименованию, коду или реквизитам через менеджер плана видов характеристик.

Кроме того, распространенной ошибкой является попытка присвоить субконто движения ссылку на СправочникОбъект вместо СправочникСсылка. Проводка требует именно ссылку, иначе значение субконто в записи регистра останется пустым.

Пошаговое решение: создание аналитики и заполнение субконто в проводке

Рассмотрим типовую ситуацию, характерную для конфигураций на базе БГУ или типовых решений с подчиненным справочником Субконто. Создадим новый элемент справочника цен и запишем его в субконто движения.

  1. Находим пользовательский вид субконто: получаем ссылку на вид субконто из плана видов характеристик методом поиска.
  2. Создаем или находим значение субконто: если используется универсальный справочник Субконто, подчиненный плану видов характеристик, обязательно указываем владельца.
  3. Записываем объект и получаем ссылку: сохраняем созданный элемент справочника.
  4. Устанавливаем субконто в строке движения: передаем строго ссылку на объект.

Посмотрим на практический пример кода:


// 1. Поиск вида субконто, созданного в пользовательском режиме
ВидСубконтоЦены = ПланыВидовХарактеристик.ВидыСубконтоБюджет.НайтиПоНаименованию("Цены номенклатуры");

Если ЗначениеЗаполнено(ВидСубконтоЦены) Тогда
    // 2. Создание элемента подчиненного справочника Субконто
    НоваяЦена = Справочники.Субконто.СоздатьЭлемент();
    НоваяЦена.Родитель = Справочники.Субконто.НайтиПоНаименованию("Цены на продукты");
    НоваяЦена.Наименование = Формат(текСтр.Сумма / текСтр.Количество, "ЧДЦ=2; ЧГ=0");
    НоваяЦена.Владелец = ВидСубконтоЦены;
    НоваяЦена.Записать();
    
    // 3. Заполнение субконто в строке проводки (важно использовать НоваяЦена.Ссылка)
    Движение.СубконтоКт[ВидСубконтоЦены] = НоваяЦена.Ссылка;
КонецЕсли;

Особенности работы с коллекцией субконто в проводках

Проанализируем важные нюансы при формировании движений регистра бухгалтерии:

  1. Использование метода Вставить: Для гарантированной установки субконто безопаснее использовать метод Движение.СубконтоКт.Вставить(ВидСубконто, Значение) вместо прямого присвоения по ключу в квадратных скобках. Это исключает ошибки в случаях, когда коллекция еще не была полностью инициализирована счетом.
  2. Проверка наличия вида субконто на счете: Значение не запишется в проводку, если данный вид субконто не добавлен в табличную часть ВидыСубконто конкретного счета. Проверить это можно обходом коллекции Счет.ВидыСубконто.
  3. Ограничение количества субконто: Максимальное число аналитик на счете ограничено свойством плана счетов (обычно до 3 субконто). Добавить аналитику сверх установленного лимита без доработки конфигурации невозможно.

Динамическое определение типа субконто при загрузке данных

Если перед вами стоит задача универсальной загрузки данных (например, из Excel), когда тип субконто заранее неизвестен, определим объект метаданных динамически через типы значения вида субконто:


// Получаем доступные типы для текущего вида субконто
МассивТипов = ВидСубконто.ТипЗначения.Типы();

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

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

← На главную