В практике разработчика 1С часто возникает задача автоматизации создания документов. Одной из самых востребованных операций является программное формирование документа «Реализация товаров и услуг». Это необходимо при интеграции с внешними системами, массовом оформлении продаж по выгрузкам Excel или CSV или при создании документов на основании других объектов. В этой статье мы подробно разберем, как реализовать этот процесс правильно, соблюдая логику типовых конфигураций (таких как УТ 11, ERP 2.0 или КА 2).
Первым делом нам необходимо создать новый экземпляр объекта документа. Для этого мы обращаемся к менеджеру документа РеализацияТоваровУслуг. Проанализируем, как это выглядит в коде:
НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.УстановитьНовыйНомер();
Обратите внимание, что использование метода УстановитьНовыйНомер() желательно вызывать перед записью, чтобы система автоматически присвоила следующий порядковый номер согласно префиксам организации и информационной базы. Рассмотрим ситуацию, когда документ создается на текущую дату — это стандартная практика, однако при загрузке исторических данных дату следует брать из источника.
Документ не сможет быть проведен или даже корректно записан, если не заполнены обязательные реквизиты. Разберем основные из них: Организация, Партнер, Контрагент, Договор и Склад. В современных конфигурациях на базе «1С:Библиотека стандартных подсистем» (БСП) важно различать Партнера (управленческая сущность) и Контрагента (юридическое лицо).
Выясним, как правильно заполнить эти данные, используя поиск ссылок в базе:
НовыйДокумент.Организация = Справочники.Организации.НайтиПоНаименованию("Наша организация");
НовыйДокумент.Партнер = Справочники.Партнеры.НайтиПоНаименованию("Клиент ООО");
НовыйДокумент.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("Клиент ООО");
НовыйДокумент.Склад = Справочники.Склады.НайтиПоКоду("00001");
// Важно указать валюту и тип цен, если это требуется логикой учета
НовыйДокумент.Валюта = Справочники.Валюты.НайтиПоКоду("643"); // Рубли
НовыйДокумент.ЦенаВключаетНДС = Истина;
Проанализируем важный нюанс: если в вашей конфигурации включено использование договоров, поле Договор является обязательным. Рекомендуем искать договор, связанный именно с выбранным контрагентом и организацией, чтобы избежать ошибок проведения.
Перейдем к самой ответственной части — наполнению документа товарными позициями. Мы используем метод Добавить() для создания новой строки в табличной части Товары. Посмотрим на примере, как заполнить номенклатуру, количество и цену.
НоваяСтрока = НовыйДокумент.Товары.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоАртикулу("ART-100");
НоваяСтрока.Количество = 10;
НоваяСтрока.Цена = 1500;
НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
// Автоматический расчет суммы
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
Рассмотрим подробнее вопрос расчета налогов. В типовых решениях часто недостаточно просто умножить количество на цену. Существуют специальные экспортные процедуры в модулях менеджеров или общих модулях, которые рассчитывают НДС и суммы автоматически. Для детального контроля ТЧ вы можете реализовать программный анализ позиций товаров в документе реализации, чтобы видеть историю движений номенклатуры прямо из формы.
Чтобы документ вел себя «как родной», желательно вызвать процедуру ЗаполнитьЗначенияСвойств или специализированные методы инициализации. В многих конфигурациях существует метод ОбработкаЗаполнения(), который можно вызвать программно, передав в него основание (например, Заказ клиента).
Проанализируем пример использования метода Заполнить():
Основание = Документы.ЗаказКлиента.НайтиПоНомеру("ЗК-001");
НовыйДокумент.Заполнить(Основание);
При таком подходе система сама перенесет товары, цены, скидки и настройки налогообложения из заказа в реализацию. Это наиболее безопасный способ программного создания объектов. На базе заказов также можно реализовать создание чеков ККМ и чеков коррекции или настроить пакетное создание возвратов от клиента на основании заявок, что значительно ускоряет работу оператора.
После того как все данные заполнены, документ необходимо сохранить в базе данных. Существует три режима записи:
Разберем, как правильно оформить финализацию создания документа с обработкой возможных ошибок:
Попытка
// Сначала записываем объект
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
// Затем пытаемся провести
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Документ успешно создан и проведен: " + НовыйДокумент.Ссылка);
Исключение
Инфо = ИнформацияОбОшибке();
Сообщить("Ошибка при создании документа: " + Инфо.Описание, СтатусСообщения.Важное);
КонецПопытки;
Использование конструкции Попытка...Исключение критически важно. Проведение может не выполниться из-за отсутствия остатков на складе или не заполненных аналитик. Если возникают проблемы с распределением товаров, можно применить автоматическое исправление видов запасов по данным регистров остатков, чтобы привести документ в соответствие с учетными данными.
Разберем несколько важных моментов, которые помогут сделать ваш код более профессиональным:
НайтиПоНаименованию) внутри циклов. Лучше заранее подготовить соответствие или кэш ссылок, чтобы не нагружать базу данных лишними запросами.Номенклатура), убедитесь, что объект найден.Выясним причину, почему документ может не проводиться даже при заполненных данных. Часто это связано с параметрами указания серий или характеристик. Если в программе ведется учет по характеристикам, поле Характеристика в табличной части становится обязательным для заполнения, иначе проведение будет отклонено системой контроля остатков.
Таким образом, мы рассмотрели полный цикл программного создания документа «Реализация товаров и услуг». Следуя этой структуре, вы сможете автоматизировать складской и торговый учет в любой конфигурации на платформе 1С:Предприятие 8.3.