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

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

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

В этой статье мы подробно разберем несколько проверенных способов решения этой задачи, проанализируем современные методы работы с общими модулями и выясним, какой из них лучше применять в зависимости от ситуации. Мы пройдем путь от точечного заполнения строк до комплексного использования механизмов конфигурации.

Способ 1. Использование механизма дополнительных свойств перед записью

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

Для реализации этого метода используем следующий код:


// Устанавливаем флаг автоматического заполнения
ДокОбъект.ДополнительныеСвойства.Вставить("ЗаполнитьСчетаУчетаПередЗаписью", Истина);

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

// Записываем документ
ДокОбъект.Записать(РежимЗаписиДокумента.Запись);

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

Способ 2. Использование метода ЗаполнитьСтроки общего модуля СчетаУчетаВДокументах

Проанализируем ситуацию, когда нам нужно программно заполнить счета непосредственно в процессе формирования таблицы, не дожидаясь записи документа. Для этого отлично подходит метод ЗаполнитьСтроки из общего модуля СчетаУчетаВДокументах. Этот метод перебирает все строки указанной табличной части и подставляет счета согласно настройкам в регистре сведений «Счета учета номенклатуры».

Пример реализации при заполнении ТЧ документа «Реализация товаров и услуг»:


Для Каждого СтрокаТЧ Из НовыйДокумент.Товары Цикл
    НоваяСтрока = ДокОбъект.Товары.Добавить;
    ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТЧ);
КонецЦикла;

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

Разберем параметры этого метода:

  1. ДокОбъект.Товары — сама табличная часть, которую мы обрабатываем.
  2. "Товары" — строковое имя табличной части.
  3. ДокОбъект.Ссылка — ссылка на документ (может быть пустой, если документ новый).
  4. Документы.РеализацияТоваровУслуг — менеджер соответствующего типа документа.
  5. Истина — флаг, указывающий на необходимость перезаписывать уже заполненные счета.

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

Если ваша задача — создать документ на основании другого (например, Реализацию на основании Счета) (удобно через настройка заполнения документов без программирования), стоит воспользоваться наиболее мощным механизмом — общим модулем ЗаполнениеДокументов. Метод Заполнить выполняет полную инициализацию объекта, включая не только счета учета номенклатуры, но и счета расчетов с контрагентами (60, 62, 76), основываясь на договоре и типе операции.

Рассмотрим пример кода:


// ДокОбъект — наш новый документ
// Основание — документ-источник (например, СчетНаОплатуПокупателю)
ЗаполнениеДокументов.Заполнить(ДокОбъект, Основание, Истина);

Этот метод хорош тем, что он имитирует интерактивное создание документа пользователем. Он автоматически вызовет все необходимые обработчики из модуля менеджера документа, обеспечивая максимальную корректность данных — для этого подойдёт исправление ошибок аналитики на счетах расчетов.

Способ 4. Точечное заполнение конкретной строки

Иногда возникают задачи, когда массовое заполнение всей таблицы избыточно или может повредить ручные правки пользователя. В таких случаях в актуальных версиях БП 3.0 рекомендуется использовать метод для одной строки:

СчетаУчетаВДокументах.ЗаполнитьСтроку(Объект, ИмяТабличнойЧасти, СтрокаТабличнойЧасти);

Это позволяет обновить аналитику только для вновь добавленной позиции. Проанализируем, как это выглядит в цикле:


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

Как проверить, почему счета не заполняются?

Если вы применили один из вышеперечисленных методов, но счета в базе данных остались пустыми, проверим следующие моменты:

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

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

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

← На главную