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

8 6

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

 

Для использования функции нам понадобятся предопределенные переменные:

    SelectMode - тип выбора из справочника, принимает значения:

  smSelect – показ формы-списка;

  smLike – показ отфильтрованного по введенному значению списка записей;

  smCard – показ формы-карточки для введенного в поле значения.

    InputValue - текст, введенный в управляющий элемент, который связан с реквизитом. 

    Requisite – ссылка на реквизит типа IRequisite, событие Выбор из справочника которого переопределяем.  

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

Пример №1

Простейший выбор без дополнительных условий на примере выбора подразделения без учета нашей организации (за это отвечает параметр функции UseFirmContext, который в данном примере = FALSE):

SelectFromReferenceAction("ПОД"; SelectMode; InputValue; Requisite; nil; FALSE)

Благодаря использованию переменной Requisite этот код отработает и для реквизитов карточки и для реквизитов табличных частей.

Пример №2

Выбор работника из уже указанного подразделения (оба реквизита находятся в табличной части):  

  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) 

Пример №4

Выбор журнала регистрации обращений в справочнике Номенклатура дел с использованием произвольного условия на 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;;)

Пример №5

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

  Окружение('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 и выше.

Евгений Романчук

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

 

 KeyReqInfoArray = ArrayOf(
    ArrayOf('Состояние'; "ВЭД";; "Д";;))
  SelectFromReferenceAction("ВЭД"; SelectMode; InputValue; Requisite; KeyReqInfoArray;)
Дмитрий Тарасов

Мария, вы точно должны знать ответ на вопрос: http://club.directum.ru/forum/topic1303-пользовательскии-выбор-из-справочника-шаблоны-электронных-документов.aspx

Без вас никак не разобраться :)

Алексей Пестов

А как можно было догадаться о существовании имени переменной окружения:

ADD_WHERE_VARIABLE_NAME = "AddWhereCondition" ?
Дмитрий Гойнаш

В который раз комментарии полезнее статьи.
 

Александр Кузнецов

Мария, ссылка http://support.directum.ru/Login.aspx?ReturnUrl=%2fdoc.aspx%3fId%3d1749466&Id=1749466 не рабочая...(

Вадим Грозов
Мария, ссылка 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

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