gifts2017

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

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

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

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

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

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

Измерения:

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

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

Ресурсы

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

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

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

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

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

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

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

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

КонецЕсли;

КонецЕсли;

КонецЕсли;

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

И 

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

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

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

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

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

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

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

КонецЕсли;

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

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

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

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

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

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

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

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

См. также

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

Комментарии

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

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

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

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

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


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

alnovin пишет:

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


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

А какая конфиуграция?
6. Кирилл Краснов (kirillkr) 21.11.11 15:54
Я, например, в конфигурации от Раруса задействовал регистр КартинкиИФайлы.
7. alnovin (alnovin) 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) 24.11.11 07:00
(8) dumal, данный механизм сохраняет данные произвольных типов, в частности, строки различной длинны.
10. grigory пкш (dryms) 27.06.12 11:32
Не знаю как в других конфигурациях, но в УПП есть такой типовой регистр по названием "ЗначенияСвойствОбъектов". У любого документа он заполняется через свойства документа. Почему бы это не ипользовать для хранения доп реквизитов? Я именно так и сделал. Зачем ипользовать ваш механизм?
11. Дмитрий Дашевский (dmitry1975) 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) 14.01.13 06:15
(11) dmitry1975, добрый день! Пользователи, как показывает практика, любят преувеличить, мягко говоря. Логично, что настройки форм должны сохраняться, но, это не работает при аварийном завершении программы.
Как решение, можете собирать в структуру все настройки видимости, положение колонок и сохранять их при закрытии и восстанавливать при открытии.
13. Дмитрий Дашевский (dmitry1975) 14.01.13 17:34
(12) alnovin, добрый день!
Спасибо за ответ, в принципе я на этом решении и остановился, но пока не реализовал, поскольку все-таки хочется докопаться, почему именно настройки этой формы не сохраняются автоматически. Ведь в этой же конфигурации настройки других форм документов сохраняются и восстанавливаются при открытии. А здесь нет.. Может есть какие идеи куда еще посмотреть можно? Кстати конфигурацию закрывают нормально, нет аварийных закрытий. Вернее они конечно есть, но не каждый же раз. Да и к тому же, даже не требуется полностью закрывать конфигурацию. достаточно переоткрыть обработку и все сделанные настройки сбрасываются :(
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа