Как программно заполнить счета учета и номенклатурную группу в табличной части реализации в 1С:Бухгалтерия 3.0?

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

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

Анализ типичных ошибок при заполнении номенклатурной группы

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

  1. Ошибка «Поле объекта недоступно для записи (НоменклатурнаяГруппа)». Возникает при попытке присвоения значения через ссылку:
    
    НовСтрока.Номенклатура.НоменклатурнаяГруппа = Справочники.НоменклатурныеГруппы.НайтиПоНаименованию("Основная номенклатурная группа");
    
    Выясним причину: реквизит Номенклатура в табличной части хранит ссылку (СправочникСсылка.Номенклатура). Любые реквизиты ссылочных типов в платформе «1С:Предприятие» доступны только для чтения. Менять элемент справочника здесь не требуется, нам нужно заполнить реквизит самого документа.
  2. Ошибка «Поле объекта не обнаружено (НоменклатурнаяГруппа)». Появляется при попытке прямого обращения:
    
    НовСтрока.НоменклатурнаяГруппа = Справочники.НоменклатурныеГруппы.НайтиПоНаименованию("Основная номенклатурная группа");
    
    Причина кроется в структуре метаданных. В табличной части Товары типового документа реализации нет отдельного реквизита с именем НоменклатурнаяГруппа.
  3. Ошибка «Значение не является значением объектного типа». Происходит при попытке обращения через составной реквизит:
    
    НовСтрока.Субконто.НоменклатурнаяГруппа = Справочники.НоменклатурныеГруппы.НайтиПоНаименованию("Основная номенклатурная группа");
    
    Поле само по себе хранит непосредственную ссылку на элемент справочника, а не структуру или объект со вложенными свойствами.

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

Проанализируем структуру метаданных документа РеализацияТоваровУслуг. Счета доходов и расходов (90.01 и 90.02) имеют субконто первого порядка типа СправочникСсылка.НоменклатурныеГруппы. В табличной части документа соответствующий реквизит называется именно Субконто.

Посмотрим на пример корректного прямого присвоения значений в строке:


// Заполняем счета учета
НовСтрока.СчетУчета = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах; // 41.01
НовСтрока.СчетДоходов = ПланыСчетов.Хозрасчетный.ВыручкаНеЕНВД;  // 90.01.1
НовСтрока.СчетРасходов = ПланыСчетов.Хозрасчетный.СебестоимостьПродажНеЕНВД; // 90.02.1

// Заполняем номенклатурную группу в поле Субконто
НовСтрока.Субконто = Справочники.НоменклатурныеГруппы.НайтиПоНаименованию("Основная номенклатурная группа");

Обратите внимание: использование методов НайтиПоКоду и НайтиПоНаименованию внутри циклов заполнения табличных частей крайне не рекомендуется. Каждый такой вызов отправляет отдельный запрос к базе данных, что существенно замедляет выполнение обработки. Кроме того, при изменении наименования группы поиск вернет пустую ссылку. Для счетов учета всегда предпочтительнее обращаться к предопределенным значениям через точку, как показано в примере выше.

Способ 2. Заполнение через типовой общий модуль (рекомендуемый)

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

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

  1. Сначала создаем строку и указываем в ней номенклатуру:
    
    НовСтрока = ДокументОбъект.Товары.Добавить();
    НовСтрока.Номенклатура = ВыбраннаяНоменклатура;
    НовСтрока.Количество = 1;
    
  2. Вызываем специализированную процедуру общего модуля для отдельной строки:
    
    СчетаУчетаВДокументах.ЗаполнитьСчетаУчетаВСтрокеТабличнойЧасти(ДокументОбъект, НовСтрока, "Товары");
    
    В этом случае программа сама определит нужный счет учета номенклатуры, счета доходов и расходов, а также подставит номенклатурную группу из настроек регистра сведений или реквизита самой номенклатуры.

Способ 3. Комплексное заполнение счетов документа целиком

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


// Формируем отбор для заполнения только пустых реквизитов
Отбор = Новый Структура("НеЗаполненныеРеквизиты", Истина);

// Выполняем автозаполнение всех счетов документа
СчетаУчетаВДокументах.Заполнить(ДокументОбъект, Отбор);

Преимущество этого метода заключается в том, что процедура заполняет счета не только во всех строках табличной части Товары, но и в шапке документа (реквизиты СчетУчетаРасчетовСКонтрагентом и СчетУчетаРасчетовПоАвансам). Без заполнения счетов расчетов с покупателем документ не сможет провестись по регистрам бухгалтерии.

Важный нюанс отображения: если после выполнения программного кода счета в форме открытого документа не видны на экране, убедитесь, что в информационной базе включена опция «Показывать счета учета в документах» (раздел Главное → Персональные настройки). Наличие или отсутствие видимости колонок в интерфейсе не отменяет необходимости корректного заполнения этих данных в базе.

← На главную