Как в 1С программно создать документ "Возврат товаров от клиента" на основании "Реализации"?

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

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

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

Основной алгоритм создания документа на основании

Общая логика создания одного документа на основе другого сводится к нескольким ключевым шагам. Разберем их по порядку:

  1. Получение объекта-основания. Сначала нужно получить ссылку на тот документ, на основании которого мы будем создавать новый. В нашем случае это "Реализация товаров и услуг".
  2. Создание нового документа. Используя менеджер нужного нам документа, мы создаем новый объект в памяти — "Возврат товаров от клиента".
  3. Заполнение реквизитов шапки. На этом этапе мы присваиваем значения основным реквизитам нового документа. Часть из них можно скопировать из документа-основания (например, Контрагент, Организация), а часть — установить программно (например, Дата).
  4. Заполнение табличной части. Самый важный этап — перенос данных из табличной части документа-основания в табличную часть нового документа. Необходимо в цикле обойти строки "Товары" в реализации и на их основе создать новые строки в возврате.
  5. Запись и проведение документа. После того как все данные заполнены, новый документ нужно записать, а при необходимости — провести.

Практический пример кода с разбором

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


// 1. Создаем новый документ "Возврат товаров от клиента"
ВозвратТоваров = Документы.ВозвратТоваровОтКлиента.СоздатьДокумент();

// 2. Устанавливаем дату документа (текущая дата)
ВозвратТоваров.Дата = ТекущаяДата();

// 3. Заполняем основные реквизиты шапки из документа-основания
ВозвратТоваров.Заполнить(РеализацияТоваровИУслугСсылка);

// 4. Устанавливаем документ-основание явно, если это необходимо
ВозвратТоваров.ДокументОснование = РеализацияТоваровИУслугСсылка;

// 5. Корректируем или устанавливаем специфичные реквизиты
// Например, явно указываем Соглашение и Договор
ВозвратТоваров.Соглашение = РеализацияТоваровИУслугСсылка.Соглашение;
ВозвратТоваров.Договор = РеализацияТоваровИУслугСсылка.Договор;

// 6. Обходим табличную часть "Товары" документа-основания
Для Каждого ТекСтрокаТовары Из РеализацияТоваровИУслугСсылка.Товары Цикл
    
    // 7. Добавляем новую строку в табличную часть "Товары" возврата
    НоваяСтрока = ВозвратТоваров.Товары.Добавить();
    
    // 8. Заполняем реквизиты новой строки
    НоваяСтрока.Номенклатура = ТекСтрокаТовары.Номенклатура;
    НоваяСтрока.Характеристика = ТекСтрокаТовары.Характеристика;
    НоваяСтрока.Упаковка = ТекСтрокаТовары.Упаковка;
    НоваяСтрока.КоличествоУпаковок = ТекСтрокаТовары.КоличествоУпаковок;
    НоваяСтрока.Количество = ТекСтрокаТовары.Количество;
    
    // Указываем, от какой реализации идет возврат
    НоваяСтрока.ДокументРеализации = РеализацияТоваровИУслугСсылка;
    
    // Важный момент: заполняем цену и сумму
    НоваяСтрока.Цена = ТекСтрокаТовары.Цена;
    НоваяСтрока.Сумма = ТекСтрокаТовары.Сумма;
    
    // Заполняем ставку и сумму НДС
    НоваяСтрока.СтавкаНДС = ТекСтрокаТовары.СтавкаНДС;
    НоваяСтрока.СуммаНДС = ТекСтрокаТовары.СуммаНДС;
    
КонецЦикла;

// 9. Записываем созданный документ в базу данных
ВозвратТоваров.Записать(РежимЗаписиДокумента.Проведение);

Разбор важных моментов и нюансов

Метод Заполнить()

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

Заполнение табличной части "Товары"

Это ключевая часть нашего кода. Мы организуем цикл Для Каждого ... Из ... Цикл по табличной части документа-основания. Внутри цикла для каждой строки реализации мы:

  1. Создаем новую строку в документе возврата с помощью метода ВозвратТоваров.Товары.Добавить(). Этот метод возвращает объект новой строки, с которым мы и будем работать.
  2. Присваиваем значениям полей новой строки (Номенклатура, Количество, Цена и т.д.) значения из соответствующей строки документа реализации (ТекСтрокаТовары).

Обратите внимание на поле НоваяСтрока.ДокументРеализации = РеализацияТоваровИУслугСсылка;. В документе "Возврат товаров от клиента" в УТ 11 каждая строка товаров может быть привязана к конкретному документу продажи. Это важно для корректного ведения взаиморасчетов и партионного учета. Мы явно указываем, что возвращаемый товар относится именно к этой реализации.

Запись и проведение

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

Возможные проблемы и их решения

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

← На главную