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