В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает необходимость автоматизировать процесс создания документов. Одной из самых востребованных задач является формирование документа РеализацияТоваровУслуг. Это может потребоваться при интеграции со сторонними системами, загрузке данных из файлов (Excel, XML, JSON) или при создании документов на основании других объектов, например, когда требуется создание заказа поставщику из приобретения товаров или иных связанных цепочек. В данной статье мы подробно разберем, как реализовать этот процесс программно, обеспечив корректное заполнение всех обязательных реквизитов и проведение документа.
Для начала работы нам необходимо создать новый экземпляр документа. Мы используем менеджер документа РеализацияТоваровУслуг. Проанализируем базовый код для инициализации:
НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
// Установка организации и склада по умолчанию
НовыйДокумент.Организация = Справочники.Организации.НайтиПоНаименованию("Основная организация");
НовыйДокумент.Склад = Справочники.Склады.НайтиПоНаименованию("Основной склад");
Важно помнить, что при создании документа через СоздатьДокумент() он еще не записан в базу данных. На этом этапе мы работаем с объектом в оперативной памяти. Рассмотрим подробнее, какие реквизиты являются критически важными для корректной записи.
После создания объекта нам необходимо заполнить информацию о покупателе и условиях сделки. Разберем по шагам заполнение Контрагента и его Договора. Обратите внимание, что договор должен соответствовать виду операции документа и выбранной организации.
НовыйДокумент.Контрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", "7701234567");
// Поиск договора контрагента
НовыйДокумент.ДоговорКонтрагента = Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию("Основной", Ложь, , НовыйДокумент.Контрагент);
// Установка валюты и типа цен
НовыйДокумент.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("643");
НовыйДокумент.ЦенаВключаетНДС = Истина;
Проанализируем ситуацию: если договор не найден, документ не пройдет валидацию при проведении. Рекомендуется добавлять проверку на заполненность ссылочных типов перед вызовом методов записи.
Самая ответственная часть — работа со списком товаров. Мы должны не только добавить строки, но и обеспечить заполнение номенклатуры, единиц измерения, количества и цен. Для глубокого контроля данных на этом этапе может быть полезен анализ позиций товаров в документе реализации, который позволяет отследить историю движений каждой позиции. Посмотрим на пример реализации цикла по массиву данных:
Для Каждого СтрокаДанных Из МассивТоваров Цикл
НоваяСтрока = НовыйДокумент.Товары.Добавить();
НоваяСтрока.Номенклатура = СтрокаДанных.СсылкаНаНоменклатуру;
НоваяСтрока.Количество = СтрокаДанных.Колво;
// Используем типовые механизмы для заполнения единиц и счетов учета
// Если используется конфигурация на базе БСП или ERP/УТ:
НоваяСтрока.Упаковка = НоваяСтрока.Номенклатура.ЕдиницаИзмерения;
// Расчет суммы
НоваяСтрока.Цена = СтрокаДанных.ЦенаПродажи;
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
// Ставка НДС
НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
НоваяСтрока.СуммаНДС = НоваяСтрока.Сумма * 0.20;
КонецЦикла;
Выясним причину, почему иногда суммы в документе могут не сходиться. Часто это связано с округлением или неправильной установкой флага ЦенаВключаетНДС. Всегда проверяйте, как настроена политика налогообложения в конкретной базе данных.
Для того чтобы документ выглядел "как настоящий", то есть содержал все значения, которые проставляются при интерактивном вводе, рекомендуется вызывать метод Заполнить(). Это запустит стандартный алгоритм ОбработкаЗаполнения, определенный в модуле объекта документа. Например, так часто реализуется пакетное создание возвратов от клиента на основании заявки на возврат.
// Заполнение по данным другого объекта (например, на основании Заказа)
НовыйДокумент.Заполнить(ОснованиеСсылка);
Рассмотрим подробнее: если мы создаем документ "с нуля", полезно вызвать ЗаполнитьЗначенияСвойств для копирования реквизитов из структуры или других объектов. Это сокращает объем кода и делает его более читаемым.
После того как все данные заполнены, документ необходимо сохранить. Существует два режима записи: просто запись (создание ссылки в БД) и проведение (формирование движений по регистрам). Разберем оба варианта.
Для обеспечения надежности используем конструкцию Попытка...Исключение. Это позволит нам обработать ошибки, связанные с блокировками или нехваткой прав доступа.
Попытка
// Сначала записываем объект, чтобы получить ссылку
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
// Проверяем заполнение перед проведением
Если НовыйДокумент.ПроверитьЗаполнение() Тогда
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Документ успешно проведен: " + НовыйДокумент.Ссылка);
Иначе
Сообщить("Ошибка заполнения обязательных реквизитов!");
КонецЕсли;
Исключение
ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
Сообщить("Не удалось записать документ: " + ТекстОшибки);
КонецПопытки;
Важно помнить, что программное создание документов должно происходить на сервере. Если вы инициируете создание из формы (клиентская часть), вам необходимо создать процедуру с директивой &НаСервере. Посмотрим на структуру такого вызова:
&НаКлиенте.&НаСервере, где выполняется основной код по работе с базой данных.Практический совет: При массовом создании документов (например, загрузка 1000 реализаций) старайтесь использовать одну транзакцию для группы документов или выполнять запись порциями. В таких задачах удобно использовать готовые решения, такие как массовое оформление продаж в 1С по выгрузкам Excel или специализированное пакетное создание актов выполненных работ. Также для сервисных операций может пригодиться создание поступлений услуг из Excel по нечеткому сопоставлению.
Подводя итог, программное управление документами в 1С требует внимательного отношения к заполнению аналитики (Склады, Договоры, Статьи движения денежных средств). Использование методов ПроверитьЗаполнение() и корректная обработка исключений являются обязательными стандартами профессиональной разработки.