Для запроса у пользователя необходимых данных в системе 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
В зависимости от поставленной задачи следует выбирать соответствующий способ запроса данных, главное – нужно стремиться, чтобы пользователю было максимально удобно.
Отличная статья! Ксения, спасибо за проделанный труд
По п.6 вопрос. При как реализовать отмену выбора? У меня и при нажатии на Esc и при нажатии на закрытие окна справочника SelectedRecordCount = 1 и в SelectedRecordsID - ИД записи на которой был установлен курсор при открытии. Как-то это можно обойти?
Разобрался. Нужно получить форму список и у неё смотреть результат:
Это все конечно здоров, но вот если бы разработчики реализовали возможность "рисования" форм для сценариев, то это решила бы массу проблем.
О! Антон подкинул отличную идею! Надо взять на вооружение![yes yes](http://club.directum.ru/js//CKEditor/plugins/smiley/images/thumbs_up.gif)
10. В типовых маршрутах запрашиваемые параметры регулируются установкой галочки Запрашивать. Запрос параметров таким способом дает возможность запрашивать параметры в веб-доступе тоже.
Было бы неплохо добавить в запрос параметров ТМов возможность переопределять выбор. Как это сделано в карточках и справочниках.
Отличный материал! Спасибо, Ксения. Хорошо бы еще посмотреть на то как предложенные варианты возвращают выбор пользователя, для дальнейшего разбора.
Дополнила рассмотренные примеры получением указанных пользователем значений.
Замечательно! Теперь, однозначно, в HowTo или MustHave !
У меня вопрос к 3 пункт. Столкнулась с такой проблемой, что при открытии окна запроса параметров, система в левом поле не сортирует значение по наименованию. В моем случае это выбор со справочника, где более 100 записей, и не удобно находить нужное значение. Вопрос: Как можно отсортировать список в поле "Доступные" по наименованию ну и соответственно в поле справа -"Выбраные".
Как можно отсортировать список в поле "Доступные"
Может поможет добавить сортировку, например так:
Спасибо, помогло.
Дополнение к материалу - выбор списка пользователей описан в Форма для заполнения списка пользователей.
А можно ли менять цвет текста полей в InputDialog?
На текущий момент, штатными средствами такое сделать нельзя.
Можно, например, в Delphi нарисовать необходимые формы с нужными цветами текста полей и запихать их в dll-ку. Потом в нужных местах на isbl вызывать эти формы из dll. Правда могут возникнуть проблемы со стабильностью и быстродействием системы. Все зависит от того, на сколько у программиста прямые руки и он должен понимать, что он делает, как делает и где это можно применять, а где нет.
Добрый день.
Скажите, пожалуйста, можно увеличить размер поля типа "Строка" в функциях InputDialog и InputDialogEx? По умолчанию создаётся поле размером 160 символов.
Речь идёт именно о видимом размере, а не об общей длине строки, которую можно записать в это поле.
Версия 4.7.0.
Спасибо.
Авторизуйтесь, чтобы написать комментарий