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

В данном случае рассматривались следующие действия пользователя:

  • Принятие решения о продолжении или отмене операции
  • Выбор определенной строки данных из таблицы значений

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

Такой массив может быть легко получен из таблицы значений функцией:

Функция ПреобразоватьТаблицуЗначенийВМассивСтруктур(ТЗ) Экспорт
    нМ = Новый Массив;
    Для Каждого СтрокаТЗ Из ТЗ Цикл
        СтрСтруктура = Новый Структура;
        Для Каждого Элм Из ТЗ.Колонки Цикл
            СтрСтруктура.Вставить(Элм.Имя,СтрокаТЗ[Элм.Имя]);
        КонецЦикла;

        нМ.Добавить(СтрСтруктура);
    КонецЦикла;
    Возврат нМ;
КонецФункции

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

Основное требование к форме – простота ее использования (минимум требуемого кода при использовании формы).

Данные в форму передаются через параметры формы:

  • «МассивСтруктур» - содержит массив структур
  • «ОписаниеТЧ» - структура с тем же набором ключей, что и стркутуры в «МассивСтруктур», значением является структура, описывающая некоторые характеристики необходимые для построения формы. Данный элемент необязателен.
  • «ТекстВопроса» - строка текста вопроса к оператору, наличие данного элемента вызывает построение формы для получения от оператора команд отмены или продолжения операции. При отсутствии – оператор выбирает одну из строк массива, либо отказывается от выбора.

При построении формы по данным массива структур и описания данных строится реквизит типа "Таблица значений" и соответствующее ему табличное поле формы.

Значения квалификаторов данных по умолчанию:

Число общее число разрядов 15, дробной части – 3, знак – любой
Строка длина строки 0, тип длины строки – переменная
Дата дата и время

 

Описание колонок табличного поля:

Наименование наименование ключа разбитое на слова (ЕдИзмерения -> Ед измерения)
Ширина 0
Растягивать по горизонтали Истина

 

Порядок колонок определяется структурой «ОписаниеТЧ» или по первой структуре из массива данных (если «ОписаниеТЧ» не задано).

В примерах функция «ПолучитьДанные» возвращает массив

str ar 01

 Каждый элемент, которого является структурой

str ar 02

Элементы с одним и тем же ключом структуры в разных элементах массива могут иметь различные значения.

Примеры использования формы

Выбор строки из массива структур

    мс = ПолучитьДанные();
    Парам = Новый Структура("МассивСтруктур",мс);
    Форма = ПолучитьФорму("ОбщаяФорма.УниверсальнаяФормаМассиваСтруктур",Парам,Неопределено);
    Ответ = Форма.ОткрытьМодально();

str ar 03

При закрытии формы через (х) Ответ = Неопределенно

При выбора строки Ответ – структура с выбранными данными

Принятие решения

    мс = ПолучитьДанные();
    оп = Новый Структура;

    // Все даты будем выводить без времени, в качестве заголовков использованы имена ключи структуры исходных данных
    Для Каждого элм Из мс[0] Цикл
        оп.Вставить(элм.Ключ,Кв.Колонка(элм.Ключ,,,,,Кв.Даты("Дата")));
    КонецЦикла;

    //Изменим порядок
    Номер = оп.Номер;
    оп.Удалить("Номер");
    оп.Вставить("Номер",Номер);

    // наличие ключа структуры «ТекстВопроса» определяет режим использования струтуры – расширенный диалог запроса
    // на продолжение выполнения операции, отсутствие – диалог выбора строки массива.
    Парам = Новый Структура("МассивСтруктур, ОписаниеТЧ, ТекстВопроса",мс, оп, "Продолжить, Вы уверены?");
    Форма = ПолучитьФорму("ОбщаяФорма.УниверсальнаяФормаМассиваСтруктур",Парам,Неопределено);
    Ответ = Форма.ОткрытьМодально();

 str ar 04

В данный функционал входит общий модуль «Кв» (исполняется на клиенте, тонком клиенте и на сервере) и общая форма «УниверсальнаяФормаМассиваСтруктур». Для передачи формы с этим текстом форма помещена во внешнюю обработку.

Текст модуля:

Функция Числа(пДЛ = 15, пДМ = 3, пТип = Неопределено) Экспорт

            Возврат Новый Структура("ДЛ, ДМ, Мода",пДЛ, пДМ, ?( пТип = "+",ДопустимыйЗнак.Неотрицательный,ДопустимыйЗнак.Любой));

КонецФункции

Функция Даты(пТип = Неопределено) Экспорт

            результат = ЧастиДаты.ДатаВремя;

            Если пТип <> Неопределено Тогда

                        Если пТип = "Дата" Тогда

                                   результат = ЧастиДаты.Дата;

                        ИначеЕсли пТип = "Время" Тогда

                                   результат = ЧастиДаты.Время;

                        КонецЕсли;

            КонецЕсли;

            Возврат Результат;

КонецФункции

Функция Строки(пДЛ = 15, пТип = Неопределено) Экспорт

            Результат = ДопустимаяДлина.Переменная;

            Если пТип <> Неопределено И пТип = "Фиксированная" Тогда

                        Результат = ДопустимаяДлина.Фиксированная;

            КонецЕсли;

            Возврат Новый Структура("ДЛ, Мода",пДЛ, Результат);

КонецФункции

Функция Колонка(пЗаголовок = "", пШирина = 0, пАвто = Истина, КвЧисла = Неопределено, КвСтроки = Неопределено, КвДаты = Неопределено) Экспорт

            Стр = Новый Структура;

            Стр.Вставить("Заголовок",пЗаголовок);

            Стр.Вставить("Ширина",пШирина);

            Стр.Вставить("АвтоРазмер",пАвто);

            Если КвЧисла <> Неопределено Тогда

                        Стр.Вставить("КвЧисла",Квалификатор(КвЧисла));

            Иначе

                        Стр.Вставить("КвЧисла",Квалификатор(Числа()));

            КонецЕсли;  

            Если КвСтроки <> Неопределено Тогда

                        Стр.Вставить("КвСтроки",Квалификатор(КвСтроки));

            Иначе

                        Стр.Вставить("КвСтроки",Квалификатор(Строки()));

            КонецЕсли;  

            Если КвДаты <> Неопределено Тогда

                        Стр.Вставить("КвДаты",Квалификатор(КвДаты));

            Иначе

                        Стр.Вставить("КвДаты",Квалификатор(Даты()));

            КонецЕсли;

            Возврат Стр;

КонецФункции

Функция Квалификатор(стр) Экспорт

            Если ТипЗнч(стр) = Тип("ЧастиДаты") Тогда Возврат Новый КвалификаторыДаты(стр); КонецЕсли;

            Если стр.Свойство("ДМ") Тогда    Возврат Новый КвалификаторыЧисла(стр.ДЛ, стр.ДМ, стр.Мода); КонецЕсли;

            Если стр.Свойство("ДЛ") Тогда     Возврат Новый КвалификаторыСтроки(стр.ДЛ, стр.Мода); КонецЕсли;

            Возврат Неопределено;

КонецФункции

           

// Разбор строки на слова

// http://www.forum.mista.ru/topic.php?id=425752

// добавил замену символа подчеркивания на пробел //Бизяев А.Ю.

// Параметры

// <Исходная строка> - <Тип строка> - на входе должна быть строка вида "ЭтоТестоваяСтрока"

//                                     где слова разделены заглавной буквой

//

// Возвращаемое значение:

// <Строка разобранная>   - возвращает строку вида "Это тестовая строка"

//

// Функция РазобратьНаименованиеПоСловам(ИсходнаяСтрока) Экспорт

Функция НормализоватьИмя(ИсходнаяСтрока) Экспорт

   НоваяСтрока = Лев(ИсходнаяСтрока, 1); //первую заглавную букву оставляем

   Для н = 2 По СтрДлина(ИсходнаяСтрока) Цикл

       ТекСимвол = Сред(ИсходнаяСтрока, н, 1); //перебираем символы строки по 1

                        Если ТекСимвол = "_" Тогда

                                   НоваяСтрока = НоваяСтрока + " ";

                        ИначеЕсли

                                   Нрег(ТекСимвол) <> ТекСимвол Тогда //это если большая буква

           НоваяСтрока = НоваяСтрока + " " + Нрег(ТекСимвол);

       Иначе

           НоваяСтрока = НоваяСтрока + ТекСимвол;

       КонецЕсли;

   КонецЦикла;

  

   Возврат НоваяСтрока;

КонецФункции