В данной статье речь пойдет о создании формы подбора Номенклатуры, открываемой из формы документа для подбора необходимых позиций. Форма будет создана на основе общих форм и будет состоять из трех списков. Первый список будет отображать дерево значений номенклатуры, второй – непосредственно список номенклатуры, а в третьем будут отображаться выбранные значения. Для начала зайдем в документ, создадим кнопку “Подбор” и команду на кнопку. Теперь добавим действие на эту команду в котором пропишем код, открывающий форму подбора: &НаКлиенте Процедура Подбор(Команда) ОткрытьФорму(“ОбщаяФорма. ФормаПодбора”); КонецПроцедуры Далее закрываем форму документа (к ней мы вернемся чуть позже) и создаем новую общую форму “ФормаПодбора”: Далее добавляем таблицу на форму и реквизит к таблице. Тип данных реквизита будет “ДинамическийСписок”. В свойствах реквизита в разделе Объект поставим галочку – “Произвольный запрос” и нажмем на ссылку Настройка списка: В появившейся форме нам необходимо будет написать запрос который будет отображаться в таблице “Дерево”.
Текст запроса будет выглядеть так: ВЫБРАТЬ Номенклатура. Наименование КАК Группа ИЗ Справочник. Номенклатура КАК Номенклатура ГДЕ Номенклатура. ЭтоГруппа Теперь нужно немного изменить настройки для таблицы Дерево, точнее изменить кое какие свойства отображения нашего древовидного списка: 1. Установим галочку на свойство ТолькоПросмотр 2. Установим галочку на свойство РежимВыбора 3. ПоложениеКоманднойПанели – Нет 4. Отображение – Дерево 5. Режим выделения – Одиночный 6. Начальное отображение дерева – Раскрывать верхний уровень 7. Выбор групп и элементов – Группы 8. РазрешитьВыборКорня – Галочка Посмотрим что у нас получилось: Неплохо. Следующим шагом будет создание таблицы где будет отображаться сама номенклатура. Создадим на форме еще отдну таблицу Список и добавим реквизит с таким же названием. Как и в случае с реквизитом Дерево повторяем те же манипуляции, т. е. тип – ДинамическийСписок, произвольный запрос – Да. Открываем форму редактирования запроса. Тут придется написать запрос чуточку сложнее (подробности можно посмотреть в конструкторе запросов): ВЫБРАТЬ ЦеныСрезПоследних. Цена, НоменклатураСписок. Код, НоменклатураСписок. Ссылка ИЗ Справочник. Номенклатура КАК НоменклатураСписок ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений. Цены. СрезПоследних КАК ЦеныСрезПоследних ПО НоменклатураСписок. Ссылка = ЦеныСрезПоследних. Номенклатура. Ссылка ГДЕ НоменклатураСписок. Родитель. Ссылка В(&Группа) СГРУППИРОВАТЬ ПО ЦеныСрезПоследних. Цена, НоменклатураСписок. Код, НоменклатураСписок. Ссылка Плюс нужно создать событие формы ПриСозданииНаСервере и прописать в нем наш фильтр “Группа”: &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Список. Параметры. УстановитьЗначениеПараметра(“Группа”, Группа); КонецПроцедуры Форма почти готова. Осталось связать наши таблицы: Дерево и Список. Для этого нужно будет создать еще несколько событий для таблицы Дерево: &НаКлиенте Процедура ОбновитьСписок() Список. Параметры. УстановитьЗначениеПараметра(“Группа”, Группа); КонецПроцедуры &НаКлиенте Процедура ДеревоВыборЗначения(Элемент, Значение, СтандартнаяОбработка) Группа = Значение; ОбновитьСписок(); КонецПроцедуры &НаКлиенте Процедура ДеревоОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) Группа = ВыбранноеЗначение; ОбновитьСписок(); КонецПроцедуры &НаКлиенте Процедура ДеревоПередРазворачиванием(Элемент, Строка, Отказ) Группа = Строка; ОбновитьСписок(); КонецПроцедуры &НаКлиенте Процедура ДеревоПередСворачиванием(Элемент, Строка, Отказ) Группа = Строка; ОбновитьСписок(); КонецПроцедуры &НаКлиенте Процедура ДеревоПриСменеТекущегоРодителя(Элемент) Группа = Элемент. Родитель; ОбновитьСписок(); КонецПроцедуры Наша форма почти готова: Ну и наконец добавим третий список (тип данных – ТаблицаЗначений), в который добавим 2 колонки – Номенклатура и Цена: а в таблице “Список” добавим событие “Выбор”: &НаКлиенте Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) ТекущаяСтрока = Элемент. ТекущиеДанные; НоваяСтрока = Отобранные. Добавить(); НоваяСтрока. Номенклатура = ТекущаяСтрока. Ссылка; НоваяСтрока. Цена = ТекущаяСтрока. Цена; КонецПроцедуры Теперь необходимо чтобы эта форма возвращала отобранные значения, обратно в форму документа. Для этого создадим новую кнопку “ОК” и создадим новую команду с таким же названием. Событие будет выглядеть так: &НаКлиенте Процедура ОК(Команда) Закрыть(ЗаписатьВХранилище()); КонецПроцедуры а функция ЗаписатьВХранилище будет такая: &НаСервере Функция ЗаписатьВХранилище() Возврат ПоместитьВоВременноеХранилище(Отобранные. Выгрузить()); КонецФункции Откроем опять форму нашего документа и исправим процедуру Подбор, добавив процедуру получения данных из временного хранилища: &НаСервере Процедура ПолучитьЗапасыИзХранилища(АдресВХранилище) ВременнаяТаблица = ПолучитьИзВременногоХранилища(АдресВХранилище); Для Каждого ЗагружаемаяСтрока Из ВременнаяТаблица Цикл СтрокаТЧ = Объект["Товар"].Добавить(); СтрокаТЧ. Номенклатура = ЗагружаемаяСтрока. Номенклатура; СтрокаТЧ. Цена = ЗагружаемаяСтрока. Цена; КонецЦикла; КонецПроцедуры &НаКлиенте Процедура Подбор(Команда) ФормаПодбора = ПолучитьФорму(“ОбщаяФорма. ФормаПодбора”); АдресВХранилище = ФормаПодбора. ОткрытьМодально(); Если ЗначениеЗаполнено(АдресВХранилище) Тогда Пол