Имя: Пароль:
1C
1С v8
Как сохранить таб. часть в настройках отчета?
0 lirt82
 
25.09.25
12:30
Всем привет, есть самописный отчет (не СКД) в отчете на форме есть закладка "НастройкиВыгрузки" в ней расположена таб. часть "СписокКлиентовДляВыгрузки" эта таб. часть реквизит объекта отчета. Пользователь ее (таб. часть заполняет) и сохраняет по кнопке "СохранитьНастройкиВыгрузки". Необходимо реализовать сохранение данных таб. части отчета и при открытии восстановить данные в таб. части. Код из формы отчета.

&НаКлиенте
Процедура СохранитьНастройкиВыгрузки(Команда)
	СохранитьНастройкиВыгрузкиНаСервере();
КонецПроцедуры

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

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


Код модуля объекта отчета.

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

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

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


при таком коде выходит ошибка:
Ошибка при установке значения атрибута контекста (СписокКлиентовДляВыгрузки)
по причине:
Нельзя изменять поле, содержащее объект данных формы
1 Asmody
 
25.09.25
08:04
Потому что нельзя присвоить значение  таб.части.
Загрузить() можно
2 lirt82
 
25.09.25
08:20
(1) СписокКлиентов = НастройкиВыгрузки.СписокКлиентов.Загрузить();
Метод объекта не обнаружен (Загрузить)
Хотя тип НастройкиВыгрузки.СписокКлиентов ТаблицаЗначений
3 Chameleon1980
 
25.09.25
08:31
Список.загрузить
4 Мультук
 
гуру
25.09.25
08:32
(2)
Кэп имел в виду


ПутьДляСохранения = НастройкиВыгрузки.ПапкаДляСохранения;
СписокКлиентов.Загрузить(НастройкиВыгрузки.СписокКлиентов);
5 Chameleon1980
 
25.09.25
08:33
(4) не вник в название метода :)
6 lirt82
 
25.09.25
12:21
(4) Ошибка при вызове метода контекста (Загрузить)
по причине:
Несоответствие типов (параметр номер '1')
7 Волшебник
 
25.09.25
12:29
СписокКлиентов.Загрузить(НастройкиВыгрузки.СписокКлиентов.Выгрузить());
8 Мультук
 
гуру
25.09.25
12:35
(7)

ТС утверждает что

ТипЗнч(НастройкиВыгрузки.СписокКлиентов) = Таблица значений
9 Волшебник
 
25.09.25
12:44
(8) это вряд ли... Как говорит Доктор Хаус, все врут.
10 lirt82
 
25.09.25
13:21
(7) Значение не является значением объектного типа (Выгрузить)
11 Мультук
 
гуру
25.09.25
13:35
(10)

1) Вы выгружаете из
НастройкиВыгрузки.СписокКлиентов.Выгрузить()
Но показываете не эту переменную,  а вовсе другую

2) показываете вы
СписокКлиентов (который Процедура ВосстановитьНастройкиВыгрузки(ПутьДляСохранения, СписокКлиентов) )
Эта переменная  ожидаемо должна быть табличной частью, а у вас неопределено.
Что вы собираетесь загрузить в неопределено я без понятия

3) Зачем нужно передавать туда (в ВосстановитьНастройкиВыгрузки) табличную часть я не знаю.
Я бы просто вернул из ВосстановитьНастройкиВыгрузки(..) "НастройкиВыгрузки" и дальше в форме рассовал был всё по своим местам
12 Fish
 
гуру
25.09.25
13:50
(2) "Хотя тип НастройкиВыгрузки.СписокКлиентов ТаблицаЗначений"

А на картинке (10) тип Неопределено.
13 Chameleon1980
 
25.09.25
16:28
при сохранении

НастройкиВыгрузки.Вставить("СписокКлиентов", СписокКлиентов.Выгрузить());
14 Chameleon1980
 
25.09.25
16:29
расскоментируй тут

ОтчетОбъект.СохранитьНастройкиВыгрузки(Отчет.АдресДляВыгрузки, Отчет.СписокКлиентовДляВыгрузки); //.Выгрузить());
15 Ivanich
 
26.09.25
09:30
Делал так:
Сохранение:
ТЧ -> ТЗ -> СтрокаВнутр -> Двоичн.данные -> ХранилищеЗначений -> Файл на диске


&НаКлиенте
Процедура Команда2_ЗаписатьФайл(Команда)
    //тчИД - табличная часть на форме обработки.
    Если Объект.тчИД.Количество()=0 Тогда
        ПоказатьПредупреждение(,"НЕ заполнена табл. часть! Нажмите [Подготовить]",5)
    Иначе
        Команда2_ЗаписатьФайлНаСервере();

        ИмяФайла = "ID_TovarOzon.dat";
        АдресФайлаДанныхВХранилище = Объект.АдресВремФайла;
        НачатьПолучениеФайлаССервера(АдресФайлаДанныхВХранилище, ИмяФайла,); //Файл на диске
    КонецЕсли;
    
КонецПроцедуры    

&НаСервере
Процедура Команда2_ЗаписатьФайлНаСервере()
    ОбъектОбр = РеквизитФормыВЗначение("Объект",);
    стрТаб = ЗначениеВСтрокуВнутр(ОбъектОбр.тчИД.Выгрузить());                         //ТЧ -> ТЗ -> СтрокаВнутр
    стрТ64 = ПолучитьДвоичныеДанныеИзСтроки(стрТаб, "windows-1251");                   //Двоичн.данные
    АдресФайлаДанных = ПоместитьВоВременноеХранилище(стрТ64, УникальныйИдентификатор); //ХранилищеЗначений
    ОбъектОбр.АдресВремФайла = АдресФайлаДанных;
    ЗначениеВРеквизитФормы(ОбъектОбр,"Объект");
КонецПроцедуры
16 Ivanich
 
26.09.25
09:31
Восстанавливал в обратном порядке.

&НаКлиенте
Процедура Команда3_ПрочитатьФайл(Команда)
    
    ОписаниеОповещения = Новый ОписаниеОповещения("ВыбратьФайлID_TovarOzon", ЭтотОбъект);
    НачатьПомещениеФайлаНаСервер(ОписаниеОповещения,,,,, УникальныйИдентификатор);  //Файл на диске -> ХранилищеЗначений
КонецПроцедуры

&НаКлиенте
Процедура ВыбратьФайлID_TovarOzon(Результат, ДополнительныеПараметры) Экспорт
    
    Если Результат = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    Команда3Х_ПрочитатьФайлНаСервере(Результат.Адрес);
    
КонецПроцедуры

&НаСервере
Процедура Команда3Х_ПрочитатьФайлНаСервере(пИмяФайла)
    
    ПолученноеДвоичД   = ПолучитьИзВременногоХранилища(пИмяФайла);               //ХранилищеЗначений -> Двоичн.данные
    Строка64 = ПолучитьСтрокуИзДвоичныхДанных(ПолученноеДвоичД, "windows-1251"); //Двоичн.данные -> СтрокаВнутр
    ПолученноеЗначение = ЗначениеИзСтрокиВнутр(Строка64);                        //СтрокаВнутр -> ТЗ
    Если ТипЗнч(ПолученноеЗначение) = Тип("ТаблицаЗначений") Тогда
        // обработка значения
        ОбъектОбр = РеквизитФормыВЗначение("Объект",);
        ОбъектОбр.тчИД.Загрузить(ПолученноеЗначение);                        //ТЗ -> ТЧ
        ЗначениеВРеквизитФормы(ОбъектОбр,"Объект");
    Иначе // Формат файла не опознан
        Сообщить("НЕизвестный тип значения в файле: "+пИмяФайла+", "+ТипЗнч(ПолученноеЗначение));
    КонецЕсли;
КонецПроцедуры
17 Ivanich
 
26.09.25
09:37
У меня "затык" был в том, что не сразу сообразил: строка хранится в виде двоичных данных (в хранилище значений и, соответственно на диске). И при обратном преобразовании требуется сначала получить строку из двоичных данных
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой