gifts2017

1С 8.2 Управляемое приложение. Сохранение реквизитов объектов формы.

Опубликовал abc2000 (abc2000) в раздел Программирование - Практика программирования

1С 8.2 Управляемое приложение. Сохранение реквизитов объектов формы.

 

 

Совсем недавно передо мной встала задача, сделать внешнюю обработку в УТ11, которая как известно работает полностью на управляемых формах. Какое же было мое удивление, когда я обнаружил, что у управляемой формы реквизиты заведенные как реквизиты формы, при закрытии и открытии ее заново могут сохраняться и восстанавливаться, точно так же как это было в 8.1, достаточно только поставить напротив галочку сохраненять и в свойствах формы выбрать "АвтоматическоеСохранениеДанныхВНастройках"  - Использовать. А что же делать с реквизитами, которые выступают в роли реквизитов объектов ? Погуглив и так ничего толком не найдя, я приступил к экспериментам. Делюсь полученнными результатами.

Поскольку в платформе (8.2.16.362) механизим сохранения реквизитов объектов так и не был найден, осталось только одно - это програмное сохранение настроек при закрытии обработки и программное восстановление при открытии.

 

За основу примера была взята обработка с конкурса БиТа  отсюда Результаты конкурса для участников INFOSTART EVENT 2012 от Первого Бита. за что им кстати огромное спасибо.

К обработке, для наглядности, я еще добавил 2 реквизита. Реквизит1 - тип строка и Реквизит2 -тип "Произвольный", чтобы было еще что-то, кроме "таблицы значений".

Итак, обо всем по порядку:

I. Было создано две процедуры:

 

1.

&НаСервере
Процедура СохранитьНастройки()

КлючНастроек = "Обработка.ЗадачаПоУТ_11_шаблон";
Настройки = Новый Соответствие;

Настройки.Вставить("ТаблицаЗначений", Объект.Свойства.Выгрузить());

Настройки.Вставить("Реквизит1", Объект.Реквизит1);
Настройки.Вставить("Реквизит2", Объект.Реквизит2);

ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("Обработка.ЗадачаПоУТ_11_шаблон", КлючНастроек, Настройки);

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

и

2.

 

&НаСервере
Процедура ВосстановитьНастройки()

КлючНастроек = "Обработка.ЗадачаПоУТ_11_шаблон";

ЗначениеНастроек = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("Обработка.ЗадачаПоУТ_11_шаблон", КлючНастроек);

Если
ТипЗнч(ЗначениеНастроек) = Тип("Соответствие") Тогда

ЗначениеИзНастройки = ЗначениеНастроек.Получить("ТаблицаЗначений");

Объект.Реквизит1 = ЗначениеНастроек.Получить("Реквизит1");
Объект.Реквизит2 = ЗначениеНастроек.Получить("Реквизит2");

Объект.Свойства.Загрузить(ЗначениеИзНастройки);

КонецЕсли;

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


II. Затем эти процедуры были прописаны в соответствующих процедурах, выполняющихся при открытии и закрытии формы

 

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

ВосстановитьНастройки();

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



&НаКлиенте
Процедура ПриЗакрытии()

СохранитьНастройки()

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

 

Если же по каким то причинам планируется использовать не типовую или не основанную на БСП конфигурацию,  то можно заменить текст процедур ВосстановитьНастройки() и СохранитьНастройки() так :

 

&НаСервере
Процедура ВосстановитьНастройки()

КлючОбъекта = "Обработка.ЗадачаПоУТ_11_шаблон";
КлючНастроек = "Обработка.ЗадачаПоУТ_11_шаблон";
ОписаниеНастроек = "Обработка.ЗадачаПоУТ_11_шаблон";
Значение ="";
ИмяПользователя = "";

//ЗначениеНастроек = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("Обработка.ЗадачаПоУТ_11_шаблон", КлючНастроек);
ЗначениеНастроек = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта, КлючНастроек, ОписаниеНастроек, ИмяПользователя);

Если
ТипЗнч(ЗначениеНастроек) = Тип("Соответствие") Тогда

ЗначениеИзНастройки = ЗначениеНастроек.Получить("ТаблицаЗначений");

Объект.Реквизит1 = ЗначениеНастроек.Получить("Реквизит1");
Объект.Реквизит2 = ЗначениеНастроек.Получить("Реквизит2");

Объект.Свойства.Загрузить(ЗначениеИзНастройки);

КонецЕсли;

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



&НаСервере
Процедура СохранитьНастройки()

КлючОбъекта = "Обработка.ЗадачаПоУТ_11_шаблон";
КлючНастроек = "Обработка.ЗадачаПоУТ_11_шаблон";
ОписаниеНастроек = "Обработка.ЗадачаПоУТ_11_шаблон";
Значение ="";
ИмяПользователя = "";

Настройки = Новый Соответствие;

Настройки.Вставить("ТаблицаЗначений", Объект.Свойства.Выгрузить());

Настройки.Вставить("Реквизит1", Объект.Реквизит1);
Настройки.Вставить("Реквизит2", Объект.Реквизит2);

//ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("Обработка.ЗадачаПоУТ_11_шаблон", КлючНастроек, Настройки);
ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, Настройки, ОписаниеНастроек, ИмяПользователя);

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

 

Как это все работает, можно посмотреть скачав приложенную к статье обработку.

 

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
infostart2012-template.epf
.epf 10,86Kb
08.12.12
73
.epf 10,86Kb 73 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Валерий Гайдабура (director04) 09.07.13 09:34
Спасибо, что не пришлось долго искать.
Хотя, даже странно, почему обошлось без злопыхателей по поводу велосипеда.... ))))

Еще раз спасибо автору.
2. Нагим Османов (nagimo) 22.07.14 13:17
Платформа уже 8.3.4, а проблема все та же. Спасибо за статью, очень пригодилась.
3. Максим Коломиец (shamahn) 03.12.14 20:01
&НаСервере
Процедура ЗагрузитьНастройкиНаСервере(КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию)
	ЭтотОб = РеквизитФормыВЗначение("Объект");
	Настройки = ЭтотОб.ЗагрузитьНастройки(КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию);
	
	Объект.Свойства.Загрузить(Настройки);
КонецПроцедуры
...Показать Скрыть

{Форма.Форма.Форма(6)}: Поле объекта не обнаружено (Свойства)
Объект.Свойства.Загрузить(Настройки);


1С:Предприятие 8.3 (8.3.5.1248)
Что-то изменилось в платформе? Не проблема, конечно пробежаться по реквизитам и записать их, но реквизит свойства, почему-то, отсутствует. Что-то изменилось в платформе?
4. abc2000 (abc2000) 03.12.14 22:34
8.3.5.1248 все работает.
Кусок приведенного Вами, выше кода в публикации отсутствует, и по данному приведенному отрывку получить полное представление почему вываливается ошибка не представляется, по крайней мере мне, возможным.
5. abc2000 (abc2000) 03.12.14 22:36
Да и самое главное, где в публикации написано про
РеквизитФормыВЗначение("Объект");
?
P.S. Советую не изобретать ничего, а скачать прикрепленную обработку и убедиться самому, что все работает. Если что то, вдруг не сработает будем разбираться вместе. :)
6. Максим Коломиец (shamahn) 05.12.14 00:04
P.S. Советую не изобретать ничего, а скачать прикрепленную обработку и убедиться самому, что все работает.

Я не спорю, скорее всего и работает. Но у меня задача немного другая, а Ваш текст пробовал адаптировать про свои задачи. Скачать не могу, - не хватает местных денег. Да оно и не особо надо :)
и по данному приведенному отрывку получить полное представление почему вываливается ошибка не представляется

Ошибка в модуле формы в серверной процедуре при обращении к свойству "свойства" объекта "объект" :) Все ясно. Все исходные данные такие же как и в Вашем примере, но, видимо, "свойств" у меня в "объекте" нету.

Я просто только начал управляемые формы грызть. До этого как-то не надо было... А сейчас столько нового и интересного оказывается.
Спасибо за помощь
7. abc2000 (abc2000) 05.12.14 03:52
Свойства это название визуального элемента табличной части на форме, в котором выбираются свойства номенклатуры. Если его нет то будет ошибка конечно же.
8. Максим Коломиец (shamahn) 05.12.14 10:06
(7) abc2000, А! О! Точно! Спасибо, мил человек :) Теперь совсем разобрался
9. Артем Кондауров (koar) 27.01.15 12:37
10. Марина Чирина (chmv) 13.01.16 10:21
11. Дмитрий (sommid) 11.05.16 15:06
а сохранение таблицы, у которой в качестве реквизита тоже есть таблица, кто-нить делал?
12. Михаил (msokolan) 17.05.16 13:34
Спасибо. Тоже столкнулся с такой проблемой, решил прогаммно, но сомневался может чего не заметил и есть секрет.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа