В этой статье я хочу рассказать, как переопределить пользовательский выбор из справочника с использованием функции SelectFromReferenceAction(). Также для переопределения выбора можно использовать функцию SelectFromFiltrateReferenceAction(), но она предназначения для выбора из фильтруемого справочника, подробнее смотрите здесь Использование механизма фильтрации справочников. Ну а в большинстве случаев подойдет SelectFromReferenceAction().
Для использования функции нам понадобятся предопределенные переменные:
● SelectMode - тип выбора из справочника, принимает значения:
● smSelect – показ формы-списка;
● smLike – показ отфильтрованного по введенному значению списка записей;
● smCard – показ формы-карточки для введенного в поле значения.
● InputValue - текст, введенный в управляющий элемент, который связан с реквизитом.
● Requisite – ссылка на реквизит типа IRequisite, событие Выбор из справочника которого переопределяем.
Далее я приведу несколько примеров, которые раскроют возможности данной функции.
Простейший выбор без дополнительных условий на примере выбора подразделения без учета нашей организации (за это отвечает параметр функции UseFirmContext, который в данном примере = FALSE):
SelectFromReferenceAction("ПОД"; SelectMode; InputValue; Requisite; nil; FALSE)
Благодаря использованию переменной Requisite этот код отработает и для реквизитов карточки и для реквизитов табличных частей.
Выбор работника из уже указанного подразделения (оба реквизита находятся в табличной части):
KeyRequisite = Object.DetailDataSet(1).Requisites("ПодразделениеТ")
KeyRequisiteArray = ArrayOf(ArrayOf("Подразделение"; "Справочник:ПОД";
KeyRequisite.Title; KeyRequisite.AsString; TRUE; TRUE))
SelectFromReferenceAction("РАБ"; SelectMode; InputValue; Requisite;
KeyRequisiteArray; FALSE)
Пример №3
Выбор договора в справочнике договоры, с ограничением по категории договора, организации и нашей организации
EMPTY_REQUISITE_TYPE = 'Пусто'
// Сформировать список ключевых реквизитов.
KeyRequisiteList = CreateInitializedList(ArrayOf(
ArrayOf('КДГ'; 'КатегорияДоговора');
ArrayOf('ОРГ'; 'Организация');
ArrayOf('НОР'; 'НашаОрг2')))
// Сформировать массив ключевых реквизитов.
KeyRequisiteArray = ArrayOf(ArrayOf(Requisite.Name; EMPTY_REQUISITE_TYPE;
Requisite.Title; Requisite.AsString; TRUE; TRUE))
I = 0
foreach KeyRequisiteName in KeyRequisiteList
KeyRequisite = Object.Requisites(KeyRequisiteName)
if not VarIsNull(KeyRequisite.Value)
KeyRequisiteArray = AddElementToArray(KeyRequisiteArray;
ArrayOf(KeyRequisiteName; "Справочник:" & KeyRequisiteList.Names(I);
KeyRequisite.Title; KeyRequisite.Value; TRUE; TRUE))
endif
I = I + 1
endforeach
SelectFromReferenceAction("ДГВ"; SelectMode; InputValue; Requisite;
KeyRequisiteArray; FALSE)
Выбор журнала регистрации обращений в справочнике Номенклатура дел с использованием произвольного условия на T-SQL:
ADD_WHERE_VARIABLE_NAME = "AddWhereCondition"
// Сформировать дополнительное условие по типу обращений и месту регистрации.
Conditions = CreateStringList()
Conditions.Delimiter = " and "
if not In(ArrayOf('All'; ''); Object.Requisites("ClaimKindAdd").AsString)
Conditions.Add(Format("
isnull(!ClaimLogs!.!ClaimLogs.ClaimKindAdd!, 'A') in ('%s','A')";
СпрПолеЗнач(;; Object.Requisites("ClaimKindAdd").SQLFieldName;)))
endif
Conditions.Add(Format("isnull(!ClaimLogs!.!ClaimLogs.МестоРег!, '') in ('%s', '')";
СпрПолеЗнач(;; Object.Requisites("МестоРег").SQLFieldName;)))
Object.Environment.SetVar(ADD_WHERE_VARIABLE_NAME;
PreprocQuery(Conditions.DelimitedText))
SelectFromReferenceAction('ClaimLogs'; SelectMode; InputValue; Requisite; nil;;)
Выбор персоны в представлении граждане с открытием справочника, если подходящих записей нет или она только одна:
Окружение('ShowReferenceWithOutRecord'; FALSE)
Окружение('ShowReferenceWithOneRecord'; TRUE)
SelectFromReferenceAction(RefName; SelectMode; InputValue;
Object.Requisites('Персона'); ; ;'Граждане')
PersonCode = Object.Requisites('Персона').AsString
// Сформировать ФИО для выбранной персоны
CorrectName = InputValue
if RefCode <<>> ""
PersonLastName = GetRequisiteValueAsString(RefName; PersonCode; 'Дополнение')
PersonName = GetRequisiteValueAsString(RefName; PersonCode; 'Дополнение2')
PersonPatronymic = GetRequisiteValueAsString(RefName; PersonCode; 'Дополнение3')
CorrectName = Format('%s %s %s'; ArrayOf(PersonLastName; PersonName;
PersonPatronymic))
endif
Requisite.Value = CorrectName
Обратите внимание, в этом примере кода обрабатывается ситуация, когда отображать нужно не наименование выбираемой записи. Для этого используется 2 реквизита:
Ну вот, надеюсь, эти примеры будут неплохим подспорьем к справке по функции SelectFromReferenceAction(). Кстати, примеры актуальны для DIRECTUM 4.6 и выше.
Авторизуйтесь, чтобы написать комментарий
Может будет кому полезным, пример фильтрации по реквизиту типа "Признак", на примере справочника Виды электронных документов по значению состояния "Действующая"
Мария, вы точно должны знать ответ на вопрос: http://club.directum.ru/forum/topic1303-пользовательскии-выбор-из-справочника-шаблоны-электронных-документов.aspx
Без вас никак не разобраться :)
А как можно было догадаться о существовании имени переменной окружения:
В который раз комментарии полезнее статьи.
Мария, ссылка http://support.directum.ru/Login.aspx?ReturnUrl=%2fdoc.aspx%3fId%3d1749466&Id=1749466 не рабочая...(
Документу уже почти 10 лет - видимо, за неактуальностью его и удалили с сайта поддержки. Но ссылку на всякий случай поправил, скачивайте.
http://club.directum.ru/images/axd/c7e14437-7c73-45c6-8eb5-f1ff23349dff.zip