Урок 16.
"Список значений".

 

Сегодня сложный урок, но тема очень интересная. Сегодняшняя рассылка посвящена объекту "СписокЗначений". Можно сказать, что это объект-ветеран: он существует с самого начала существования платформы v7.х. и помогает решить огромное количество задач: выгрузка/загрузка данных, закладки в форме, обработка данных, сервис в форме и т.д.

Назначение объекта Список Значений:

  1. Формирование списков для возможности выбора пользователем одного или нескольких значений.
  2. Формирование списков значений и использование их в качестве параметров при вызове методов, процедур и функций.
  3. Позволяет создавать динамические списки для обработки.

Основной недостаток - невозможность стандартными средствами сохранить список значений в информационной базе. В качестве положительного момента можно отметить возможность хранения значений разных типов в одном списке.

Методы объекта "СписокЗначений" - можно применять к

  1. Переменным созданным с помощью команды СоздатьОбъект();
  2. Реквизитам формы: список и поле со списком. В этом случае реквизиту необходимо присвоить идентификатор. И только к идентификатору реквизита можно будет применять методы объекта Список Значений.

Объект Список Значений имеет только методы и не имеет атрибутов. Чтобы применить метод используется следующая конструкция: ИмяОбъекта.Метод(Параметр,,,);   где

  • имяОбъекта - имя переменной полученной с помощью конструкции ИмяОбъекта=СоздатьОбъект("СписокЗначений"); или ИмяОбъекта - это идентификатор реквизита список или поле со списком в форме.
  • Метод - имя метода.
  • Параметры - некоторые методы в качестве параметров могут принимать значения различных типов.

Объект Список значений для наглядности можно представить в виде таблицы, состоящей из двух колонок:

Значение

Представление

   
   

В колонке "значение" - хранятся непосредственно значения, которые необходимы для обработки в тексте модуля. В колонке "Представление"   - указывается символьное представление значения, которое и будет доступно пользователю в процессе работы с программой. Для чего это сделано - некоторые значения в системе - не имеют "хорошего" представления для пользователя или являются служебными, которые пользователю совершенно не обязательно видеть. И по этому для более удобной работы используется представление значения. Это можно продемонстрировать на примере физических констант. Многие физические константы имеют название или символьное представление, но их значения не совсем приятны для чтения и произношения. Тоже самое творится и внутри 1С.:))

Значение

Представление

3.14 Число Пи
2.7 Экспонета

По этой причине при добавлении новых строк  в таблицу значений вы указываете два параметра: значение и представление.

сз=СоздатьОбъект("СписокЗначений");

сз.ДобавитьЗначение(3.14, "Число ПИ");

сз.ДобавитьЗначение(2.7, "Экспонента");

........

В некоторых случаях, когда значение и представление этого значения одинаковы, или список используется для хранения динамических данный - используют упрощенную конструкцию:   сз.ДобавитьЗначение(2.7); - в этом случае и в значение и в представление будет добавлено 2.7.

В качестве значения в списке значений можно хранить объекты. Например, какой-нибудь конкретный документ, или элемент справочника, или другой список значений (кто придумает или встретит  хороший пример, когда список значений хранится в списке значений - сообщите, буду очень благодарен).

Не много о реквизитах формы: СПИСОК и ПОЛЕсоСПИСКОМ.

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

Установка свойств элементов диалога производится в палитре свойств «Свойства...», которую можно вызвать на экран двойным щелчком мыши на нужном элементе диалога. Палитра свойств, используемая при редактировании свойств элементов диалога, по порядку использования аналогична той, которая применяется при редактировании свойств объектов метаданных.  

Закладка «Общие».
Идентификатор
. Поле «Идентификатор» может содержать условное имя элемента диалога. Идентификатор представляет собой строку длиной не более 128 символов, состоящую из букв, цифр и .таков подчеркивания. Идентификатор не должен содержать пробелов и начинаться с цифры. Идентификатор используется для обращения к элементам диалога из встроенного языка системы 1С:Предприятие.
Сделать недоступным
. Если флажок установлен, элемент диалога будет недоступен при использовании диалога. Недоступные элементы будут выводиться «серым» цветом.  Управление этим свойством доступно из встроенного языка системы 1С:Предприятие, что позволяет динамически устанавливать для элемента диалога атрибут «Сделать недоступным».
Сделать невидимым
. Если флажок установлен, элемент не будет отображаться при использовании диалога. Управление этим свойством доступно из встроенного языка системы 1С:Предприятие, что позволяет динамически управлять видимостью элемента диалога.
Сохранять при сохранении настройки
. Этот флажок появляется в палитре свойств при редактировании форм объектов метаданных типа «Отчет» («Обработка») и внешних отчетов (обработок). Если флажок установлен, значение элемента диалога будет сохраняться при сохранении настройки. Сохранение настройки — запоминание текущих значений реквизитов диалога отчета при работе с отчетом в режиме запуска «1С:Предприятие».

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

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

Указание: Все примеры в этом разделе можно попробовать в работе. Для этого:
1. создайте в форме реквизит "Список". Задайте ему идентификатор СЗ.
2. создайте в форме кнопку и в свойствах этой кнопки - пропишите имя вызываемой процедуры

В некоторых примерах показано несколько вариантов решения. Они приведены только для того, чтобы показать возможности встроенного языка и продемонстрировать методику работы с объектом список значений. Наиболее оптимальные варианты решения задач (с моей точки зрения) - помечены *.

Как заполнить список значений

Процедура Заполнить()
сз.ДобавитьЗначение("01.01.01","1 квартал 2001 г.");
сз.ДобавитьЗначение("01.04.01","2 квартал 2001 г.");
сз.ДобавитьЗначение("01.07.01","3 квартал 2001 г.");
сз.ДобавитьЗначение("01.010.01","4 квартал 2001 г.");
КонецПроцедуры
Процедура заполняет список названиями кварталов. В качестве значений используется первая дата в квартале.

Как перебрать значения в списке и получать значения и их представления

Процедура Перебор()
Перем зн, предст;
Строк=сз.РазмерСписка();
для к=1 по Строк цикл
зн=сз.ПолучитьЗначение(к, предст);
Сообщить(строка(зн)+"__"+предст);
конецЦикла;
КонецПроцедуры
Смотрим размер списка и открываем цикл по строкам. В цикле последовательно получаем значение в строках и выводим значения и их представления с помощью команды "сообщить"

Как определить текущую строку в форме (которую пользователь выбрал)

Процедура ТекСтрок()
Перем зн, пред;
текСтр=сз.ТекущаяСтрока();
Если текстр=0 тогда
сообщить("Строка не выбрана");
возврат;
конецЕсли;
зн=сз.ПолучитьЗначение(текСтр,пред);
Сообщить("Выбрана строка "+текСтр);
сообщить("Значение в строке "+зн);
сообщить("Представление в строке "+пред);
конецПроцедуры
Получаем номер текущей строки. Если он равен нулю - значит строка не выбрана - сообщаем об этом и уходим. Если строка выбрана, то получаем значение и представление в этой строке и сообщаем номер строки, значение и представление.

Как удалить текущую строку

Процедура УдалитьТекСтрок()
Перем зн, пред;
текСтр=сз.ТекущаяСтрока();
Если текстр=0 тогда
сообщить("Строка не выбрана");
возврат;
конецЕсли;
сз.удалитьЗначение(текСтр, 1);
КонецПроцедуры
Получаем номер текущей строки. Если он равен нулю - значит строка не выбрана - сообщаем об этом и уходим. Если строка выбрана, то удаляем ее.

Как определить есть ли в списке такое определенное значение или нет

1 способ.*

Процедура ЕстьЗначение()
перем дат;
ВвестиДату(дат,"Укажите любую дату");
Если сз.НайтиЗначение(дат)=0 тогда
сообщить("Нет такой даты");
Иначе
сообщить("Значение найдено в списке");
конецЕсли;
КонецПроцедуры
В списке СЗ, находятся первые дни каждого квартала. Просим пользователя ввести любую дату и смотрим нет ли ее в списке. Используем метод НАЙТИ(). Позволяет точно найти позицию значения.

2 способ

Процедура ЕстьЗначение2()
Перем дат;
ВвестиДату(дат, "Укажите любую дату");
Если сз.Принадлежит(дат)=1 тогда
сообщить("есть значение");
Иначе
сообщить("Нет значения");
конецЕсли;
конецПроцедуры
Тоже самое, что и в предыдущем случае, но используется метод ПРИНАДЛЕЖИТ()

3 способ.

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

Как полностью очистить список от существующих значений

1 способ *

Процедура УдалялкаВсего()
сз.УдалитьВсе();
конецПроцедуры
Ну тут комментарии излишни

2 способ.

Процедура УдалялкаВсего2()
РазмСп=сз.РазмерСписка();
для к=1 по РазмСп цикл
сз.УдалитьЗначение(1,1);
конецЦикла;
конецПроцедуры
Смотрим сколько строк в списке и столько раз удаляем первую строку. Нельзя в цикле удалять строку К, так как скоро строк станет значительно меньше, чем изначально определенное К. Плохой способ, но надо разобраться как работает процедура.

3 способ.

Процедура УдалялкаВсего3()
сз.УдалитьЗначение(1,сз.РазмерСписка());
конецПроцедуры
Одной командой удаляем все значения с первого, до последнего. Самый "некрасивый" способ. Хотя работать будет

Как получить все значения, которые помечены пользователем (список с пометками).

Процедура УдалялкаВсего2()
Перем зн,предст;
РазмСп=сз.РазмерСписка();
для к=1 по РазмСп цикл
Если сз.Пометка(к)=1 тогда
зн=сз.ПолучитьЗначение(к,предст);
сообщить("Пометка в строке "+к);
Сообщить("Значение ="+зн);
Сообщить("Представление ="+предст);
конецЕсли;
конецЦикла;
конецПроцедуры
Перебираем строки документа. В каждой строке смотрим не стоит ли пометка. Если пометка стоит - тогда получаем значение и представление. Потом выводим полученные значения и представления.

Это были основные методы, которые встречаются в процессе конфигурирования. 

Домашнее задание: разобраться с примерами и проверить их работоспособность. К понедельнику приготовиться к самостоятельной работе по теме "Использование списка значений" - будет большой урок по самостоятельному решению задач.

Hosted by uCoz