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