MasterLex


Создание формы подбора для документа
Создание формы подбора для документа

В данной статье речь пойдет о создании формы подбора Номенклатуры, открываемой из формы документа для подбора необходимых позиций. Форма будет создана на основе общих форм и будет состоять из трех списков. Первый список будет отображать дерево значений номенклатуры, второй - непосредственно список номенклатуры, а в третьем будут отображаться выбранные значения.


Для начала зайдем в документ, создадим кнопку "Подбор" и команду на кнопку. Теперь добавим действие на эту команду в котором пропишем код, открывающий форму подбора: &НаКлиенте


Процедура Подбор(Команда)


ОткрытьФорму("ОбщаяФорма.ФормаПодбора");


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


Далее закрываем форму документа (к ней мы вернемся чуть позже) и создаем новую общую форму "ФормаПодбора":


Далее добавляем таблицу на форму и реквизит к таблице. Тип данных реквизита будет "ДинамическийСписок". В свойствах реквизита в разделе Объект поставим галочку - "Произвольный запрос" и нажмем на ссылку Настройка списка: В появившейся форме нам необходимо будет написать запрос который будет отображаться в таблице "Дерево". Текст запроса будет выглядеть так: ВЫБРАТЬ


Номенклатура.Наименование КАК Группа


ИЗ


Справочник.Номенклатура КАК Номенклатура


ГДЕ


Номенклатура.ЭтоГруппа Теперь нужно немного изменить настройки для таблицы Дерево, точнее изменить кое какие свойства отображения нашего древовидного списка: 1. Установим галочку на свойство ТолькоПросмотр 2. Установим галочку на свойство РежимВыбора 3. ПоложениеКоманднойПанели - Нет 4. Отображение - Дерево 5. Режим выделения - Одиночный 6. Начальное отображение дерева - Раскрывать верхний уровень 7. Выбор групп и элементов - Группы 8. РазрешитьВыборКорня - Галочка Посмотрим что у нас получилось:


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


Открываем форму редактирования запроса. Тут придется написать запрос чуточку сложнее (подробности можно посмотреть в конструкторе запросов): ВЫБРАТЬ


ЦеныСрезПоследних.Цена,


НоменклатураСписок.Код,


НоменклатураСписок.Ссылка


ИЗ


Справочник.Номенклатура КАК НоменклатураСписок


ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних КАК ЦеныСрезПоследних


ПО НоменклатураСписок.Ссылка = ЦеныСрезПоследних.Номенклатура.Ссылка


ГДЕ


НоменклатураСписок.Родитель.Ссылка В(&Группа)


СГРУППИРОВАТЬ ПО


ЦеныСрезПоследних.Цена,


НоменклатураСписок.Код,


НоменклатураСписок.Ссылка Плюс нужно создать событие формы ПриСозданииНаСервере и прописать в нем наш фильтр "Группа": &НаСервере


Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)


Список.Параметры.УстановитьЗначениеПараметра("Группа", Группа);


КонецПроцедуры Форма почти готова. Осталось связать наши таблицы: Дерево и Список. Для этого нужно будет создать еще несколько событий для таблицы Дерево: &НаКлиенте


Процедура ОбновитьСписок()


Список.Параметры.УстановитьЗначениеПараметра("Группа", Группа);


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


&НаКлиенте


Процедура ДеревоВыборЗначения(Элемент, Значение, СтандартнаяОбработка)


Группа = Значение;


ОбновитьСписок();


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


&НаКлиенте


Процедура ДеревоОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)


Группа = ВыбранноеЗначение;


ОбновитьСписок();


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


&НаКлиенте


Процедура ДеревоПередРазворачиванием(Элемент, Строка, Отказ)


Группа = Строка;


ОбновитьСписок();


КонецПроцедуры &НаКлиенте


Процедура ДеревоПередСворачиванием(Элемент, Строка, Отказ)


Группа = Строка;


ОбновитьСписок();


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


&НаКлиенте


Процедура ДеревоПриСменеТекущегоРодителя(Элемент)


Группа = Элемент.Родитель;


ОбновитьСписок();


КонецПроцедуры Наша форма почти готова: Ну и наконец добавим третий список (тип данных - ТаблицаЗначений), в который добавим 2 колонки - Номенклатура и Цена: а в таблице "Список" добавим событие "Выбор": &НаКлиенте


Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)


ТекущаяСтрока = Элемент.ТекущиеДанные;


НоваяСтрока = Отобранные.Добавить();


НоваяСтрока.Номенклатура = ТекущаяСтрока.Ссылка;


НоваяСтрока.Цена = ТекущаяСтрока.Цена;


КонецПроцедуры Теперь необходимо чтобы эта форма возвращала отобранные значения, обратно в форму документа. Для этого создадим новую кнопку "ОК" и создадим новую команду с таким же названием. Событие будет выглядеть так: &НаКлиенте


Процедура ОК(Команда)


Закрыть(ЗаписатьВХранилище());


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


а функция ЗаписатьВХранилище будет такая: &НаСервере


Функция ЗаписатьВХранилище()


Возврат ПоместитьВоВременноеХранилище(Отобранные.Выгрузить());


КонецФункции


Откроем опять форму нашего документа и исправим процедуру Подбор, добавив процедуру получения данных из временного хранилища: &НаСервере


Процедура ПолучитьЗапасыИзХранилища(АдресВХранилище)


ВременнаяТаблица = ПолучитьИзВременногоХранилища(АдресВХранилище);


Для Каждого ЗагружаемаяСтрока Из ВременнаяТаблица Цикл


СтрокаТЧ = Объект["Товар"].Добавить();


СтрокаТЧ.Номенклатура = ЗагружаемаяСтрока.Номенклатура;


СтрокаТЧ.Цена = ЗагружаемаяСтрока.Цена;


КонецЦикла;


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


&НаКлиенте


Процедура Подбор(Команда)


ФормаПодбора = ПолучитьФорму("ОбщаяФорма.ФормаПодбора");


АдресВХранилище = ФормаПодбора.ОткрытьМодально();


Если ЗначениеЗаполнено(АдресВХранилище) Тогда


ПолучитьЗапасыИзХранилища(АдресВХранилище);


КонецЕсли;


КонецПроцедуры Наконец наша форма подбора готова:


Источник материала

Другие статьи по теме: