1с обработкаполученияданныхвыбора не срабатывает
1. Данная рекомендация действует для ситуаций, когда какой-либо объект информационной базы перестает быть актуальным – навсегда или на время (сотрудник увольняется или уходит в декретный отпуск, подразделение расформируется и т.д.). При этом удалять этот объект из базы недопустимо, чтобы не нарушать ссылочную целостность: на него должны ссылаться другие ранее созданные объекты. Например, объект типа Файл должен содержать в поле Автор ссылку на уволившегося сотрудника и после его увольнения.
2. Для запрета выбора неактуальных объектов с помощью автоподбора и быстрого выбора в полях ввода следует выбрать один из двух подходов к реализации (2.1 или 2.2). Проиллюстрируем их далее на примере пользователей информационной системы, учет которых ведется в справочнике Пользователи .
Для учета неактуальных пользователей у справочника Пользователи добавлен реквизит Недействителен ( Булево ), по умолчанию Ложь .
2.1. Если запрет должен действовать во всех или в большинстве полей ввода форм системы, то он задается по умолчанию.
2.1.1. В модуле менеджера справочника Пользователи реализуются обработчики ОбработкаПолученияДанныхВыбора и ОбработкаПолученияФормы для установки параметров отбора. Пример реализации этих обработчиков для справочника Пользователи :
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
Если Не Параметры.Отбор.Свойство("Недействителен") Тогда
Параметры.Отбор.Вставить("Недействителен", Ложь);
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
Если ВидФормы = "ФормаВыбора" Тогда
ПараметрИзменен = Ложь;
Если Не Параметры.Свойство("Отбор") Тогда
Параметры.Вставить("Отбор", Новый Структура("Недействителен", Ложь));
ПараметрИзменен = Истина;
ИначеЕсли Не Параметры.Отбор.Свойство("Недействителен") Тогда
Параметры.Отбор.Вставить("Недействителен", Ложь);
ПараметрИзменен = Истина;
КонецЕсли;
// Этот код нужен, чтобы были использованы измененные нами значения параметров
Если ПараметрИзменен Тогда
СтандартнаяОбработка = Ложь;
ВыбраннаяФорма = "ФормаВыбора"; // передаем имя формы выбора
КонецЕсли;
КонецЕсли;
КонецПроцедуры
2.1.2. Для тех реквизитов, где это поведение нужно изменить (например, нужно выводить всех пользователей или должно работать другое ограничение) следует явно установить свойства «Параметры выбора» и «Связи параметров выбора» с необходимыми в конкретном контексте значениями выбора:
- если требуется выбирать недействующих пользователей, указываем в свойстве реквизита «Параметры выбора» значение Отбор.Недействителен(Ложь) ,
- а если не требуется ограничивать выбор вообще, то оба значения - Истина и Ложь .
2.2. Если запрет на выбор неактуальных объектов сильно зависит от контекста (сценариев работы), то не следует его устанавливать по умолчанию.
- Модуль менеджера справочника Пользователи не реализуется.
- В простейшем случае, во всех объектах, в которых есть реквизиты типа СправочникСсылка.Пользователи устанавливаются значения свойств «Параметры выбора» и «Связи параметров выбора» , как описано выше в пункте 2.1.2.
- В тех случаях, когда критерий ограничения не может быть описан параметрами выбора, то реализуются обработчики формы ОбработкаПолученияДанныхВыбора , ОбработкаВыбора и ОкончаниеВводаТекста , а также разрабатывается отдельная форма выбора, в которой реализуется та же логика ограничения.
3. В форме списка пользователей (в меню «Все действия» ) рекомендуется добавить команду «Показывать недействительных пользователей» . С ее помощью возможно открыть карточку пользователя и снова сделать пользователя действительным (например сотрудницу, вернувшуюся из декретного отпуска).
4. Для отображения неактуальных объектов в списках рекомендуется использовать элемент стиля ТекстЗапрещеннойЯчейкиЦвет (192,192,192).
и ничего не происходит при открытии справочника,выборе, быстром выборе. Может вне менеджера нужно что-то проставить?
Возникает на сервере перед стандартным формированием списка при вводе по строке, автоподборе текста и быстром выборе, а также при выполнении метода ПолучитьДанныеВыбора.
(2) ну он типа написал что "ничего не происходит при , быстром выборе". Возможно, он знает, что такое - быстрый выбор.
Что такое СП? Мне нужно сузить справочник по данным из вызывающей формы. Справочник ОГРОМНЫЙ, но суженый список включает несколько 2-3 позиции, поэтому ставлю галочку БыстрыйВыбор. Только и без галочки не отрабатывается.
При отладке в ОбработкаПолученияДанныхВыбора не заходит, СтандартнаяОбработка=Ложь игнорируется.
А как определить управляемая она или нет, конфигурация пока цельная (файловый вариант 1с).
Под игнорируется, имеется ввиду, что список элементов остался прежним, а мне казалось, что если не определить ДанныеВыбора, то список должен быть пустым.
И вообще, я туда ломлюсь: если это будет форма - то параметры вызывающе формы можно будет передать, но нельзя представить ее выпадающим списком, а если это будет форма выпадающего списка быстрого выбора - то непонятно как передать параметры вызывающей формы.
(10) Свойства формы -> тип формы.
У тебя, очевидно, обычная.
Что лежит в параметрах - go СП.
Если конечная цель - обеспечить выбор из 2-3 позиций, готовь эти позиции и выбирай, используя, например, кнопку выбора из списка и свойство СписокВыбора.
Делать кнопку (или обрабатывать ПриНачалеВыбора) придется во многих формах. А хотелось бы в одном месте.
Я очень-очень начинающий программист в восьмерке, что написано в СП про параметры понимаю с трудом, посмотреть в отладчике, получается тоже не могу. Может кто примерчик кинет?
Зачем примерчик, если все равно работать не будет? Ну дело твое, у меня, к сожалению, нет готового примера.
Если "в одном месте", можно еще накладывать отбор в форме выбора твоего справочника. Будет, конечно, отдельное окно, а не выпадающий список.
Где-то попадалась информация, что какие-то проблемы с отбором решались созданием дополнительной формы списка выбора. Я так, понимаю, что проблема в том, не генерируется нужное событие. Может это событие можно сгенерировать искусственно - обработчик же есть где прописать, просто к нему надо как-то подобраться (и что-то правильно передать).
А управляемую форму можно создать УТ10 или это фишка УТ11?
(15) можно. Но для достижения поставленной в этой теме задачи это видится в высшей мере странным решением.
"где-то попадалась информация. " - да в посте (14) эта инфомация попадалась ^^
Да, фигня какая пресложная получается. Спасибо не бросаешь меня в муках.
Последний вопрос: я так понимаю, у тебя УТ11? Работает? Наш начальник отдела говорит, что с нее все бегут на УТ10. Врет наверное.
Действительно, вопрос можно решить созданием дополнительной формы (потому что ее можно сделать управляемой)
(19) управляемой должна быть вызывающая форма, а не форма справочника.
(17) У меня не УТ 11. Переход пока не планируем, возможно, в бессрочной перспективе.
Чтобы использовать ввод по строке в документах нужно на уровне справочника указать поля по которым будет использоваться ввод по строке. По умолчанию это предопределенные реквизиты "Наименование" и "Код".
Для переопределения события ввода по строке в модуле менеджера документа (в котором собственно и будем творить бардак) создаем событие
"Параметры" - Содержит параметры выбора.
Их можно дополнительно настроить в обработчике события.
Структура, в которой обязательно должны содержаться следующие ключи:
- СтрокаПоиска (SearchString) - строка, используемая при поиске данных, Неопределено - осуществляется быстрый выбор;
- Отбор (Filter) - отбор, используемый при поиске данных;
- ВыборГруппИЭлементов (ChoiceFoldersAndItems) - указывается использование групп и элементов (только для иерархических данных); тип ИспользованиеГруппИЭлементов;
- СпособПоискаСтроки (StringSearchMode) - указывается способ поиска при вводе по строке; тип СпособПоискаСтрокиПриВводеПоСтроке; параметр может отсутствовать;
- ПолнотекстовыйПоиск (FullTextSearch) - указывается необходимость использования полнотекстового поиска при вводе по строке; тип - ПолнотекстовыйПоискПриВводеПоСтроке; параметр может отсутствовать;
- РежимПолученияДанныхВыбора (ChoiceDataGettingMode) - указывает режим запуска поиска. Тип РежимПолученияДанныхВыбораПриВводеПоСтроке; параметр может отсутствовать.
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
Запрос = Новый Запрос("ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование ПОДОБНО &Наименование");
Запрос.УстановитьПараметр("Наименование", "%" + Параметры.СтрокаПоиска + "%");
// Конструкция "%" + Параметры.СтрокаПоиска + "%" показывает что в начале и в конце строки
//может быть неопределенное количество символов
//Выгружаем таблицу в массив чтобы потом загрузить ее в данные выбора
Массив = Таблица.ВыгрузитьКолонку("Ссылка");
ДанныеВыбора = Новый СписокЗначений; // Переопределяем данные выбора т.к. по
//умолчанию они имею тип - "неопределено"
СтандартнаяОбработка = Ложь; //ключевое вырожение отлючает стандартное выполнение
//и позволяет рабртать новому алгоритму
При разработке конфигурации, для упрощении ввода документов потребовалось настроить ввод номенклатуры по совпадению любой части наименования!
В 1С 8.3 по умолчанию настройки справочника номенклатуры такие:
При такой настройке, механизм поиска в справочнике номенклатуры работает так:
- в документе вводим первые символы Пета и видим такой результат подсказки:
Но, такой поиск не удобен и менеджеры захотели подбирать номенклатуру по артикулу, например 1320
Для этого изменим настройки указав поиск по Любой части и включив полнотекстовый поиск:
Сохраняем конфигурацию и в режиме предприятие обновляем Полнотекстовый поиск: Меню - Все функции - Стандартные - Управление полнотекстовый поиском
После этого пробуем в документе выполнить поиск по 1320 и видим:
Все Менеджеры пищат как дети на новогодней елке!
Пока писал эту статью нашел в интернете другое решение для платформы 8.2:
В модуле менеджера справочника "Номенклатура" пишем:
В обработчике - ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбраблтка) для нас важны все три параметра. В первый "ДанныеВыбора" мы загружаем наш список номенклатуры, полученный по нашему алгоритму. Из параметра "Параметры" мы получим значение введенное пользователем, а третьему параметру "СтандартнаяОбработка" мы должны поставить значение "Ложь"(отключаем стандартный алгоритм системы).
В результате одной небольшой процедурой мы полностью решили поставленную задачу.
Похожие FAQ
Еще в этой же категории
Как проверить ЭтоНовый() в управляемой форме? 11
Понятие ЭтоНовый() отсутствует в 8.2. Поэтому при необходимости определить, что создается новый элемент можно использовать следующую особенность управляемой формы. Как правило, любая управляемая форма содержит в себе реквизит " Объект" , поэтому Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П Заполнение реквизитов формы и объекта 6
Для реквизитов в документе обработке отчете: Объект.Реквизит = " значение" ; Для реквизитов на форме: ЭтаФорма.Реквизит = " значение" ; Как получить Макет? 6
НаСервере Функция ПолучитьМакетНаСервере(ИмяМакета) ЭтотОбъект=РеквизитФормыВЗначение(" Объект" ); Макет = ЭтотОбъект.ПолучитьМакет(ИмяМакета); Возврат Макет; КонецФункции НаСервере Процедура ВывестиМакет(ТД) Макет = Обработки.ОбработкаВ Как открыть внешнюю обработку или отчет программно 1С УП? 6
В версии 8.2 и старше: приложение не работает непосредственно с локальными файлами, расположенными на компьютере. Файлы должны находиться на сервере. Поэтому для открытия внешней обработки нужно выполнить следующую последовательность действий: Посмотреть все в категории Управляемое приложение, Тонкий клиент
У документа Рассылка электронной почты пользователю необходимо ограничить выбор статуса до Подготоваливается и Подготовлена. Статусы Выполняется и Завершена будут устанавливаться регламентным заданием в момент выполнения рассылки и ее завершения. Разбираемся с ограниченим выбора значений перечисления.
Задача
Имеется документ Рассылка электронной почты, при создании документа автоматически устанавливаетс статус Подготавливается, после подготовки рассылки пользователь устанавливает статус Подготовлена. Рассылка выполняется регламентным заданием с момента указанным как дата документа, в моент рассылки устанавливается статус Выполняется, по заверешении — Заверешена. Пользователю необходимо ограничить выбор статуса до Подготоваливается и Подготовлена.
Решение
При указании типа реквизита перечисление пользователю будут доступны к выбору все значения этого перечисления.
В интеренетах для ограничения доступных значений перечислений зачастую предлагают выполнять это непосредственно в форме. Но для этого в платформе предусмотрен целый механизм, потому не будем костытировать.
Для органичения необходимо в процедуре ОбработкаПолученияДанныхВыбора() модуля менеджера перечисления указать доступные данные выбора в переменной ДанныеВыбора. Для этого в переменную ДанныеВыбора поместим список допустимых значений.
Так же не забываем переменной СтандартнаяОбработка присвоить значение Ложь, иначе в списке выбора будут доступны все элементы + указанные в переменной ДанныеВыбора. Проверяем результат:
Теперь даже если будет указан не доступный для пользователя статус, он будет корректно отображаться:
Читайте также: