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 не будет опубликован. Обязательные поля помечены *