Механизм хранения реквизитов в хранилище значений информационной базы

Программирование - Практика программирования

Хранение реквизитов внешних печатных форм в информационной базе

Кому-то покажется, что это БАЯН, но данная статья мне нужна как приложение к двум другим моим публикациям. Если кому-то будет данная информация полезной,то я буду счастлив. 

Итак, существует ряд внешних печатных форм для 1с, которые предварительно "дозаполняются" перед формированием печатной формы. Пример тому печатная форма 1-Т, или Транспортная накладная, приложение №4. Возникла задача хранить заполненные реквизиты в информационной базе, чтобы можно было быстро переформировать ПФ без повторного заполнения ряда реквизитов.

Создаем регистр сведений, например, ХранилищеНастроекВнешнихОбработок.

Измерения:

1. ДокументСсылка - ссылка на любой документ.

2. Обработка - Строка (100)

Ресурсы

1. Настройка -ХранилищеЗначения

 В один из общедоступных модулей ИБ добавляем 2 процедуры

Процедура дкВосстановитьНастройкиВнешнейОбработки(ДокументСсылка, ОбработкаОбъект) Экспорт

Если ЗначениеЗаполнено(ДокументСсылка) Тогда

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

СтруктураНастроек = НаборЗаписей[0].Настройка.Получить();
Если ТипЗнч(СтруктураНастроек) = Тип("Структура") Тогда

//восстановим реквизиты
Для каждого Ключ Из ОбработкаОбъект.Метаданные().Реквизиты Цикл
Попытка
ОбработкаОбъект[Ключ.Имя] = СтруктураНастроек[Ключ.Имя];
Исключение
КонецПопытки;
КонецЦикла;

//восстановим табличные части
Для каждого ТабличнаяЧасть Из ОбработкаОбъект.Метаданные().ТабличныеЧасти Цикл
Для каждого стр Из СтруктураНастроек[ТабличнаяЧасть.Имя] Цикл
ЗаполнитьЗначенияСвойств(ОбработкаОбъект[ТабличнаяЧасть.Имя].Добавить(),Стр);
КонецЦикла;
КонецЦикла;

КонецЕсли;

КонецЕсли;

КонецЕсли;

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

И 

//Процедура сохраняет значения реквизитов обработки
//
Процедура дкСохранитьНастройкиВнешнейОбработки(ДокументСсылка, ОбработкаОбъект) Экспорт

Если ЗначениеЗаполнено(ДокументСсылка) Тогда

//сформируем структуру настроек
СтруктураНастроек = новый Структура;
Для каждого Ключ Из ОбработкаОбъект.Метаданные().Реквизиты Цикл
СтруктураНастроек.Вставить(Ключ.Имя,ОбработкаОбъект[Ключ.Имя]);
КонецЦикла;

Для каждого ТабличнаяЧасть Из ОбработкаОбъект.Метаданные().ТабличныеЧасти Цикл
СтруктураНастроек.Вставить(ТабличнаяЧасть.Имя,ОбработкаОбъект[ТабличнаяЧасть.Имя].Выгрузить());
КонецЦикла;

НаборЗаписей = РегистрыСведений.ХранилищеНастроекВнешнихОбработок.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ДокументСсылка.Установить(ДокументСсылка);
НаборЗаписей.Отбор.Обработка.Установить(Строка(ОбработкаОбъект));
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() = 0 Тогда

НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Настройка = Новый ХранилищеЗначения(СтруктураНастроек);
НоваяЗапись.ДокументСсылка = ДокументСсылка;
НоваяЗапись.Обработка = Строка(ОбработкаОбъект);

Иначе
//перезапишем настройку
Запись = НаборЗаписей[0];
Запись.Настройка = Новый ХранилищеЗначения(СтруктураНастроек);

КонецЕсли;

НаборЗаписей.Записать();
КонецЕсли;

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

Вот собственно и все.

Теперь во внешних печатных формах вызываем данные процедуры следующим образом:

В процедуре ПередОткрытием вызовем  дкВосстановитьНастройкиВнешнейОбработки, а впроцедуре Перед закрытием - дкСохранитьНастройкиВнешнейОбработки. 

Главным условием сохранения обработок является наличие реквизитов обработки, а не реквизитов формы (если кто не видит разницы пишите, расскажу.)

Представленный метод позволяет сохранять и восстанавливать как реквизиты, так и табличные части.

Всем спасибо, кто дочитал до конца.

См. также

Комментарии
1. Сергей Старых (tormozit) 4451 21.11.11 08:40 Сейчас в теме
Табличные части лучше методами Загрузить и Выгрузить копировать и восстанавливать.
2. Андрей Акулов (DrAku1a) 1213 21.11.11 09:41 Сейчас в теме
Механизмы общего хранения настроек в стандартных конфигурациях уже давно созданы.

//Пример: УТ 10.3

СтруктураНастройки.Вставить("Пользователь", Справочники.Пользователи.ПустаяСсылка());
СтруктураНастройки.Вставить("ИмяОбъекта", ИмяОбъекта);
СтруктураНастройки.Вставить("НаименованиеНастройки", ИмяНастройки);

УниверсальныеМеханизмы.ПолучитьНастройку(СтруктураНастройки);

УниверсальныеМеханизмы.СохранитьНастройку(СтруктураНастройки);
...Показать Скрыть


зачем изобретать велосипед?
bulpi; fomix; Istur; +3 Ответить
3. alnovin (alnovin) 218 21.11.11 12:09 Сейчас в теме
В конфигурациях от Раруса я ничего подобного не обнаружил, поэтому набросал "велосипед" )
4. Станислав Турчинский (Istur) 1363 21.11.11 12:49 Сейчас в теме
Почитай вот это: Хранение настроек внешних отчетов на СКД в 1С. Существует как данный регистр, так и процедуры сохранения/восстановления настроек из него.

alnovin пишет:

В конфигурациях от Раруса я ничего подобного не обнаружил, поэтому набросал "велосипед" )


Но возможно было бы проще, универсальнее, перенести данные процедуры из типовой конфигурации 1с, точнее весь данный механизм, с общей формой и процедурами в общем модуле.
5. Кирилл kirillkr (kirillkr) 27 21.11.11 12:57 Сейчас в теме
alnovin пишет:
В конфигурациях от Раруса я ничего подобного не обнаружил, поэтому набросал "велосипед" )

А какая конфиуграция?
6. Кирилл kirillkr (kirillkr) 27 21.11.11 15:54 Сейчас в теме
Я, например, в конфигурации от Раруса задействовал регистр КартинкиИФайлы.
7. alnovin (alnovin) 218 21.11.11 19:02 Сейчас в теме
(5) kirillkr, Альфа-Авто: Автосервис+Автозапчасти. Редакция 4.1 (4.1.01.19)
8. Dima Dima (dumal) 23.11.11 10:25 Сейчас в теме
Правильно ли я понял, что Вы предлагаете использовать для хранения строку длиной 100 символов?
9. alnovin (alnovin) 218 24.11.11 07:00 Сейчас в теме
(8) dumal, данный механизм сохраняет данные произвольных типов, в частности, строки различной длинны.
10. grigory пкш (dryms) 230 27.06.12 11:32 Сейчас в теме
Не знаю как в других конфигурациях, но в УПП есть такой типовой регистр по названием "ЗначенияСвойствОбъектов". У любого документа он заполняется через свойства документа. Почему бы это не ипользовать для хранения доп реквизитов? Я именно так и сделал. Зачем ипользовать ваш механизм?
11. Дмитрий Дашевский (dmitry1975) 36 13.01.13 21:35 Сейчас в теме
Извиняюсь, что сюда с вопросом, но можно поподробнее про такое сохранение настроек табличных частей. Столкнулся как раз с рарусовской конфигурацией альфа-авто 4.1 там есть обработка самописная,интегрированная в конфигурацию. В ней имеется очень большое кол-во колонок в табличной части, и каждый пользователь их каждый раз под себя подстраивает (перетаскивает с места на место, изменяет размер) и хотелось бы как-то сохранить один раз сделанные настройки пользователями и восстанавливать их при запуске. Мне казалось, что платформа 8.2 такие настройки делает автоматически, но почему-то именно в этой обработке такое сохранение не работает. Чистил кэши, выгружал обработку и снова загружал в конфигурацию, поднимал базу в файловом варианте, на другом сервере, плясал с бубном, но воз и ныне там. Самое интересное, что пользователи гвоорят, что раньше настройки сохранялись. уже не знаю куда копать и подумал, может имеет сделать принудительно сохранение. В связи с чем если есть возможность привести небольшой примерчик на эту тему то буду благодарен.
Режим работы 1С серверный. Крутится на ubuntu 10.04 LTS + 1С 8.2.15.301 + postgresql 9.04
12. alnovin (alnovin) 218 14.01.13 06:15 Сейчас в теме
(11) dmitry1975, добрый день! Пользователи, как показывает практика, любят преувеличить, мягко говоря. Логично, что настройки форм должны сохраняться, но, это не работает при аварийном завершении программы.
Как решение, можете собирать в структуру все настройки видимости, положение колонок и сохранять их при закрытии и восстанавливать при открытии.
13. Дмитрий Дашевский (dmitry1975) 36 14.01.13 17:34 Сейчас в теме
(12) alnovin, добрый день!
Спасибо за ответ, в принципе я на этом решении и остановился, но пока не реализовал, поскольку все-таки хочется докопаться, почему именно настройки этой формы не сохраняются автоматически. Ведь в этой же конфигурации настройки других форм документов сохраняются и восстанавливаются при открытии. А здесь нет.. Может есть какие идеи куда еще посмотреть можно? Кстати конфигурацию закрывают нормально, нет аварийных закрытий. Вернее они конечно есть, но не каждый же раз. Да и к тому же, даже не требуется полностью закрывать конфигурацию. достаточно переоткрыть обработку и все сделанные настройки сбрасываются :(
Оставьте свое сообщение