При разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с нюансами работы составных типов данных. Типичная ситуация: у документа есть реквизит Давалец, который может принимать значения типов СправочникСсылка.Контрагенты и СправочникСсылка.Подразделения. Задача состоит в том, чтобы при копировании документа система не просто переносила значение, но и корректно отображала его на форме, избавляя пользователя от необходимости заново искать элемент в иерархии справочника.
Рассмотрим подробнее, почему стандартное копирование может работать не так, как ожидается, и разберем по шагам способы решения этой задачи.
Процедура ПриКопировании выполняется на стороне сервера в модуле объекта. Важно понимать, что в момент вызова этой процедуры в новый объект уже перенесены все данные из объекта-оригинала (ОбъектКопирования). Проанализируем типичную ошибку: попытку принудительного перезаполнения реквизитов, которая может привести к сбросу типа.
Посмотрим на пример кода, который часто пытаются использовать разработчики:
Процедура ПриКопировании(ОбъектКопирования)
// Попытка явного переназначения типа
Если ТипЗнч(ОбъектКопирования.Давалец) = Тип("СправочникСсылка.Подразделения") Тогда
Давалец = ОбъектКопирования.Давалец;
Подразделение = ОбъектКопирования.Давалец; // Если есть дублирующий реквизит
ИначеЕсли ТипЗнч(ОбъектКопирования.Давалец) = Тип("СправочникСсылка.Контрагенты") Тогда
Давалец = ОбъектКопирования.Давалец;
КонецЕсли;
КонецПроцедуры
Важный момент: если вы не планируете изменять значение или очищать его, этот код избыточен. Платформа самостоятельно копирует значение реквизита Давалец вместе с его типом. Если после копирования в форме значение «теряется» или требует повторного выбора, причину нужно искать в логике формы или настройках метаданных, а не в самом процессе копирования данных.
Одной из наиболее вероятных причин того, что подразделение приходится выбирать заново в иерархии (как если бы оно не было выбрано), является установленная на форме Связь параметров выбора. Выясним причину этого поведения.
Если для элемента формы Давалец установлена связь, например, по реквизиту Организация, то при открытии формы документа платформа проверяет, соответствует ли текущее значение Давалец установленному отбору. Если в момент инициализации формы Организация еще не заполнена или ее значение меняется программно, связь может «разорваться», и визуальное отображение значения в поле ввода очистится или станет невалидным.
Чтобы решить эту проблему, проанализируем следующие действия:
ПриКопировании раньше или одновременно с реквизитом Давалец.Если реквизит составного типа должен при определенных условиях «превратиться» в конкретный тип (например, при копировании мы хотим жестко зафиксировать, что это будет Подразделение), мы можем использовать объект ОписаниеТипов. Это особенно полезно для корректной работы элементов управления на форме.
В модуле формы, в процедуре ПриСозданииНаСервере, можно выполнить следующую настройку:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если ЗначениеЗаполнено(Параметры.ЗначениеКопирования) Тогда
// Проверяем, какой тип был в исходном объекте
ИсходныйДавалец = Параметры.ЗначениеКопирования.Давалец;
Если ТипЗнч(ИсходныйДавалец) = Тип("СправочникСсылка.Подразделения") Тогда
// Ограничиваем тип элемента формы, чтобы платформа понимала, с чем работает
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("СправочникСсылка.Подразделения"));
Элементы.Давалец.ОграничениеТипа = Новый ОписаниеТипов(МассивТипов);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Такой подход гарантирует, что поле ввода будет ожидать именно ссылку на справочник подразделений, и механизм автоматического подбора отработает корректно.
Иногда требуется не просто скопировать значение, а «подготовить» поле составного типа под определенный выбор. Рассмотрим ситуацию, когда мы хотим очистить значение, но сохранить выбранный тип (чтобы пользователю не предлагалось окно выбора типа при нажатии на кнопку выбора).
Существует два способа очистки:
Объект.Давалец = Неопределено; — полная очистка. При нажатии «Выбрать» система предложит выбрать тип (Контрагент или Подразделение).Объект.Давалец = Новый ("СправочникСсылка.Подразделения"); — установка пустой ссылки конкретного типа. В поле будет пусто, но система уже «знает», что там должно быть подразделение, и сразу откроет нужный справочник.Подводя итог, проанализируем последовательность действий для стабильной работы механизма:
ПриКопировании модуля объекта не нужно переприсваивать реквизиты «само в себя». Платформа делает это эффективнее.Давальца (связи параметров выбора), также корректно заполнены.Обновление текста редактирования и Выбор групп и элементов у элемента формы.ПриСозданииНаСервере используйте Параметры.ЗначениеКопирования для тонкой настройки интерфейса в зависимости от данных исходного документа.Соблюдение этих правил позволит сделать процесс копирования документов максимально удобным для пользователя, исключая лишние действия по повторному поиску данных в справочниках.