В продолжение статей Пользовательский выбор из справочника. Часть1 и Пользовательский выбор из справочника. Часть2 хочу поделиться опытом разработки для модификации стандартного выбора из справочника на реквизитах типа справочник в новой версии DIRECTUM 4.9.
В XIni добавились две настройки:
В Утилитах администратора в компоненте Установки системы эти две настройки называются RestrictedReferences и RestrictedReferenceRecordCount соответственно.
В контроле для ref-реквизитов для справочников, перечисленных в настройке, логика кнопки «…» изменится, она начнет работать так, как будто нажали клавишу Enter. Если строка like условия окажется пустой – будет сгенерировано исключение. Таким образом, открыть справочник без ввода like условия будет нельзя. При указании like-условия, в запрос добавятся соответствующие where условия и select top N, где N - максимальное количеством записей справочника, которое может быть показано при выборе.
Так как при попытке открыть справочник, указанный в настройке RestrictedReferences, через объектную модель будет создано исключение, то для тех, кому доступ к полному справочнику все же нужен, необходимо создать отдельные сценарии для его открытия и показа с явным отключением ограничения с использованием ISBL-функций DisableCheckFullShowingRestriction и EnableCheckFullShowingRestriction.
Назначение событий – модификация стандартного выбора из справочника. Например:
Если в событии «Выбора из справочник» присутствуют ISBL вычисления, то новые события игнорируются.
Также следует помнить! Открывать набор данных в событии «До выбора из справочника» НЕЛЬЗЯ. Новые события не служат для "переопределения" стандартного выбора, они служат для уточнения реквизитов, по которым происходит поиск, а также для задания дополнительных условий.
В событии До выбора из справочника определим:
// Дополнительные реквизиты, в которых следует искать введенное значение
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.
Предположим, что из справочника Работники необходимо выбирать Подписывающего, с ограничением Состояние записи - Действующая. Подписывающий хранится в реквизите Подписал(Работник3).
Для этого переопределим выбор из справочника для реквизита Подписал(Работник3).
Для того чтобы переопределить выбор из справочника, в поле Выбор из справочника необходимо задать следующие вычисления на событиях До выбора из справочника и После выбора из справочника.
На событии До выбора из справочника:
// Дополнительные реквизиты, в которых следует искать введенное значение
LookUpRequisiteNames.Add('Подразделение')
LookUpRequisiteNames.Add('Строка')
// Реквизиты дополнительного фильтра
KeyReqInfoArray = ArrayOf(ArrayOf(SYSREQ_STATE; ;; "Д";;))
UseFirmContext = FALSE
BeforeSelectingFromRefRequisite(SelectMode; InputValue; LookUpReference;
KeyReqInfoArray; UseFirmContext)
где
([НАИМЕНОВАНИЕ][ТИП][ЗАГОЛОВОК][ЗНАЧЕНИЕ][ПРИЗНАК_ЗНАЧЕНИЯ][ПРИЗКАК_ФИЛЬТРУЕМОСТИ]),
где:
НАИМЕНОВАНИЕ - наименование реквизита;
ТИП - тип рекизита. Возможные значения:
'Справочник:<ИМЯ_СПРАВОЧНИКА>';
'Дата';
'Строка:<ДЛИНА_СТРОКИ>', <ДЛИНА_СТРОКИ> не более 255;
'Признак: Имя_значения1,Имя_значения2[,Имя_значенияN]';
'Число: ТОЧНОСТЬ';
'ДатаВремя'.
'Значение по умолчанию 'Строка:35';
ЗАГОЛОВОК - заголовок реквизита;
ЗНАЧЕНИЕ - значение реквизита, если есть;
ПРИЗНАК_ЗНАЧЕНИЯ - логическое значение. Возможные значения: "TRUE" - в значении хранится код записи справочника, "FALSE" - в значении хранится наименование записи справочника или его часть;
ПРИЗКАК_ФИЛЬТРУЕМОСТИ - логическое значение. Возможные значения: "TRUE" - фильтровать реквизиты по значению, "FALSE" - не фильтровать реквизиты по значению.
Нижняя граница внутренних массивов должна быть равна 0.
Если реквизит типа "Признак", то в качестве значения нужно указывать ИД допустимого значения реквизита, то есть внутреннее значение реквизита, хранящееся на сервере.
На событии После выбора из справочника используем функцию AfterSelectingFromRefRequisite, которая предназначена для восстановления первоначальных значений предопределенных переменных, если были наложены дополнительные фильтры на просмотр всех записей справочника в событии "До выбора из справочника":
LookUpRequisiteNames.DelimitedText = AfterSelectingFromRefRequisite(LookUpReference)
|
Пользовательский выбор из фильтруемого справочника с использованием функции BeforeSelectingFromFiltratedRefRequisiteДля того чтобы модифицировать выбор из фильтруемого справочника, в поле Выбор из справочника можно использовать функцию BeforeSelectingFromFiltratedRefRequisite и задать следующие вычисления на событиях До выбора из справочника и После выбора из справочника. Предположим, что необходим выбор из справочника Контактные лица организаций. Like-ввод дополнительно выполнять по Подразделению организации, показывать только действующие записи, отфильтровать по Организации. На событии До выбора из справочника пишем: В событии реквизита "До выбора из справочника" для типа справочника "Контактные лица организаций:
где параметры функции:
([НАИМЕНОВАНИЕ][ЗНАЧЕНИЕ]), где: НАИМЕНОВАНИЕ - наименование реквизита; ЗНАЧЕНИЕ - значение предопределенной переменной InputRequisiteValue. Реквизиты, указываемые в данном параметре, должны быть ключевыми, то есть эти же реквизиты должны быть указаны в функции фильтрации для справочника LookUpReference. Имя функции фильтрации 'Filtrare[ИМЯ_СПР]Reference', где ИМЯ_СПР - имя справочника, из которого производится выбор, заданное с помощью транслитерации. AddFilterReqArray - информация о реквизитах дополнительного фильтра в виде двумерного массива из 6 элементов: ([НАИМЕНОВАНИЕ][ТИП][ЗАГОЛОВОК][ЗНАЧЕНИЕ][ПРИЗНАК_СОДЕРЖИМОГО][ПРИЗНАК_ФИЛЬТРАЦИИ_ПО_ЗНАЧЕНИЮ]), где: НАИМЕНОВАНИЕ - наименование реквизита; ТИП - тип реквизита; ЗАГОЛОВОК - заголовок реквизита; ЗНАЧЕНИЕ - значение предопределенной переменной InputRequisiteValue; ПРИЗНАК_СОДЕРЖИМОГО - возможные значения: "TRUE" - в значении содержится код, "FALSE" - в значении содержится наименование; ПРИЗНАК_ФИЛЬТРАЦИИ_ПО_ЗНАЧЕНИЮ - возможные значения: "TRUE" - отфильтровать справочник по значению, "FALSE" - локализовать строку в справочнике по коду. Если реквизит типа "Признак", то в качестве значения нужно указывать ИД допустимого значения реквизита, то есть внутреннее значение реквизита, хранящееся на сервере. ВНИМАНИЕ. Реквизиты, указываемые в данном параметре, не должны быть ключевыми, то есть не должны быть указаны в функции фильтрации для справочника LookUpReference. Имя функции фильтрации 'Filtrare[ИМЯ_СПР]Reference', где ИМЯ_СПР - имя справочника, из которого производится выбор, заданное с помощью транслитерации. Если ведущий реквизит типа "Признак", то в качестве значения нужно указывать ИД допустимого значения реквизита, то есть внутреннее значение реквизита, хранящееся на сервере.
На событии После выбора из справочника используем функцию AfterSelectingFromRefRequisite, которая предназначена для восстановления первоначальных значений предопределенных переменных, если были наложены дополнительные фильтры на просмотр всех записей справочника в событии "До выбора из справочника":
|
Авторизуйтесь, чтобы написать комментарий