Directum. Пользовательский выбор из справочника. Ссылка на самого себя

Расскажу про пользовательский выбор из справочника, когда в справочнике используется ссылка на самого себя (тот же справочник) в табличном разделе. Ну нужно мне так 🙂

Есть два варианта реализации:
1. Выводить предупреждение, когда пользователь выбирает тот же справочник, что у нас уже открыт (ссылку на самого себя).
2. Переопределить выбор из справочника, исключив из вывода текущий справочник.

Итак, реализуем:

1. В событии нашего справочника Карточка.Открытие пишем:

  if not Sender.Inserted //если это не новая запись
//  запишем в переменную окружения(используется при выборе детального раздела, если юзер неверно выбрал подобъект) 
  if (Object.DetailExists(1))
    ODS = Object.DetailDataSet(1)
    if (ODS.RecordCount > 0)
      REG_PLACES_VAR_SUBOBJ_CODE = "SubObject"
      Object.Environment.SetVar(REG_PLACES_VAR_SUBOBJ_CODE; ODS.Requisites("TD_rObjects").AsString)
    endif
  endif  

,где

TD_rObjects - реквизит табличной части, ссылающийся на наш справочник.

Здесь мы записали в переменную окружения старое значение реквизита с тем, чтобы восстановить его при неверном выборе юзера.

Теперь в вычислении реквизита TD_rObjects детального раздела нашего справочника пишем:

//чтобы не добавить свой объект(самого себя)
  ODS = Object.DetailDataSet(1)
  if (TRIM(ODS.Requisites("TD_rObjects").AsString) == TRIM(Object.Requisites("КОД").AsString))
    ShowMessage("Нельзя ссылаться на текущий объект!")
    REG_PLACES_VAR_SUBOBJ_CODE = "SubObject"
    Index = Object.Environment.IndexOfName(REG_PLACES_VAR_SUBOBJ_CODE)
    if Index > -1
      ODS.Requisites("TD_rObjects").Value = Object.Environment.ValueByName(REG_PLACES_VAR_SUBOBJ_CODE) 
    else
      ODS.Requisites("TD_rObjects").Value = "" 
    endif
  endif

Вариант нумбер ту:

2. В пользовательском выборе из справочника нашего реквизита табличного раздела, ссылающегося на справочник (TD_rObjects), пишем:

    ADD_WHERE_VARIABLE_NAME = "AddWhereCondition" 
    // Сформировать дополнительное условие по типу обращений и месту регистрации.
    Conditions = CreateStringList() 
    Conditions.Delimiter = " and "
    data = СпрПолеЗнач(;; Object.Requisites("Код").SQLFieldName;)
    QueryTemplate = "!TD_Objects!.!TD_Objects.Код! not like '%0:s%1:s'"     
    Conditions.Add(Format(QueryTemplate; ArrayOf("%";data)))
    query = PreprocQuery(Conditions.DelimitedText)
    Object.Environment.SetVar(ADD_WHERE_VARIABLE_NAME; query)   
    SelectFromReferenceAction('TD_Objects'; SelectMode; InputValue; Requisite; nil;)

Усе.

Рекомендовать в Социальных сетях:
 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Тариф Смарт МТС на сайте http://mts-smart.ru/ Как подключить и отключить тариф Smart.