Создание копированием и создание на основании

Создание копированием

Чтобы упростить работу пользователей приложения и ускорить ввод данных в систему, предоставляет возможность создавать новый экземпляр объекта путем копирования данных существующего экземпляра. Создавать копированием можно следующие типы объектов:
  • элементы справочников,
  • экземпляры документов,
  • узлы планов обмена,
  • записи регистров сведений,
  • элементы хранилищ настроек.

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

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

При создании новой формы объекта команда Создать копию автоматически прописывается в ее YAML-файле в свойстве ДополнительныеКоманды:

ДополнительныеКоманды:
    Тип: ФрагментКомандногоИнтерфейса<Команда>
    Элементы:
        - =Обновить
        - =СоздатьКопию

В формах списка команда Создать копию автоматически добавляется в команды строки:

При создании новой формы списка команда Создать копию автоматически прописывается в ее YAML-файле в свойстве КомандыСтроки:

КомандыСтроки:
   Тип: ФрагментКомандногоИнтерфейса<КомандаСПараметром<Массив<Сущность.Ключ>>|КомандаСПараметром<Сущность.Ключ>>
   Элементы:
      - =Компоненты.ОсновнаяТаблица.СоздатьКопию

Использование механизма создания копированием в интерфейсе

Вы можете создать новый экземпляр сущности на клиенте из формы или другого компонента интерфейса. Для этого:
  • в модуле компонента интерфейса получите ссылку на сущность-источник;
  • откройте форму объекта и в качестве параметра КлючИсточникаКопирования: имя-сущности.Ссылка укажите эту ссылку.
    метод ОткрытьКопиюМоегоСправочника(Ссылка: МойСправочник.Ссылка)
        Открыть(КлючИсточникаКопирования = Ссылка)
    ;

Использование механизма создания копированием в коде

Чтобы создать копию экземпляра справочника, документа или плана обмена в коде на сервере:
  • получите ссылку на копируемый объект и воспользуйтесь методом имя-сущности.Ссылка.СоздатьКопиюОбъекта(). Чтобы сразу переопределить значения реквизитов, метод можно вызвать с параметрами, аналогично конструктору экземпляра сущности:
    метод СкопироватьБезНаименования(Ссылка: МойСправочник.Ссылка): МойСправочник.Объект
        возврат Ссылка.СоздатьКопиюОбъекта(Наименование = "")
    ;
  • получите копируемый объект и воспользуйтесь методом имя-сущности.Объект.СоздатьКопию(). Чтобы сразу переопределить значения реквизитов, метод можно вызвать с параметрами, аналогично конструктору экземпляра сущности:
    метод СкопироватьБезНаименования(Источник: МойСправочник.Объект): МойСправочник.Объект
        возврат Источник.СоздатьКопию(Наименование = "")
    ;
Чтобы создать копию экземпляра регистра сведений в коде на сервере:
  • получите ключ копируемой записи регистра сведений и воспользуйтесь методом имя-регистра-сведений.КлючЗаписи.СоздатьКопиюЗаписи(). Чтобы сразу переопределить значения реквизитов, метод можно вызвать с параметрами, аналогично конструктору экземпляра сущности:
    метод СкопироватьЗаписьСКлючом(Парам: Строка)
        пер Запрос = Запрос{ВЫБРАТЬ КлючЗаписи ИЗ МойРегистрСведений ГДЕ Измерение1 == %Парам}
        исп Результат = Запрос.Выполнить()
        для Строка из Результат
            пер Ключ = Строка.КлючЗаписи
            пер НоваяЗапись = Ключ.СоздатьКопиюЗаписи()
            // Меняем значения ресурсов, измерений или реквизитов и записываем новую запись
        ;
    ;
  • получите копируемую запись регистра сведений и воспользуйтесь методом имя-регистра-сведений.Запись.СоздатьКопию(). Чтобы сразу переопределить значения реквизитов, метод можно вызвать с параметрами, аналогично конструктору экземпляра сущности:
    метод СкопироватьЗапись(Парам: Строка)
        пер Запрос = Запрос{ВЫБРАТЬ КлючЗаписи ИЗ МойРегистрСведений ГДЕ Измерение1 == %Парам}
        исп Результат = Запрос.Выполнить()
        для Строка из Результат
            пер Ключ = Строка.КлючЗаписи
            пер Запись = Ключ.ЗагрузитьЗапись()
            пер НоваяЗапись = Запись.СоздатьКопию()
            // Меняем значения ресурсов, измерений или реквизитов и записываем новую запись
        ;
    ;

Настройка создания копированием

Вы можете изменить процесс создания копированием в обработчике события ПриСозданииКопии в модуле объекта сущности. В параметре Источник этого обработчика находятся данные копируемого объекта. Вы можете перезаписать значения нужных вам реквизитов в соответствии с бизнес-логикой. Пример:

@Обработчик
метод ПриСозданииКопии(Источник: МойСправочник.Данные)
    если Источник.Реквизит1 == 1
        Реквизит2 = "Значение Реквизита2, соответствующее бизнес-логике"
    ;
;

На момент вызова обработчика ПриСозданииКопии значения всех реквизитов уже будут скопированы, за исключением следующих:

  • реквизит Код для справочников, потому что он всегда вычисляется или задается по прикладной логике;
  • реквизиты Дата и Номер для документов;
  • реквизиты Код, НомерОтправленного, НомерПринятого, ЭтотУзел для планов обмена;
  • стандартное поле Период для периодических регистров сведений.
Примечание: При создании копированием событие ПриЗаполнении вызывается так же, как и при обычном создании:
  • пользователь нажимает на соответствующий компонент интерфейса;
  • открывается форма объекта сущности с переданным параметром КлючИсточникаКопирования;
  • форма отправляет запрос на сервер, который формирует данные источника копирования;
  • на сервере происходит создание нового экземпляра сущности:
    • вызывается обработчик события ПриЗаполнении;
    • вызывается обработчик события ПриСозданииКопии;
  • получившийся экземпляр возвращается в форму.

Свойство «ЗаполнятьПриКопировании»

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

ВидЭлемента: РегистрСведений
Ид: 1228d00a-dc2a-48bf-8709-d4fd0fdd331e
Имя: МойРегистрСведений
ОбластьВидимости: ВПодсистеме
Измерения:
    -
        Ид: 4661c2bc-a5b2-4293-ac66-02a5dd16fdc0
        Имя: Измерение1
        Тип: Число
        ЗаполнятьПриКопировании: Ложь
Ресурсы:
    -
        Ид: 2af5e19a-d922-4158-b27a-36bd214ee295
        Имя: Ресурс1
        Тип: Строка
        МаксимальнаяДлина: 10
        ЗаполнятьПриКопировании: Ложь
Реквизиты:
    -
        Ид: 1e26fe17-1f7f-42be-b9bc-9a4c449a1279
        Имя: Реквизит1
        Тип: Число
        ЗаполнятьПриКопировании: Ложь

Создание на основании

Функциональность Создать на основании позволяет создавать новые экземпляры сущностей из экземпляров сущностей другого типа. Механизм создания на основании доступен для следующих элементов проектов:
  • справочники,
  • документы,
  • планы обмена,
  • контракты сущностей,
  • структуры (элементы проекта).
Чтобы указать, какие объекты будут выступать в качестве источника данных при создании на основании, используется свойство СозданиеНаОсновании создаваемого элемента проекта. В нем можно указать типы имя-сущности.Ссылка для элементов проекта сущностей, имя-контракта.Ссылка для контрактов сущностей и имя-структуры для структур (только тех, которые являются элементами проекта).
Примечание: Если в списке источников создания на основании указан контракт сущности, то нельзя указывать элементы проекта, которые реализуют этот контракт.

Например:

ВидЭлемента: Документ
Ид: d41be85d-d23e-4a9a-aeeb-a5ffc51cb7af
Имя: ДокументОснование
ОбластьВидимости: ВПодсистеме
СозданиеНаОсновании:
    - МойСправочник.Ссылка
    - Основное::МояСтруктура
Реквизиты:
    -
        Имя: Дата
        Тип: ДатаВремя
    -
        Имя: Номер
        Длина: 15
        Автонумерация:
            Использовать: Ложь
    -
        Ид: 82b4f4a2-a216-4473-883c-253f0c06eb6e
        Имя: Поле_строка
        Тип: Строка
ТабличныеЧасти:
    -
        Ид: 5df84bd8-b268-45fa-aabe-9dae894cec2e
        Имя: ТабличнаяЧастьДокумент
        Реквизиты:
            -
                Ид: 4f26bfdc-80f3-4f73-85fd-1ae7bb25312d
                Имя: Реквизит_число
                Тип: Число
            -
                Ид: 441f366e-008f-4c88-9611-1fe85b7d7c3a
                Имя: Реквизит_справочник
                Тип: МойСправочник.Ссылка?
Команда Создать на основании доступна в формах списка и объекта в группе команд Создать на основании. В эту группу автоматически добавляются команды для создания разных типов объектов на основании сущности, которую просматривает пользователь. При вызове команды из группы открывается форма объекта новой сущности, которая создается на основании просматриваемой: некоторые ее реквизиты уже заполнены из данных источника.

Группа команд Создать на основании добавляется в дополнительные команды при создании новой формы объекта в среде разработки, а также в автоматическую форму объекта.

При создании новой формы объекта команда Создать на основании автоматически прописывается в YAML-файле новой формы в свойстве ДополнительныеКоманды:
ДополнительныеКоманды:
    Тип: ФрагментКомандногоИнтерфейса<Команда>
    Элементы:
        - =Обновить
        - =СоздатьКопию
        - =СоздатьНаОсновании
В формах списка группа команд Создать на основании автоматически добавляется в группу команд строки таблицы.

При создании новой формы списка группа команд Создать на основании автоматически прописывается в YAML-файле новой формы в свойстве КомандыСтроки:

КомандыСтроки:
Тип: ФрагментКомандногоИнтерфейса<КомандаСПараметром<Массив<Сущность.Ключ>>|КомандаСПараметром<Сущность.Ключ>>
Элементы:
    - =Компоненты.ОсновнаяТаблица.СоздатьКопию
    - =Компоненты.ОсновнаяТаблица.СоздатьНаОсновании(ДанныеСтроки)
Логика создания на основании прописывается в обработчике заполнения для каждого типа источника. Обработчики ПриСозданииНаОсновании имеют параметр Основание типа данных источника. Они располагаются в модуле объекта сущности и по сути являются перегрузкой метода. Например:
@Обработчик
метод ПриСозданииНаОсновании(Основание: МойСправочник.Ссылка)
    // Создание документа МойДокумент на основании справочника МойСправочник
;

@Обработчик
метод ПриСозданииНаОсновании(Основание: МояСтруктура)
    // Создание документа МойДокумент на основании структуры МояСтруктура
;

Использование механизма создания на основании в интерфейсе

Вы можете создать новый экземпляр сущности на клиенте из формы или другого компонента интерфейса. Для этого:
  • в свойствах создаваемой сущности укажите сущность-источник в качества источника создания на основании;
  • в модуле компонента интерфейса получите ссылку на сущность-источник;
  • откройте форму объекта и в качестве параметра Основание укажите эту ссылку.
    метод СоздатьПродажиНаОснованииКлиента(КлиентСсылка: Клиенты.Ссылка)
        ПродажиФормаОбъекта.ОткрытьВМодальномОкне(Основание = КлиентСсылка)
    ;

Использование механизма создания на основании в коде

В коде вы можете создавать объекты на основании других с помощью метода СоздатьНаОсновании, который в качестве параметра принимает ссылку на источник создания на основании или экземпляр структуры. Получив новый объект, вы можете поменять его реквизиты, а потом вызвать метод Записать.

метод СоздатьЗаказКлиента(КлиентСсылка: Клиенты.Ссылка): ЗаказКлиента.Ссылка
    пер Заказ = ЗаказКлиента.СоздатьНаОсновании(КлиентСсылка)
    Заказ.Записать()
    возврат Заказ.Ссылка
;