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