При разработке внешних обработок или расширений для конфигурации 1С:Бухгалтерия предприятия 3.0 программисты часто сталкиваются с проблемой: при программном создании или копировании документов (например, «Реализация товаров и услуг» или «Поступление товаров и услуг») табличные части заполняются данными, но поля со счетами учета остаются пустыми. Это происходит потому, что логика подбора счетов в БП 3.0 вынесена в специализированные общие модули и не всегда срабатывает автоматически при простой записи объекта.
В этой статье мы подробно разберем несколько проверенных способов решения этой задачи, проанализируем современные методы работы с общими модулями и выясним, какой из них лучше применять в зависимости от ситуации. Мы пройдем путь от точечного заполнения строк до комплексного использования механизмов конфигурации.
Рассмотрим наиболее элегантный и «чистый» способ, который позволяет задействовать штатные механизмы документа. В типовой конфигурации БП 3.0 в модулях многих документов прописана логика, которая проверяет наличие определенных флагов в структуре ДополнительныеСвойства. Если мы установим флаг ЗаполнитьСчетаУчетаПередЗаписью, система сама определит нужные счета в момент вызова метода Записать().
Для реализации этого метода используем следующий код:
// Устанавливаем флаг автоматического заполнения
ДокОбъект.ДополнительныеСвойства.Вставить("ЗаполнитьСчетаУчетаПередЗаписью", Истина);
// Вызываем стандартную процедуру заполнения перед записью
СчетаУчетаВДокументах.ЗаполнитьПередЗаписью(ДокОбъект, РежимЗаписиДокумента.Проведение);
// Записываем документ
ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
Важное замечание: Чтобы этот способ сработал корректно, в объекте ДокОбъект на момент вызова уже должны быть заполнены базовые реквизиты, влияющие на счета учета: Организация, Склад и Вид операции. Также в строках табличной части должна быть заполнена Номенклатура.
Проанализируем ситуацию, когда нам нужно программно заполнить счета непосредственно в процессе формирования таблицы, не дожидаясь записи документа. Для этого отлично подходит метод ЗаполнитьСтроки из общего модуля СчетаУчетаВДокументах. Этот метод перебирает все строки указанной табличной части и подставляет счета согласно настройкам в регистре сведений «Счета учета номенклатуры».
Пример реализации при заполнении ТЧ документа «Реализация товаров и услуг»:
Для Каждого СтрокаТЧ Из НовыйДокумент.Товары Цикл
НоваяСтрока = ДокОбъект.Товары.Добавить;
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТЧ);
КонецЦикла;
// Массовое заполнение счетов учета для всей табличной части
СчетаУчетаВДокументах.ЗаполнитьСтроки(
ДокОбъект.Товары,
"Товары",
ДокОбъект.Ссылка,
Документы.РеализацияТоваровУслуг,
Истина
);
Разберем параметры этого метода:
ДокОбъект.Товары — сама табличная часть, которую мы обрабатываем."Товары" — строковое имя табличной части.ДокОбъект.Ссылка — ссылка на документ (может быть пустой, если документ новый).Документы.РеализацияТоваровУслуг — менеджер соответствующего типа документа.Истина — флаг, указывающий на необходимость перезаписывать уже заполненные счета.Если ваша задача — создать документ на основании другого (например, Реализацию на основании Счета) (удобно через настройка заполнения документов без программирования), стоит воспользоваться наиболее мощным механизмом — общим модулем ЗаполнениеДокументов. Метод Заполнить выполняет полную инициализацию объекта, включая не только счета учета номенклатуры, но и счета расчетов с контрагентами (60, 62, 76), основываясь на договоре и типе операции.
Рассмотрим пример кода:
// ДокОбъект — наш новый документ
// Основание — документ-источник (например, СчетНаОплатуПокупателю)
ЗаполнениеДокументов.Заполнить(ДокОбъект, Основание, Истина);
Этот метод хорош тем, что он имитирует интерактивное создание документа пользователем. Он автоматически вызовет все необходимые обработчики из модуля менеджера документа, обеспечивая максимальную корректность данных — для этого подойдёт исправление ошибок аналитики на счетах расчетов.
Иногда возникают задачи, когда массовое заполнение всей таблицы избыточно или может повредить ручные правки пользователя. В таких случаях в актуальных версиях БП 3.0 рекомендуется использовать метод для одной строки:
СчетаУчетаВДокументах.ЗаполнитьСтроку(Объект, ИмяТабличнойЧасти, СтрокаТабличнойЧасти);
Это позволяет обновить аналитику только для вновь добавленной позиции. Проанализируем, как это выглядит в цикле:
Для Каждого СтрТЧ Из СписокНоменклатуры Цикл
НоваяСтрока = ДокОбъект.Товары.Добавить();
НоваяСтрока.Номенклатура = СтрТЧ.Ссылка;
НоваяСтрока.Количество = СтрТЧ.Количество;
// Заполняем счета только для этой строки
СчетаУчетаВДокументах.ЗаполнитьСтроку(ДокОбъект, "Товары", НоваяСтрока);
КонецЦикла;
Если вы применили один из вышеперечисленных методов, но счета в базе данных остались пустыми, проверим следующие моменты:
ВидОперации (Товары, Услуги, Отгрузка без перехода права собственности). Если этот реквизит не установлен программно до вызова процедур заполнения, счета не подберутся.Рассмотрим подробнее работу модуля менеджера. У большинства документов БП 3.0 в модуле менеджера есть процедура УстановитьПравилаЗаполненияСчетовУчета. Именно она диктует системе, какие счета подставлять в зависимости от контекста документа. Программный вызов общих модулей, который мы разобрали выше, по сути является обращением к этим правилам.
Таким образом, мы выяснили, что для конфигурации 1С:Бухгалтерия 3.0 на управляемых формах устаревшие методы (типа ЗаполнитьСчетаУчетаВСтрокеТабличнойЧасти) заменены на более универсальные инструменты в модулях СчетаУчетаВДокументах и ЗаполнениеДокументов. Рекомендуется использовать флаг в ДополнительныеСвойства для максимально стандартного поведения системы или метод ЗаполнитьСтроки для тонкой настройки процесса в коде обработки.