Имя: Пароль:
1C
1С v8
Копирование реквизита с типом ХранилищеЗначения в документе ПриКопировании()
0 Leono27
 
19.03.21
09:25
Всем трямс.

Дано:
  Самописная конфа на УФ 8.3.х.
Требуется:
  При копировании документа скопировать реквизит ОбъектаКопирования с типом "ХранилищеЗначения". Реквизит хранит настройки различных элементов формы документа. Здесь важно уточнить, что форму нужно открыть в соответствии с этими настройками и оставить за пользователем выбор - записывать новый документ или нет.
Что пошло не так:

В модуле объекта следующий код:
&НаСервере
Процедура ПриКопировании(ОбъектКопирования)
    ХранилищеОК = ОбъектКопирования.РеквизитХЗ.Получить();
    РеквизитХЗ = Новый ХранилищеЗначения(ХранилищеОК, Новый СжатиеДанных());
КонецПроцедуры

На этом этапе всё ОК, при отладке в конце этой процедуры видно, что РеквизитХЗ заполнен, внутри (после вызова "получить") лежат искомые данные.

Далее на форме создаваемого документа в процедуре "ПриОткрытии" вызываем функцию проверки заполненности этого реквизита:
&НаСервере
Функция РеквизитХЗзаполнен()
    Реквизиты = РеквизитФормыВЗначение("Объект");
    Хранилище = Реквизиты.РеквизитХЗ.Получить();
    Если Хранилище = Неопределено Тогда
        Возврат Ложь;
    Иначе
        Возврат Истина;
    КонецЕсли;
КонецФункции

И получаем "Ложь": РеквизитХЗ имеет значение "Неопределено".
Нужна помощь, чую, что ларчик просто открывается, но допетрить "как" - не могу.
1 RomanYS
 
19.03.21
09:47
Проблема вероятно не в копировании. Хранилище кажется не поддерживается в данных формы. Его надо читать в ПриЧтенииНаСервере и писать в ПриЗаписиНаСервере
2 Leono27
 
19.03.21
09:57
(1) Верно, Не поддерживается. Если обратиться по Объект.РеквизитХЗ - его не найдётся.
Но я же получаю значение реквизита на сервере. Если я всё правильно понимаю - это, фактически, ссылка. В ней всё должно быть. На форму планировал вернуть уже извлеченные из ХЗ данные.
3 1Снеговик
 
гуру
19.03.21
10:04
Тоже помучился с этим.
В общем, есть реквизит объекта РасписаниеХранилище с типом ХранилищеЗначения и реквизит формы РасписаниеШаблона с типом Произвольный, где хранится РасписаниеРегламентногоЗадания.


&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
  Если РасписаниеШаблона <> Неопределено Тогда
    ТекущийОбъект.РасписаниеХранилище = Новый ХранилищеЗначения(РасписаниеШаблона);
  КонецЕсли;    
КонецПроцедуры

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
  РасписаниеШаблонаХранилище = ТекущийОбъект.РасписаниеХранилище.Получить();
  Если РасписаниеШаблонаХранилище <> Неопределено Тогда
    РасписаниеШаблона = РасписаниеШаблонаХранилище;
  КонецЕсли;    
КонецПроцедуры


Чтобы при копировании справочника копировался и реквизит с расписанием, при создании на сервере пишу:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
  Если Параметры.Ключ.Пустая() Тогда
    Если ЗначениеЗаполнено(Параметры.ЗначениеКопирования) Тогда
      РасписаниеШаблона = Параметры.ЗначениеКопирования.РасписаниеХранилище.Получить();
    КонецЕсли;    
  КонецЕсли;    
4 RomanYS
 
19.03.21
10:13
(2) Не правильно понимаешь: РеквизитФормыВЗначение это конвертация данных формы в объект, в твоих данных формы уже нет ХЗ.
5 Leono27
 
19.03.21
10:27
(4) Я безусловно вижу логику в вашем сообщении и понимаю её. Но для меня это оказалось крайне неочевидно и стало интересно как на самом деле отрабатывает платформа =)
При обращении через Объект.РеквизитХЗ будет ошибка, на форме вообще нет реквизита из-за типа ХЗ.
При обращении через РеквизитВЗначение реквизит уже существует. Т.е. он взят не из коллекции данных формы, где ему неоткуда взяться. И получаемое значение через "РеквизитВЗначение" имеет тип ДокументОбъект. И все реквизиты открытого документа есть (включая РеквизитХЗ) и заполнены согласно прописанной логике (кроме РеквизитаХЗ).
Попробовал перенести весь код из "ПриОткрытии" в "ПриСозданииНаСервере" - эффект тот же.
6 Leono27
 
19.03.21
10:29
(3) выглядит как то, что нужно =)
Спасибо!
7 RomanYS
 
19.03.21
10:30
(5) Реквизит-то есть только данным в реквизите взяться неоткуда при твоем раскладе.
8 Leono27
 
19.03.21
10:37
(7) Понял, принял)