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

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

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

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

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

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


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

Использование метода УстановитьНовыйНомер() является обязательным, если вы хотите, чтобы система автоматически присвоила следующий порядковый номер согласно заданному префиксу организации или узла распределенной информационной базы (РИБ).

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

Рассмотрим подробнее процесс заполнения основных реквизитов, таких как Организация, Контрагент, Склад и Договор. Эти данные являются ссылочными типами, поэтому нам необходимо передать в них ссылки на соответствующие объекты справочников. Разберем по шагам, как это реализовать:

  1. Определяем организацию, от имени которой оформляется сделка.
  2. Выбираем контрагента и его договор (важно следовать иерархии и типам договоров).
  3. Указываем склад, с которого будет произведена отгрузка.
  4. Устанавливаем валюту документа.

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

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

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

Перейдем к самому ответственному этапу — заполнению табличной части Товары. Посмотрим на пример, где мы добавляем новую строку и заполняем данные о номенклатуре, количестве и цене. Выясним, как правильно рассчитать сумму и налоги.


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

// Выполняем расчет суммы
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
// В типовых решениях часто используется обработчик
// ПриИзмененииНоменклатуры(НоваяСтрока) для заполнения единиц измерения

Разберем важный нюанс: при программном заполнении не срабатывают события формы (например, ПриИзменении). Это означает, что все расчеты и зависимости (пересчет НДС, веса, упаковок) программист должен реализовать самостоятельно или вызывать экспортные процедуры из модулей объекта/менеджера, предназначенные для серверного выполнения.

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

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

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


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

Использование типовых процедур заполнения

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

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

Рассмотрим подробнее использование структуры для передачи параметров:


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

Оптимизация при массовом создании документов

Если нам нужно создать сотни или тысячи документов, мы должны обратить внимание на производительность. Посмотрим на основные правила оптимизации:

  1. Минимизируйте количество обращений к базе данных. Не ищите объекты в цикле по наименованию или коду. Лучше заранее выбрать все необходимые ссылки в один массив или таблицу значений с помощью запроса.
  2. Используйте объектную кэш-память. Если вы многократно используете одну и ту же организацию или склад, сохраните ссылку в переменной.
  3. Отключайте лишние проверки. В некоторых случаях при загрузке данных можно использовать ОбменДанными.Загрузка = Истина, чтобы пропустить тяжелые проверки в модуле объекта (но используйте это с осторожностью, чтобы не нарушить целостность данных).

Проанализируем пример предварительной подготовки данных с использованием Запроса:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Номенклатура.Ссылка КАК Ссылка,
    |   Номенклатура.Код КАК Код
    |ИЗ
    |   Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |   Номенклатура.Код В(&МассивКодов)";

Запрос.УстановитьПараметр("МассивКодов", СписокНужныхКодов);
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
// Теперь ищем ссылки в таблице значений, что гораздо быстрее поиска в БД

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

← На главную