Варианты запроса данных в DIRECTUM

49 18

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

1. Чаще всего диалог запроса параметров создается с помощью функций  InputDialog()/InputDialogEx(). Функции используются, например, в отчетах или в сценариях. Можно запрашивать параметры типа «Строка», «Число», «Дата», «Запись справочника», «Признак». В функции InputDialogEx() также можно добавить на диалог дополнительные кнопки. У функций достаточно подробная справка, поэтому не  буду в этой статье описывать все возможности.

InputData = InputDialog(
    // Метки полей ввода  
    '*Плановый срок исполнения с|*Плановый срок исполнения по|Наша организация|Автор|Подразделение|Состояние исполнения';
    // Значения по умолчанию
    Format('%s|%s||||%s'; ArrayOf(BeginOfMonth(); EndOfMonth(); 'Все'));
    // Типы полей ввода
    'Дата|Дата|Аналитика:НОР|Аналитика:РАБ|Аналитика:ПОД|Признак:Все,Просроченные';
    // Заголовок 
    'Установка фильтра для отчета') 
// Получить указанные значения
PlanDateFrom = SubString(InputData; '|'; 1)
PlanDateTo = SubString(InputData; '|'; 2)
OurOrgCode = SubString(InputData; '|'; 3)
AuthorCode = SubString(InputData; '|'; 4)
DepartmentCode = SubString(InputData; '|'; 5)
PerformerState = SubString(InputData; '|'; 6) 

Функция возвращает строку, состоящую из значений полей ввода, разделенных символом "|".

2. Если необходимо сообщение с выбором возможных действий, то можно использовать  MessageBox()\MessageBoxEx().

  Button = MessageBoxEx(
    // Заголовок формы
    CONFIRMATION_CAPTION; 
    // Текст сообщения
    'Показателю уже назначено раписание.'; ;
    // Список кнопок 
    'Открыть раписание|Удалить связь с расписанием|Выбрать новое расписание'; ; ; ; 
    // Стиль кнопок 
    cbsCommandLinks)  

Функция возвращает заголовок нажатой кнопки.

Или

3. Можно создать диалог с двумя списками с помощью  функции CreateDualListDialog(). Используется для выбора нескольких значений, лучше использовать, когда выбирается из относительно небольшого списка значений, иначе будет неудобно выбирать. Дополнительная возможность – можно задавать порядок выбранных значений.

DualList = CreateDualListDialog()
DualList.Title = "Группы документов"
DualList.AvailableItemsTitle = 'Доступные группы документов'
DualList.SelectedItemsTitle = 'Выбранные группы документов'
DocGroupsRef = References.ГД.GetComponent()
foreach Record in DocGroupsRef
  DualList.AvailableItems.Add(Record.SYSREQ_NAME)
endforeach
DualList.Execute() 
// Все выбранные значения записать в строку-информацию 
DualList.SelectedItems.Delimiter = ","
Data = DualList.SelectedItems.DelimitedText  

 

4. Также для выбора одного или нескольких значений можно использовать функцию ПВыборSQL()

  // Запрос показателей: действующие, утвержденные, с типом расчета Авто
  Query = PreprocQuery(Format(
    'select 
       indicators.!KeyPerfomanceIndicators.%s! 
    from
      !KeyPerfomanceIndicators! indicators
    where
      indicators.!KeyPerfomanceIndicators.ComponentIDField! = !KeyPerfomanceIndicators.ComponentID!
      and indicators.!KeyPerfomanceIndicators.%s! = "Д"
      and indicators.!KeyPerfomanceIndicators.%s! = "+"
      — тип расчета "Авто"
      and indicators.!KeyPerfomanceIndicators.CalculationType! = "A"'; ArrayOf('Дополнение'; SYSREQ_STATE; SYSREQ_RECORD_STATUS)))
  SelectIndicators = ПВыборSQL(
   // Заголовок
   'Выбор показателей'; 
   // Запрос выбора показателей
   Query; ; )
  if SelectIndicators <<>> 'НЕУДАЧА: ESC!'
    foreach IndicatorFullName in CSubString(SelectIndicators; '|')
      ShowMessage(IndicatorFullName)        
    endforeach
  endif

Функция возвращает выбранные значения через разделитель, заданный в параметре функции (по умолчанию '|') или 'НЕУДАЧА: ESC!' в случае отмены.

 

5. И еще одна функция для выбора одного или нескольких значений – ВыборSQL().

  Query = "select Name from MBRegUnit"
  SelectUnits = ВыборSQL(
    // Заголовок
    "Модули (Shift и Ctrl-множественный выбор)";
    // Название колонки
    "Наименование модуля";
    // Запрос 
    Query;
    // Сортировка 
    "1 ASC";;)
  if SelectUnits <<>> 'НЕУДАЧА: ESC!'
    foreach UnitName in CSubString(SelectUnits; '|')
      ShowMessage(UnitName)        
    endforeach
  endif
Функция возвращает выбранные значения через разделитель, заданный в параметре функции (по умолчанию '|') или 'НЕУДАЧА: ESC!' в случае отмены. 

6. Если нужно выбрать одну или несколько записей из одного справочника и чтобы у пользователей была возможность открыть карточку записи, настроить видимые колонки, установить фильтр при выборе, то можно открыть справочник на выбор.

  Ref = CreateReference('KeyPerfomanceIndicators')
  // Создать предтставление
  View = Ref.CreateView(Ref.MainViewCode)
  // Окрыть справочник на выбор
  View.ViewMode =  vmSelect 
  // Разрешить множественный выбор
  View.MultiSelection = TRUE
  View.MainForm.Show
  // Если выбрали записи, то получить ИД выбранных значений
  if View.MainForm.Result = mrOK
    Index = 0
    while Index < View.SelectedRecordCount 
      // Показать ИД записи
      ShowMessage(View.SelectedRecordsID(Index))
      Index = Index + 1   
    endwhile
  endif
 

7. Функция создания различных системных диалогов CreateDialog(). Используется, например, для создания диалога назначения прав. Чтобы узнать какие диалоги создаются с помощью функции, можно посмотреть какие существуют константы с префиксом SYSDLG, среди них SYSDLG_CURRENT_PERIOD, SYSDLG_SETUP_TASK_OBSERVERS, SYSDLG_CREATE_EDOCUMENT и т.д. По названию константы ясно какой диалог она создает.

ВНИМАНИЕ: описанные возможности не документированы, значит использовать их можно только под свою ответственность!

  // Получить документ
  Doc = EDocuments.GetObjectByID(110320)
  // Создать диалог
  AccessRights = CreateDialog(ACCESS_RIGHTS_SETTING_DIALOG_CODE; "")
  // Задать параметры диалога
  AccessRights.Params.Add("ReadOnly"; FALSE)
  AccessRights.Params.Add("EdmsObject"; Doc)
  AccessRights.CreateView(AccessRights.MainViewCode)
  AccessRightsForm = AccessRights.View.Forms(FORMCARD_NAME)
  AccessRightsForm.Show
  AccessRights = nil

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

  // Получить нужную запись справочника
  FindRec = References.ПРК.GetObjectByCode('Д000021')
  FindRec.CreateView('Поиск')
  // Открыть карточку
  FindRec.View.Forms(FORMCARD_NAME).Show
  // Получить значения реквизитов с карточки показанной записи
  ReqValue = FindRec.Requisites(<Имя реквизита>).AsString

  

9. Для запроса папки или файла следует использовать CreateSaveDialog()\CreateOpenDialog() и CreateFolderDialog().

  // Создать диалог сохранения файла  
  SaveDialog = CreateSaveDialog()
  // Задать ограничение на типы фалой 
  SaveDialog.Filter = 'Export file (*.xml)|*.xml'
  // Заголовок
  SaveDialog.Title = 'Экспорт показателей эффективности'
  // Запретить множвественный выбор
  SaveDialog.MultiSelect = FALSE
  SaveDialog.Execute
  // Получить имя выбранного файла
  FileName = SaveDialog.Result

  

10. В типовых маршрутах запрашиваемые параметры регулируются установкой галочки Запрашивать. Запрос параметров таким способом дает возможность запрашивать параметры в веб-доступе тоже.

 

11. Еще один способ выбора – это показывать результаты поиска. Используется для выбора электронных документов, задач, заданий.

  Search = Searches.CreateNew(ckEDocument)
  WherePart = 'EDocuments.Name like "Договор"'
  Search.SearchCriteria.AddWhere = WherePart
  Search.Description = 'Выберите основной документ для согласования' 
  // Выбор только 1 документа
  Search.Show(ssmSelect; TRUE)
  // Получить выбранные документы
  SelectedEDocuments = Search.SelectedContents  
  if Assigned(SelectedEDocuments)
    foreach Doc in SelectedEDocuments
      // Показать ИД выбранного документа
      ShowMessage(Doc.ID)     
    endforeach
  endif

 

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

49
Авторизуйтесь, чтобы оценить материал.
6
Иван Середкин

Отличная статья! Ксения, спасибо за проделанный труд

Константин Белов

По п.6 вопрос. При как реализовать отмену выбора? У меня и при нажатии на Esc и при нажатии на закрытие окна справочника SelectedRecordCount = 1 и в SelectedRecordsID -  ИД записи на которой был установлен курсор при открытии. Как-то это можно обойти?
 

Константин Белов

Разобрался. Нужно получить форму список и у неё смотреть результат:

ListForm = View.MainForm
ListForm.Show
if ListForm.Result == mrOk
 //Значит выбрали
endif
Андрей Литвинов

Это все конечно здоров, но вот если бы разработчики реализовали возможность "рисования" форм для сценариев, то это решила бы массу проблем.

Антон Юминов
"рисования" форм для сценариев
Зачем? Если приближать IS-Builder к общеспециализированным средам разработки, он перестанет быть простым и понятным. Если нужны формы и что-то совершенно не заложенное в IS-Builder, то может быть лучше взять Visual Studio, Delphi... и обращаться к объектной модели DIRECTUM?
Дмитрий Тарасов

О! Антон подкинул отличную идею! Надо взять на вооружение yes

Евгений Иванов

10. В типовых маршрутах запрашиваемые параметры регулируются установкой галочки Запрашивать. Запрос параметров таким способом дает возможность запрашивать параметры в веб-доступе тоже.

Было бы неплохо добавить в запрос параметров ТМов возможность переопределять выбор. Как это сделано в карточках и справочниках.

Антон ИСУПОВ

Отличный материал! Спасибо, Ксения. Хорошо бы еще посмотреть на то как предложенные варианты возвращают выбор пользователя, для дальнейшего разбора.

Ксения Останина

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

Антон ИСУПОВ

Замечательно! Теперь, однозначно, в HowTo или MustHave !
 

Marina Kobzar

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

Алексей Марков

Как можно отсортировать список в поле "Доступные"

Может поможет добавить сортировку, например так: 

DocGroupsRef = References.ГД.GetComponent()
DocGroupsRef.Index = "Наименование;ASC"
DocGroupsRef.Indexed = True
Marina Kobzar

Спасибо, помогло.

Денис Баранов

Дополнение к материалу - выбор списка пользователей описан в Форма для заполнения списка пользователей.

Анна Долганова

А можно ли менять цвет текста полей в InputDialog?

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

На текущий момент, штатными средствами такое сделать нельзя.

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

Можно, например, в Delphi нарисовать необходимые формы с нужными цветами текста полей и запихать их в dll-ку. Потом в нужных местах на isbl вызывать эти формы из dll. Правда могут возникнуть проблемы со стабильностью и быстродействием системы. Все зависит от того, на сколько у программиста прямые руки и он должен понимать, что он делает, как делает и где это можно применять, а где нет. 

Сергей Радыгин

 

Добрый день. 

Скажите, пожалуйста, можно увеличить размер поля типа "Строка" в функциях InputDialog и InputDialogEx? По умолчанию создаётся поле размером 160 символов. 

Речь идёт именно о видимом размере,  а не об общей длине строки, которую можно записать в это поле.

Версия 4.7.0.

Спасибо.

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