В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает необходимость автоматизировать создание документов. Это может быть связано с импортом данных из внешних систем, созданием документов на основании или работой регламентных заданий. В данной статье мы подробно разберем, как правильно инициализировать объект документа, заполнить его реквизиты и табличные части, а также выполнить проведение.
Для начала работы нам необходимо создать новый экземпляр документа в оперативной памяти. Проанализируем, какой метод для этого используется. В платформе 1С для любого типа документа существует менеджер, через который вызывается функция СоздатьДокумент(). Рассмотрим пример для документа РеализацияТоваровУслуг.
Важно помнить, что на этом этапе документ еще не записан в базу данных, он существует только как объект в памяти сервера. Выясним, какие действия необходимо выполнить в первую очередь:
НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.УстановитьНовыйНомер();
Использование метода УстановитьНовыйНомер() является обязательным, если вы хотите, чтобы система автоматически присвоила следующий порядковый номер согласно заданному префиксу организации или узла распределенной информационной базы (РИБ).
Рассмотрим подробнее процесс заполнения основных реквизитов, таких как Организация, Контрагент, Склад и Договор. Эти данные являются ссылочными типами, поэтому нам необходимо передать в них ссылки на соответствующие объекты справочников. Разберем по шагам, как это реализовать:
НовыйДокумент.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7700123456");
НовыйДокумент.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");
НовыйДокумент.ДоговорКонтрагента = Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию("Основной договор", Ложь, , НовыйДокумент.Контрагент);
НовыйДокумент.Склад = Справочники.Склады.НайтиПоНаименованию("Основной склад");
НовыйДокумент.ВалютаДокумента = Константы.ВалютаУправленческогоУчета.Получить();
Проанализируем ситуацию, когда необходимо заполнить параметры, зависящие от настроек учетной политики. В современных конфигурациях, таких как 1С:ERP или 1С:Комплексная автоматизация, многие реквизиты заполняются автоматически при вызове специализированных процедур в модуле менеджера или объекта. Рекомендуется использовать типовые механизмы, чтобы не нарушить логику конфигурации.
Перейдем к самому ответственному этапу — заполнению табличной части Товары. Посмотрим на пример, где мы добавляем новую строку и заполняем данные о номенклатуре, количестве и цене. Выясним, как правильно рассчитать сумму и налоги.
НоваяСтрока = НовыйДокумент.Товары.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("00001");
НоваяСтрока.Количество = 10;
НоваяСтрока.Цена = 1500;
НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
// Выполняем расчет суммы
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
// В типовых решениях часто используется обработчик
// ПриИзмененииНоменклатуры(НоваяСтрока) для заполнения единиц измерения
Разберем важный нюанс: при программном заполнении не срабатывают события формы (например, ПриИзменении). Это означает, что все расчеты и зависимости (пересчет НДС, веса, упаковок) программист должен реализовать самостоятельно или вызывать экспортные процедуры из модулей объекта/менеджера, предназначенные для серверного выполнения.
После того как все данные заполнены, документ необходимо сохранить. Посмотрим на методы записи. Существует два основных режима: просто запись Записать(РежимЗаписиДокумента.Запись) и запись с проведением Записать(РежимЗаписиДокумента.Проведение).
Проанализируем пример использования блока Попытка...Исключение, так как проведение может завершиться ошибкой из-за нехватки остатков на складе или не заполненных обязательных полей.
Попытка
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Документ успешно проведен: " + НовыйДокумент.Ссылка);
Исключение
Инфо = ИнформацияОбОшибке();
Сообщить("Ошибка при проведении: " + Инфо.Описание);
// Если проведение не удалось, можно просто записать как черновик
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
КонецПопытки;
В современных конфигурациях на базе БСП (Библиотека стандартных подсистем) крайне желательно использовать встроенные механизмы. Рассмотрим, как это упрощает код. Вместо ручного поиска каждой ссылки, мы можем подготовить структуру данных и вызвать процедуру заполнения.
Выясним причину, по которой это лучше: типовые механизмы учитывают установленные в программе настройки округления, алгоритмы расчета цен по прайс-листам и автоматическое заполнение счетов учета. Это гарантирует, что созданный программно документ не будет отличаться от созданного вручную пользователем.
Рассмотрим подробнее использование структуры для передачи параметров:
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("Организация", СсылкаОрганизация);
ПараметрыЗаполнения.Вставить("Контрагент", СсылкаКонтрагент);
// Вызов типовой процедуры (название может меняться в зависимости от конфигурации)
НовыйДокумент.Заполнить(ПараметрыЗаполнения);
Если нам нужно создать сотни или тысячи документов, мы должны обратить внимание на производительность. Посмотрим на основные правила оптимизации:
ОбменДанными.Загрузка = Истина, чтобы пропустить тяжелые проверки в модуле объекта (но используйте это с осторожностью, чтобы не нарушить целостность данных).Проанализируем пример предварительной подготовки данных с использованием Запроса:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Код КАК Код
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Код В(&МассивКодов)";
Запрос.УстановитьПараметр("МассивКодов", СписокНужныхКодов);
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
// Теперь ищем ссылки в таблице значений, что гораздо быстрее поиска в БД
Подведем итог: программное создание документов требует четкого понимания структуры метаданных и бизнес-логики конфигурации. Сочетание ручного заполнения реквизитов с использованием типовых процедур платформы позволяет создавать надежные и эффективные механизмы автоматизации в 1С.