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

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

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

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

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

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


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

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

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

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


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

// Заполнение валюты и типа цен
НовыйДокумент.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("643");
НовыйДокумент.ЦенаВключаетНДС = Истина;

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

Шаг 3. Работа с табличной частью документа

Перейдем к самой ответственной части — заполнению строк документа. Каждая табличная часть — это подчиненный объект. Чтобы добавить новую строку, мы используем метод Добавить() у коллекции строк табличной части.

Выясним причину, почему важно заполнять не только количество, но и ставку НДС, а также счета учета. В типовых конфигурациях многие параметры зависят от учетной политики. Рассмотрим пример заполнения табличной части Товары:


Для Каждого СтрокаДанных Из МассивДанныхДляЗагрузки Цикл
    НоваяСтрока = НовыйДокумент.Товары.Добавить();
    НоваяСтрока.Номенклатура = СтрокаДанных.НоменклатураСсылка;
    НоваяСтрока.Количество = СтрокаДанных.Кол;
    НоваяСтрока.Цена = СтрокаДанных.Цена;
    
    // Автоматический расчет суммы
    НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
    
    // Установка ставки НДС
    НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
    НоваяСтрока.СуммаНДС = НоваяСтрока.Сумма * 20 / 120; // Пример расчета
КонецЦикла;

Проанализируем этот фрагмент: мы создаем новую строку в цикле, заполняем ее данными и производим арифметические вычисления. В реальных задачах МассивДанныхДляЗагрузки может быть результатом чтения файла Excel или запроса к другой базе данных.

Шаг 4. Использование типовых механизмов заполнения

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


// Заполнение на основании другого документа (например, Заказа клиента)
НовыйДокумент.Заполнить(ОснованиеСсылка);

Этот метод вызывает обработчик ОбработкаЗаполнения в модуле объекта документа. Это позволяет значительно сократить код, так как платформа сама перенесет данные из документа-основания и рассчитает налоги.

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

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


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

Важно понимать разницу между РежимЗаписиДокумента.Запись и РежимЗаписиДокумента.Проведение. Проведение инициирует движение по регистрам накопления, бухгалтерии и сведений. Если в процессе проведения возникнут ошибки (например, нехватка остатков на складе), система выдаст исключение, которое мы перехватываем в блоке Попытка...Исключение.

Дополнительные советы и важные моменты

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

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

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


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

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

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

← На главную