Как заполнить один документ данными из другого без стандартного ввода на основании?

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

Часто в практике разработки на платформе 1С возникает задача: перенести данные из одного документа в другой, но при этом стандартный механизм "Создать на основании" по каким-то причинам не подходит или не предусмотрен конфигурацией. Проанализируем типичную ситуацию. У нас есть Документ1 и Документ2. Оба имеют одинаковые реквизиты: Сотрудник, Номер Договора и Дата Договора. Нам нужно, чтобы при создании Документа2 путем нажатия на кнопку "Создать" в форме списка, эти данные автоматически подтягивались из выбранного Документа1. Давайте разберем по шагам, как можно реализовать такой функционал различными способами.

Способ 1. Программное заполнение через параметры формы

Рассмотрим подробнее классический программный подход. Если кнопка создания второго документа располагается, например, в форме списка первого документа, мы можем использовать метод ОткрытьФорму и передать в него необходимые параметры для инициализации нового объекта.

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


&НаКлиенте
Процедура СоздатьДокумент2(Команда)
    
    Если Элементы.Список.ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;

    ТекущийДокумент1 = Элементы.Список.ТекущиеДанные.Ссылка;
    
    // Получаем данные для заполнения с сервера
    ДанныеЗаполнения = ПолучитьДанныеДляДокумента2(ТекущийДокумент1);
    
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("ЗначенияЗаполнения", ДанныеЗаполнения);
    
    ОткрытьФорму("Документ.Документ2.Форма.ФормаДокумента", ПараметрыФормы);
    
КонецПроцедуры

&НаСервере
Функция ПолучитьДанныеДляДокумента2(СсылкаДокумент1)
    
    Данные = Новый Структура;
    Данные.Вставить("Сотрудник", СсылкаДокумент1.Сотрудник);
    Данные.Вставить("НомерДоговора", СсылкаДокумент1.НомерДоговора);
    Данные.Вставить("ДатаДоговора", СсылкаДокумент1.ДатаДоговора);
    
    Возврат Данные;
    
КонецФункции

При таком подходе переданная структура попадает в процедуру ОбработкаЗаполнения в модуле объекта Документа2 (если она переопределена) или просто ложится в реквизиты, если их имена совпадают с ключами структуры.

Способ 2. Использование обработчика "ОбработкаЗаполнения" напрямую

Разберем альтернативный вариант, упомянутый в обсуждении. Мы можем передать ссылку на сам Документ1 как параметр-основание. В этом случае мы не готовим структуру заранее, а поручаем логику заполнения самому создаваемому документу.

  1. В форме списка первого документа вызываем создание второго, передавая ссылку на документ-источник в параметре Основание внутри структуры ЗначенияЗаполнения.
  2. В модуле объекта Документа2 находим или создаем процедуру ОбработкаЗаполнения.

Проанализируем пример логики в модуле объекта Документа2:


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    
    Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.Документ1") Тогда
        // Отключаем стандартную обработку, так как пишем свою логику
        СтандартнаяОбработка = Ложь;
        
        ЭтотОбъект.Сотрудник = ДанныеЗаполнения.Сотрудник;
        ЭтотОбъект.НомерДоговора = ДанныеЗаполнения.НомерДоговора;
        ЭтотОбъект.ДатаДоговора = ДанныеЗаполнения.ДатаДоговора;
        
    КонецЕсли;
    
КонецПроцедуры

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

Способ 3. Внешние обработки заполнения объекта (Механизм БСП)

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

Создается внешняя обработка с видом "Заполнение объекта". Назначением этой обработки мы указываем Документ2. Как это будет работать для пользователя:

  1. Пользователь открывает форму списка Документа2 и нажимает стандартную кнопку "Создать".
  2. В открывшейся форме нового документа в подменю "Заполнить" появляется наша команда.
  3. При нажатии на команду открывается вспомогательная форма выбора, где пользователь указывает Документ1.
  4. После выбора срабатывает логика внешней обработки, которая программно переносит реквизиты из источника в текущий открытый объект.

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

Способ 4. Штатные пользовательские функции (без программирования)

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

Функция копирования строк: Пользователь может открыть исходный документ, выделить нужные строки табличной части (если речь идет о таблицах), нажать Ctrl+C (копировать), затем создать новый документ и вставить строки нажатием Ctrl+V.

Команда "Заполнить из..." / "Добавить из...": Над табличными частями во многих типовых документах предусмотрено меню, позволяющее выбрать другой документ базы данных в качестве источника строк и реквизитов. При выборе источника система сама сопоставит данные и заполнит текущий документ.

Подводя итог, проанализируем выбор метода. Если нужно жестко завязать логику в конфигурации и документы тесно связаны бизнес-процессом — используем ОбработкаЗаполнения или передачу структуры ЗначенияЗаполнения. Если нужно сохранить конфигурацию типовой — пишем внешнюю обработку заполнения БСП. Независимо от того, называем ли мы это "вводом на основании" или нет, технически платформа 1С предоставляет богатый инструментарий для решения данной задачи.

← На главную