Разработка справочников в Directum

10 10

Цикл статей для начинающего разработчика на IS-Builder

  1. Общие сведения о разработке на IS-Builder
  2. Язык ISBL
  3. Типовые варианты использования функций ISBL
  4. Основы работы с объектной моделью IS-Builder
  5. Разработка на ISBL. Постановка задачи
  6. Разработка справочников в Directum

Разработка справочников в Directum

В предыдущей статье цикла, была поставлена задача разработки решения упрощающего заведение новых пользователей. Первым этапом в разработке этого решения является создание необходимых справочников. В данной статье мы создадим четыре справочника:

  • Программное обеспечение;
  • Тип прав к программному обеспечению;
  • Типовые права доступа;
  • Права доступа работников на ПО.

Справочники

Программное обеспечение 

Начнём со справочника Программное обеспечение. Для этого необходимо запустить компоненту Типы справочников и добавить новую запись.

Заполним поля в открывшейся карточке нового типа справочника. В поле Имя нужно указать уникальное имя справочника, которое будет использоваться при программном обращении к справочнику. В имени справочника рекомендуется использовать только буквы, цифры и символ "_". Назовём наш справочник Software.

Поля Заголовоки Заголовок в ед. числе, в отличие от поля Имя, будут использоваться для отображения названия справочника в проводнике системы и могут быть локализованы. Нажатием на кнопку   в поле Заголовок, откроем компоненту Словарь локализации, в которой нужно выбрать строку локализации. Но так как требуемой строки локализации в системе еще нет, нам необходимо создать её. Создав новую строку локализации, заполним её карточку. Поле Имя заполнится сгенерированным значением, которое при желании можно изменить. В поле Группа укажем группу строки локализации. В табличной части укажем значения локализуемой статьи.

 

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

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

Остальные поля на вкладке Тип справочника оставим без изменений.

 

Перейдя на вкладку Реквизиты, мы увидим, что наш тип справочника уже содержит предопределённые реквизиты. Добавим дополнительные реквизиты, характеризующие программное обеспечение:

  • Экземпляр– реквизит типа Строка, длинна реквизита 50 символов;
  • *Ответственный– реквизит типа Справочник (ссылка на справочник Работники), обязательный реквизит;
  • Примечание– реквизит типа Строка, длинна реквизита 255 символов.

Реквизит Экземпляр будет использоваться для указания конкретного экземпляра установленного ПО, так как в организации может быть установлено несколько экземпляров одного типа ПО, например, несколько доменов. После согласования запроса на создание нового пользователя, администратору должно приходить задание на создание пользователя, в реквизите Ответственный, будет указан работник администрирующий данное ПО, именно ему будет приходить задание. Реквизит Примечание будет содержать  дополнительную информацию.

В IS-Builder один и тот же реквизит может использоваться в разных справочниках, причем данные хранящиеся в реквизите определяются логикой типа справочника, а не логикой реквизита. То есть реквизит Строка100 в одном справочнике может использоваться для хранения названия чего либо, а в другом для хранения примечания. Таким образом, реквизит это что-то вроде контейнера определённого типа, но не определяющего своё содержание. Как уже было сказано в статье Общие сведения о разработке на IS-Builder, для работы с реквизитами используется компонента Реквизиты справочников.

Для добавления реквизита в карточке типа справочника вызовем контекстное меню на пустой области табличной части Реквизиты и выберем пункт Добавить. В поле Раздел, появившейся строки, укажем значение Карточка, назначение этого поля будет описано далее в статье. В поле Имя по кнопке   укажем реквизит типа Строка с длинной 50 символов. Скорее всего, реквизиты с нужными параметрами уже существует, поэтому создавать реквизит не придётся. Необходимо учитывать, что один и тот же реквизит не может использоваться в одном типе справочника дважды.

В случае если требуемого реквизита в системе нет, его нужно создать и сгенерировать. Для этого запустим компоненту Реквизиты справочников и кликнем по кнопке добавления записи. В появившемся окне необходимо указать уникальное Имя реквизита, оно будет использоваться для обращения к реквизиту, кроме этого нужно указать уникальное Имя поля, которое является именем поля в базе данных. В поле Заголовок укажем заголовок реквизита, который будет использоваться по умолчанию. В поле Тип выберем нужный тип реквизита. После этого заполним все необходимые оставшиеся поля. Подробнее о назначении каждого поля можно прочитать в справке, которую можно вызвать клавишей ‘F1’.

После выбора реквизита укажем его заголовок и обязательность. По аналогии добавим оставшиеся реквизиты. Не забудем в табличной части указать, что реквизит Ответственный, является обязательным для заполнения. У вас должно получиться примерно следующее:

Теперь сформируем карточку типа справочника, то есть её внешний вид. Для этого сохраним тип справочника, после сохранения типа справочника разблокируется кнопка Форма, по нажатию на неё откроется редактор формы. В левой части окна мы увидим дерево реквизитов, из которого нужно перенести реквизиты на форму. Перенесём нужные реквизиты методом Drag & Drop и настроим их расположение на форме.

Длина реквизита Примечание - 255 символов, редактировать его в одной строке будет неудобно, поэтому целесообразно использовать для его отображения на форме многострочное поле. Для этого на панели инструментов выберем Многострочное поле и расположим его на форме, после этого, для установления связи перенесём реквизит на это поле.

Предопределённый реквизит Наша организация переносить на форму не имеет смысла, так как его нельзя изменить, а посмотреть его значение можно будет в статусной строке созданной записи справочника.

Под группой со стандартными кнопками присутствует группа для дополнительных кнопок, поскольку их в нашем справочнике не будет, можно её удалить. Так как карточка нашего справочника будет содержать не много реквизитов, её можно уменьшить. В результате, у вас должна получиться форма, похожая на эту:

 

Типы прав к программному обеспечению

После сохранения изменений и закрытия редактора форм, по аналогии создадим справочник Типы прав к программному обеспечению. При создании данного справочника, необходимо будет создать две разные строки локализации для полей Заголовок и Заголовок в ед. числе. Назовём наш справочник PermissionsType:

 

У каждого ПО может существовать свой набор прав доступа, поэтому необходимо связать типы прав с конкретным ПО. Для этого в справочник Типы прав к программному обеспечению добавим реквизит, ссылающийся на запись справочника Программное обеспечение. Так как справочник Программное обеспечение новый, в системе еще не создан реквизит, ссылающийся на этот справочник. Создадим его:

После сохранения реквизита нужно сгененрировать его, для этого предназначена кнопка Генерировать.

Сгенерировав реквизит мы можем добавить его в наш справочник, кроме этого в табличной части реквизитов необходимо указать что реквизит ведущий. Этим мы укажем системе что создаваемый справочник и справочник Программное обеспечение логически связанны между собой. То есть конкретному ПО, соответствуют свои права доступа, и наоборот.

Добавим так же реквизит Примечание. Сохраним карточку и расположим реквизиты на форме:

 

Типовые права доступа

Таким образом, мы создали справочник, который позволит на каждое ПО завести отдельный тип прав. Например, мы можем создать тип прав Полные права к Учетной системе используемой на предприятии и тип прав Создание заявок на оплату в ERP-системе. При приеме на работу сотрудника, которому нужны оба типа прав, их необходимо будет добавлять по одному. Для автоматизации процесса добавления типов прав группами создадим еще один справочник Типовые права доступа. В такой справочник можно будет добавить запись, которая будет содержать набор типов прав доступа, то есть будет являться, своего рода, контейнером набора записей предыдущего справочника. Добавив в такой справочник запись с наименованием Типовые права бухгалтера, а также связав их с типами прав Полные права к Учетной системе и Типовые права доступа, мы облегчим процесс заведения пользователя для сотрудника бухгалтерии.

Для реализации справочника воспользуемся детальными разделами. Выше упоминалось о значении свойства Раздел в табличной части реквизитов типа справочника, данное свойство указывает к какому разделу относится реквизит, всего доступно 7 значений: Карточка, Таблица, Таблица2, …, Таблица6. При выборе значения Карточка, реквизит относится к карточке записи, при выборе остальных значений реквизит относится к одному из шести детальных разделов, которые представляют собой контейнер для множества записей(строк). На форме карточки записи справочника детальные разделы отображаются в виде таблицы, где колонками являются реквизиты детального раздела. Для физического хранения данных детальных разделов в базе данных используются таблицы MBAnValR, MBAnValR2, ..., MBAnValR6. Для хранения данных карточки - MBAnalit.

Создадим справочник Типовые права доступа, дадим ему имя TypicalPermissions и добавим детальный раздел(Таблица) с обязательным реквизитом типа Справочник (ссылка на справочник Тип прав к программному обеспечению). Для обеспечения работы связи ведущий-ведомый, необходимо чтобы реквизита Программное обеспечение в табличной части был меньше чем реквизита Тип прав к программному обеспечению.

Добавим, так же,  реквизит Примечание в основной раздел (карточку).

 

Перенесём реквизиты карточки и сам детальный раздел на форму.

Права доступа работников на ПО

Пришло время создать справочник, который будет решать поставленную ранее задачу, используя созданные справочники. Основной частью данного справочника будет табличная часть, которая будет состоять из двух колонок Програмное обеспечение и Тип прав. Создадим справочник с именем UserPermissions и добавим следующие реквизиты:

  • *Работник - ссылка на справочник Работники;
  • *Логин – строка в 20 символов, для хранения логина, который нужно создать;
  • *Приступает к работе с – реквизит типа Дата;
  • Примечание – строка в 255 символов;
  • Реквизиты детального раздела:
    • *Програмное обеспечение – ссылка на справочник Программное обеспечение;
    • *Тип прав – ссылка на справочник Тип прав к программному обеспечению.

Напомню, что для обеспечения работы связи ведущий-ведомый, необходимо, чтобы реквизита Программное обеспечение в табличной части был меньше чем реквизита Тип прав к программному обеспечению.

Реквизит Наименование в этом справочнике будет генерироваться автоматически, поэтому сделаем его не обязательным и доступным только для чтения. Запретить изменение реквизита можно в редакторе форм, выделив элемент управления связанный с реквизитом и в его свойствах установить параметру Только чтение значение Да.

Для того чтобы в карточке справочника была возможность выбирать запись справочника Типовые права доступа, нам нужно добавить кнопку на форму карточки. В IS-Builder вычисления пользовательских кнопок связываются с Действиями. Для того чтобы добавить действие перейдите на закладку Действия и в табличной части заполните имя и заголовок нового действия, после чего сохраните изменения.

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

Вычисления

У каждого справочника есть события, код которых выполняется после, до или при выполнении определенных действий с данными. События являются предопределенными, разработчик не может добавлять или удалять их, но есть возможность отключать события. События могут относиться к набору данных, записи, операции, форме-карточки, таблице, реквизиту. В коде событий можно использовать предопределенные переменные, так, например, в событии Карточка.Добавление После переменная Object указывает на новую добавляемую запись. Подробнее о событиях можно почитать в справке.

Создав справочники, добавим простые вычисления, упрощающие жизнь пользователю. Было бы удобно заполнять поле  *Приступает к работе с сегодняшей датой. Для этого в карточке типа справочника Права доступа работников на ПО по кнопке События, вызываем окно редактора событий, в левой части окна перечисленны события к которым можно привязать вычисления. Выбрав событие Карточка.Добавление После, в области редактирования кода напишем его вычисление:

  // Заполнить реквизит 'Приступает к работе с' текущей датой
  Object.Дата = Today()

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

Таким образом, при добавлении новой записи, реквизит Дата(*Приступает к работе) заполнится текущей датой.

Для примера, работы с событиями реквизитов, добавим авто-формирование наименования при сохранении карточки записи. В событие Карточка.Сохранение До добавим следующий код:

  // Заполнить Наименование по формату 'Права доступа <Логин> (<Код>)'
  // 'Права доступа %s (%s)'
  Name = LoadStringFmt('PermissionsFormat'; 'Demo';
                       ArrayOf(Trim(Object.Реквизит); Trim(Object.SYSREQ_CODE))) 
  Object.SYSREQ_NAME = Name 

Теперь при сохранении карточки, наименование записи сформируется автоматически.

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

  // Проверить логин на содержание пробелов
  if CharPos(' '; Trim(Object.Реквизит)) > 0
    // 'Логин не должен содержать пробелов'
    Message = LoadString('DIR26C9F5DA_1E85_4F6E_9CB0_2B2715B2F298'; 'Demo')
    Raise(CreateException("EBadLoginName"; Message; ecWarning))        
  endif

Вычисление на кнопку Добавить типовые права выходит за рамки данной статьи и будет создано в следующей статье.

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

 

Пакет разработки для Directum версии 4.5.0ref_directum.zip (21,40 Кб)

Пакет разработки для Directum версии 5.1ref_directum51.zip (24,67 Кб)

 

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

Недавно заметил, что если "Имя" реквизита задать "ИД", то он не будет отображаться в реквизитах на форме.

Дмитрий Шамонов

 

Выбрав событие Карточка.Добавление После, в области редактирования кода напишем его вычисление:

  // Заполнить реквизит 'Приступает к работе с' текущей датой
  Object.Дата = Today()

 

У Меня нет Карточка.Добавление После есть Запись.Добавление После, Я туда вставляю этот код при попытке создать запись в этом справочнике ошибка: Method 'Дата' not supported by automation object. Версия Directum 4.7, IS-Builder 7.8.3.1041  

Иван Чурбаков

Чтобы не было ошибки, в справочнике должен быть реквизит с кодом Дата.

Артём Кунашев

Дмитрий, имя реквизита *Приступает к работе справочника Права доступа работников на ПО должно быть Дата.

Ольга Чигринова

В событие Запись.Сохранение До добавляю следующий код:

 

// Заполнить Наименование по формату 'Права доступа <Логин> (<Код>)'
  // 'Права доступа %s (%s)'
  Name = LoadStringFmt('PermissionsFormat'; 'Demo';
                       ArrayOf(Trim(Object.Реквизит); Trim(Object.SYSREQ_CODE))) 
  Object.SYSREQ_NAME = Name

при попытке сохранить  запись в этом справочнике выскакивает ошибка: Method 'Реквизит' not supported by automation object. Версия Directum 4.7

 

Ольга Чигринова

при использовании следующего кода:

 

// Проверить логин на содержание пробелов
  if CharPos(' '; Trim(Object.Реквизит)) > 0
    // 'Логин не должен содержать пробелов'
    Message = LoadString('DIR26C9F5DA_1E85_4F6E_9CB0_2B2715B2F298'; 'Demo')
    Raise(CreateException("EBadLoginName"; Message; ecWarning))        
  endif

 

выскакивает ошибка: Method 'Реквизит' not supported by automation object. Версия Directum 4.7

Дмитрий Тарасов

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

Адик Крымгужин

выскакивает ошибка: Method 'Реквизит' not supported by automation object. Версия Directum 4.7
Лечится обычно использованием "Requisites"

Object.Requisites('Дата').Value
Елена Акулина

предпоследний коммент на миллион. спасибо, Дмитрий

Вадим Грозов

Добавлен пакет разработки для DIRECTUM 5.0.

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