Основная страницаМЕТОДИКА ОРГАНИЗАЦИИ ПОДБОРА И ВЫБОРА


 

Подбор из формы обработки

В 1С:Предприятии 7.7 подбор может выполняться не только из форм списков справочников, счетов и журналов документов, но и из формы обработки.

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

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

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

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

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

Заметим, что применение подборов из форм обработок может быть особенно эффективно при использовании версий 1С:Предприятия 7.7 для SQL, обеспечивающих высокую производительность выполнения запросов, на основании которых формируется набор значений подбора.

Множественная отметка в списках объектов

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

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

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

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

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

Множественный подбор из справочника

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

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

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

Подбираемые товары, сначала "накапливаются" в форме подбора, а затем включаются "общим списком" в табличную часть документа.

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

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

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

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

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

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

Отбор элементов справочника по сложному критерию

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

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

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

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

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

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

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

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

Кроме того, в данном примере, полученный результат запроса используется не только для отбора элементов, но и для показа текущего остатка в колонке табличной части формы. Это позволяет не обращаться повторно при просмотре списка к данным регистра.

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

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

Подбор с использованием табличного документа

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

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

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

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

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

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

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

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

Организация выбора значения из небольшого списка

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

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

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

Кроме возможности выбора из списка значений по отдельной кнопке существует возможность организации выбора  непосредственно при нажатии кнопки выбора элемента диалога типа "Справочник".

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

                     Выбор из справочника только групп

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

В методической конфигурации выбор групп, демонстрируется на примере формы списка справочника "Товары" - "ДляВыбораГрупп". Пример задействован в форме обработки "ПереносТоваров" для выбора группы, в которую переносятся внесенные в список товары.

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

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

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

Выбор документа из общего журнала

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

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

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

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

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

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

Поиск в списке справочника по первым символам

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

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

Для активизации поиска используется кнопка, которая может также быть вызвана с помощью функциональной клавиши. Это позволит оператору при интенсивной работе максимально быстро обращаться к функции поиска.

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

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

Поиск в справочнике по подстроке

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

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

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

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

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






Рекомендации по конфигурированию и администрированию