Как в управляемой форме 1С узнать, что документ был скопирован

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

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

Рассмотрим подробно способы решения этой задачи как на стороне управляемой формы, так и на уровне модуля объекта.

Способ 1. Анализ стандартного параметра ЗначениеКопирования в форме

Когда пользователь интерактивно копирует документ из списка (нажатием клавиши F9 или через контекстное меню «Скопировать»), платформа 1С автоматически инициализирует форму нового объекта и передает в нее системный параметр ЗначениеКопирования. Данный параметр содержит ссылку на документ-источник.

Разберем логику проверки в обработчике ПриСозданииНаСервере модуля управляемой формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем, что это новый (еще не записанный в базу) документ
    Если Объект.Ссылка.Пустая() Тогда
        
        // Проверяем наличие источника копирования
        Если Параметры.Свойство("ЗначениеКопирования") И ЗначениеЗаполнено(Параметры.ЗначениеКопирования) Тогда
            // Документ создан путем копирования
            // Здесь выполняем действия, необходимые только при копировании
        Иначе
            // Документ создан обычным способом (НЕ копирование и НЕ ввод на основании)
            // Здесь выполняем первоначальное заполнение нового документа
        КонецЕсли;
        
    КонецЕсли;

КонецПроцедуры

Обратите внимание на важные условия:

  1. Проверка на новый документ: условие Объект.Ссылка.Пустая() гарантирует, что мы анализируем именно процесс создания объекта, а не открытие ранее сохраненного в базе документа.
  2. Срок доступности параметра: параметр Параметры.ЗначениеКопирования доступен исключительно в момент инициализации формы в обработчике ПриСозданииНаСервере. После первой записи объекта или при вызове других серверных процедур из клиента этот параметр становится недоступным. Если признак копирования требуется анализировать на протяжении всего сеанса редактирования формы, его следует сохранить в отдельный реквизит формы с типом Булево.

Способ 2. Использование события ПриКопировании модуля объекта

Если логика очистки или переопределения реквизитов должна выполняться независимо от того, как копируется документ — интерактивно пользователем через интерфейс или программно с помощью метода Скопировать(), — правильнее использовать событие модуля объекта ПриКопировании.

В модуль объекта документа поместим следующий обработчик:


Процедура ПриКопировании(ОбъектОснование)
    
    // Сбрасываем реквизиты, которые не должны переноситься из старого документа
    Дата = ТекущаяДатаСеанса();
    Ответственный = Пользователи.ТекущийПользователь();
    
    // Устанавливаем маркер для передачи признака в другие обработчики
    ЭтотОбъект.ДополнительныеСвойства.Вставить("ЭтоКопирование", Истина);
    
КонецПроцедуры

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

Сравнение сценариев создания документа

Проанализируем различные состояния объекта при открытии формы:

  1. Обычный новый документ: Объект.Ссылка.Пустая() = Истина, Параметры.ЗначениеКопирования не заполнено, Параметры.Основание не заполнено.
  2. Копия документа: Объект.Ссылка.Пустая() = Истина, Параметры.ЗначениеКопирования содержит ссылку на объект-источник. Вызывается процедура ПриКопировании.
  3. Ввод на основании: Объект.Ссылка.Пустая() = Истина, Параметры.ЗначениеКопирования не заполнено, заполнен параметр Основание (или ДанныеЗаполнения). В модуле объекта вызывается ОбработкаЗаполнения.
  4. Существующий документ: Объект.Ссылка.Пустая() = Ложь. Открыта ранее записанная версия объекта.

Таким образом, для выполнения действий строго в момент обычного создания документа (когда объект не копируется), достаточно проверить условие пустоты ссылки объекта и отсутствия заполненного параметра ЗначениеКопирования.

← На главную