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

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

В процессе разработки в среде 1С:Предприятие 8.3 часто возникает задача автоматизации бизнес-процессов, связанных с созданием цепочек документов. Типичный пример — программное формирование документа РеализацияТоваровУслуг на основании существующего ЗаказКлиента. В этой статье мы подробно разберем, как реализовать этот механизм, обеспечив корректное заполнение всех реквизитов и табличных частей.

Понимание механизма «Заполнить»

Прежде чем приступать к написанию кода, проанализируем стандартный механизм платформы. Основным инструментом для создания связанных объектов является метод Заполнить() (удобнее через конструктор правил заполнения документов без программирования). Этот метод вызывает обработчик события ОбработкаЗаполнения в модуле объекта создаваемого документа. Рассмотрим подробнее, почему этот подход является предпочтительным.

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

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

Рассмотрим пример кода, который создает новый документ и инициирует его заполнение данными из документа-основания. Предположим, что у нас уже есть ссылка на ЗаказКлиента.


// Предположим, СсылкаНаЗаказ — это ссылка на существующий документ ЗаказКлиента
НоваяРеализация = Документы.РеализацияТоваровУслуг.СоздатьДокумент();

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

// Используем стандартный механизм заполнения
НоваяРеализация.Заполнить(СсылкаНаЗаказ);

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

Шаг 2: Программная корректировка табличной части

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

Посмотрим на пример обхода табличной части Товары:


Для Каждого СтрокаТовара Из НоваяРеализация.Товары Цикл
    // Проанализируем остатки или спецификацию
    Если СтрокаТовара.Количество > 10 Тогда
        СтрокаТовара.Комментарий = "Оптовая отгрузка";
    КонецЕсли;
    
    // Пересчитаем сумму, если изменили количество или цену
    // В типовых конфигурациях для этого используются экспортные процедуры из общих модулей
    // Но мы можем сделать это и вручную для демонстрации
    СтрокаТовара.Сумма = СтрокаТовара.Количество * СтрокаТовара.Цена;
КонецЦикла;

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

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

Иногда возникают ситуации, когда ЗаказКлиента не содержит всех необходимых данных для Реализации. В этом случае мы должны заполнить их вручную. Выясним, какие реквизиты часто требуют внимания:

  1. Подразделение: если оно не совпадает с подразделением в заказе.
  2. Склад: если отгрузка производится с другого склада.
  3. Статус документа: для конфигураций, использующих статусы.

Пример заполнения дополнительных полей:


НоваяРеализация.Ответственный = Пользователи.ТекущийПользователь();
НоваяРеализация.Комментарий = "Создано автоматически на основании " + Строка(СсылкаНаЗаказ);
// Если документ использует статусы
НоваяРеализация.Статус = Перечисления.СтатусыРеализацийТоваровУслуг.КОтгрузке;

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

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

После того как все реквизиты заполнены и проверены, документ необходимо записать в базу данных. Мы можем просто сохранить его как черновик или сразу попытаться провести. Разберем оба варианта. Например, автоматическое создание возврата поставщику на основании возврата клиента обычно требует немедленного проведения для корректного отражения взаиморасчетов — для этого подойдёт обработка для автоматизации создания цепочек документов.

Для записи без проведения используйте метод Записать() без параметров или с режимом записи Запись. Для проведения необходимо использовать режим Проведение. Рассмотрим правильную обработку исключений при записи:


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

Рекомендации по оптимизации кода

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

Заключение

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

Рассмотренные примеры кода можно адаптировать для создания любых пар документов: от ПоступлениеТоваровУслуг на основании ЗаказПоставщику (поможет автоматизация создания установки цен из закупок) до СчетНаОплату на основании РеализацияТоваровУслуг. Главное — понимать структуру метаданных и следовать принципам работы платформы 1С:Предприятие.

← На главную