Критерии отбора подчиненные документы. Назначение и устройство критериев отбора

Если в основу решения об отборе кладутся определенные характеристики кандидатов, выступающие в качестве критериев отбора, то для снижения вероятности ошибок эти характеристики должны отвечать определенным требованиям. Среди важнейших требований, которым должны отвечать критерии отбора, можно выделить следующие:

· валидность,

· полнота,

· надежность,

· различительная способность,

· необходимость и достаточность критериев.

Валидность критериев отбора. Валидность критериев означает, что критерии отбора должны соответствовать содержанию работы и требованиям к должности, на которую производится отбор. Если при отборе используются критерии, обладающие низкой валидностью, то это может явиться источником ошибок. К примеру, если производить отбор на должность секретаря на основании внешних данных, то будет неудивительно, если в ряде случаев такие секретарши не будут справляться со своей работой. Привлекательная внешность сама по себе не гарантирует наличие способностей или навыков, необходимых для хорошего выполнения работы. Конечно, может попасться и отличный работник, но это скорее будет случайностью или везением, а не результатом целенаправленного поиска и отбора.

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

Надежность критериев. Отбор на основании установленных критериев должен обеспечивать точность и устойчивость результатов. Результаты, полученные в ходе отбора, не должны быть случайными.

Высокая различительная способность . Критерии, используемые при отборе, должны легко устанавливать различия между кандидатами (отделять подходящих от неподходящих).

Необходимость и достаточность критериев. Не следует усложнять процедуру поиска и отбора претендентов на заполнение той или иной вакансии, излишне сокращая число возможных кандидатов и включая в число критериев такие, которые не являются необходимыми или обязательными для прогноза успешной работы в должности. Например, если на должность секретаря искать красавицу, с высшим лингвистическим образованием (желательно МГУ), знанием двух языков, компьютера, делопроизводства, этикета, то поиск и отбор на основании таких критериев превращается в крайне сложную задачу. Важным условием для замещения имеющейся вакансии наилучшей кандидатурой является наличие достаточного числа претендентов, отвечающих минимальным требованиям должности. При этом число кандидатов на одно вакантное место может колебаться от нескольких человек до нескольких десятков.

«Иногда руководители перебарщивают – они хотят иметь непременно эксклюзивных сотрудников,  считает руководителя службы персонала ТД «Русьимпорт» И.Дудник.  Очень часто предполагаемую работу может выполнять нормальный человек со средним уровнем профессиональной подготовки. И стоит он дешевле на рынке, и найти его можно быстрее. Пример из моей практики: «Подберите мне секретаря в отдел. Обязателен совершенный английский язык, профессиональное знание компьютера. Стоимостью, условно говоря, 400 рублей». Я спрашиваю, а зачем вам секретарь с совершенным английским языком: Отвечают: «Нам там иногда факсы приходят раз в три месяца». Таких примеров очень много, когда требования к человеку не соотносятся с рыночными реалиями жизни».

Желание работодателя взять на работу человека с высшим образованием вполне понятно. Высшее образование гарантирует определенный культурный уровень претендента, и этот уровень важен не только для работников, непосредственно связанных с обслуживанием клиентов (например, в торговле или в гостиничном бизнесе). Дипломированный специалист легко осваивает навыки, необходимые для работы, и при найме его часто предпочитают менее образованному человеку, уже имеющему профильный опыт.

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

Однако при установлении критериев отбора также не следует забывать о проблеме «переобученности» или «переобразованности» работников, которая возникает в случае, когда работник «слишком хорош», имеет слишком высокую квалификацию для данной работы, когда реальная работа требует меньше того, что умеет или может работник.

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

В составе метаданных 1С:Предприятия 8 существует объект Критерий отбора.

Этот объект, в отличие от большинства прикладных объектов конфигурации, не описывает каких-либо самостоятельных данных, которые будут храниться в информационной базе 1С:Предприятия. Критерий отбора предназначен для того, чтобы описать условия отбора по некоторым объектам. Например, можно указать, что критерий отбора строится по типу данных СправочникСсылка.Номенклатура, и в этот критерий входят документы "ПоступлениеТоваровУслуг" и "РеализацияТоваровУслуг". Конечно, все отборы мы можем делать с помощью запроса.

Особенностью (преимуществом) критерия отбора является то, что он может строиться в том числе по реквизирам табличных частей. Таким образом мы можем очень просто настроить отбор так, чтобы в его результат попадали лишь те документы, в табличной части которых есть интересующий нас элемент справочника "Номенклатура".

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

Рассмотрим особенности критерия отбора на примере. Создадим новый критерий отбора "Документы с номенклатурой". Настроим закладки "Данные" и "Состав". На закладке "Данные" указывается тот тип данных, по которому будет осуществляться отбор. Причем тип данных может быть составным. Итак, выберем тип данных - СправочникСсылка.Номенклатура. На закладке состав мы выбираем объекты, которые будут являться результатом выполнения нашего отбора. Система предлагает нам отметить флажками интересующие нас объекты из списка, в который она включает все объекты, содержащие ссылку на справочник "Номенклатура". На закладке формы мы можем для критерия отбора указать ФормуСписка, которая будет содержать динамический список объектов, удовлетворяющих нашему критерию. Кроме того, на закладке Права мы можем настроить "Просмотр" для определенных ролей. Следует отметить, что в пользовательском интерфейсе существует возможность просмотра результата отбора, т.е. ФормыСписка критерия отбора. В нашем случае это будет форма справочника "Номенклатура", но, чтобы это работало, необходимо перейти в командный интерфейс ФормыЭлемента справочника "Номенклатура" и поставить флаг в колонке "Видимость" напротив "Документы с номенклатурой (Объект.Ссылка) .


Рассмотрим, как критерий отбора хранится в базе данных. Если мы в нашей Базе данных создадим запрос, то мы увидим таблицу, которая соответствует критерию отбора. Однако данная таблица является "виртуальной ". В процессе отладки мы можем вызвать метод ПолучитьСтруктуруХраненияБазыДанных() , и мы также не найдем таблиц, соответствующих критерию отбора. Таким образом, нет физической таблицы, соответствующей критерию отбора, но есть таблица виртуальная, к которой мы можем обратиться. Например, создав запрос и выгрузив результатЗапроса:

Запрос.Текст = "ВЫБРАТЬ | ДокументыСНоменклатурой.Ссылка |ИЗ | КритерийОтбора.ДокументыСНоменклатурой(&Номенклатура) КАК ДокументыСНоменклатурой"; Запрос.УстановитьПараметр("Номенклатура", Номенклатура); РезультатЗапроса = Запрос.Выполнить();

Мы получим документы, в которых содержится интересующая нас номенклатура.

Также следует отметить, что, несмотря на то, что при включении в конфигурацию критерия отбора система не создает никаких таблиц, однако для оптимизации поиска создается индекс по каждому реквизиту, который указан в составе критериев отбора. Индексы будут использоваться для оптимизации получения выборки при использовании критерия отбора. Таким образом, при описании критерия отбора нужно учитывать, что система будет тратить дополнительные ресурсы на поддержание необходимых индексов. Кстати, процесс "заполнения индекса поиска" можно увидеть, если мы просто переименуем созданный ранее критерий отбора. Сам процесс длится около минуты. А далее система выдает сообщение "Код модулей содержит возможные использования ссылки на изменяемый объект. Продолжить операцию переименования?" И если мы соглашаемся, то выдает нам ссылки на код, где встречаются упоминания нашего критерия отбора. Причем рядом с каждой ссылкой появляется команда "заменить", при нажатии на которую автоматически происходит замена старого наименования критерия отбора на новое.

Каким же образом система получает искомый результат? Дело в том, что она формирует запрос для поиска объектов, которые включают искомое значение, и формирует выборку, состоящую из найденных ссылок на объекты. Формируемый запрос представляет собой объединение запросов по каждой таблице, в которой нужно осуществить поиск. Запросы формируются только к тем данным (таблицам), из числа описанных в критерии отбора, у которых в реквизите может быть значение того типа, значение которого в данный момент ищется. Например, критерий отбора включает ссылки на справочник физических лиц и справочник организаций, а в конкретном реквизите конкретного документа может быть ссылка только на справочник физических лиц. Тогда запрос по этому документу будет выполняться, только если в данный момент поиск выполняется по физическому лицу. Важно учитывать, что критерий отбора всегда выбирает все искомые данные. Ни в списке, ни в других режимах не поддерживается динамическая выборка, так как информация выбирается путем объединения данных из разных таблиц. Формируемый для критерия отбора индекс позволяет сделать это достаточно быстро, но если данных в выборке окажется очень много, то выборка не будет формироваться эффективно. Поэтому целесообразно создавать критерии отбора по данным, имеющим большой разброс значений, чтобы выборки получались не очень большие. В противном случае теряется смысл такого отбора и снижается его эффективность.

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

Поговорим о программной работе с критерием отбора. В синтакс-помощнике в ветке "Прикладные объекты" находится ветка "Критерии отбора". Мы видим, что количество типов данных здесь не очень большое. Во-первых, это менеджер критериев отбора - КритерииОтбораМенеджер (FilterCriteriaManager) . Это свойство глобального контекста, которое позволяет через точку обратиться к конкретному критерию отбора. Далее мы получаем КритерийОтбораМенеджер.<Имя критерия> (FilterCriterionManager.<Имя критерия>) , у которого есть два метода - Найти(<ЗначениеПоиска>) и ПолучитьФорму(<Форма>, <Владелец>, <КлючУникальности>) . И еще один тип данных - КритерийОтбораСписок.<Имя критерия> (FilterCriterionList.<Имя критерия>) . Он предназначен для управления списком отобранных документов и/или элементов справочников, отображаемых в табличном поле (списком критерия отбора). Как видим, методов для програмной работы не очень много, поэтому гораздо удобнее работать с критерием отбора при помощи запроса.
Рассмотрим на примере, как отобразить результат работы критерия отбора в форме. Для этого можно создать обработку.

Итак, создаем обработку и управляемую форму для неё. У формы будет два реквизита. Это "Номенклатура" - СправочникСсылка.Номенклатуры и "Список", тип которого - "ДинамическийСписок ". В свойствах реквизита "Список" заполним "ОсновнаяТаблица" значением - "КритерийОтбора.ДокументыСНоменклатурой". Перетаскиваем оба реквизита на форму. Кроме того, нам необходимо установить параметр "Значение" для нашего динамического списка. У динамического списка есть свойство "Параметры", тип значения которого: ЗначенияПараметровДанныхКомпоновкиДанных. У которого в свою очередь есть метод: УстановитьЗначениеПараметра(<Параметр>, <Значение>) . Итак, в модуле формы у нас будет следующий код:

&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Список.Параметры.УстановитьЗначениеПараметра("Значение",Номенклатура); КонецПроцедуры &НаКлиенте Процедура НоменклатураПриИзменении(Элемент) Список.Параметры.УстановитьЗначениеПараметра("Значение",Номенклатура); КонецПроцедуры

Сохраняем обработку и запускаем в пользовательском режиме.

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

&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Список.Параметры.УстановитьЗначениеПараметра("Значение",Номенклатура); КонецПроцедуры &НаКлиенте Процедура НоменклатураПриИзменении(Элемент) Список.Параметры.УстановитьЗначениеПараметра("Значение",Номенклатура); КонецПроцедуры &НаКлиенте Процедура ОткрытьФ(Команда) ОткрытьФорму("КритерийОтбора.ДокументыПоДоговоруКонтрагента.ФормаСписка"); КонецПроцедуры

Сохраняем нашу обработку, в пользовательском режиме нажимаем на кнопку "ОткрытьФ" , наша ФормаСписка открывается, но система при этом выдает ошибку. Дело в том, что система не может понять, по какому объекту ей нужно сделать отбор. Нам необходимо заполнить параметр Значение нашего динамического списка. В принципе, мы можем сделать это интерактивно. Для этого перейдем в ФормуСписка нашего критерия отбора, раскроем ветку "Список", найдем там "Параметры" и перетащим их на нашу ФормуСписка критерия отбора. Теперь в пользовательском режиме мы можем поставить флажок перед параметром "Значение" в истину, ну и, собственно, заполнить и сам параметр "Значение". Но лучше это сделать программно при открытии ФормыСписка критерия отбора. Программную установку мы будем делать в процедуре "ПриСозданииНаСервере() ". Если мы поставим точку останова в этой процедуре, то при отладке мы увидим: в параметрах нашего динамического списка есть коллекция "Элементы", и у элемента "Использование" стоит значение "Ложь". Чтобы установить его в истину, можно использовать следующий код, поскольку "Элементы" - это коллекция значений:

&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Список.Параметры.Элементы.Использование = Истина; КонецПроцедуры

Мы можем также использовать обращение по имени параметра. Для этого мы можем использовать метод "Найти()" :

&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Список.Параметры.Элементы.Найти("Значение").Использование = Истина; КонецПроцедуры

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

&НаКлиенте Процедура ОткрытьФ(Команда) ОткрытьФорму("КритерийОтбора.ДокументыСНоменклатурой.ФормаСписка", новый Структура("Номенклатура", Номенклатура); КонецПроцедуры

А в ФормеСписка критерия отбора воспользуемся переданным значением:

&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Список.Параметры.Элементы.Найти("Значение").Использование = Истина; Список.Параметры.Элементы.Найти("Значение").Значение = Параметры.Номенклатура; КонецПроцедуры

Далее запускаем нашу обработку в пользовательском режиме, заполняем реквизит "Номенклатура" и нажимаем кнопку "ОткрытьФ". В результате откроется ФормаСписка критерия отбора с переданным значением "Номенклатуры" из формы вызывающей, а также сформируется результат отбора.

На этом заканчиваем, надеюсь, материал будет полезен для понимания сути объекта "Критерий отбора". Всем пока и удачи)

В составе метаданных 1С:Предприятия 8 существует объект Критерий отбора.

Этот объект, в отличие от большинства прикладных объектов конфигурации, не описывает каких-либо самостоятельных данных, которые будут храниться в информационной базе 1С:Предприятия. Критерий отбора предназначен для того, чтобы описать условия отбора по некоторым объектам. Например, можно указать, что критерий отбора строится по типу данных СправочникСсылка.Номенклатура, и в этот критерий входят документы “ПоступлениеТоваровУслуг” и “РеализацияТоваровУслуг”. Конечно, все отборы мы можем делать с помощью запроса.

Особенностью (преимуществом) критерия отбора является то, что он может строиться в том числе по реквизирам табличных частей. Таким образом мы можем очень просто настроить отбор так, чтобы в его результат попадали лишь те документы, в табличной части которых есть интересующий нас элемент справочника “Номенклатура”.

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

Рассмотрим особенности критерия отбора на примере. Создадим новый критерий отбора “Документы с номенклатурой”. Настроим закладки “Данные” и “Состав”. На закладке “Данные” указывается тот тип данных, по которому будет осуществляться отбор. Причем тип данных может быть составным. Итак, выберем тип данных – СправочникСсылка.Номенклатура. На закладке состав мы выбираем объекты, которые будут являться результатом выполнения нашего отбора. Система предлагает нам отметить флажками интересующие нас объекты из списка, в который она включает все объекты, содержащие ссылку на справочник “Номенклатура”. На закладке формы мы можем для критерия отбора указать ФормуСписка, которая будет содержать динамический список объектов, удовлетворяющих нашему критерию. Кроме того, на закладке Права мы можем настроить “Просмотр” для определенных ролей. Следует отметить, что в пользовательском интерфейсе существует возможность просмотра результата отбора, т.е. ФормыСписка критерия отбора. В нашем случае это будет форма справочника “Номенклатура”, но, чтобы это работало, необходимо перейти в командный интерфейс ФормыЭлемента справочника “Номенклатура” и поставить флаг в колонке “Видимость” напротив “Документы с номенклатурой (Объект.Ссылка) .


Рассмотрим, как критерий отбора хранится в базе данных. Если мы в нашей Базе данных создадим запрос, то мы увидим таблицу, которая соответствует критерию отбора. Однако данная таблица является “виртуальной “. В процессе отладки мы можем вызвать метод ПолучитьСтруктуруХраненияБазыДанных() , и мы также не найдем таблиц, соответствующих критерию отбора. Таким образом, нет физической таблицы, соответствующей критерию отбора, но есть таблица виртуальная, к которой мы можем обратиться. Например, создав запрос и выгрузив результатЗапроса:

Запрос.Текст = "ВЫБРАТЬ | ДокументыСНоменклатурой.Ссылка |ИЗ | КритерийОтбора.ДокументыСНоменклатурой(&Номенклатура) КАК ДокументыСНоменклатурой"; Запрос.УстановитьПараметр("Номенклатура", Номенклатура); РезультатЗапроса = Запрос.Выполнить();

Мы получим документы, в которых содержится интересующая нас номенклатура.

Также следует отметить, что, несмотря на то, что при включении в конфигурацию критерия отбора система не создает никаких таблиц, однако для оптимизации поиска создается индекс по каждому реквизиту, который указан в составе критериев отбора. Индексы будут использоваться для оптимизации получения выборки при использовании критерия отбора. Таким образом, при описании критерия отбора нужно учитывать, что система будет тратить дополнительные ресурсы на поддержание необходимых индексов. Кстати, процесс “заполнения индекса поиска” можно увидеть, если мы просто переименуем созданный ранее критерий отбора. Сам процесс длится около минуты. А далее система выдает сообщение “Код модулей содержит возможные использования ссылки на изменяемый объект. Продолжить операцию переименования?” И если мы соглашаемся, то выдает нам ссылки на код, где встречаются упоминания нашего критерия отбора. Причем рядом с каждой ссылкой появляется команда “заменить”, при нажатии на которую автоматически происходит замена старого наименования критерия отбора на новое.

Каким же образом система получает искомый результат? Дело в том, что она формирует запрос для поиска объектов, которые включают искомое значение, и формирует выборку, состоящую из найденных ссылок на объекты. Формируемый запрос представляет собой объединение запросов по каждой таблице, в которой нужно осуществить поиск. Запросы формируются только к тем данным (таблицам), из числа описанных в критерии отбора, у которых в реквизите может быть значение того типа, значение которого в данный момент ищется. Например, критерий отбора включает ссылки на справочник физических лиц и справочник организаций, а в конкретном реквизите конкретного документа может быть ссылка только на справочник физических лиц. Тогда запрос по этому документу будет выполняться, только если в данный момент поиск выполняется по физическому лицу. Важно учитывать, что критерий отбора всегда выбирает все искомые данные. Ни в списке, ни в других режимах не поддерживается динамическая выборка, так как информация выбирается путем объединения данных из разных таблиц. Формируемый для критерия отбора индекс позволяет сделать это достаточно быстро, но если данных в выборке окажется очень много, то выборка не будет формироваться эффективно. Поэтому целесообразно создавать критерии отбора по данным, имеющим большой разброс значений, чтобы выборки получались не очень большие. В противном случае теряется смысл такого отбора и снижается его эффективность.

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

Поговорим о программной работе с критерием отбора. В синтакс-помощнике в ветке “Прикладные объекты” находится ветка “Критерии отбора”. Мы видим, что количество типов данных здесь не очень большое. Во-первых, это менеджер критериев отбора – КритерииОтбораМенеджер (FilterCriteriaManager) . Это свойство глобального контекста, которое позволяет через точку обратиться к конкретному критерию отбора. Далее мы получаем КритерийОтбораМенеджер.<Имя критерия> (FilterCriterionManager.<Имя критерия>) , у которого есть два метода – Найти(<ЗначениеПоиска>) и ПолучитьФорму(<Форма>, <Владелец>, <КлючУникальности>) . И еще один тип данных – КритерийОтбораСписок.<Имя критерия> (FilterCriterionList.<Имя критерия>) . Он предназначен для управления списком отобранных документов и/или элементов справочников, отображаемых в табличном поле (списком критерия отбора). Как видим, методов для програмной работы не очень много, поэтому гораздо удобнее работать с критерием отбора при помощи запроса.
Рассмотрим на примере, как отобразить результат работы критерия отбора в форме. Для этого можно создать обработку.

Итак, создаем обработку и управляемую форму для неё. У формы будет два реквизита. Это “Номенклатура” – СправочникСсылка.Номенклатуры и “Список”, тип которого – “ДинамическийСписок “. В свойствах реквизита “Список” заполним “ОсновнаяТаблица” значением – “КритерийОтбора.ДокументыСНоменклатурой”. Перетаскиваем оба реквизита на форму. Кроме того, нам необходимо установить параметр “Значение” для нашего динамического списка. У динамического списка есть свойство “Параметры”, тип значения которого: ЗначенияПараметровДанныхКомпоновкиДанных. У которого в свою очередь есть метод: УстановитьЗначениеПараметра(<Параметр>, <Значение>) . Итак, в модуле формы у нас будет следующий код:

&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Список.Параметры.УстановитьЗначениеПараметра("Значение",Номенклатура); КонецПроцедуры &НаКлиенте Процедура НоменклатураПриИзменении(Элемент) Список.Параметры.УстановитьЗначениеПараметра("Значение",Номенклатура); КонецПроцедуры

Сохраняем обработку и запускаем в пользовательском режиме.

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

&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Список.Параметры.УстановитьЗначениеПараметра("Значение",Номенклатура); КонецПроцедуры &НаКлиенте Процедура НоменклатураПриИзменении(Элемент) Список.Параметры.УстановитьЗначениеПараметра("Значение",Номенклатура); КонецПроцедуры &НаКлиенте Процедура ОткрытьФ(Команда) ОткрытьФорму("КритерийОтбора.ДокументыПоДоговоруКонтрагента.ФормаСписка"); КонецПроцедуры

Сохраняем нашу обработку, в пользовательском режиме нажимаем на кнопку “ОткрытьФ” , наша ФормаСписка открывается, но система при этом выдает ошибку. Дело в том, что система не может понять, по какому объекту ей нужно сделать отбор. Нам необходимо заполнить параметр Значение нашего динамического списка. В принципе, мы можем сделать это интерактивно. Для этого перейдем в ФормуСписка нашего критерия отбора, раскроем ветку “Список”, найдем там “Параметры” и перетащим их на нашу ФормуСписка критерия отбора. Теперь в пользовательском режиме мы можем поставить флажок перед параметром “Значение” в истину, ну и, собственно, заполнить и сам параметр “Значение”. Но лучше это сделать программно при открытии ФормыСписка критерия отбора. Программную установку мы будем делать в процедуре “ПриСозданииНаСервере() “. Если мы поставим точку останова в этой процедуре, то при отладке мы увидим: в параметрах нашего динамического списка есть коллекция “Элементы”, и у элемента “Использование” стоит значение “Ложь”. Чтобы установить его в истину, можно использовать следующий код, поскольку “Элементы” – это коллекция значений:

&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Список.Параметры.Элементы.Использование = Истина; КонецПроцедуры

Мы можем также использовать обращение по имени параметра. Для этого мы можем использовать метод “Найти()” :

&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Список.Параметры.Элементы.Найти("Значение").Использование = Истина; КонецПроцедуры

Также мы можем передать в ФормуСписка критерия отбора значение “Номенклатуры” из формы вызывающей, т.е. нашей обработки. Для этого передадим из формы нашей обработки значение “Номенклатура”:

&НаКлиенте Процедура ОткрытьФ(Команда) ОткрытьФорму("КритерийОтбора.ДокументыСНоменклатурой.ФормаСписка", новый Структура("Номенклатура", Номенклатура); КонецПроцедуры

А в ФормеСписка критерия отбора воспользуемся переданным значением:

&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Список.Параметры.Элементы.Найти("Значение").Использование = Истина; Список.Параметры.Элементы.Найти("Значение").Значение = Параметры.Номенклатура; КонецПроцедуры

Далее запускаем нашу обработку в пользовательском режиме, заполняем реквизит “Номенклатура” и нажимаем кнопку “ОткрытьФ”. В результате откроется ФормаСписка критерия отбора с переданным значением “Номенклатуры” из формы вызывающей, а также сформируется результат отбора.

На этом заканчиваем, надеюсь, материал будет полезен для понимания сути объекта “Критерий отбора”. Всем пока и удачи)

/
Прикладные объекты

Назначение и устройство критериев отбора

В составе метаданных 1С:Предприятия 8 существует объект Критерий отбора . Этот объект, в отличие от большинства прикладных объектов конфигурации, не описывает каких-либо самостоятельных данных, которые будут храниться в информационной базе 1С:Предприятия. Он предназначен исключительно для описания некоторого правила выборки информации из объектных данных различных типов.

Суть решаемой задачи очень проста – нужно найти ссылки на все объекты заданных типов, которые хранят некоторое искомое значение в указанных реквизитах. Например, нужно найти все документы, связанные с определенным контрагентом, то есть имеющие в своих реквизитах (или реквизитах табличной части) ссылку на конкретный элемент справочника Контрагенты.

При описании в конфигурации критерия отбора нужно задать список реквизитов различных объектных данных, по которым будет формироваться отбор.

Например, если, мы будем искать по контрагенту документы " ПриходнаяНакладная ", " РасходнаяНакладная " и "Взаимозачет", то нужно выбрать реквизиты:

  • Документ.ПриходнаяНакладная .Реквизит.Поставщик;
  • Документ.РасходнаяНакладная.Реквизит.Покупатель;
  • Документ. Взаимозачет.ТабличнаяЧасть.Состав.Реквизит.Кто;
  • Документ. Взаимозачет.ТабличнаяЧасть.Состав.Реквизит.Кому.

На примере документа "Взаимозачет" заметим, что можно выбирать реквизиты из табличных частей и можно выбирать несколько реквизитов в одном объекте. Данный критерий отбора позволит найти все документы указанных трех типов, содержащие ссылку на искомого контрагента в указанных реквизитах. Фактически, критерий отбора описывает некоторую область поиска.

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

При включении в конфигурацию критерия отбора система не создает никаких таблиц, однако для оптимизации поиска создается индекс по каждому реквизиту, который указан в составе критериев отбора. Индексы будут использоваться СУБД для оптимизации получения выборки при использовании критерия отбора. Таким образом, при описании критерия отбора нужно учитывать, что система будет тратить дополнительные ресурсы на поддержание необходимых индексов.

Критерий отбора может использоваться несколькими способами.

  • может быть получена выборка с помощью метода Найти() менеджера критерия отбора;
  • может быть выполнено обращение к виртуальной таблице критерия отбора в запросе (КритерийОтбора.<имя>);
  • можно сделать форму критерия отбора или вставить в любую форму табличное поле, связанное с объектом КритерийОтбораСписок.<имя> , для отображения выборки в табличном поле;
  • можно использовать критерий отбора в отборе списка документов.

Во всех случаях выборка выполняется одним и тем же способом. Система формирует запрос к СУБД для поиска объектов, которые включают искомое значение, и формирует выборку, состоящую из найденных ссылок на объекты. Формируемый запрос представляет собой объединение запросов по каждой таблице, в которой нужно осуществить поиск.

Запросы формируются только к тем данным (таблицам), из числа описанных в критерии отбора, у которых в реквизите может быть значение того типа, значение которого в данный момент ищется. Например, критерий отбора включает ссылки на справочник физических лиц и справочник организаций, а в конкретном реквизите конкретного документа может быть ссылка только на справочник физических лиц. Тогда запрос по этому документу будет выполняться, только если в данный момент поиск выполняется по физическому лицу.

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

В составе метаданных 1С:Предприятия 8 существует объект Критерий отбора.

Этот объект, в отличие от большинства прикладных объектов конфигурации, не описывает каких-либо самостоятельных данных, которые будут храниться в информационной базе 1С:Предприятия. Критерий отбора предназначен для того, чтобы описать условия отбора по некоторым объектам. Например, можно указать, что критерий отбора строится по типу данных СправочникСсылка.Номенклатура, и в этот критерий входят документы "ПоступлениеТоваровУслуг" и "РеализацияТоваровУслуг". Конечно, все отборы мы можем делать с помощью запроса.

Особенностью (преимуществом) критерия отбора является то, что он может строиться в том числе по реквизирам табличных частей. Таким образом мы можем очень просто настроить отбор так, чтобы в его результат попадали лишь те документы, в табличной части которых есть интересующий нас элемент справочника "Номенклатура".

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

Рассмотрим особенности критерия отбора на примере. Создадим новый критерий отбора "Документы с номенклатурой". Настроим закладки "Данные" и "Состав". На закладке "Данные" указывается тот тип данных, по которому будет осуществляться отбор. Причем тип данных может быть составным. Итак, выберем тип данных - СправочникСсылка.Номенклатура. На закладке состав мы выбираем объекты, которые будут являться результатом выполнения нашего отбора. Система предлагает нам отметить флажками интересующие нас объекты из списка, в который она включает все объекты, содержащие ссылку на справочник "Номенклатура". На закладке формы мы можем для критерия отбора указать ФормуСписка, которая будет содержать динамический список объектов, удовлетворяющих нашему критерию. Кроме того, на закладке Права мы можем настроить "Просмотр" для определенных ролей. Следует отметить, что в пользовательском интерфейсе существует возможность просмотра результата отбора, т.е. ФормыСписка критерия отбора. В нашем случае это будет форма справочника "Номенклатура", но, чтобы это работало, необходимо перейти в командный интерфейс ФормыЭлемента справочника "Номенклатура" и поставить флаг в колонке "Видимость" напротив "Документы с номенклатурой (Объект.Ссылка) .


Рассмотрим, как критерий отбора хранится в базе данных. Если мы в нашей Базе данных создадим запрос, то мы увидим таблицу, которая соответствует критерию отбора. Однако данная таблица является "виртуальной ". В процессе отладки мы можем вызвать метод ПолучитьСтруктуруХраненияБазыДанных() , и мы также не найдем таблиц, соответствующих критерию отбора. Таким образом, нет физической таблицы, соответствующей критерию отбора, но есть таблица виртуальная, к которой мы можем обратиться. Например, создав запрос и выгрузив результатЗапроса:

Запрос.Текст = "ВЫБРАТЬ | ДокументыСНоменклатурой.Ссылка |ИЗ | КритерийОтбора.ДокументыСНоменклатурой(&Номенклатура) КАК ДокументыСНоменклатурой"; Запрос.УстановитьПараметр("Номенклатура", Номенклатура); РезультатЗапроса = Запрос.Выполнить();

Мы получим документы, в которых содержится интересующая нас номенклатура.

Также следует отметить, что, несмотря на то, что при включении в конфигурацию критерия отбора система не создает никаких таблиц, однако для оптимизации поиска создается индекс по каждому реквизиту, который указан в составе критериев отбора. Индексы будут использоваться для оптимизации получения выборки при использовании критерия отбора. Таким образом, при описании критерия отбора нужно учитывать, что система будет тратить дополнительные ресурсы на поддержание необходимых индексов. Кстати, процесс "заполнения индекса поиска" можно увидеть, если мы просто переименуем созданный ранее критерий отбора. Сам процесс длится около минуты. А далее система выдает сообщение "Код модулей содержит возможные использования ссылки на изменяемый объект. Продолжить операцию переименования?" И если мы соглашаемся, то выдает нам ссылки на код, где встречаются упоминания нашего критерия отбора. Причем рядом с каждой ссылкой появляется команда "заменить", при нажатии на которую автоматически происходит замена старого наименования критерия отбора на новое.

Каким же образом система получает искомый результат? Дело в том, что она формирует запрос для поиска объектов, которые включают искомое значение, и формирует выборку, состоящую из найденных ссылок на объекты. Формируемый запрос представляет собой объединение запросов по каждой таблице, в которой нужно осуществить поиск. Запросы формируются только к тем данным (таблицам), из числа описанных в критерии отбора, у которых в реквизите может быть значение того типа, значение которого в данный момент ищется. Например, критерий отбора включает ссылки на справочник физических лиц и справочник организаций, а в конкретном реквизите конкретного документа может быть ссылка только на справочник физических лиц. Тогда запрос по этому документу будет выполняться, только если в данный момент поиск выполняется по физическому лицу. Важно учитывать, что критерий отбора всегда выбирает все искомые данные. Ни в списке, ни в других режимах не поддерживается динамическая выборка, так как информация выбирается путем объединения данных из разных таблиц. Формируемый для критерия отбора индекс позволяет сделать это достаточно быстро, но если данных в выборке окажется очень много, то выборка не будет формироваться эффективно. Поэтому целесообразно создавать критерии отбора по данным, имеющим большой разброс значений, чтобы выборки получались не очень большие. В противном случае теряется смысл такого отбора и снижается его эффективность.

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

Поговорим о программной работе с критерием отбора. В синтакс-помощнике в ветке "Прикладные объекты" находится ветка "Критерии отбора". Мы видим, что количество типов данных здесь не очень большое. Во-первых, это менеджер критериев отбора - КритерииОтбораМенеджер (FilterCriteriaManager) . Это свойство глобального контекста, которое позволяет через точку обратиться к конкретному критерию отбора. Далее мы получаем КритерийОтбораМенеджер.<Имя критерия> (FilterCriterionManager.<Имя критерия>) , у которого есть два метода - Найти(<ЗначениеПоиска>) и ПолучитьФорму(<Форма>, <Владелец>, <КлючУникальности>) . И еще один тип данных - КритерийОтбораСписок.<Имя критерия> (FilterCriterionList.<Имя критерия>) . Он предназначен для управления списком отобранных документов и/или элементов справочников, отображаемых в табличном поле (списком критерия отбора). Как видим, методов для програмной работы не очень много, поэтому гораздо удобнее работать с критерием отбора при помощи запроса.
Рассмотрим на примере, как отобразить результат работы критерия отбора в форме. Для этого можно создать обработку.

Итак, создаем обработку и управляемую форму для неё. У формы будет два реквизита. Это "Номенклатура" - СправочникСсылка.Номенклатуры и "Список", тип которого - "ДинамическийСписок ". В свойствах реквизита "Список" заполним "ОсновнаяТаблица" значением - "КритерийОтбора.ДокументыСНоменклатурой". Перетаскиваем оба реквизита на форму. Кроме того, нам необходимо установить параметр "Значение" для нашего динамического списка. У динамического списка есть свойство "Параметры", тип значения которого: ЗначенияПараметровДанныхКомпоновкиДанных. У которого в свою очередь есть метод: УстановитьЗначениеПараметра(<Параметр>, <Значение>) . Итак, в модуле формы у нас будет следующий код:

&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Список.Параметры.УстановитьЗначениеПараметра("Значение",Номенклатура); КонецПроцедуры &НаКлиенте Процедура НоменклатураПриИзменении(Элемент) Список.Параметры.УстановитьЗначениеПараметра("Значение",Номенклатура); КонецПроцедуры

Сохраняем обработку и запускаем в пользовательском режиме.

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

&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Список.Параметры.УстановитьЗначениеПараметра("Значение",Номенклатура); КонецПроцедуры &НаКлиенте Процедура НоменклатураПриИзменении(Элемент) Список.Параметры.УстановитьЗначениеПараметра("Значение",Номенклатура); КонецПроцедуры &НаКлиенте Процедура ОткрытьФ(Команда) ОткрытьФорму("КритерийОтбора.ДокументыПоДоговоруКонтрагента.ФормаСписка"); КонецПроцедуры

Сохраняем нашу обработку, в пользовательском режиме нажимаем на кнопку "ОткрытьФ" , наша ФормаСписка открывается, но система при этом выдает ошибку. Дело в том, что система не может понять, по какому объекту ей нужно сделать отбор. Нам необходимо заполнить параметр Значение нашего динамического списка. В принципе, мы можем сделать это интерактивно. Для этого перейдем в ФормуСписка нашего критерия отбора, раскроем ветку "Список", найдем там "Параметры" и перетащим их на нашу ФормуСписка критерия отбора. Теперь в пользовательском режиме мы можем поставить флажок перед параметром "Значение" в истину, ну и, собственно, заполнить и сам параметр "Значение". Но лучше это сделать программно при открытии ФормыСписка критерия отбора. Программную установку мы будем делать в процедуре "ПриСозданииНаСервере() ". Если мы поставим точку останова в этой процедуре, то при отладке мы увидим: в параметрах нашего динамического списка есть коллекция "Элементы", и у элемента "Использование" стоит значение "Ложь". Чтобы установить его в истину, можно использовать следующий код, поскольку "Элементы" - это коллекция значений:

&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Список.Параметры.Элементы.Использование = Истина; КонецПроцедуры

Мы можем также использовать обращение по имени параметра. Для этого мы можем использовать метод "Найти()" :

&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Список.Параметры.Элементы.Найти("Значение").Использование = Истина; КонецПроцедуры

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

&НаКлиенте Процедура ОткрытьФ(Команда) ОткрытьФорму("КритерийОтбора.ДокументыСНоменклатурой.ФормаСписка", новый Структура("Номенклатура", Номенклатура); КонецПроцедуры

А в ФормеСписка критерия отбора воспользуемся переданным значением:

&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Список.Параметры.Элементы.Найти("Значение").Использование = Истина; Список.Параметры.Элементы.Найти("Значение").Значение = Параметры.Номенклатура; КонецПроцедуры

Далее запускаем нашу обработку в пользовательском режиме, заполняем реквизит "Номенклатура" и нажимаем кнопку "ОткрытьФ". В результате откроется ФормаСписка критерия отбора с переданным значением "Номенклатуры" из формы вызывающей, а также сформируется результат отбора.

На этом заканчиваем, надеюсь, материал будет полезен для понимания сути объекта "Критерий отбора". Всем пока и удачи)



Просмотров