Книга знаний

1С:Предприятие / v8 / Приемы программирования / Формы

v8: Организация подбора на 8.0

Начинающие программисты на 8.0 иногда затрудняются организовать подбор в 8.0. Подбирать можно все, что угодно: товары, контрагентов, сотрудников. Это типичная задача для автоматизированной системы, поэтому нельзя обойти это вниманием. Автор статьи: Волшебник | Редакторы: vladnet
Последняя редакция №5 от 19.04.07 | История
URL: http://kb.mista.ru/article.php?id=1

Ключевые слова: подбор, ОбработкаПодбора, ОбработкаВыбора, МножественныйВыбор, ЗакрыватьПриВыборе, ОповеститьОВыборе


1. Простой подбор



В форме размещаем кнопку "Подбор". Это может быть кнопка панели инструментов или отдельно стоящая кнопка.

В обработчике события Нажатие для кнопки пишем:

Процедура кпТоварыПодбор(Кнопка) 
   ФормаПодбора = Справочники.Номенклатура.ПолучитьФормуВыбора(,ЭтаФорма); 
   ФормаПодбора.ЗакрыватьПриВыборе = Ложь; 
   ФормаПодбора.Открыть(); 
КонецПроцедуры 


При этом происходят довольно интересные вещи:

1. В первой строке получаем форму выбора. Это особая форма, которая может не совпадать с формой списка (а может совпадать). Форму выбора можно создать самому, или она будет сгенерирована системой автоматически, или форма списка может работать в режиме выбора.

Если вы получили не форму подбора, а обычную форму (методом ПолучитьФорму или ПолучитьФормуСписка), то по умолчанию у нее не установлено свойство РежимВыбора. Нужно или установить это свойство в Истина, или оповещать о выборе элемента самостоятельно (см. метод формы ОповеститьОВыборе).

а) Первым параметром можно передать имя формы или объект описания метаданных типа формы. Если у объекта несколько форм выбора, то здесь можно указать, какую форму нужно использовать.

б) Вторым параметр указывается владелец формы - форма или элемент управления, из которого производится вызов формы выбора. После совершения выбора именно владельцу формы будет послано оповещение о выборе, которое инициирует событие "ОбработкаВыбора" (у формы или элемента формы).

в) Третьим параметром можно указать ключ уникальности для поиска среди уже открытых форм. Если форма с таким ключом уникальности будет найдена, то будет возвращена именно она. Это удобно, если не нужно открывать новых форм выбора.

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

3. Третья строка открывает форму выбора. После первой строки форма еще не была открыта, но ее модуль уже был скомпилирован и инициализирован.

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

Процедура ОбработкаВыбора(ЗначениеВыбора, Источник) 

 Если ТипЗнч(ЗначениеВыбора) = Тип("СправочникСсылка.Номенклатура") Тогда 
  Строка = Товары.Найти(ЗначениеВыбора,"Номенклатура"); 
  Если Строка = Неопределено Тогда 
     Строка = Товары.Добавить(); 
     Строка.Товар = Товар; 
     Строка.Количество = 1; 
  Иначе 
     Если Вопрос("Такой товар уже есть (" + СокрЛП(Товар) + 
                         ")! Увеличить кол-во?", 
                 РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да Тогда 
         Строка.Количество = Строка.Количество + 1; 
     КонецЕсли; 
  КонецЕсли; 
КонецПроцедуры 



2. Множественный выбор



При таком выборе пользователь может выделить сразу несколько элементов (например, с помощью клавиши Ctrl) и после нажатия кнопки "Выбрать" система вернет массив выбранных элементов, а не один элемент, как в первом случае.

Процедура кпТоварыПодбор(Кнопка) 
  ФормаПодбора = Справочники.Номенклатура.ПолучитьФормуВыбора(,ЭтаФорма); 
  ФормаПодбора.МножественныйВыбор = Истина; 
  ФормаПодбора.ЗакрыватьПриВыборе = Ложь; 
  ФормаПодбора.Открыть(); 
КонецПроцедуры 


Тогда обработчик события ОбработкаВыбора можно написать так:

Процедура ОбработкаВыбора(ЗначениеВыбора, Источник) 
  МассивВыбранныхЭлементов = Новый Массив; 
  Если ТипЗнч(ЗначениеВыбора) = Тип("СправочникСсылка.Номенклатура") Тогда 
     МассивВыбранныхЭлементов.Добавить(ЗначениеВыбора); 
  ИначеЕсли ТипЗнч(ЗначениеВыбора) = Тип("Массив") Тогда 
     МассивВыбранныхЭлементов = ЗначениеВыбора; 
  КонецЕсли; 

  Для каждого Элемент Из МассивВыбранныхЭлементов Цикл 
     //действия с очередным элементом 
  КонецЦикла; 
КонецПроцедуры 


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

Вот, собственно, и все. Подбор - легкая вещь, если понимаешь, что происходит.

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика