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

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

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

Проблема использования клиентских процедур

Разберем типичную ситуацию: вы создаете документ Поступление (акт, накладная), заполняете склад, контрагента и табличную часть «Товары». Однако колонки «Счет учета» остаются пустыми. Попытка вызвать те же процедуры, что прописаны в свойствах элементов формы (например, СчетаУчетаПриИзменении), приводит к ошибке, так как эти процедуры требуют передачи объекта ЭтаФорма, которого при программном создании документа на сервере просто не существует.

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

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

Основным инструментом для решения нашей задачи является общий модуль СчетаУчетаВДокументах. В нем сосредоточена вся логика подбора счетов из регистра сведений «Счета учета номенклатуры». Для того чтобы счета заполнились в табличной части, нам необходимо вызвать метод Заполнить или ЗаполнитьСчетаУчетаВТабличнойЧасти.

Рассмотрим пример кода, который выполняет эту задачу:


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

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

// Заполняем табличную часть (пример добавления строки)
НоваяСтрока = НовыйДок.Товары.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Стол офисный");
НоваяСтрока.Количество = 1;

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

НовыйДок.Записать();

Критическая ошибка: Объект против Ссылки

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

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

Выясним причину, почему это не работает. Когда вы вызываете ПолучитьОбъект() от ссылки, система создает в оперативной памяти новый, независимый экземпляр документа. Процедура заполнения честно записывает в этот экземпляр нужные счета, но как только выполнение процедуры заканчивается, этот временный объект удаляется из памяти. Тот объект, с которым вы работаете в своем основном коде, остается без изменений.

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

Последовательность заполнения данных

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

  1. Организация: Счета могут отличаться для разных юридических лиц.
  2. Номенклатура: Это ключевой параметр для поиска в регистре «Счета учета номенклатуры».
  3. Склад: В настройках системы можно указать разные счета для разных складов (например, товары на оптовом складе и товары в рознице).
  4. Тип операции документа: От вида операции (например, «Поступление через агента» или «Обычное поступление») зависит, какие именно счета будут подставляться.

Если вы вызовете заполнение счетов в пустом документе, а потом заполните номенклатуру — счета останутся пустыми. Порядок действий всегда должен быть таким: сначала данные, потом вызов сервисной процедуры.

Альтернативный метод: Использование ОбработкаЗаполнения

В современных версиях БП 3.0 существует еще один элегантный способ инициализировать документ так, как если бы его создал пользователь. Это использование метода Заполнить() самого объекта. Посмотрим на пример:


НовыйДок = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();

// Подготавливаем структуру данных для заполнения
ДанныеЗаполнения = Новый Структура;
ДанныеЗаполнения.Вставить("Организация", СсылкаНаОрганизацию);
ДанныеЗаполнения.Вставить("Склад", СсылкаНаСклад);

// Вызываем стандартный обработчик заполнения
НовыйДок.Заполнить(ДанныеЗаполнения);

// После этого счета учета для шапки и основных реквизитов уже будут заполнены

Однако стоит помнить, что ОбработкаЗаполнения в модуле объекта чаще всего рассчитана на заполнение реквизитов шапки. Для табличных частей все равно рекомендуется использовать явный вызов СчетаУчетаВДокументах после добавления строк номенклатуры.

Резюме

Подведем итог нашей совместной работы. Для корректного программного заполнения счетов учета в 1С:Бухгалтерия 3.0 необходимо:

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

← На главную