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;)
Усе.