Как программно сохранить настройки списка значений с пометками в диалоге формы для следующего сеанса работы в системе 1С:Предприятие 7.7?

Доброго времени суток, уважаемые посетители! Тема сохранения настроек актуальна не только для версии 1С 7.7. На этом блоге даже была выложена обработка, которая наглядно показывала, как сохранить настройки табличного поля для следующего сеанса работы пользователя в версии 1С:Предприятие 8. Сегодня мы рассмотрим, как сохранить реквизита диалога СписокЗначений в версии 1C:Предприятие 7.7. Итак, приступим!

Чтобы сохранить настройку реквизита диалога СписокЗначений с пометками, мы будем использовать функции СохранитьЗначение и ВосстановитьЗначение. Эти функции будут использованы в предопределенных процедурах ПриОткрытии и ПриЗакрытии соответственно.

Для получения списка значений с пометками необходимо в свойствах списка, во вкладке «Дополнительно», отметить галочкой значение «Список с пометками».Наша задача усложняется тем, что кроме значений из реквизита диалога типа СписокЗначений (назавём его СписокДокументов) ещё нужно сохранять пометки каждого элемента списка.Реквизит диалога «СписокДокументов» выглядит так:


список значений с пометками

Как видно из изображения выше, пользователь может отмечать разные строки списка значений и было бы удобно, чтобы при следующем сеансе работы эти пометки сохранялись. Чтобы этого добиться необходимо сохранять эти значения. Поэтому при закрытии диалога формы мы будем это делать, используя предопределенную процедуру ПриЗакрытии:

Процедура ПриЗакрытии()
	// Создадим ещё один список значений для сохранения отметок
	СписокДоков1 = СоздатьОбъект("СписокЗначений");
	// Используем цикл для сохраняем отметки каждого элемента
	// из списка СписокДокументов в список СписокДоков1
	Для к=1 По СписокДокументов.РазмерСписка() Цикл
		СписокДоков1.ДобавитьЗначение(СписокДокументов.Пометка(к));
	КонецЦикла;
	// Преобразуем элементы списка в строку
	СписокДоков = СписокДоков1.ВСтрокуСРазделителями();
	СохранитьЗначение("СписокДоков",СписокДоков);
КонецПроцедуры

Для сохранения отметок нам нужен промежуточный список СписокДоков1, в него мы сохраняем отметки каждого элемента из списка СписокДокументов. Чтобы узнать помечен ли элемент списка используем метод Пометка. Затем нам нужно преобразовать элементы списка в строку.

Для этого используем метод объекта СписокДоков1.ВСтрокуСРазделителями(), этот метод возвращает строку из элементов списка, разделенных запятыми. В нашем случае эта строка выглядит так: «1,0,1,0,1». Теперь с помощью функции СохранитьЗначение сохраним эту строку для следующего сеанса работы с этой формой.

Когда пользователь открывает форму при следующем сеансе ему будет приятно видеть, что его настройки сохранены и ему не нужно заново выставлять пометки. Не трудно выставить пометки, когда значений в списке всего пять, как в нашем примере, а если двадцать пять? Чтобы значения пометок были восстановлены при следующем сеансе работы необходимо написать код по восстановлению значений в предопределенной процедуре
ПриОткрытии:

Процедура ПриОткрытии()
	//Восстановим строку с разделителями
	СписокДоков = ВосстановитьЗначение("СписокДоков");
	// Создадим ещё один список значений для восстановления отметок
	СписокДоков1 = СоздатьОбъект("СписокЗначений");
	// Заполним реквизит диалога СписокДокументов значениями
	СписокДокументов.ДобавитьЗначение("РеализацияТоваров","Реализация товаров");
	СписокДокументов.ДобавитьЗначение("ПеремещениеТоваров","Перемещение товаров");
	СписокДокументов.ДобавитьЗначение("СписаниеТоваров","Списание товаров");
	СписокДокументов.ДобавитьЗначение("ПоступлениеТоваров","Поступление товаров");
	СписокДокументов.ДобавитьЗначение("ВыполнениеРабот","Выполнение работ, оказание услуг");
	// Проверяем сохранился ли список с предыдущего раза
	Если ПустоеЗначение(СписокДоков) = 0 Тогда
		// Восстанавливаем из строки элементы списка
		СписокДоков1.ИзСтрокиСРазделителями(СписокДоков);
		// Проходим каждый элемент реквизита СписокДокументов и выставляем пометки
		Для к=1 По СписокДоков1.РазмерСписка() Цикл
			СписокДокументов.Пометка(к,СписокДоков1.ПолучитьЗначение(к));
		КонецЦикла;
		// Если переменная СписокДоков пустая (возможно первый сеанс), 
		// то отмечаем все элементы
	Иначе
		Для к=1 По СписокДокументов.РазмерСписка() Цикл
			СписокДокументов.Пометка(к,1);
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры

Сначала нам нужно восстановить строку с разделителями и создать ещё один список значений для восстановления отметок. Затем заполним реквизит диалога СписокДокументов значениями. Теперь проверим сохранился ли список с предыдущего раза, если нет (возможно первый сеанс), то отмечаем все элементы.

Если список есть, то используя метод ИзСтрокиСРазделителями, восстанавливаем из строки элементы списка и отмечаем каждый элемент реквизитаСписокДокументов соответствующим значением из сохраненного списка СписокДоков1. Ну а более легкий способ всё это сделать со списком значений такой:

Процедура ПриЗакрытии()
	СохранитьЗначение("СписокДокументов", СписокДокументов);
КонецПроцедуры

Если прочитать Синтакс-Помощник, то в замечании к функции ВосстановитьЗначение написано:

При использовании метода ВосстановитьЗначение для значения типа СписокЗначений, являющегося реквизитом формы, его следует передавать в качестве второго параметра. В данном случае метод следует использовать как процедуру.

Например:

ВосстановитьЗначение("ИдентификаторМоегоСписка", МойСписок);

Поэтому в процедуре при открытии мы запишем следующее:

Процедура ПриОткрытии()
	ВосстановитьЗначение("СписокДокументов", СписокДокументов);
КонецПроцедуры

Ну а что, если список значений не является реквизитом формы? Тогда посмотрим следующий код:

Процедура ВывестиСписок()
	// Создаем список значений  
	Список1 = СоздатьОбъект("СписокЗначений");
	Док=СоздатьОбъект("Документ");
	Док.ВыбратьДокументы();
	// Добавляем в него десять разных документов      
	Для Сч=1 По 10 Цикл
		Док.ПолучитьДокумент();
		Список1.ДобавитьЗначение(Док.ТекущийДокумент(),""+Док.ТекущийДокумент());
	КонецЦикла;
	// Сохраняем этот список   
	СохранитьЗначение("Список1",Список1);
	Список2 = "";
	// Востанавливаем список     
	ВосстановитьЗначение("Список1",Список2);
	// Открываем окно для интерактивной пометки значений списка.     
	Список2.ОтметитьЗначения("");
КонецПроцедуры

В этом листинге мы создаем список значений Список1, добавляем в него десять разных документов. Затем сохраняем этот список при помощи функции СохранитьЗначение. Потом востанавливаем список в Список2 и выводим окно для интерактивной пометки значений списка (это для наглядности).

ПОДПИСКА