Имя: Пароль:
1C
1С v8
Сохранение/восстановление ПоляТабличногоДокумента
0 Chuvaschow
 
08.01.18
14:33
Здравствуйте, уважаемые форумчане"
Тема была перенесена в архив, но понадобилось решение сейчас.
Поле табличного документа. Сохранение и вывод на печать

Подскажите, пожалуйста, как сохранять и восстанавливать значения ПолеТабличногоДокумента?
Есть документ, в котором несколько страниц с ПолеТабличногоДокумента. Я научился заполнять эти поля. Но не знаю как сохранять при записи зокумента и восстанавливать при открытии документа эти значения.

http://www.picshare.ru/view/8410499/

Хочется сделать что-то проде регламентированной отчетности как в ЗУП 2.5. В ЗУП смотрел, но, видимо, уровень знаний не тот, чтобы понять как это работает...
1 Lexey_
 
08.01.18
14:52
(0) в реквизит с типом ХранилищеЗначения
2 Chuvaschow
 
08.01.18
15:31
(1) Это я понимаю :)
Можно поподробнее? Научите...
3 Lexey_
 
08.01.18
15:33
4 Chuvaschow
 
08.01.18
18:00
Да-да. В случае с обычными формами все ок.
Как переписать на УФ?
5 Lexey_
 
08.01.18
18:06
(4) принцип тот же, задавай конкретные вопросы
6 Chuvaschow
 
08.01.18
18:22
Переданное значение не может быть помещено в ХранилищеЗначения, поскольку не сериализуется или содержит вложенный несериализуемый элемент

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

Или сервер не знает что там на форме?
7 Lexey_
 
08.01.18
18:29
(6) тебе не поле нужно, а табличный документ, который в этом поле
8 Chuvaschow
 
08.01.18
18:37
Если так

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

То вот такая ошибка:

ТабДок.Вывести(Элементы.ПолеТабличногоДокументаСтраница1);
по причине:
Несоответствие типов (параметр номер '1')
9 Chuvaschow
 
08.01.18
18:39
10 Lexey_
 
08.01.18
18:57
(8) бери табличный документ в связанном реквизите формы
11 Chuvaschow
 
08.01.18
19:07
&НаСервере
Процедура ПередЗаписьюНаСервере()
    ТабДок = Новый ТабличныйДокумент;
    ТабДок.Вывести(ПолеТабличногоДокументаСтраница1);
    Хранилище = Новый ХранилищеЗначения(ТабДок);
    Записать();
КонецПроцедуры

Вот так не ругается. Документ записывается.
Скажите, как при открытии документа теперь прочитать данные из ХранилищеЗначений?
12 Lexey_
 
08.01.18
19:15
(11) метод Получить()
13 Chuvaschow
 
08.01.18
19:18
ТабДок = Хранилище.Получить();

{Документ.РегламентированнаяОтчетностьФорма36.Форма.ФормаДокумента.Форма(11,12)}: Переменная не определена (Хранилище)
14 Lexey_
 
08.01.18
19:24
(13) на сервере нужно
15 Chuvaschow
 
08.01.18
19:26
ТАм и пытаюсь :)

&НаСервере
Процедура ПриОткрытииНаСервере()

    ТабДок = Хранилище.Получить();
    Если ТабДок <> Неопределено Тогда
        Элементы.ПолеТабличногоДокументаСтраница1.Вывести(ТабДок);
    КонецЕсли;
16 Lexey_
 
08.01.18
19:34
(15)читай в ПриСозданииНаСервере, выводи в  реквизит, а не в элемент формы
17 Chuvaschow
 
08.01.18
19:36
Также ругается.
18 Lexey_
 
08.01.18
19:40
(15) в ПриЧтенииНаСервере, в параметрах есть объект, там можно обратиться к реквизитам
19 h-sp
 
08.01.18
19:40
(17) переменная Хранилище - это где определяется у вас?
20 Chuvaschow
 
08.01.18
19:43
Извините, не понимаю...
Есть реквизит документа Хранилище с типом ХранилищеЗначения. Но к нему не добраться. И мы его не использовали при записи, так ведь?
21 Chuvaschow
 
08.01.18
19:43
(19) Видимо нигде.
22 Chuvaschow
 
08.01.18
19:45
(19) Вот здесь:

&НаСервере
Процедура ПередЗаписьюНаСервере()
    ТабДок = Новый ТабличныйДокумент;
    ТабДок.Вывести(ПолеТабличногоДокументаСтраница1);
    Хранилище = Новый ХранилищеЗначения(ТабДок);
    Записать();
КонецПроцедуры
23 Lexey_
 
08.01.18
19:46
(22) (18) читал?
24 Chuvaschow
 
08.01.18
19:48
Читал. Не помогло. Чуть больше разжевать бы :) Буду очень признателен.
Понимаю, что ХранилищеЗначений должно быть простым - записать/прочитать/очистить. Но пока не уложу в головы что да как...
25 Lexey_
 
08.01.18
19:50
(24) что делал по (18)?
26 Chuvaschow
 
08.01.18
19:55
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    Хранилище = ТекущийОбъект.Хранилище.Получить();
КонецПроцедуры
27 Lexey_
 
08.01.18
19:56
(26) есть ошибки?
28 Chuvaschow
 
08.01.18
19:57
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    ТабДок = Хранилище.Получить();
    Если ТабДок <> Неопределено Тогда
       ПолеТабличногоДокументаСтраница1.Вывести(ТабДок);
    КонецЕсли;

КонецПроцедуры

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


Да, также самая:
{Документ.РегламентированнаяОтчетностьФорма36.Форма.ФормаДокумента.Форма(145,11)}: Переменная не определена (Хранилище)
    ТабДок = <<?>>Хранилище.Получить(); (Проверка: Сервер)
29 Lexey_
 
08.01.18
20:04
(28)  ПриСозданииНаСервере забудь, делай все в ПриЧтенииНаСервере
30 Chuvaschow
 
08.01.18
20:14
Хорошо. Попробую.
31 h-sp
 
08.01.18
20:45
(30) Объект.Хранилище = Новый ХранилищеЗначения(ТабДок);
32 Chuvaschow
 
09.01.18
17:56
Снова здравствуйте!

Вот что сейчас имеем:


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

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

КонецПроцедуры

Без ошибок, проводится, открывается. Но ничего не сохраняется/не восстанавливается. При открытии документа отладчик говорит ТабДок      Неопределено.
33 Chuvaschow
 
09.01.18
17:57
(31) Так не дотягивается. Получаем:

{Документ.РегламентированнаяОтчетностьФорма36.Форма.ФормаДокумента.Форма(132)}: Поле объекта не обнаружено (Хранилище)
    Объект.Хранилище = Новый ХранилищеЗначения(ТабДок);
34 Chuvaschow
 
09.01.18
19:17
При таком варианте:

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

КонецПроцедуры

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    
    //ДанныйОбъект = РеквизитФормыВЗначение("Объект");
    //Хранилище = ТекущийОбъект.Хранилище.Получить();

КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ДанныйОбъект = РеквизитФормыВЗначение("Объект");
    Хранилище = ДанныйОбъект.Хранилище.Получить();
    ПолеТабличногоДокументаСтраница1.Вывести(Хранилище);

КонецПроцедуры


При открытии Хранилище имеет тип ТабличныйДокумент.
Но ПолеТабличногоДокументаСтраница1 так и остается пустой. Хотя, возможно, он и в хранилище записывается пустым, не знаю как проверить.
35 h-sp
 
09.01.18
19:31
Процедура ПередЗаписьюНаСервере()
    //


    Объект.Хранилище = Новый ХранилищеЗначения(ПолеТабличногоДокументаСтраница1);

КонецПроцедуры
36 Chuvaschow
 
09.01.18
19:40
(33) (35)
37 Chuvaschow
 
09.01.18
19:55
Весь смысл в том, что на форме есть ПолеТабличногоДокумента с типом ТабличныйДокумент, который по кнопке Заполнить заполняется необходимыми значениями в определенные области.
Необходимо то, что получилось сохранить со ссылкой на этот документ и при открытии соответственно извлечь это все и показать...
38 Chuvaschow
 
09.01.18
20:09
А сервер не знает, что там на форме изменилось.
Он знает лишь про ТабличныйДокумент.
39 Chuvaschow
 
09.01.18
20:29
Может правильнее после заполнения сохранять значения каждой области в массив, а при открытии этот массив перечитывать и расставлять по своим местам ?
40 Lexey_
 
09.01.18
21:12
(34) процедуру ПередЗаписьюНаСервере руками писал? Не назначил обработчиком, если бы назначил, то увидел бы, что в параметрах есть ТекущийОбъект, и не нужны извращения с РеквизитФормыВЗначение
41 Chuvaschow
 
09.01.18
21:52
Катастрафически просто :)

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

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    ПолеТабличногоДокументаСтраница1 = ТекущийОбъект.Хранилище.Получить();
КонецПроцедуры


Не отрабатывало, видимо, потому, что процедуры не были назначены в обработчике формы...

:)))