Имя: Пароль:
1C
1С v8
УФ. Как сохранить ТабличныйДокумент в реквизит Документа?
0 Nemoj
 
09.09.15
21:12
Мне нужно в документе Заявка хранить печатную форму Соглашения. Печатная форма может быть руками изменена, и нужно хранить именно измененный вариант, поэтому заново ее генерировать при надобности - не вариант.
На форме документа Заявка у меня есть ПолеТабличногоДокумента, в котором создается и правится руками печатная форма.
В объекте Документ.Заявка есть реквизит ХранилищеПечатнойФормы типа ХранилищеЗначения.
Пытаюсь сделать так:

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    ПередЗаписьюНаСервере(ПечатнаяФорма);
КонецПроцедуры

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


Получаю это:
{Документ.Заявка.Форма.ФормаДокумента.Форма(143)}: Поле объекта не обнаружено (ХранилищеПечатнойФормы)
        Объект.ХранилищеПечатнойФормы  = Новый ХранилищеЗначения(Док);

Другие реквизиты документа видны, а именно реквизит ХранилищеПечатнойФормы не виден. Что делать?
1 Брегорьян
 
09.09.15
21:14
переворачивать реквизит формы ("Объект") в значение
2 Славен
 
09.09.15
21:14
Поместитьвхранилище как то так назывался
3 Славен
 
09.09.15
21:15
+(2) а в реквизите путь храни
4 Брегорьян
 
09.09.15
21:16
можно в строку внутр пихать ещу
5 Nemoj
 
09.09.15
21:21
(1) Не понимаю.
Объект.Ссылка.ПолучитьОбъект()
Так?
(2) ПоместитьВоВременноеХранилище?
(4) И хранить как строку?
6 Брегорьян
 
09.09.15
21:22
(5) а почему бы и нет, Ватсон?
на (1) забей, кури (2)
7 Славен
 
09.09.15
21:23
(5) в точку, именно поместитьвовременноехранилище
8 Славен
 
09.09.15
21:24
(7) хотя нет, тебе надо в хранилище закинуть, во временном оно долго не живет
9 Nemoj
 
09.09.15
21:25
(4)Про ЗначениеВСтрокуВнутр синтакспомощник говорит так:
Используется для сохранения функциональной совместимости с 1С:Предприятием 7.7. Использовать для других целей не рекомендуется.
10 Nemoj
 
09.09.15
21:26
(8) Где бы увидеть образец?
11 Брегорьян
 
09.09.15
21:27
(10) могу показать самописку, в которой я вордовские файлы хранил и гонял меж клиентом и сервером. можешь сам подглядеть в типовых
12 Nemoj
 
09.09.15
21:31
(11) Ткни носом, куда смотреть?
13 Брегорьян
 
09.09.15
21:33
(12) картинки у номенклатуры
14 Nemoj
 
09.09.15
21:34
(13) Спасибо. Пошел изучать.
15 Nemoj
 
09.09.15
22:42
Посмотрел УТ11.
Картинки номенклатуры хранятся не в самом справочнике Номенклатура, а в специальном справочнике ПрикрепленныеФайлы.
16 Nemoj
 
09.09.15
22:52
Сделал пока через ЗначениеВСтрокуВнутр
Вроде работает.
17 palsergeich
 
10.09.15
00:02
(16) ЗначениеВСтрокуВнутр не кошерно, есть в платформе только для совместимости с 77, могут и убрать. Есть кошерное  ХранилищеЗначения. (11) При более менее значимом количестве документов в базе будут ощутимые тормоза. Так же придется забыть об обращениях через точку, потому что при каждом считывании объекта через объектную модель будет так же тянутся и этот документ, что методически неверно, и будут совем не иллюзорные тормоза.
18 palsergeich
 
10.09.15
00:10
Ваша ошибка в следующем:
1) ПередЗаписьюНаСервере - предопределенный обработчик!!!!! НИКОГДЕ НЕ ПЕРЕОПРЕДЕЛЯЙТЕ стандартные обработчики!!!!!!!!!
Ниже то, что надо сделать и все шикарно будет работать
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    ЗаписатьМакет(ПечатнаяФорма);
КонецПроцедуры


&НаСервере
Процедура ЗаписатьМакет(Док)
ДокументОбъект = РеквизитФормыВЗначение("Объект");        
ДокументОбъект.ХранилищеПечатнойФормы  = Новый ХранилищеЗначения(Док);
ЗначениеВРеквизитФормы(ДокументОбъект,Объект)
КонецПроцедуры
19 palsergeich
 
10.09.15
00:11
ЗначениеВРеквизитФормы(ДокументОбъект,"Объект")
20 Nemoj
 
10.09.15
00:25
Спасибо, буду изучать.
21 Nemoj
 
10.09.15
00:52
Что-то не работает.
ДокументОбъект.ХранилищеПечатнойФормы  = Новый ХранилищеЗначения(Док); отрабатывает
А потом теряется при переводе в реквизит формы.
Может быть это потому, что у меня ХранилищеПечатнойФормы не привязано к полю формы?
Объект.Ссылка.ХранилищеПечатнойФормы.Получить() Возвращает неопределено. Ну это  понятно, пока запись не отработала, ссылка содержит старые значения.
А реквизит ХранилищеПечатнойФормы в самом Объекте не существует вообще.
22 palsergeich
 
10.09.15
00:56
а вообще задача решается в одну строчку в стандартном обработчике ПерезЗаписьюНаСервере()
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
ТекущийОбъект.ХранилищеПечатнойФормы  = Новый ХранилищеЗначения(Док);
КонецПроцедуры
Где Док - Реквизит формы типа табличный документ
23 Nemoj
 
10.09.15
01:09
Сделал так:
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    ТекущийОбъект.ХранилищеПечатнойФормы  = Новый ХранилищеЗначения(Элементы.ПолеПечатнойФормы);
КонецПроцедуры

Получил это:

{Документ.Заявка.Форма.ФормаДокумента.Форма(135)}: Ошибка при вызове конструктора (ХранилищеЗначения)
    ТекущийОбъект.ХранилищеПечатнойФормы  = Новый ХранилищеЗначения(эЛЕМЕНТЫ.ПолеПечатнойФормы);
по причине:
Переданное значение не может быть помещено в ХранилищеЗначения, поскольку не сериализуется или содержит вложенный несериализуемый элемент
24 palsergeich
 
10.09.15
01:22
Нужно пихать реквизит формы.
А вы суете элемент коллекции Элементы.
25 palsergeich
 
10.09.15
01:26
26 Nemoj
 
10.09.15
01:27
Ффухх... Заработало.
Спасибо большое! Без вас я бы не сделал этого.