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






Спасибо, что не пришлось долго искать.
Хотя, даже странно, почему обошлось без злопыхателей по поводу велосипеда…. ))))
Еще раз спасибо автору.
Платформа уже 8.3.4, а проблема все та же. Спасибо за статью, очень пригодилась.
Объект.Свойства.Загрузить(Настройки);
1С:Предприятие 8.3 (8.3.5.1248)
Что-то изменилось в платформе? Не проблема, конечно пробежаться по реквизитам и записать их, но реквизит свойства, почему-то, отсутствует. Что-то изменилось в платформе?
8.3.5.1248 все работает.
Кусок приведенного Вами, выше кода в публикации отсутствует, и по данному приведенному отрывку получить полное представление почему вываливается ошибка не представляется, по крайней мере мне, возможным.
Да и самое главное, где в публикации написано про
?
P.S. Советую не изобретать ничего, а скачать прикрепленную обработку и убедиться самому, что все работает. Если что то, вдруг не сработает будем разбираться вместе. 🙂
Я не спорю, скорее всего и работает. Но у меня задача немного другая, а Ваш текст пробовал адаптировать про свои задачи. Скачать не могу, — не хватает местных денег. Да оно и не особо надо 🙂
Ошибка в модуле формы в серверной процедуре при обращении к свойству «свойства» объекта «объект» 🙂 Все ясно. Все исходные данные такие же как и в Вашем примере, но, видимо, «свойств» у меня в «объекте» нету.
Я просто только начал управляемые формы грызть. До этого как-то не надо было… А сейчас столько нового и интересного оказывается.
Спасибо за помощь
Свойства это название визуального элемента табличной части на форме, в котором выбираются свойства номенклатуры. Если его нет то будет ошибка конечно же.
(7) А! О! Точно! Спасибо, мил человек 🙂 Теперь совсем разобрался
Спасибо, очень помогло!
Очень полезно
а сохранение таблицы, у которой в качестве реквизита тоже есть таблица, кто-нить делал?
Спасибо. Тоже столкнулся с такой проблемой, решил прогаммно, но сомневался может чего не заметил и есть секрет.
Маленькое уточнение:
должно быть в процедуре ПередЗакрытием
Работает ли для пользователя с неполными правами?
С «не полными» это понятие растяжимое. Вообще-то должно.
Спасибо.
Только переменная «Значение» нигде не используется, нормальная среда разработки бы выругалась…
Почему?