Пользовательский выбор из справочника. Часть3

10 0

В продолжение статей Пользовательский выбор из справочника. Часть1 и Пользовательский выбор из справочника. Часть2 хочу поделиться опытом разработки для модификации стандартного выбора из справочника на реквизитах типа справочник в новой версии DIRECTUM 4.9.

Запрет показа полных справочников

В XIni добавились две настройки:

  1. Перечисление типов справочников с запретом на просмотр всех записей;
  2. Максимальное количество отображаемых записей в справочниках с запретом на просмотр всех записей, которое может быть показано при выборе. Настройка влияет только на справочники, перечисленные в предыдущей настройке. По умолчанию – 0, ограничений нет.

В Утилитах администратора в компоненте Установки системы эти две настройки называются RestrictedReferences и RestrictedReferenceRecordCount соответственно.

В контроле для ref-реквизитов для справочников, перечисленных в настройке, логика кнопки «…» изменится, она начнет работать так, как будто нажали клавишу Enter. Если строка like условия окажется пустой – будет сгенерировано исключение. Таким образом, открыть справочник без ввода like условия будет нельзя. При указании like-условия, в запрос добавятся соответствующие where условия и select top N, где N - максимальное количеством записей справочника, которое может быть показано при выборе.

Так как при попытке открыть справочник, указанный в настройке  RestrictedReferences, через объектную модель будет создано исключение, то для тех, кому доступ к полному справочнику все же нужен, необходимо создать отдельные сценарии для его открытия и показа с явным отключением ограничения с использованием ISBL-функций DisableCheckFullShowingRestriction и EnableCheckFullShowingRestriction.

Новые события для модификации стандартного выбора из справочника

Назначение событий – модификация стандартного выбора из справочника. Например:

  • Можно изменить список реквизитов, по которым выполняется like-ввод с помощью предопределенной переменной LookUpRequisiteNames (стандартный список реквизитов, по которым выполняется like-ввод - это «Код» и «Наименование»);
  • Через предопределенную переменную LookUpReference можно добавить дополнительные ограничения на выборку с помощью методов объектной модели AddWhere и AddFrom, например, разрешить выбирать только действующие записи. Либо в событии «До выбора из справочника» можно отключить контекст нашей организации. Ограничения следует снять в событии «После выбора из справочника».

Если в событии «Выбора из справочник» присутствуют ISBL вычисления, то новые события игнорируются.

Также следует помнить! Открывать набор данных в событии «До выбора из справочника» НЕЛЬЗЯ.  Новые события не служат для "переопределения" стандартного выбора, они служат для уточнения реквизитов, по которым происходит поиск, а также для задания дополнительных условий.

Как модифицировать Пользовательский выбор из справочника с помощью новых предопределенных переменных LookUpRequisiteNames и LookUpReference

В событии До выбора из справочника определим:

// Дополнительные реквизиты, в которых следует искать введенное значение

FindInRequisiteArray = ArrayOf('Подразделение'; 'Строка')

// Добавить дополнительные реквизиты для like-ввода в предопределенную переменную LookUpRequisiteNames

foreach FindInRequisite = CArrayElement(FindInRequisiteArray)

  LookUpRequisiteNames.Add(FindInRequisite)

endforeach

// Запомнить значение предопределенной переменной LookUpRequisiteNames

Object.Params.Add('LookUpRequisiteNamesText'; LookUpRequisiteNames.DelimitedText)

// Дополнительное условие для фильтрации - только действующие записи

Condition = Format(“ and %s.%s = ‘%s’”; ArrayOf(LookUpReference.SQLTableName; LookUpReference.Requisites(SYSREQ_STATE).SQLFieldName; ‘Д’))

AddWhereID = LookUpReference.AddWhere(Condition)

Object.Params.Add('AddWhereID'; AddWhereID)

// Отключить контекст нашей организации

Object.Params.Add('OldOurFirmContext'; GetOurFirmContext())

SetOurFirmContext(NULL)

В событии После выбора из справочника добавим следующий код:

  // Если в событии До выбора из справочника  были дополнительные ограничения на выборку
  // снять их

  AddWhereID = Object.Params.FindItem('AddWhereID')

  if Assigned(AddWhereID)

    LookUpReference.DelWhere(AddWhereID)

    Object.Params.PopVar('AddWhereID')

  endif

  // Вернуть контекст Нашей оранизации, если он менялся

  OldOurFirmContext = Object.Params.FindItem('OldOurFirmContext')

  if Assigned(OldOurFirmContext)

    SetOurFirmContext(OldOurFirmContext)

    Object.Params.PopVar('OldOurFirmContext')

  Endif

  // Вернуть значение предопределенной переменной LookUpRequisiteNames

  LookUpRequisiteNamesText = Object.Params.FindItem('LookUpRequisiteNamesText')

  if Assigned(LookUpRequisiteNamesText)

    LookUpRequisiteNames.DelimitedText = LookUpRequisiteNamesText

    Object.Params.PopVar('LookUpRequisiteNamesText')

  endif

Также можно переопределить пользовательский выбор из справочника с использованием функций BeforeSelectingFromRefRequisite и BeforeSelectingFromFiltratedRefRequisite.

Пользовательский выбор из справочника с использованием функции BeforeSelectingFromRefRequisite

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

Для этого переопределим выбор из справочника для реквизита Подписал(Работник3).

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

На событии До выбора из справочника:

// Дополнительные реквизиты, в которых следует искать введенное значение

  LookUpRequisiteNames.Add('Подразделение')

  LookUpRequisiteNames.Add('Строка')

  // Реквизиты дополнительного фильтра   

  KeyReqInfoArray = ArrayOf(ArrayOf(SYSREQ_STATE; ;; "Д";;))

  UseFirmContext = FALSE
  BeforeSelectingFromRefRequisite(SelectMode; InputValue; LookUpReference;   
    KeyReqInfoArray; UseFirmContext)

где

  • SelectMode, InputValue, LookUpReference - предопределенная переменная, доступные в вычислениях на выбор из справочника. Подробнее см. раздел «Переменные в выборе из справочника реквизитов типов карточек эл. документов»;
  • KeyReqInfoArray - массив ведущих реквизитов в виде двумерного массива:

([НАИМЕНОВАНИЕ][ТИП][ЗАГОЛОВОК][ЗНАЧЕНИЕ][ПРИЗНАК_ЗНАЧЕНИЯ][ПРИЗКАК_ФИЛЬТРУЕМОСТИ]),

где:

НАИМЕНОВАНИЕ - наименование реквизита;

ТИП - тип рекизита. Возможные значения:

    'Справочник:<ИМЯ_СПРАВОЧНИКА>';

    'Дата';

    'Строка:<ДЛИНА_СТРОКИ>', <ДЛИНА_СТРОКИ> не более 255;

    'Признак: Имя_значения1,Имя_значения2[,Имя_значенияN]';

    'Число: ТОЧНОСТЬ';

    'ДатаВремя'.

    'Значение по умолчанию 'Строка:35';

ЗАГОЛОВОК - заголовок реквизита;

ЗНАЧЕНИЕ - значение реквизита, если есть;

ПРИЗНАК_ЗНАЧЕНИЯ - логическое значение. Возможные значения: "TRUE" - в значении хранится код записи справочника, "FALSE" - в значении хранится наименование записи справочника или его часть;

ПРИЗКАК_ФИЛЬТРУЕМОСТИ - логическое значение. Возможные значения: "TRUE" - фильтровать реквизиты по значению, "FALSE" - не фильтровать реквизиты по значению.

Нижняя граница внутренних массивов должна быть равна 0.

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

  • UseFirmContext - Признак, в котором определяется нужен ли контекст нашей организации. По умолчанию установлено значение "TRUE". Если UseFirmContext = FALSE, то контекст нашей организации отключается.

На событии После выбора из справочника используем функцию AfterSelectingFromRefRequisite, которая предназначена для восстановления первоначальных значений предопределенных переменных, если были наложены дополнительные фильтры на просмотр всех записей справочника в событии "До выбора из справочника":

 

LookUpRequisiteNames.DelimitedText = AfterSelectingFromRefRequisite(LookUpReference)

 

Пользовательский выбор из фильтруемого справочника с использованием функции BeforeSelectingFromFiltratedRefRequisite

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

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

В событии реквизита "До выбора из справочника" для типа справочника "Контактные лица организаций:

  LookUpRequisiteNames.Add('ПодразделениеОрг')

  // Ключевые реквизиты задаются в функции FiltrateKNTReference()

  KeyReqInfoArray = ArrayOf(ArrayOf('Организация'; Object.Организация))

  // Реквизиты дополнительного фильтра

  AddFilterReqArray = ArrayOf(ArrayOf(SYSREQ_STATE; 'Признак'; LoadString('REQ_Д000101';
  'COMMON'); "Д";;))

  ViewName  = 'Главное'

  BeforeSelectingFromFiltratedRefRequisite(SelectMode; InputValue; Requisite;

    LookUpReference; LookUpRequisiteNames; KeyReqInfoArray; AddFilterReqArray; ViewName)

где параметры функции:

  • SelectMode, InputValue, Requisite, LookUpReference, LookUpRequisiteNames - предопределенные переменные, доступные в вычислениях на выбор из справочника. Подробнее см. раздел «Переменные в  выборе из справочника реквизитов типов справочников» справочной системы DIRECTUM;
  • KeyReqInfoArray – информация о ведущих реквизитов в виде двумерного массива:

([НАИМЕНОВАНИЕ][ЗНАЧЕНИЕ]),

где:

НАИМЕНОВАНИЕ - наименование реквизита;

ЗНАЧЕНИЕ - значение предопределенной переменной InputRequisiteValue.

Реквизиты, указываемые в данном параметре, должны быть ключевыми, то есть эти же реквизиты должны быть указаны в функции фильтрации для справочника LookUpReference.  Имя функции фильтрации 'Filtrare[ИМЯ_СПР]Reference', где ИМЯ_СПР - имя справочника, из которого производится выбор, заданное с помощью транслитерации. 

AddFilterReqArray - информация о реквизитах дополнительного фильтра в виде двумерного массива из 6 элементов:

([НАИМЕНОВАНИЕ][ТИП][ЗАГОЛОВОК][ЗНАЧЕНИЕ][ПРИЗНАК_СОДЕРЖИМОГО][ПРИЗНАК_ФИЛЬТРАЦИИ_ПО_ЗНАЧЕНИЮ]),

где:

НАИМЕНОВАНИЕ - наименование реквизита;

ТИП - тип реквизита;

ЗАГОЛОВОК - заголовок реквизита;

ЗНАЧЕНИЕ - значение предопределенной переменной InputRequisiteValue;

ПРИЗНАК_СОДЕРЖИМОГО - возможные значения: "TRUE" - в значении содержится код, "FALSE" - в значении содержится наименование;

ПРИЗНАК_ФИЛЬТРАЦИИ_ПО_ЗНАЧЕНИЮ - возможные значения: "TRUE" - отфильтровать справочник по значению, "FALSE" - локализовать строку в справочнике по коду.

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

ВНИМАНИЕ. Реквизиты, указываемые в данном параметре, не должны быть ключевыми, то есть не должны быть указаны в функции фильтрации для справочника LookUpReference.  Имя функции фильтрации 'Filtrare[ИМЯ_СПР]Reference', где ИМЯ_СПР - имя справочника, из которого производится выбор, заданное с помощью транслитерации.

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

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

На событии После выбора из справочника используем функцию AfterSelectingFromRefRequisite, которая предназначена для восстановления первоначальных значений предопределенных переменных, если были наложены дополнительные фильтры на просмотр всех записей справочника в событии "До выбора из справочника":

  LookUpRequisiteNames.DelimitedText = AfterSelectingFromRefRequisite(LookUpReference)

 

Пока комментариев нет.

Авторизуйтесь, чтобы написать комментарий