Иногда возникает необходимость отобразить таблицу значений (например, полученную в результате запроса) на экране для предоставления оператору возможности информации для принятия решения.
В данном случае рассматривались следующие действия пользователя:
- Принятие решения о продолжении или отмене операции
- Выбор определенной строки данных из таблицы значений
Так как таблица значений не может быть передана с сервера на клиент, то в качестве исходных данных может быть использован массив структур, созданный на данных таблицы значений.
Такой массив может быть легко получен из таблицы значений функцией:
Функция ПреобразоватьТаблицуЗначенийВМассивСтруктур(ТЗ) Экспорт
нМ = Новый Массив;
Для Каждого СтрокаТЗ Из ТЗ Цикл
СтрСтруктура = Новый Структура;
Для Каждого Элм Из ТЗ.Колонки Цикл
СтрСтруктура.Вставить(Элм.Имя,СтрокаТЗ[Элм.Имя]);
КонецЦикла;
нМ.Добавить(СтрСтруктура);
КонецЦикла;
Возврат нМ;
КонецФункции
Все структуры, входящие в массив, имеют один и тот же набор ключей. Элемент с одним и тем же ключом в разных структурах массива может иметь различные типы (результатом выполнения запроса могут быть мутабельные значения).
Основное требование к форме – простота ее использования (минимум требуемого кода при использовании формы).
Данные в форму передаются через параметры формы:
- «МассивСтруктур» - содержит массив структур
- «ОписаниеТЧ» - структура с тем же набором ключей, что и стркутуры в «МассивСтруктур», значением является структура, описывающая некоторые характеристики необходимые для построения формы. Данный элемент необязателен.
- «ТекстВопроса» - строка текста вопроса к оператору, наличие данного элемента вызывает построение формы для получения от оператора команд отмены или продолжения операции. При отсутствии – оператор выбирает одну из строк массива, либо отказывается от выбора.
При построении формы по данным массива структур и описания данных строится реквизит типа "Таблица значений" и соответствующее ему табличное поле формы.
Значения квалификаторов данных по умолчанию:
Число | общее число разрядов 15, дробной части – 3, знак – любой |
Строка | длина строки 0, тип длины строки – переменная |
Дата | дата и время |
Описание колонок табличного поля:
Наименование | наименование ключа разбитое на слова (ЕдИзмерения -> Ед измерения) |
Ширина | 0 |
Растягивать по горизонтали | Истина |
Порядок колонок определяется структурой «ОписаниеТЧ» или по первой структуре из массива данных (если «ОписаниеТЧ» не задано).
В примерах функция «ПолучитьДанные» возвращает массив
Каждый элемент, которого является структурой
Элементы с одним и тем же ключом структуры в разных элементах массива могут иметь различные значения.
Примеры использования формы
Выбор строки из массива структур
мс = ПолучитьДанные();
Парам = Новый Структура("МассивСтруктур",мс);
Форма = ПолучитьФорму("ОбщаяФорма.УниверсальнаяФормаМассиваСтруктур",Парам,Неопределено);
Ответ = Форма.ОткрытьМодально();
При закрытии формы через (х) Ответ = Неопределенно
При выбора строки Ответ – структура с выбранными данными
Принятие решения
мс = ПолучитьДанные();
оп = Новый Структура;
// Все даты будем выводить без времени, в качестве заголовков использованы имена ключи структуры исходных данных
Для Каждого элм Из мс[0] Цикл
оп.Вставить(элм.Ключ,Кв.Колонка(элм.Ключ,,,,,Кв.Даты("Дата")));
КонецЦикла;
//Изменим порядок
Номер = оп.Номер;
оп.Удалить("Номер");
оп.Вставить("Номер",Номер);
// наличие ключа структуры «ТекстВопроса» определяет режим использования струтуры – расширенный диалог запроса
// на продолжение выполнения операции, отсутствие – диалог выбора строки массива.
Парам = Новый Структура("МассивСтруктур, ОписаниеТЧ, ТекстВопроса",мс, оп, "Продолжить, Вы уверены?");
Форма = ПолучитьФорму("ОбщаяФорма.УниверсальнаяФормаМассиваСтруктур",Парам,Неопределено);
Ответ = Форма.ОткрытьМодально();
В данный функционал входит общий модуль «Кв» (исполняется на клиенте, тонком клиенте и на сервере) и общая форма «УниверсальнаяФормаМассиваСтруктур». Для передачи формы с этим текстом форма помещена во внешнюю обработку.
Текст модуля:
Функция Числа(пДЛ = 15, пДМ = 3, пТип = Неопределено) Экспорт
Возврат Новый Структура("ДЛ, ДМ, Мода",пДЛ, пДМ, ?( пТип = "+",ДопустимыйЗнак.Неотрицательный,ДопустимыйЗнак.Любой));
КонецФункции
Функция Даты(пТип = Неопределено) Экспорт
результат = ЧастиДаты.ДатаВремя;
Если пТип <> Неопределено Тогда
Если пТип = "Дата" Тогда
результат = ЧастиДаты.Дата;
ИначеЕсли пТип = "Время" Тогда
результат = ЧастиДаты.Время;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция Строки(пДЛ = 15, пТип = Неопределено) Экспорт
Результат = ДопустимаяДлина.Переменная;
Если пТип <> Неопределено И пТип = "Фиксированная" Тогда
Результат = ДопустимаяДлина.Фиксированная;
КонецЕсли;
Возврат Новый Структура("ДЛ, Мода",пДЛ, Результат);
КонецФункции
Функция Колонка(пЗаголовок = "", пШирина = 0, пАвто = Истина, КвЧисла = Неопределено, КвСтроки = Неопределено, КвДаты = Неопределено) Экспорт
Стр = Новый Структура;
Стр.Вставить("Заголовок",пЗаголовок);
Стр.Вставить("Ширина",пШирина);
Стр.Вставить("АвтоРазмер",пАвто);
Если КвЧисла <> Неопределено Тогда
Стр.Вставить("КвЧисла",Квалификатор(КвЧисла));
Иначе
Стр.Вставить("КвЧисла",Квалификатор(Числа()));
КонецЕсли;
Если КвСтроки <> Неопределено Тогда
Стр.Вставить("КвСтроки",Квалификатор(КвСтроки));
Иначе
Стр.Вставить("КвСтроки",Квалификатор(Строки()));
КонецЕсли;
Если КвДаты <> Неопределено Тогда
Стр.Вставить("КвДаты",Квалификатор(КвДаты));
Иначе
Стр.Вставить("КвДаты",Квалификатор(Даты()));
КонецЕсли;
Возврат Стр;
КонецФункции
Функция Квалификатор(стр) Экспорт
Если ТипЗнч(стр) = Тип("ЧастиДаты") Тогда Возврат Новый КвалификаторыДаты(стр); КонецЕсли;
Если стр.Свойство("ДМ") Тогда Возврат Новый КвалификаторыЧисла(стр.ДЛ, стр.ДМ, стр.Мода); КонецЕсли;
Если стр.Свойство("ДЛ") Тогда Возврат Новый КвалификаторыСтроки(стр.ДЛ, стр.Мода); КонецЕсли;
Возврат Неопределено;
КонецФункции
// Разбор строки на слова
// http://www.forum.mista.ru/topic.php?id=425752
// добавил замену символа подчеркивания на пробел //Бизяев А.Ю.
// Параметры
// <Исходная строка> - <Тип строка> - на входе должна быть строка вида "ЭтоТестоваяСтрока"
// где слова разделены заглавной буквой
//
// Возвращаемое значение:
// <Строка разобранная> - возвращает строку вида "Это тестовая строка"
//
// Функция РазобратьНаименованиеПоСловам(ИсходнаяСтрока) Экспорт
Функция НормализоватьИмя(ИсходнаяСтрока) Экспорт
НоваяСтрока = Лев(ИсходнаяСтрока, 1); //первую заглавную букву оставляем
Для н = 2 По СтрДлина(ИсходнаяСтрока) Цикл
ТекСимвол = Сред(ИсходнаяСтрока, н, 1); //перебираем символы строки по 1
Если ТекСимвол = "_" Тогда
НоваяСтрока = НоваяСтрока + " ";
ИначеЕсли
Нрег(ТекСимвол) <> ТекСимвол Тогда //это если большая буква
НоваяСтрока = НоваяСтрока + " " + Нрег(ТекСимвол);
Иначе
НоваяСтрока = НоваяСтрока + ТекСимвол;
КонецЕсли;
КонецЦикла;
Возврат НоваяСтрока;
КонецФункции