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


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_шаблон», КлючНастроек, Настройки);
ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, Настройки, ОписаниеНастроек, ИмяПользователя);

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

 

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

 

17 Comments

  1. director04

    Спасибо, что не пришлось долго искать.

    Хотя, даже странно, почему обошлось без злопыхателей по поводу велосипеда…. ))))

    Еще раз спасибо автору.

    Reply
  2. nagimo

    Платформа уже 8.3.4, а проблема все та же. Спасибо за статью, очень пригодилась.

    Reply
  3. shamahn
    &НаСервере
    Процедура ЗагрузитьНастройкиНаСервере(КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию)
    ЭтотОб = РеквизитФормыВЗначение(«Объект»);
    Настройки = ЭтотОб.ЗагрузитьНастройки(КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию);
    
    Объект.Свойства.Загрузить(Настройки);
    КонецПроцедуры

    {Форма.Форма.Форма(6)}: Поле объекта не обнаружено (Свойства)

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

    1С:Предприятие 8.3 (8.3.5.1248)

    Что-то изменилось в платформе? Не проблема, конечно пробежаться по реквизитам и записать их, но реквизит свойства, почему-то, отсутствует. Что-то изменилось в платформе?

    Reply
  4. abc2000

    8.3.5.1248 все работает.

    Кусок приведенного Вами, выше кода в публикации отсутствует, и по данному приведенному отрывку получить полное представление почему вываливается ошибка не представляется, по крайней мере мне, возможным.

    Reply
  5. abc2000

    Да и самое главное, где в публикации написано про

    РеквизитФормыВЗначение(«Объект»);

    ?

    P.S. Советую не изобретать ничего, а скачать прикрепленную обработку и убедиться самому, что все работает. Если что то, вдруг не сработает будем разбираться вместе. 🙂

    Reply
  6. shamahn
    P.S. Советую не изобретать ничего, а скачать прикрепленную обработку и убедиться самому, что все работает.

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

    и по данному приведенному отрывку получить полное представление почему вываливается ошибка не представляется

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

    Я просто только начал управляемые формы грызть. До этого как-то не надо было… А сейчас столько нового и интересного оказывается.

    Спасибо за помощь

    Reply
  7. abc2000

    Свойства это название визуального элемента табличной части на форме, в котором выбираются свойства номенклатуры. Если его нет то будет ошибка конечно же.

    Reply
  8. shamahn

    (7) А! О! Точно! Спасибо, мил человек 🙂 Теперь совсем разобрался

    Reply
  9. koar

    Спасибо, очень помогло!

    Reply
  10. chmv

    Очень полезно

    Reply
  11. sommid

    а сохранение таблицы, у которой в качестве реквизита тоже есть таблица, кто-нить делал?

    Reply
  12. msokolan

    Спасибо. Тоже столкнулся с такой проблемой, решил прогаммно, но сомневался может чего не заметил и есть секрет.

    Reply
  13. djerry

    Маленькое уточнение:

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

    должно быть в процедуре ПередЗакрытием

    Reply
  14. vis_tmp

    Работает ли для пользователя с неполными правами?

    Reply
  15. abc2000

    С «не полными» это понятие растяжимое. Вообще-то должно.

    Reply
  16. Merkalov

    Спасибо.

    Только переменная «Значение» нигде не используется, нормальная среда разработки бы выругалась…

    Reply
  17. Merkalov

    Почему?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *