Быстрая реализация подбора на управляемых формах 1С 8.2/8.3
&НаСервере
Процедура УправлениеТаблицей ()
&НаСервере
Процедура УправлениеТаблицей ()
&НаКлиенте
Процедура ПеренестиВДокумент ( Команда )
&НаСервере
Функция ПоместитьПодобранныеМатериалыВХранилище ()
&НаСервере
Функция ПриЗакрытииНаСервере ()
СтруктураВозврата = Новый Структура ();
&НаКлиенте
Процедура ПриЗакрытии ()
Если ПеренестиВДокумент Тогда
ОповеститьОВыборе ( СтруктураВозврата );
КонецЕсли;
&НаСервере
Процедура ПоказыватьТолькоОстаткиПриИзмененииНаСервере ()
Форма выбора (подбор) в управляемых формах
Статья будет состоять из нескольких приведенных примеров кода с описанием того, как прибегнуть к Подбору.
Пример 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), Спасибо за внимание, возможно, кому-то поможет)
Установка отбора для поля ввода управляемой формы через ПараметрыВыбора (без переопределения событий «НачалоВыбора», «Автоподбор»)
Для ограничения вывода элементов какого-нибудь справочника или перечисления при редактировании поля ввода можно воспользоваться программной установкой свойства элемента формы «ПараметрыВыбора», которое доступно, начиная с версии платформы 8.2.
Данное свойство представляет собой фиксированный массив элементов типа «ПараметрВыбора», позволяет организовать простую фильтрацию доступных для выбора элементов в поле ввода. При этом фильтрация будет работать как при автоподборе, так и при открытии формы выбора.
Рассмотрим пару типовых случаев применения этого свойства для установки отбора:
Отфильтруем ввод сотрудника по значению реквизита «Организация» на форме документа.
Фильтрация будет установлена у поля ввода «СписокСотрудниковСотрудник», в таблице документа.
Для выбора будут доступны только те сотрудники, у которых значения реквизита «Организация» совпадает со значением, установленным в реквизите «Организация» документа.
Вот так будет выглядеть процедура установки фильтра:
Данная процедура вызывается в событии формы «ПриОткрытии» и в событии «ПриИзменении» поля ввода «Организация».
Не всегда достаточно одного значения сравнения, следующий случай продемонстрирует, как накладывать отбор по списку ссылок.
Фильтрация будет установлена у поля ввода «Статус».
Если у сохранённого документа установлен статус «Черновик», то список доступных элементов перечисления «Статусы» будет ограничен значениями «Черновик» и «НаРассмотрении».
Данная процедура вызывается в событиях формы «ПриСозданииНаСервере» и «ПослеЗаписиНаСервере»
Кроме этого в параметрах выбора можно устанавливать свои нетиповые свойства:
Данный параметр потом можно будет извлечь из параметров формы выбора справочника «Сотрудники» (в событии «ПриСозданииНаСервере»), а также из параметров в обработчике «ОбработкаПолученияДанныхВыбора» в модуле менеджера справочника «Сотрудники».
Расширенный автоподбор при вводе по строке в поле ввода в управляемых формах
Ниже будет выложен готовый код. А тут несколько вводных слов к нему.
Альтернативный алгоритм максимально близок к штатному автоподбору при вводе по строке с режимом поиска по строке «Любая часть». Строки результата в которых слова поиска находятся в начале строки выдаются первыми. Чтобы изменить количество строк выдаваемого результата достаточно изменить значение переменной «МаксимумСтрокРезультата». Из забавного: подсветку слов поиска в результате пришлось реализовывать вручную в функции ПодсветитьСлова() и это оказалось сопоставимо по объему с остальным кодом.
Формирование списка позиций для автоподбора перехватывается в модуле менеджера объекта (соответствующего типу значения для поля ввода). Обработчик называется ОбработкаПолученияДанныхВыбора(). Собственно, в этом обработчике и необходимо организовать альтернативный алгоритм получения данных автоподбора при вводе по строке. К слову, получение данных выбора можно инициировать программно, вызвав метод модуля менеджера объекта ПолучитьДанныеВыбора().
Но так как может оказаться нежелательным менять алгоритм автоподбора при вводе по строке сразу для всех полей ввода в конфигурации, ниже будет демонстрация приема переопределения для конкретного поля ввода «Номенклатура» в модуле некоей формы с помощью перехвата события поля ввода «Автоподбор»:
Ниже код модуля менеджера справочника «Номенклатура»:
Вот, собственно, и все чем я хотел поделиться в этой статье. Надеюсь, кому-то она сэкономит время.
Переопределение ввода по строке в управляемой форме 1С
Предыстория
К написанию статьи меня подтолкнула задача, для решения которой я должен был разработать сложную форму с большим количеством полей, связанных с разными объектами и, что главное, «c одной кнопкой». Тут и родилась мысль воспользоваться функцией «ввода по строке» в управляемом приложении 1С. В процессе решения задачи пришлось «набить шишек», но, надеюсь, приобретенный опыт будет полезен не только мне.
Механика
Думаю, правильным будет начать с краткого описания механики клиент-серверного взаимодействия при «вводе по строке».
Все начинается с поля ввода формы, у которого есть события «Автоподбор» и «ПриОкончанииВводаТекста».
Событие «АвтоПодбор» возникает при остановке ввода текста или нажатии на кнопку «стрелка вниз».
Событие «ОкончаниеВводаТекста» вызывается, как нам сообщает справка, при формировании значения из текста ввода. Кстати, это событие интересно тем, что если значение не сформировано, система не даст нам выйти из режима редактирования элемента. Иными словами, если введенный в поле текст не соответствует какому либо значению из данных выбора, то редактирование не будет завершено.
Обращаясь к труду «Разработка управляемого интерфейса» госпожи Хрусталевой и прочих уважаемых авторов, находим упоминание о методе «ПолучитьДанныеВыбора». Если спросить об этом методе синтаксис помощник, он выдаст нам список методов менеджеров для всех видов объектов платформы. Но, что толку от методов менеджеров, которые выполняются на сервере, если серверные вызовы нам недоступны? На самом деле, этот вопрос здесь, только по той причине, что если бы я был более внимательным человеком, я сразу решил бы свою задачу, и никакой статьи не появилось бы. Достаточно просто пролистать до конца список ссылок, и в конце обнаружится глобальный метод «ПолучитьДанныеВыбора». С помощью этого метода мы на клиенте можем получить данные выбора для любого ссылочного объекта системы, что дает возможность переопределить стандартный алгоритм получения выбора данных. Например, для поля строчного типа, у которого вообще нет стандартных данных выбора, использовать алгоритм справочника «Контрагенты».
Но для нас основная ценность метода «ПолучитьДанныеВыбора» в том, что он провоцирует вызов события «ПриПолученииДанныхВыбора», котрое выполняется в контексте менеджера выбранного нами типа объекта. Иными словами мы, наконец, получаем возможность работать с сервером, а значит и самостоятельно сформировать данные выбора. И с этого момента на возможность работать с автоподбором влияют только фантазия и здравый смысл.
Задача
Мы разобрались с взаимодействием клиента и сервера, теперь я предлагаю подкрепить теорию практикой. Решим небольшую задачу, которая звучит следующим образом.
Реализовать в форме документа «РасходТовара» подбор покупателя по ФИО.
Решать сохранение нового покупателя и его ФИО не будем, так как к «вводу по строке» это не относится.
Решение:
Добавим в конфигурацию «Управляемое приложение» новый периодический регистр сведений «ФИОКонтрагентов». Периодичность «день», единственное и ведущее измерение «Контрагент» (Тип(«СправочникСсылка.Контрагенты»)), ресурсы «Фамилия», «Имя», «Отчество» (Тип(«Строка(50)»)).
На форме документа «РасходТовара» также добавим три новых реквизита «ПокупательФамилия», «ПокупательИмя», «ПокупательОтчество». Также, для удобства, добавим кнопку и команду «ОчиститьФИО».
В модуле формы реализуем метод «ПолучитьДанныеВыбораПоФИО» с директивой компиляции &НаКлиенте
В модуле менеджера справочника «Контрагенты» реализуем обработчик «ОбработкаПолученияДанныхВыбора»
В модуле менеджера регистра сведений «ФИОКонтрагентов» реализуем экспортную функцию
«ПолучитьДанныеВыбораФИО»
Теперь определим в форме документа обработчики «ФамилияАвтоПодбор», «ИмяАвтоПодбор», «ОтчествоАвтоПодбор».
Готово! Можем заходить и проверять, что у нас получилось.
Решенный вариант можно получить с помощью обновления (cfu) в приложении к статье. Для этого создайте из «Демонстрационной конфигурации «Управляемое приложение» (1.0.16.1)» файл поставки и обновите его приложенным файлом. Для тех, кто редко делает поставки вот нехитрая процедура: