Выселение. Приватизация. Перепланировка. Ипотека. ИСЖ

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Список - неотъемлемый атрибут отображения информации в любой конфигурации, созданной на платформе "1С:Предприятие 8.1". Для эффективной работы со списками, содержащими разнообразные данные, в программах на платформе "1С:Предприятие 8.1" реализованы удобные и мощные механизмы отбора и сортировки. Об особенностях их использования рассказывает В.В. Рыбалка, фирма "1С".


Рис. 1

Списки

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

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

Рис. 1

Механизм сортировки

Для чего нужен механизм сортировки? Во-первых, он, как следует из названия, позволяет отсортировать список по нужному критерию.

Во-вторых, в платформе "1С:Предприятие 8.1" активно используется механизм быстрого поиска. Этот механизм позволяет быстро найти в каком-либо списке нужный элемент, набрав первые символы (рис. 2). Но в динамических списках (например, список элементов справочника или список документов) быстрый поиск работает только по реквизитам, по которым доступна сортировка.

Рис. 2

Посмотреть все доступные для сортировки реквизиты списка можно, открыв окно "Отбор и сортировка". Это окно, как правило, доступно на панели действий (рис. 3) либо в контекстном меню списка, открывающемся правой кнопкой мыши (рис. 4). В окне "Отбор и сортировка" нужно перейти на закладку "Сортировка", где показаны все доступные реквизиты, по которым возможна сортировка.

Рис. 3

Рис. 4

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

Рис. 5

Заметим, что нижний пример иллюстрирует возможность использования комбинированной сортировки (одновременно по нескольким реквизитам). В нашем случае, это сортировка по дате по убыванию (самые старые даты внизу) и по номерам по возрастанию (самые большие номера внизу).

В каждом списке можно индивидуально сохранить нужную сортировку. Достаточно включить галочку "Использовать эту настройку сортировки при открытии" и нажать "ОК". Система запомнит настройку и при следующем открытии этого списка установит сохраненную сортировку.

Быстро отсортировать список по нужному реквизиту можно, щелкнув мышкой по шапке с названием этого реквизита.

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

Механизм отбора

Отбор - мощный механизм платформы "1С:Предприятие 8.1", который позволяет эффективно работать со списками, даже если в них содержится не один десяток или сотня тысяч элементов. Для начала рассмотрим работу механизма отбора в общем случае.

Практически везде, где есть список (как правило, в виде таблицы), можно использовать механизм отбора, который активируется либо соответствующей кнопкой на панели действий, либо в контекстно-зависимом меню списка (рис. 3 и 4). Если отбор у нужного списка возможен, откроется окно "Отбор и сортировка". В нем будут отображены все возможные виды доступных для отбора реквизитов. Список доступных элементов отбора зависит от того, где этот отбор будет использован. В общем случае нужно найти один или несколько необходимых элементов для отбора, указать значения и активировать настроенную комбинацию критериев.

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

Если указать одновременно несколько критериев отбора, в списке будут отображены только такие элементы, которые удовлетворяют всем указанным критериям.

Механизмы отбора и сортировки на примерах

Попробуем решить несколько задач в демонстрационной базе ("Бухгалтерия предприятия", редакция 1.6). Например, отобразим документы, сформированные для контрагента "Саймон и Шустер ООО" в журнале "Документы покупателей". Сразу оговоримся, что описывать будем стандартные для платформы "1С:Предприятие 8.1" правила и логику ведения отбора, без привязки к какой-либо конкретной конфигурации и дополнительным сервисным возможностям, в ней реализованным.

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

Нам нужно быстро посмотреть все документы контрагента "Саймон и Шустер ООО". Реализуется задача следующим образом - открывается окно отбора, в элементе "Контрагент" выбирается контрагент "Саймон и Шустер ООО" из справочника (рис. 6) и нажимается "ОК". Задача решена (рис. 7).

Рис. 6

Рис. 7

Для быстрого использования нужного отбора достаточно сразу приступать к выбору нужного критерия. Ставить галочку напротив используемого отбора не нужно. Программа сделает это сама после того, как будет указан необходимый критерий. Быстро применить настроенные критерии отбора можно, нажав комбинацию клавиш Ctrl+Enter*.

Обратите внимание еще и на то, что при указании значений в элементах отбора (в нашем примере - контрагент "Саймон и Шустер ООО"), в большинстве случаев будет работать механизм быстрого подбора, широко распространенный в платформе "1С:Предприятие 8.1". В нашем примере достаточно было набрать первые символы названия контрагента или его код прямо в поле значения отбора, нажать Enter или Tab и система автоматически бы "угадала" нужный нам элемент справочника.

Имейте в виду - быстрый подбор существенно ускоряет выбор известных вам значений. Используйте его, где это возможно.

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

Рис. 8

Вид сравнения "Содержит" выбран не случайно. Именно он позволяет найти нужное слово (или его часть) в любом месте наименования номенклатуры. Если оставить вид сравнения "Равно", в списке будут отображены только такие элементы номенклатуры, которые называются точно так, как написан запрос. А таких в нашей демобазе нет (то есть не было бы отображено ни одного элемента).

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

Если искать не по наименованию, а по полному наименованию, галочку использования отбора по наименованию лучше снять. Иначе отбор будет использован и по наименованию, и по полному наименованию, что не всегда может оказаться необходимым (рис. 9).

Рис. 9

Для удобства работы с элементами справочника при использовании отборов лучше на время отключать отображение иерархии (рис. 10).

Рис. 10

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

Открываем журнал "Документы покупателей" и указываем в элементе отбора "Вид документа" документ "Реализация товаров и услуг". Программа сама предоставляет возможность выбора определенного вида документа из тех, которые включены в данный журнал. Для этого есть и персональная кнопочка на панели действий (рис. 11).

Рис. 11

Аналогично отбору по виду документов платформа автоматически предложит элемент отбора "Структура подчиненности", если в конфигурации настроены взаимосвязи между документами.

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

У задачи существует несколько способов реализации. Рассмотрим наиболее эффективный. Открываем журнал "Документы покупателей", указываем в элементе отбора "Вид документа" документ "Счет-фактура выданный". После этого в элементе отбора "Контрагент" указываем вид сравнения "В группе". Выбираем тип значения "Контрагенты" и открываем форму выбора контрагентов. В ней выбираем группу "Покупатели" (рис. 12).

Рис. 12

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

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

Человеческим языком задача формулируется так: "отобразить все нужные документы по всем контрагентам, находящимся в группах справочника Покупатели, Поставщики, Поставщики на реализацию". Реализуется это просто - в условии отбора "Контрагент" выбираем "В группе из списка" (рис. 13). После этого становится доступным механизм заполнения списка, в который можно добавить нужные группы (или элементы) справочника. Причем список можно заполнить вручную. По аналогии с решением предыдущей задачи, найти нужную группу и выбрать ее, повторив это для каждого нового элемента списка. Однако целесообразнее воспользоваться удобным механизмом подбора, который автоматически реализуется программой. С помощью подбора намного проще и быстрее заполнить список нужными составляющими. После того, как список заполнен, нажимаем "ОК" и активируем настроенные критерии отбора. Задача решена.

Рис. 13

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

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

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

Далее накладываем критерии отбора в разрезе Номенклатуры. Тут же возникает другой вопрос - как отобрать "СТИНОЛ", если условия выбора номенклатуры довольно сильно ограничены (доступно "Равно", "Не равно", "В списке" и "Не в списке"). Решить задачу можно и при таких условиях. Выбираем условие "В списке", открываем уже знакомое окно заполнения списка, используем подбор номенклатуры (рис. 14, 1). В списке номенклатуры может быть большое количество элементов, поэтому не будем искать глазами нужные позиции. Воспользуемся отбором в списке номенклатуры, указав условие отбора "Содержит" для наименования номенклатуры (рис. 14, 2).

Рис. 14

После этого остается только добавить отобранные позиции в список отбора для документа и применить критерии отбора.

Полезные функции механизма отбора

Рассмотрим еще несколько моментов, связанных так или иначе с отборами в системе "1С:Предприятие 8.1".

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

Рис. 15

Быстро установить отбор по значению в текущей ячейке списка можно, нажав на кнопку "Отбор по значению в текущей колонке" (рис. 16). При нажатии на эту кнопку будет установлен отбор по текущему значению в колонке. Эта функция работает только для тех колонок, по реквизитам которых можно устанавливать отборы. Если в списке уже используется какой-либо отбор, новый будет присоединен к нему. Причем кнопка становится активной для данной колонки. Отменить такой отбор можно аналогично - "отжав" кнопку в соответствующей колонке.

Рис. 16

Еще одно полезное свойство механизма отборов - ведение истории отборов (рис. 17). Программа запоминает, какие отборы были установлены, поэтому можно быстро вернуться к какому-либо из них, просто выбрав его из выпадающего списка. К слову, в окне "Отбор и сортировка" обратите внимание на кнопку "Отборы" (рис. 6). Нажав на эту кнопку, вы попадете в интерфейс, в котором можно сохранять и восстанавливать настройки отборов, чтобы в последствие можно было к ним вернуться (рис. 18).

Рис. 17

Рис. 18

И последняя функция - это отмена всех отборов (рис. 19). Нажатием кнопки "Отключить отбор" отключаются все отборы, установленные в списке. Аналогичного действия можно добиться, открыв окно "Отбор и сортировка" и сняв галочки напротив всех активных элементов.

Рис. 19

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

Был рассмотрен простой пример настройки и использования объекта конфигурации "критерий отбора". Подробнее узнать информацию о нем Вы можете в синтаксис-помощнике или на официальном сайте .

Сегодня в статье рассмотрим закулисную работу платформы 1С:Предприятие с СУБД при использовании критериев отбора. В примере будет использоваться Microsoft® SQL Server® 2008 Express with Advanced Services .

Что у нас есть?

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


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

В запросе

Для каждого критерия отбора создается виртуальная таблица, в которой имеется единственный параметр "Значение". В параметр передается ссылка на элемент, для которого нужно получить связанные элементы.

При выполнении запроса мы получим аналогичный результат, что и на скриншоте выше, если в качестве параметра передадим ссылку на элемент справочника товары.

"За кулисами"

Сразу стоит оговориться, что отдельной SQL-таблицы для критерия отбора не создается. Платформа получает данные динамически, формирую SQL-запрос в зависимости от настроек критерия отбора.

Например, если мы выполним следующий запрос с ссылкой на элемент справочника "Товары" в параметре:


,

то платформа сформирует следующий SQL-запрос к СУБД:

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

Для каждой таблицы документа формируется отдельный SELECT. После результаты объединяются с помощью конструкции "UNION ALL". Из полученной таблицы во вложенном запросе получают все ссылки на документы, в табличных частях которых присутствует искомый элемент справочника.

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

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

Выводы

Таким образом, критерий отбора - это механизм платформы, который выступает в качестве инструкции платформе для формирования SQL-запросов к базе данных на получения ссылок на связанные объекты информационной базы. В противном случае разработчику пришлось бы самостоятельно писать такие запросы и настраивать индексы для реквизитов объектов.

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

Влияние на производительность с их стороны незначительная. Из-за создания дополнительных индексов может увеличиться время записи, так как появляется необходимость в обновлении индекса при помещении данных в информационную базу.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Это легко сделать с помощью .

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

Как это сделать?

Критерии отбора 1С

Критерии отбора 1С позволяют искать разные – справочники, документы — по значению.

Например в разных документах есть поле Контрагент. Мы можем сделать критерий отбора 1С ПоискПоКонтрагенту и находить любые документы, в которых указан определенный контрагент.

Критерии отбора 1С находятся в дереве объектов конфигурации в ветке Общие/Критерии отбора 1С.

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

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

1С покажет Вам все справочники и документы, в которых есть поля с выбранным Вами типом. Нужно установить галочки для тех полей, которые нужно учитывать при поиске.

Для работы пользователя с критерием отбора 1С нужно создать хотя бы одну форму. Критерии отбора 1С будут доступны во всех выбранных в Составе документов по кнопке Перейти, поэтому для работы нужна форма.

Использование критериев отбора 1С

После создания критерия отбора 1С его можно использовать в коде программ на языке 1С.

Рассмотрим пример:

  • Мы создали критерий отбора 1С
  • В типе мы указали Справочник.Контрагенты
  • В составе указали все документы, установив галочки на реквизиты шапки этих документов с названием Контрагент.

В тексте программы на языке 1С мы можем запрограммировать поиск всех документов по контрагенту следующим способом:
СписокДокументовКонтрагента = КритерииОтбора.ДокументыКонтрагента.Найти(ИскомыйКонтрагент);

Аналогичный поиск можно сделать через со следующим текстом:

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



Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter
ПОДЕЛИТЬСЯ:
Выселение. Приватизация. Перепланировка. Ипотека. ИСЖ