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

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

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

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

Анализ работы процедуры ПриКопировании в модуле объекта

Процедура ПриКопировании выполняется на стороне сервера в модуле объекта. Важно понимать, что в момент вызова этой процедуры в новый объект уже перенесены все данные из объекта-оригинала (ОбъектКопирования). Проанализируем типичную ошибку: попытку принудительного перезаполнения реквизитов, которая может привести к сбросу типа.

Посмотрим на пример кода, который часто пытаются использовать разработчики:


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

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

Влияние механизма «Связи параметров выбора»

Одной из наиболее вероятных причин того, что подразделение приходится выбирать заново в иерархии (как если бы оно не было выбрано), является установленная на форме Связь параметров выбора. Выясним причину этого поведения.

Если для элемента формы Давалец установлена связь, например, по реквизиту Организация, то при открытии формы документа платформа проверяет, соответствует ли текущее значение Давалец установленному отбору. Если в момент инициализации формы Организация еще не заполнена или ее значение меняется программно, связь может «разорваться», и визуальное отображение значения в поле ввода очистится или станет невалидным.

Чтобы решить эту проблему, проанализируем следующие действия:

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

Явное ограничение типа через ОписаниеТипов

Если реквизит составного типа должен при определенных условиях «превратиться» в конкретный тип (например, при копировании мы хотим жестко зафиксировать, что это будет Подразделение), мы можем использовать объект ОписаниеТипов. Это особенно полезно для корректной работы элементов управления на форме.

В модуле формы, в процедуре ПриСозданииНаСервере, можно выполнить следующую настройку:


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

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

Использование пустой ссылки нужного типа для инициализации

Иногда требуется не просто скопировать значение, а «подготовить» поле составного типа под определенный выбор. Рассмотрим ситуацию, когда мы хотим очистить значение, но сохранить выбранный тип (чтобы пользователю не предлагалось окно выбора типа при нажатии на кнопку выбора).

Существует два способа очистки:

  1. Объект.Давалец = Неопределено; — полная очистка. При нажатии «Выбрать» система предложит выбрать тип (Контрагент или Подразделение).
  2. Объект.Давалец = Новый ("СправочникСсылка.Подразделения"); — установка пустой ссылки конкретного типа. В поле будет пусто, но система уже «знает», что там должно быть подразделение, и сразу откроет нужный справочник.

Резюме для реализации корректного копирования

Подводя итог, проанализируем последовательность действий для стабильной работы механизма:

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

← На главную