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

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

Программное создание документов — это одна из наиболее часто встречающихся задач при разработке на платформе 1С:Предприятие 8.3. Это необходимо при реализации импорта данных из внешних систем, создании обработок для автоматического формирования документов или при разработке сложных механизмов интеграции. В рамках данной статьи мы подробно разберем, как правильно инициализировать объект документа, заполнить его реквизиты и табличные части, а также обеспечить корректное проведение в системе.

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

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


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

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

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

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


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

Важный момент: при поиске объектов (например, НайтиПоНаименованию) всегда рекомендуется проверять, не является ли возвращенная ссылка пустой. Если объект не найден, 1С вернет ПустаяСсылка, и документ может быть записан с некорректными данными.

Работа с табличными частями

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


// Добавляем новую строку в табличную часть "Товары"
НоваяСтрока = НовыйДокумент.Товары.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Товар тестовый");
НоваяСтрока.Количество = 10;
НоваяСтрока.Цена = 1500;
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;

Если в конфигурации используется механизм автоматического пересчета итогов, мы можем воспользоваться типовыми процедурами, которые обычно располагаются в модуле менеджера или в общем модуле. Разберем ситуацию: часто в типовых решениях (УТ 11, ERP, КА) реализованы специальные обработчики, которые заполняют ставку НДС или счета учета автоматически. Вызов таких процедур позволяет избежать дублирования логики и минимизировать ошибки.

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

После заполнения всех данных документ необходимо сохранить в базе данных. В 1С существует три основных режима записи документа. Разберем каждый из них:

  1. РежимЗаписиДокумента.Запись — документ просто сохраняется в базе данных без формирования движений по регистрам.
  2. РежимЗаписиДокумента.Проведение — документ записывается и система пытается сформировать записи в регистрах (провести документ).
  3. РежимЗаписиДокумента.ОтменаПроведения — документ сохраняется, а все существующие движения по нему удаляются.

Посмотрим, как это реализуется в коде с обработкой возможных исключений:


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

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

Использование механизма ЗаполнитьЗначенияСвойств

Для ускорения процесса разработки и сокращения объема кода проанализируем функцию ЗаполнитьЗначенияСвойств. Она крайне полезна, если у вас есть структура данных (например, полученная из JSON или Excel), чьи поля совпадают с именами реквизитов документа.


ДанныеДляЗаполнения = Новый Структура;
ДанныеДляЗаполнения.Вставить("Комментарий", "Создано автоматически из внешней системы");
ДанныеДляЗаполнения.Вставить("Ответственный", Пользователи.ТекущийПользователь());

ЗаполнитьЗначенияСвойств(НовыйДокумент, ДанныеДляЗаполнения);

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

Дополнительные советы и рекомендации

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

  1. Использование транзакций: Если вы создаете несколько связанных документов одновременно, оберните их в транзакцию с помощью НачатьТранзакцию() и ЗафиксироватьТранзакцию(). Если один документ не запишется, вы сможете выполнить ОтменитьТранзакцию(), и база данных вернется в исходное состояние.
  2. Заполнение на основании: Если ваш документ должен быть создан на базе другого (например, Реализация на основании Заказа), используйте метод Заполнить(Основание). Это вызовет встроенный в конфигурацию механизм ОбработкаЗаполнения, который автоматически перенесет все нужные данные.
  3. Проверка заполнения: Перед записью полезно вызвать метод ПроверитьЗаполнение(). Это программно инициирует проверку всех реквизитов, у которых в конфигураторе установлено свойство "Проверка заполнения - Выдавать ошибку".

Мы подробно разобрали жизненный цикл программного создания документа. Соблюдение этих правил обеспечит стабильную работу вашей системы и чистоту данных в информационной базе .

← На главную