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

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

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

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

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


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

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

Шаг 2: Заполнение основных реквизитов (Шапка документа)

Рассмотрим подробнее заполнение реквизитов «шапки». Это ключевые данные, такие как дата, организация, склад и контрагент. Выясним причину, почему важно правильно устанавливать дату: от нее зависит периодичность нумерации и попадание документа в нужный бухгалтерский или налоговый период.


// Установка даты и времени (текущий момент)
НовыйДокумент.Дата = ТекущаяДата();

// Заполнение ссылочных реквизитов
// Предположим, ссылки уже получены ранее (например, через поиск или параметры)
НовыйДокумент.Организация = СсылкаНаОрганизацию;
НовыйДокумент.Контрагент  = СсылкаНаКонтрагента;
НовыйДокумент.Склад       = СсылкаНаСклад;
НовыйДокумент.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("643");

// Заполнение комментария
НовыйДокумент.Комментарий = "Документ создан программно " + ТекущаяДата();

Обратим внимание на метод УстановитьНовыйНомер(). Хотя 1С часто делает это автоматически при записи, при программном создании рекомендуется вызывать его явно, если вы хотите увидеть номер до момента физической записи объекта в БД.

Шаг 3: Работа с табличными частями

Теперь разберем по шагам, как добавить строки в табличную часть. В большинстве документов 1С основная информация о товарах или услугах хранится в коллекции, которая называется табличной частью. Посмотрим на пример работы с ТЧ Товары:


// Добавляем новую строку в табличную часть "Товары"
НоваяСтрока = НовыйДокумент.Товары.Добавить();

// Заполняем реквизиты строки
НоваяСтрока.Номенклатура = СсылкаНаОмерклатуру;
НоваяСтрока.Количество   = 10;
НоваяСтрока.Цена         = 1500;
НоваяСтрока.СтавкаНДС    = Перечисления.СтавкиНДС.НДС20;

// Автоматический расчет суммы, если логика не вынесена в модуль объекта
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;

В типовых конфигурациях часто используются специальные экспортные процедуры в модулях менеджеров для пересчета сумм и налогов. Чтобы избежать ошибок при обращении к таким процедурам, рекомендуется предварительно выполнить анализ конфигурации на наличие ошибок в программных вызовах и экспортных функциях. Рассмотрим использование таких процедур, чтобы не дублировать бизнес-логику вручную. Проанализируем ситуацию: если мы просто присвоим значение цене, НДС может не пересчитаться сам собой. В таких случаях стоит поискать процедуры вроде РассчитатьСуммуТабличнойЧасти() в программном интерфейсе документа.

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

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

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

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


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

Шаг 5: Использование дополнительных свойств и параметров

Иногда при программном создании документа нам нужно «обойти» некоторые проверки, которые обязательны для пользователя. Для этого мы можем использовать свойство ОбменДанными.Загрузка. Посмотрим, как это влияет на процесс:


// Установка режима загрузки данных
НовыйДокумент.ОбменДанными.Загрузка = Истина;
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);

Важно: Установка ОбменДанными.Загрузка = Истина отключает большинство проверок в модуле объекта. Используйте этот метод с осторожностью. В случаях, когда изменения вносятся через внешние инструменты, полезно знать, как обновить форму документа программно после корректировки данных, чтобы интерфейс отобразил актуальное состояние объекта.

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

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

Рассмотрим пример комплексного подхода, где мы объединяем все знания:


Процедура СоздатьРеализациюНаСервере(ДанныеДляЗаполнения)
    
    // 1. Создание
    ДокОбъект = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
    
    // 2. Первоначальное заполнение по правилам системы
    ДокОбъект.Заполнить(ДанныеДляЗаполнения.Основание);
    
    // 3. Дозаполнение специфичных полей
    ДокОбъект.Дата = ТекущаяДата();
    ДокОбъект.Партнер = ДанныеДляЗаполнения.Партнер;
    
    // 4. Проверка и проведение
    Если ДокОбъект.ПроверитьЗаполнение() Тогда
        ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
    КонецЕсли;

КонецПроцедуры

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

← На главную