В этой статье я хочу рассказать, как переопределить пользовательский выбор из справочника с использованием функции 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
Авторизуйтесь, чтобы написать комментарий