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

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

В практике разработчика 1С часто возникает задача автоматизации ввода данных. Одной из наиболее востребованных операций является создание документов прихода на основании внешних данных, например, из файлов Excel, JSON или сторонних API. В рамках данной статьи мы проанализируем ситуацию, когда необходимо программно создать документ ПоступлениеТоваровУслуг, корректно заполнить его заголовочную часть, добавить строки в таблицу товаров и обеспечить правильное проведение документа по регистрам учета.

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

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


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

Обратим внимание на метод УстановитьНовыйНомер(). Мы рекомендуем вызывать его сразу после создания, чтобы система зарезервировала номер согласно установленной периодичности в метаданных. Также важно установить актуальную дату, так как от нее зависят итоги и периоды регистров, в которые документ сделает записи при проведении.

Заполнение реквизитов шапки документа

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


НовыйДокумент.Организация = Справочники.Организации.НайтиПоНаименованию("Основная организация");
НовыйДокумент.Контрагент = Справочники.Контрагенты.НайтиПоИНН("7700000000");
НовыйДокумент.Склад = Справочники.Склады.НайтиПоНаименованию("Основной склад");
НовыйДокумент.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("643"); // Рубли

Если мы работаем в типовой конфигурации (например, 1С:ERP или 1С:Комплексная автоматизация), выясним причину, по которой некоторые поля могут не заполниться автоматически. Часто требуется дополнительно заполнять соглашения или договоры. В таких случаях мы используем поиск по владельцу или задаем конкретные ссылки, полученные из внешних источников.

Работа с табличной частью Товары

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

Разберем пример кода, где мы в цикле обходим некий массив данных (например, полученный из внешнего файла) и переносим его в документ:


Для Каждого СтрокаДанных Из МассивДанных Цикл
    НоваяСтрока = НовыйДокумент.Товары.Добавить();
    НоваяСтрока.Номенклатура = СтрокаДанных.СсылкаНаНоменклатуру;
    НоваяСтрока.Количество = СтрокаДанных.Количество;
    НоваяСтрока.Цена = СтрокаДанных.Цена;
    
    // Рассчитаем сумму строки
    НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
    
    // Работа с НДС
    НоваяСтрока.СтавкаНДС = Справочники.СтавкиНДС.НайтиПоНаименованию("20%");
    НоваяСтрока.СуммаНДС = (НоваяСтрока.Сумма * 20) / 120; // Пример расчета НДС сверху
КонецЦикла;

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

Автоматизация расчетов с помощью типовых модулей

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

Рассмотрим, как можно упростить заполнение ставок НДС и расчет сумм, используя типовые механизмы (если они доступны в вашей базе):


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

Использование таких методов гарантирует, что алгоритм расчета в вашем коде будет полностью совпадать с алгоритмом, заложенным разработчиками конфигурации. Это особенно важно при обновлении программы.

Запись и проведение документа

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

Рассмотрим правильный подход с обработкой возможных ошибок (транзакционный подход):


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

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

Полезные советы по оптимизации процесса

Проанализируем несколько дополнительных моментов, которые помогут сделать ваш код более профессиональным:

  1. Отключение проверок: Если вы загружаете исторические данные, иногда полезно использовать свойство ОбменДанными.Загрузка = Истина. Это отключит большинство прикладных проверок, что ускорит запись, но потребует от вас максимальной ответственности за корректность данных.
  2. Массовое создание: При создании тысяч документов за раз, всегда используйте механизмы транзакций. Группируйте документы по 100-200 штук в одну транзакцию, чтобы снизить нагрузку на СУБД.
  3. Поиск объектов: Никогда не ищите номенклатуру или контрагентов по наименованию внутри цикла добавления строк. Сначала соберите все необходимые ссылки в соответствие (Соответствие) или таблицу значений, а затем используйте их. Это значительно ускорит работу кода.

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

← На главную