В процессе автоматизации бизнес-процессов часто возникает задача программного создания одних документов на основании других. Классический пример в торговле — оформление возврата от покупателя по данным из документа продажи. Рассмотрим подробно, как в конфигурации "1С:Управление торговлей 11" (УТ 11) создать и заполнить документ "Возврат товаров от клиента" на основе документа "Реализация товаров и услуг" с помощью кода на языке 1С.
Проанализируем ситуацию: у нас есть существующий документ реализации, и нам необходимо написать обработку или фрагмент кода, который автоматически сформирует документ возврата, перенесет в него номенклатуру, укажет количество и установит все необходимые реквизиты в шапке документа.
Общая логика создания одного документа на основе другого сводится к нескольким ключевым шагам. Разберем их по порядку:
Контрагент, Организация), а часть — установить программно (например, Дата).Посмотрим на готовый пример кода, который решает нашу задачу, и разберем его ключевые моменты. Предположим, что переменная РеализацияТоваровИУслугСсылка уже содержит ссылку на нужный нам документ реализации.
// 1. Создаем новый документ "Возврат товаров от клиента"
ВозвратТоваров = Документы.ВозвратТоваровОтКлиента.СоздатьДокумент();
// 2. Устанавливаем дату документа (текущая дата)
ВозвратТоваров.Дата = ТекущаяДата();
// 3. Заполняем основные реквизиты шапки из документа-основания
ВозвратТоваров.Заполнить(РеализацияТоваровИУслугСсылка);
// 4. Устанавливаем документ-основание явно, если это необходимо
ВозвратТоваров.ДокументОснование = РеализацияТоваровИУслугСсылка;
// 5. Корректируем или устанавливаем специфичные реквизиты
// Например, явно указываем Соглашение и Договор
ВозвратТоваров.Соглашение = РеализацияТоваровИУслугСсылка.Соглашение;
ВозвратТоваров.Договор = РеализацияТоваровИУслугСсылка.Договор;
// 6. Обходим табличную часть "Товары" документа-основания
Для Каждого ТекСтрокаТовары Из РеализацияТоваровИУслугСсылка.Товары Цикл
// 7. Добавляем новую строку в табличную часть "Товары" возврата
НоваяСтрока = ВозвратТоваров.Товары.Добавить();
// 8. Заполняем реквизиты новой строки
НоваяСтрока.Номенклатура = ТекСтрокаТовары.Номенклатура;
НоваяСтрока.Характеристика = ТекСтрокаТовары.Характеристика;
НоваяСтрока.Упаковка = ТекСтрокаТовары.Упаковка;
НоваяСтрока.КоличествоУпаковок = ТекСтрокаТовары.КоличествоУпаковок;
НоваяСтрока.Количество = ТекСтрокаТовары.Количество;
// Указываем, от какой реализации идет возврат
НоваяСтрока.ДокументРеализации = РеализацияТоваровИУслугСсылка;
// Важный момент: заполняем цену и сумму
НоваяСтрока.Цена = ТекСтрокаТовары.Цена;
НоваяСтрока.Сумма = ТекСтрокаТовары.Сумма;
// Заполняем ставку и сумму НДС
НоваяСтрока.СтавкаНДС = ТекСтрокаТовары.СтавкаНДС;
НоваяСтрока.СуммаНДС = ТекСтрокаТовары.СуммаНДС;
КонецЦикла;
// 9. Записываем созданный документ в базу данных
ВозвратТоваров.Записать(РежимЗаписиДокумента.Проведение);
Метод Заполнить()
В строке ВозвратТоваров.Заполнить(РеализацияТоваровИУслугСсылка) мы используем стандартный механизм платформы 1С для заполнения на основании. Этот метод автоматически переносит значения реквизитов, для которых настроено соответствие в свойстве "Заполнение из данных" в конфигураторе. Он отлично подходит для копирования таких полей, как Организация, Контрагент, Партнер, Склад и других. Однако стоит помнить, что этот метод не всегда заполняет все, что нужно, и не заполняет табличные части. Поэтому после его вызова часто требуется "дозаполнить" некоторые реквизиты вручную, как мы сделали с Соглашение и Договор.
Заполнение табличной части "Товары"
Это ключевая часть нашего кода. Мы организуем цикл Для Каждого ... Из ... Цикл по табличной части документа-основания. Внутри цикла для каждой строки реализации мы:
ВозвратТоваров.Товары.Добавить(). Этот метод возвращает объект новой строки, с которым мы и будем работать.Номенклатура, Количество, Цена и т.д.) значения из соответствующей строки документа реализации (ТекСтрокаТовары).Обратите внимание на поле НоваяСтрока.ДокументРеализации = РеализацияТоваровИУслугСсылка;. В документе "Возврат товаров от клиента" в УТ 11 каждая строка товаров может быть привязана к конкретному документу продажи. Это важно для корректного ведения взаиморасчетов и партионного учета. Мы явно указываем, что возвращаемый товар относится именно к этой реализации.
Запись и проведение
В конце мы используем метод Записать(). В нашем примере указан параметр РежимЗаписиДокумента.Проведение, что означает, что документ будет не просто сохранен в базе, но и сразу проведен, то есть сделает все необходимые движения по регистрам. Если вам нужно только создать черновик документа, используйте РежимЗаписиДокумента.Запись.
Заполнить() какие-то поля в шапке остались пустыми, проверьте настройки заполнения в конфигураторе или просто добавьте строки для их явного присваивания в коде, как показано для Договор.Количество и Цену, но и Сумму, СтавкуНДС и СуммуНДС. В некоторых случаях система может пересчитывать эти значения автоматически, но для надежности лучше переносить их явно из документа-основания, чтобы избежать расхождений.Статья доходов/расходов) или есть другие логические ограничения. В этом случае документ запишется, но не проведется. Проанализируйте сообщения об ошибках, которые выдаст система при попытке проведения.Таким образом, используя представленный алгоритм и пример кода, вы можете легко автоматизировать создание документов возврата, что значительно ускоряет работу пользователей и снижает вероятность ошибок ручного ввода.