Как программно создать и заполнить документ Поступление товаров и услуг в 1С 8.3

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

В практике автоматизации на платформе 1С:Предприятие 8.3 часто возникает необходимость программного создания документов. Это может быть связано с импортом данных из внешних систем, автоматизацией регулярных операций или созданием документов на основании других объектов. В данной статье мы детально разберем процесс создания документа ПоступлениеТоваровУслуг, проанализируем структуру заполнения его реквизитов и изучим методы программного проведения.

Инициализация нового объекта документа

Для начала работы нам необходимо создать экземпляр объекта документа. Проанализируем, как это делается на стороне сервера. Мы используем менеджер соответствующего документа и метод СоздатьДокумент(). Рассмотрим пример кода:


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

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

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

Заполнение шапки документа и работа со ссылочными типами

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


// Поиск контрагента по ИНН (наиболее надежный способ)
КонтрагентСсылка = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", "7701234567");

Если Не КонтрагентСсылка.Пустая() Тогда
    НовыйДокумент.Партнер = КонтрагентСсылка.Партнер; // Если используется ERP/УТ11
    НовыйДокумент.Контрагент = КонтрагентСсылка;
    
    // Поиск договора по владельцу
    НовыйДокумент.Договор = Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию("Основной договор", Ложь, , КонтрагентСсылка);
КонецЕсли;

Обратите внимание на использование метода НайтиПоРеквизиту. Мы советуем всегда проверять результат поиска на Пустая(), чтобы избежать записи документа с незаполненными ключевыми полями. Также полезно использовать метод ЗаполнитьЗначенияСвойств, если данные передаются из структуры или другого объекта, это значительно сокращает объем кода.

Программное заполнение табличной части Товары

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


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

// Заполняем номенклатуру
НоменклатураСсылка = Справочники.Номенклатура.НайтиПоАртикулу("ART-001");
НоваяСтрока.Номенклатура = НоменклатураСсылка;

// Указываем характеристики и упаковки, если они используются в конфигурации
НоваяСтрока.Количество = 10;
НоваяСтрока.Цена = 1500;
НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;

// Автоматический расчет суммы
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;

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

Расчет налогов и итоговых показателей

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

  1. После заполнения всех строк табличной части необходимо вызвать процедуру расчета итогов.
  2. Проверить соответствие валюты документа и валюты цен в табличной части.
  3. Убедиться, что для каждой строки рассчитан НДС согласно настройкам налогового учета.

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

Запись и проведение документа с обработкой исключений

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

Рассмотрим безопасный способ проведения документа с использованием блока Попытка...Исключение:


Попытка
    // Устанавливаем режим проведения
    НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
    Сообщить("Документ успешно проведен: " + НовыйДокумент.Ссылка);
Исключение
    // В случае ошибки выводим описание проблемы пользователю
    Сообщить("Ошибка при проведении документа: " + КраткоеОписаниеОшибки(ИнформацияОбОшибке()));
    
    // Можно также записать ошибку в Журнал Регистрации
    ЗаписьЖурналаРегистрации("ПрограммноеСозданиеДокумента", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеОписаниеОшибки(ИнформацияОбОшибке()));
КонецПопытки;

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

Дополнительные рекомендации по оптимизации

Для повышения производительности при массовом создании документов (например, при загрузке 10 000 накладных из XML), мы рекомендуем отключать некоторые проверки. Однако делать это следует осторожно. Рассмотрим использование свойства ОбменДанными.Загрузка = Истина. Установка этого флага отключает выполнение кода в модуле объекта (процедуры ПередЗаписью, ПриЗаписи), что ускоряет процесс, но может привести к нарушению логики данных, если вы не заполните все реквизиты вручную.

Посмотрим на пример использования этой оптимизации:


НовыйДокумент.ОбменДанными.Загрузка = Истина;
НовыйДокумент.Записать();

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

Подводя итог, мы проанализировали полный цикл жизни программно создаваемого документа. Мы научились инициализировать объект, заполнять реквизиты шапки и строк, выполнять расчеты и безопасно проводить документ. Использование данных методов позволит вам создавать надежные и быстрые механизмы интеграции в системе 1С:Предприятие.

← На главную