При программном создании документов реализации (например, товарных накладных в документе РеализацияТоваровУслуг конфигурации «1С:Бухгалтерия предприятия 3.0») разработчики часто сталкиваются с вопросом заполнения счетов бухгалтерского учета и аналитики. Если заполнение реквизитов СчетУчета, СчетДоходов и СчетРасходов обычно проходит без сложностей, то попытка присвоить номенклатурную группу нередко приводит к системным ошибкам платформы. Разберем по шагам, почему возникают эти ошибки и как правильно заполнить аналитику строки табличной части.
Рассмотрим ошибки, которые чаще всего допускаются при попытке указать номенклатурную группу в строке табличной части Товары:
НовСтрока.Номенклатура.НоменклатурнаяГруппа = Справочники.НоменклатурныеГруппы.НайтиПоНаименованию("Основная номенклатурная группа");
Номенклатура в табличной части хранит ссылку (СправочникСсылка.Номенклатура). Любые реквизиты ссылочных типов в платформе «1С:Предприятие» доступны только для чтения. Менять элемент справочника здесь не требуется, нам нужно заполнить реквизит самого документа.
НовСтрока.НоменклатурнаяГруппа = Справочники.НоменклатурныеГруппы.НайтиПоНаименованию("Основная номенклатурная группа");
Товары типового документа реализации нет отдельного реквизита с именем НоменклатурнаяГруппа.
НовСтрока.Субконто.НоменклатурнаяГруппа = Справочники.НоменклатурныеГруппы.НайтиПоНаименованию("Основная номенклатурная группа");
Проанализируем структуру метаданных документа РеализацияТоваровУслуг. Счета доходов и расходов (90.01 и 90.02) имеют субконто первого порядка типа СправочникСсылка.НоменклатурныеГруппы. В табличной части документа соответствующий реквизит называется именно Субконто.
Посмотрим на пример корректного прямого присвоения значений в строке:
// Заполняем счета учета
НовСтрока.СчетУчета = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах; // 41.01
НовСтрока.СчетДоходов = ПланыСчетов.Хозрасчетный.ВыручкаНеЕНВД; // 90.01.1
НовСтрока.СчетРасходов = ПланыСчетов.Хозрасчетный.СебестоимостьПродажНеЕНВД; // 90.02.1
// Заполняем номенклатурную группу в поле Субконто
НовСтрока.Субконто = Справочники.НоменклатурныеГруппы.НайтиПоНаименованию("Основная номенклатурная группа");
Обратите внимание: использование методов НайтиПоКоду и НайтиПоНаименованию внутри циклов заполнения табличных частей крайне не рекомендуется. Каждый такой вызов отправляет отдельный запрос к базе данных, что существенно замедляет выполнение обработки. Кроме того, при изменении наименования группы поиск вернет пустую ссылку. Для счетов учета всегда предпочтительнее обращаться к предопределенным значениям через точку, как показано в примере выше.
В конфигурации «1С:Бухгалтерия предприятия 3.0» логика подстановки счетов учета строго регламентирована и зависит от регистра сведений СчетаУчетаНоменклатуры, учетной политики организации, типа склада и системы налогообложения. Ручное присвоение счетов не учитывает эти особенности, что может повлечь за собой грубые учетные ошибки.
Разберем по шагам, как использовать механизмы конфигурации для автоматического заполнения строки:
НовСтрока = ДокументОбъект.Товары.Добавить();
НовСтрока.Номенклатура = ВыбраннаяНоменклатура;
НовСтрока.Количество = 1;
СчетаУчетаВДокументах.ЗаполнитьСчетаУчетаВСтрокеТабличнойЧасти(ДокументОбъект, НовСтрока, "Товары");
Рассмотрим ситуацию, когда табличная часть уже полностью сформирована загрузкой (добавлены все строки, номенклатура и суммы). Чтобы не вызывать процедуру для каждой строки вручную, мы можем заполнить все недостающие счета в документе одной командой общего модуля СчетаУчетаВДокументах:
// Формируем отбор для заполнения только пустых реквизитов
Отбор = Новый Структура("НеЗаполненныеРеквизиты", Истина);
// Выполняем автозаполнение всех счетов документа
СчетаУчетаВДокументах.Заполнить(ДокументОбъект, Отбор);
Преимущество этого метода заключается в том, что процедура заполняет счета не только во всех строках табличной части Товары, но и в шапке документа (реквизиты СчетУчетаРасчетовСКонтрагентом и СчетУчетаРасчетовПоАвансам). Без заполнения счетов расчетов с покупателем документ не сможет провестись по регистрам бухгалтерии.
Важный нюанс отображения: если после выполнения программного кода счета в форме открытого документа не видны на экране, убедитесь, что в информационной базе включена опция «Показывать счета учета в документах» (раздел Главное → Персональные настройки). Наличие или отсутствие видимости колонок в интерфейсе не отменяет необходимости корректного заполнения этих данных в базе.