1С данныеформыколлекция в таблицу значений
Область применения: управляемое приложение, мобильное приложение.
Например, если решается задача по проверке в объекте строк, удовлетворяющих некоторому условию, то
неправильно:
правильно выполнять один явный вызов сервера:
Маленький IT блог с характером 1С.
Страницы
Поиск по блогу
пятница, 9 октября 2015 г.
Передача таблицы значений с сервера на клиент
После разделения выполнения программного кода на два контекста (клиент и сервер), у разработчиков появилось множество проблем, при переводе конфигурации с обычных форм на управляемые. Одна из них – это отсутствие возможности передачи объекта типа ТаблицаЗначений с сервера на клиент. Объект этого типа имеет много полезных методов, которые упрощают жизнь разработчику, поэтому свою жизнь без таблицы значений я не представляю возможной. Вариантов решения два: конвертировать таблицу значений в другой тип (например, в массив структур), либо динамически создавать реквизит формы типа ТаблицаЗначений (на самом деле тип ДанныеФормыКоллекция) и заполнить его данными.
Вариант №1
Здесь все просто, обходим в цикле строки таблицы значений, данные каждой строки вставляем в структуру, а структуру добавляем в массив.
&НаСервере
Функция ПолучитьТЗКакМассивСтруктур()
МассивСтруктур = Новый Массив;
Для Каждого СтрокаТЗ Из МояТаблицаЗначений Цикл
СтрокаСтруктура = Новый Структура;
Для Каждого КолонкаТЗ Из МояТаблицаЗначений.Колонки Цикл
СтрокаСтруктура.Вставить(КолонкаТЗ.Имя, СтрокаТЗ[КолонкаТЗ.Имя]);
КонецЦикла;
МассивСтруктур.Добавить(СтрокаСтруктура);
КонецЦикла;
&НаКлиенте
Процедура ПолучитьДанные()
Минус данного решения – это отсутствие тех самых полезных методов таблицы значений.
Вариант №2
Этот вариант намного сложнее, но выполнив его, считайте что к одному из пунктов экзамена на знание платформы 1С 8.2 или 8.3 «Специалист» вы подготовились. Здесь используется динамическое создание реквизитов формы. Алгоритм, примерно, такой: создается реквизит формы с типом ТаблицаЗначений, для этого реквизита создаются подчиненные реквизиты (колонки таблицы) и производиться загрузка данных таблицы значений в новый реквизит формы.
Первым делом, необходимо у формы создать реквизит ИмяТаблицыЗначений с типом ТаблицаЗначений.
Рисунок 1. Реквизит формы типа ТаблицаЗначений |
А потом написать следующий код:
&НаСервере
Функция ОтправитьТаблицуЗначенийНаКлиент()
ДобавляемыеРеквизиты = Новый Массив;
УдаляемыеРеквизиты = Новый Массив;
МассивКолонок = Новый Массив;
ИмяТаблицыФормы = «ИмяТаблицыЗначений»;
Для Каждого ТекКолонка из ТаблицаФормы.Колонки Цикл
УдаляемыеРеквизиты.Добавить(ИмяТаблицыФормы + «.» + ТекКолонка.Имя);
КонецЦикла;
Для Каждого ТекКолонка из МояТаблицаЗначений.Колонки Цикл
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ТекКолонка.Имя, ТекКолонка.ТипЗначения, ИмяТаблицыФормы));
МассивКолонок.Добавить(ТекКолонка.Имя);
КонецЦикла;
// Добавим новые, удалим старые колонки
ИзменитьРеквизиты(ДобавляемыеРеквизиты, УдаляемыеРеквизиты);
// Поместим значение в реквизит формы
ЗначениеВРеквизитФормы(МояТаблицаЗначений, ИмяТаблицыФормы);
Далее на клиенте можно смело обращаться к свежеиспеченной таблице значений ЭтаФорма.ИмяТаблицыЗначений.
личный блог
С задачей вывода каких либо данных в Таблицу Значений (ТЗ) на форме сталкиваются наверное все программисты. Если раньше до выхода Управляемого Интерфейса все решалось довольно просто, то теперь все немного изменилось.
Стоит отметить, что предварительно нужно создать соответствующие РезультатуЗапроса колонки таблицы значений. Делается это также просто. Добавить ТаблицуЗначений следует в реквизиты Формы. Еще раз акцентирую внимание — Названия колонок и типы данных колонок ТЗ должны совпадать и на форме и в запросе. Можно вообще не создавать ТЗ на форме, а описать ее программно, примерно как то так:
Для управляемых форм все ровно тоже самое кроме того что нужно на сервере получить значение данных ТЗ на форме, записать в них результат запроса и потом снова вернуть их на форму.
Ниже пример такого преобразования.
Во всей этой истории следует обратить внимание на 2 строчки.
Первая
Вторая
Первый из типа данных ДанныеФормыКоллекция преобразует данные в тип ТаблицаЗначений. Второй соответственно конвертирует в обратном направлении.
Как передать ДанныеФормыЭлементКоллекции на Сервер или считать все имена ДФК?
Вопрос: Как передать ДанныеФормыЭлементКоллекции на Сервер?
Если без структуры в общем случае не обойтись, тогда
Вопрос 2: Как автоматически создать структуру по всем колонкам ДанныеФормыКоллекция?
Как программно считать все имена колонок ДанныеФормыКоллекция?
у меня получилось как-то так:
Если это УФ и ТаблицаФормы, которая программно создаётся запросом и выводится на форму, то потом считать её содержимое можно через такой вариант:
ЭтаФорма.ИмяРеквизитаТакКакВыЕгоНазвалиПриВыводеНаФорму.Выгрузить()
вы вывели на УФ вот такой процедурой какую-то таблицу созданную заранее запросом или руками:
// Делаем описание типа ТаблицаЗначений
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип(«ТаблицаЗначений»));
ОписаниеТипа = Новый ОписаниеТипов(МассивТипов);
// Создаём описание реквизита на основании этого типа
НовыеРеквизиты = Новый Массив;
НовыеРеквизиты.Добавить(
Новый РеквизитФормы(«ТабРеквизит», ОписаниеТипа)
);
// Создаём этот реквизит (с именем ТабРеквизит)
ЭтаФорма.ИзменитьРеквизиты(НовыеРеквизиты);
// Создаём элемент на форме с именем ТабНаФорме
// и связываем его с реквизитом ТабРеквизит
ТаблицаПолейВыбора = ЭтаФорма.Элементы.Добавить(«ТабНаФорме», Тип(«ТаблицаФормы»),ГруппаФормы);
ТаблицаПолейВыбора.ПутьКДанным = «ТабРеквизит»;
ТаблицаПолейВыбора.Отображение = ОтображениеТаблицы.Список;
ТаблицаПолейВыбора.УстановитьДействие(«ПриНачалеРедактирования», «ТабРеквизитПриНачалеРедактирования»);
ТаблицаПолейВыбора.УстановитьДействие(«ПередОкончаниемРедактирования», «ТабРеквизитПередОкончаниемРедактирования»);
// реквизит ТабРеквизит и соответствующий
// ему элемент формы ТабНаФорме созданы
// нами программно выше
// 1. добавляем колонки из ТабВкоде в реквизит ТабРеквизит
НовыеРеквизиты = Новый Массив;
Для Каждого Колонка Из ТабВКоде.Колонки Цикл
НовыеРеквизиты.Добавить(
Новый РеквизитФормы(
Колонка.Имя, Колонка.ТипЗначения,
«ТабРеквизит»
)
);
КонецЦикла;
// 2. добавляем колонки из ТабВКоде в элемент ТабНаФорме
Для Каждого Колонка Из ТабВКоде.Колонки Цикл
НовыйЭлемент = ЭтаФорма.Элементы.Добавить(
«ТабРеквизит» + «_» + Колонка.Имя, Тип(«ПолеФормы»), ЭтаФорма.Элементы[«ТабНаФорме»]
);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = «ТабРеквизит» + «.» + Колонка.Имя;
Если Колонка.Имя = «ВРезервеПоСпецификации» Тогда
// 3. наконец, передаём данные из ТабВКоде в ТабРеквизит
ДанныеФормыКоллекция.Выгрузить() Метод недоступен на клиенте
Доброго всем дня!
Передаю из обычной формы в общий модуль (стоят галки Сервер, Вызов сервера) ДанныеФормыСтруктура, в которой есть ДанныеФормыКоллекция
При попытке использовать методы ДанныеФормыКоллекция.Выгрузить() и ДанныеФормыКоллекция.Загрузить() пишет «Метод недоступен на клиенте».
При этом всё остальное работает как на сервере. Недовольны только эти два метода.
Видимо, я что-то глобальное недопомнимаю или пора на море. Кто может помочь?
Функция вызова в обычной форме:
Если Модифицированность() Тогда
Ответ = Вопрос(«Перед созданием документа ЯХ счет должен быть записан! Записать?»,РежимДиалогаВопрос.ДаНет,60,КодВозвратаДиалога.Да,»Записать?»);
Если Ответ = КодВозвратаДиалога.Да Тогда
Записать();
Иначе
Возврат;
КонецЕсли;
КонецЕсли;
Форма = ПолучитьФорму(«Документ.ЯХПеремещение.Форма.ФормаДокумента»);
ДанныеФормы = Форма.Объект;
ЯХ.СоздатьДокументЯХПеремещениеНаОснованииСчета(ДанныеФормы, Ссылка);
КопироватьДанныеФормы(ДанныеФормы, Форма.Объект);
Форма.Открыть();
Функция обработки в общем модуле:
Функция СоздатьДокументЯХПеремещениеНаОснованииСчета(ДокументЯХ, ДокументОснование) Экспорт
ЯХОтбора = ПоискЯчейкиОтбора(Контрагент);
ДокументЯХ.ЯХОтбора = ЯХОтбора;
ДокументЯХ.Дата = ТекущаяДата();
ДокументЯХ.ДокументОснование = ДокументОснование;
ДокументЯХ.Контрагент = Контрагент;
ТЗРеализации = ДокументОснование.Товары.Выгрузить();
ТЗЯХ = ДокументЯХ.Товары.Выгрузить(); //ругается
РезультатПодбора = НайтиЯХИсточники(ТЗРеализации, ТЗЯХ, ДокументЯХ.ЯХОтбора, Истина);
ТЗЯХ.ЗаполнитьЗначения(ЯХОтбора, «ЯХПриемник»);
Структура данных для моделирования данных, редактируемых в управляемой форме
1С данныеформыколлекция в таблицу значений
Область применения: управляемое приложение, мобильное приложение.
Например, если решается задача по проверке в объекте строк, удовлетворяющих некоторому условию, то
неправильно:
правильно выполнять один явный вызов сервера:
Маленький IT блог с характером 1С.
Страницы
Поиск по блогу
пятница, 9 октября 2015 г.
Передача таблицы значений с сервера на клиент
После разделения выполнения программного кода на два контекста (клиент и сервер), у разработчиков появилось множество проблем, при переводе конфигурации с обычных форм на управляемые. Одна из них – это отсутствие возможности передачи объекта типа ТаблицаЗначений с сервера на клиент. Объект этого типа имеет много полезных методов, которые упрощают жизнь разработчику, поэтому свою жизнь без таблицы значений я не представляю возможной. Вариантов решения два: конвертировать таблицу значений в другой тип (например, в массив структур), либо динамически создавать реквизит формы типа ТаблицаЗначений (на самом деле тип ДанныеФормыКоллекция) и заполнить его данными.
Вариант №1
Здесь все просто, обходим в цикле строки таблицы значений, данные каждой строки вставляем в структуру, а структуру добавляем в массив.
&НаСервере
Функция ПолучитьТЗКакМассивСтруктур()
МассивСтруктур = Новый Массив;
Для Каждого СтрокаТЗ Из МояТаблицаЗначений Цикл
СтрокаСтруктура = Новый Структура;
Для Каждого КолонкаТЗ Из МояТаблицаЗначений.Колонки Цикл
СтрокаСтруктура.Вставить(КолонкаТЗ.Имя, СтрокаТЗ[КолонкаТЗ.Имя]);
КонецЦикла;
МассивСтруктур.Добавить(СтрокаСтруктура);
КонецЦикла;
&НаКлиенте
Процедура ПолучитьДанные()
Минус данного решения – это отсутствие тех самых полезных методов таблицы значений.
Вариант №2
Этот вариант намного сложнее, но выполнив его, считайте что к одному из пунктов экзамена на знание платформы 1С 8.2 или 8.3 «Специалист» вы подготовились. Здесь используется динамическое создание реквизитов формы. Алгоритм, примерно, такой: создается реквизит формы с типом ТаблицаЗначений, для этого реквизита создаются подчиненные реквизиты (колонки таблицы) и производиться загрузка данных таблицы значений в новый реквизит формы.
Первым делом, необходимо у формы создать реквизит ИмяТаблицыЗначений с типом ТаблицаЗначений.
Рисунок 1. Реквизит формы типа ТаблицаЗначений |
А потом написать следующий код:
&НаСервере
Функция ОтправитьТаблицуЗначенийНаКлиент()
ДобавляемыеРеквизиты = Новый Массив;
УдаляемыеРеквизиты = Новый Массив;
МассивКолонок = Новый Массив;
ИмяТаблицыФормы = «ИмяТаблицыЗначений»;
Для Каждого ТекКолонка из ТаблицаФормы.Колонки Цикл
УдаляемыеРеквизиты.Добавить(ИмяТаблицыФормы + «.» + ТекКолонка.Имя);
КонецЦикла;
Для Каждого ТекКолонка из МояТаблицаЗначений.Колонки Цикл
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ТекКолонка.Имя, ТекКолонка.ТипЗначения, ИмяТаблицыФормы));
МассивКолонок.Добавить(ТекКолонка.Имя);
КонецЦикла;
// Добавим новые, удалим старые колонки
ИзменитьРеквизиты(ДобавляемыеРеквизиты, УдаляемыеРеквизиты);
// Поместим значение в реквизит формы
ЗначениеВРеквизитФормы(МояТаблицаЗначений, ИмяТаблицыФормы);
Далее на клиенте можно смело обращаться к свежеиспеченной таблице значений ЭтаФорма.ИмяТаблицыЗначений.
личный блог
С задачей вывода каких либо данных в Таблицу Значений (ТЗ) на форме сталкиваются наверное все программисты. Если раньше до выхода Управляемого Интерфейса все решалось довольно просто, то теперь все немного изменилось.
Стоит отметить, что предварительно нужно создать соответствующие РезультатуЗапроса колонки таблицы значений. Делается это также просто. Добавить ТаблицуЗначений следует в реквизиты Формы. Еще раз акцентирую внимание — Названия колонок и типы данных колонок ТЗ должны совпадать и на форме и в запросе. Можно вообще не создавать ТЗ на форме, а описать ее программно, примерно как то так:
Для управляемых форм все ровно тоже самое кроме того что нужно на сервере получить значение данных ТЗ на форме, записать в них результат запроса и потом снова вернуть их на форму.
Ниже пример такого преобразования.
Во всей этой истории следует обратить внимание на 2 строчки.
Первая
Вторая
Первый из типа данных ДанныеФормыКоллекция преобразует данные в тип ТаблицаЗначений. Второй соответственно конвертирует в обратном направлении.
Как в 1С работать с универсальными коллекциями (бесплатная статья по Программированию в 1С)
из цикла статей «Первые шаги в разработке на 1С»
О чем эта статья
Эта статья продолжает цикл статей «Первые шаги в разработке на 1С». В ней рассматриваются принципы работы с универсальными коллекциями. Прочитав статью, вы узнаете:
Применимость
В статье рассматривается платформа 1С:Предприятие 8.3 актуальной редакции.
Как в 1С работать с универсальными коллекциями
Коллекция значений – это некий контейнер, в котором может содержаться обычно любое количество элементов. При этом каких-либо жестких ограничений на тип данных зачастую не накладывается.
В универсальную коллекцию можно добавлять значения. Все значения в коллекции можно обойти. Используются эти коллекции в основном для какой-либо обработки в алгоритмах. Т.е. это некие динамические структуры, которые существуют на время работы алгоритма.
Важно понимать, что коллекции не хранятся в базе данных (о типе данных Хранилище значений, которое может сохранять практически любой тип данных, речь пока не идет).
Существуют различные виды универсальных коллекций: Массив, Структура, Соответствие, Фиксированный массив, Таблица значений, Табличная часть и т.д. Но у всех коллекций есть схожесть поведения.
Коллекция может создаваться в результате работы какой-либо функции (функция возвращает в качестве значения универсальную коллекцию).
Можно получить новую коллекцию вручную, обратившись к конструктору и создав экземпляр класса.
Например: НашМассив = Новый Массив;
Конструкторы для многих универсальных коллекций являются параметризованными.
Так, в конструкторе для Массива можно указать количество элементов в соответствующих измерениях. Т.е. можно сразу же объявлять многомерные Массивы.
Соответствующее описание конструктора есть в синтакс-помощнике.
Таким образом, используя параметры конструктора, можно сразу задать желаемое поведение данного объекта.
Но параметры являются необязательными, разработчик может их не задавать и в дальнейшем определить поведение Массива так, как считает нужным.
Почти любую универсальную коллекцию можно создать с помощью конструктора (исключением являются табличные части, которые выступают в качестве объектов конфигурации).
Для универсальных коллекций существуют такие общие понятия, как индекс и номер. Каждый элемент коллекции имеет индекс. При этом индекс начинается с нуля.
Для того чтобы обратиться к элементу Массива НашМассив, можно использовать обращение по индексу, для этого индекс указывается в квадратных скобках.
Например, НашМассив[3]. Обратите внимание, в этом случае система возвращает элемент Массива с индексом 3, а по порядку это четвертый элемент Массива.
Для некоторых коллекций существует также понятие номера строки. Номер строки начинается с единицы. Например, для табличной части есть такое свойство, как номер строки. Важно иметь ввиду, что если мы знаем номер строки и хотим обратиться по индексу, то в качестве индекса следует использовать значение на единицу меньше номера строки.
Понятие номера строки существует далеко не у всех коллекций, а преимущественно у тех, которые могут отображаться в интерфейсе пользователя.
Для всех коллекций используется обход элементов коллекции. Обход возможен двумя способами: циклом Для и циклом Для каждого из.
Для большинства универсальных коллекций применимы методы: Количество, Индекс, Добавить, Вставить, Удалить и Найти.
Количество – это функция, которая возвращает количество элементов коллекции. Она может использоваться перед циклом Для, как представлено на рисунке.
Метод Индекс существует не у всех коллекций, а только у тех, на элементы которой можно сослаться. В качестве примера можно привести ТаблицуЗначений.
ТаблицаЗначений – это определенная коллекция строк, в строках могут содержаться разные колонки с разными типами значений.
Каждая строка представляет собой самостоятельную сущность. На нее можно получить ссылку, через эту строку можно обращаться к значениям колонок в данной строке.
Метод Индекс позволяет определить, какой индекс соответствует данной строке (т.е. текущую позицию строки в таблице). Значения индекса начинаются с нуля.
Методы добавления новых значений в данную коллекцию существуют практически у любой универсальной коллекции. На рисунке представлено, как заполнить Массив значениями от 0 до 10 двумя способами.
Для того, чтобы добавить элемент в Массив мы можем использовать метод Добавить, в скобках указать добавляемое значение. При этом значение будет добавляться в конец списка, т.е. Массив будет постоянно увеличиваться за счет последней позиции.
Другой метод, который позволяет добавлять значения в коллекцию – метод Вставить. Он отличается от метода Добавить тем, что можно указать, в какое место нужно вставить добавляемый элемент.
Первым параметром указывается индекс, в который будет вставлено новое значение. Т.е. мы, например, можем указать, что каждое значение нужно вставлять в начало списка (второй способ на рисунке выше).
Для удаления элементов из коллекции используется метод Удалить. В методе Удалить указывается по индексу, какой элемент мы будем удалять.
Синтаксис: Удалить( )
Пример использования: НашМассив.Удалить(5);
Следует отметить, что для тех коллекций, где строки представляют самостоятельную сущность (например, для ТаблицыЗначений), мы также можем использовать метод получения индекса для того, чтобы потом удалить данную строку.
Практически у всех коллекций существует метод поиска значения – Найти. В метод передается то значение, которое хотим найти. В некоторых коллекциях можно поставить какие-либо ограничения.
Например, в ТаблицеЗначений можно указать те строки, те колонки, в которых нужно осуществлять поиск.
Если значение найдено, то данный метод возвращает индекс или определенную строку. Если значение не найдено, возвращается значение типа Неопределено. Применительно к Массиву возвращается Индекс, либо значение Неопределено.
Пример использования: НашаПеременная = НашМассив.Найти(8);
Универсальные коллекции можно очень быстро очищать, т.е. удалить абсолютно все элементы. Для этого используется метод Очистить(), который удаляет элементы Массива, строки ТаблицыЗначений, либо данные других коллекций.
Дополнительные методы для Массива
Метод ВГраница() возвращает количество элементов минус один. Т.е. если мы используем цикл Для, то вместо метода Количество можем сразу использовать метод Граница().
В частности, переменную КоличествоВМассиве можно было определить иначе:
КоличествоВМассиве = НашМассив.ВГраница();
Тогда при описании самого цикла отнимать от данной переменной единицу не следует.
Метод Установить позволяет присвоить значение элементу Массива по индексу.
Пример: НашМассив.Установить (2,8);
Альтернативный вариант: НашМассив[2] = 8;
Можно для Массива использовать метод Получить, для того, чтобы прочитать значение по индексу, не обращаясь к использованию квадратных скобок.
Пример: НашаПеременная = НашМассив.Получить(2);
Альтернативный вариант: НашаПеременная = НашМассив[2];
Универсальная коллекция Структура
Структура, так же как и Массив, может иметь неограниченное количество элементов, но вот содержание элемента отличается от Массива.
Структура представляет собой коллекцию, каждое значение которой состоит из пары. Первый элемент пары называется Ключ. Второй элемент пары – Значение.
Ключ – это строго строковый тип данных, который описывает значение. Например, Ключу «Код» может соответствовать значение 113; Ключу «Имя» значение «Вася». На само Значение ограничение типа данных не накладывается.
Структуру очень удобно использовать, если мы хотим создать некий список параметров. Если данная Структура называется НашаСтруктура, то обращаться к ее двум значениям мы будем следующим образом: НашаСтруктура.Код и НашаСтруктура.Имя.
Такое обращение гораздо удобнее, чем если бы мы все параметры определили в Массив и обращались к ним по индексу.
Структура делает программный код читаемым (понятным). Структура применяется достаточно часто, гораздо чаще чем Массив.
Она используется для описания некоторых параметров, которых зачастую существует достаточно большое количество во всех алгоритмах.
Кроме того, Структура применяется в том случае, если процедура и функция содержат большое количество передаваемых параметров.
Тогда гораздо удобнее записать все параметры в Структуру и именно ее и передавать. Т.е. происходит «упаковка» параметров процедур и функций.
Отдельно следует отметить, что в качестве Ключа в Структуре может выступать не абсолютно любая строка. Накладываются определенные ограничения.
Ключ должен выступать в качестве идентификатора. Это означает, что в Ключе не должно быть пробелов и он не может начинаться с цифры.
Допустимо начало Ключа с буквы или знака подчеркивания. Таким образом, Ключ должен удовлетворять требованиям к созданию идентификаторов.
Отметим, чем еще Сруктура отличается от Массива. В Структуре есть метод Вставить, в Массиве есть два метода для вставки: Вставить (в определенную позицию) и Добавить (в конец списка). В Массиве все элементы являются упорядоченными.
Структура – это некое неупорядоченное множество. Именно поэтому для Структуры существует только метод вставки.
Значение вставляется не на конкретную позицию, а в указанное множество. Для Структуры недопустимо обращение по индексу, как для других универсальных коллекций.
К элементам Структуры обращаются только по имени Ключа. Тем не менее, цикл Для каждого из работает и для Структуры, но опираться на порядок элементов Структуры не следует.
Структура создается точно так же, как и другие универсальные коллекции с помощью использования конструктора Новый, указывая тип данных Структура.
Как и Массив, конструктор Структуры может иметь параметры. Т.е. возможно описать само содержание Структуры, используя конструктор.
В отличие от Массива, где можно просто указать количество элементов для всех размерностей, в Структуре возможно задавать само содержание.
Например: НашаСтруктура = Новый Структура (“Код,Имя”, 133, “Вася”);
Через запятую перечисляются сначала имена Ключей, а потом, соответственно, в той же последовательности значения параметров.
Для добавления в Структуру нового значения существует метод Вставить, который вставляет новую пару (Ключ и Значение).
Для Структуры характерен еще один метод, который используется достаточно часто. Это метод Свойство.
С помощью данного метода можно понять, а есть ли в этой Структуре такой элемент, у которого Ключ имеет такое-то имя.
Если существует такой элемент, то система вернет значение Истина, в противном случае – Ложь.
Например, выражение НашаСтруктура.Свойство (“ЧленовСемьи”) будет равно значению Истина. Этот метод применяется достаточно часто при анализе Структуры.
Как и для любой универсальной коллекции, допустимо обращение к свойствам Структуры по индексу. Но индекс для Структуры – это строковое значение.
Однако следует не забывать, что Структура – это не упорядоченное множество объектов, именно поэтому обращение по индексу 0, 1, 2 недопустимо.
Универсальная коллекция Список значений
СписокЗначений представляет собой линейный список элементов любого типа данных.
Каждый элемент состоит из нескольких значений. Схематично список значений можно представить в виде списка с четырьмя колонками.
Первая колонка – Отметка. Она имеет булевский тип данных и позволяет пользователю либо ставить флажки, либо их снимать.
Другая колонка – это картинка, которая может каким-то образом визуально изображать данный элемент, т.е. ставить в соответствие данной строке какую-либо картинку.
Третья колонка – само хранимое значение, т.е. это любой тип данных, причем в разных строках он может быть различным.
Четвертая колонка – это представление, т.е. это некое строковое описание данного значения. Представление будет выводиться пользователю, когда он будет просматривать данный элемент. При этом, если представление не задано, система будет пытаться сама получить представления для элемента, содержащегося в данной позиции.
СписокЗначений – это тот объект, с которым может визуально работать пользователь. Т.е. СписокЗначений можно вывести на форму.
Пользователь может выполнять с ним какие-то действия. Кроме этого, СписокЗначений можно вывести независимо, используя методы, т.е. показать на экран в некоторой ветке алгоритма (за исключением серверного кода), чтобы пользователь выбрал какую-то строчку или проставил какие-либо галочки.
Найдем СписокЗначений в ситакс-помощнике. Конструктор СпискаЗначений не параметризованный (нельзя задать какие-то значения по умолчанию).
Есть такие методы, как:
Есть и специальные методы, например, ВыгрузитьЗначения(). При этом создается Массив, в который копируется список значений. Например:
Существует и обратный метод:
СписокТиповЦен.ЗагрузитьЗначения(МассивЭлементов);
Существуют методы поиска:
НайтиПоЗначению( ); НайтиПоИдентификатору( ).
Есть метод копирования:
КопияСписка = СписокТиповЦен.Скопировать();
Данный метод предназначен для того, чтобы сделать какую-то модификацию с копией.
Существуют методы:
СортироватьПоЗначению( );
СортироватьПоПредставлению( ).
Для использования этих методов в свойствах конфигурации Режим использования модальности должен быть установлен на значение Использовать.
Пример кода, вызываемого из модуля Управляемого приложения:
Отображение данного кода в пользовательском режиме (модальное диалоговое окно).
Ниже СписокЗначений используется в качестве доступного типа данных для реквизита формы. Создаем для формы обработки новый реквизит, определяем для него тип СписокЗначений и отображаем его на форме.
Создаем новую команду ЗапонитьПодарки, переносим на форму и определяем для нее обработчик действия.
Обработчик действия в модуле формы:
В пользовательском режиме, при нажатии в форме обработки кнопки Заполнить подарки, появится заполненный список.
При желании список можно редактировать: какие-то элементы добавить, какие-то – удалить.
Универсальная коллекция Соответствие
Данная коллекция очень схожа со Структурой. Также, как и Структура, Соответствие представляет собой наборы значений, которые состоят из ключа и самого значения.
Главное отличие в том, что в качестве Ключа может указываться любой тип данных, равно как и для значения. В виду этой особенности обращаться к значению соответствия необходимо по индексу, в качестве значения индекса указывается значение ключа.
В качестве ключа может быть тип данных, отличающихся от строки. Свойства и методы работы с Соответствием практически такие же, как у Структуры.
Конструктор Соответствия, в отличии от Структуры, не содержит возможности указания параметров.
Соответствие удобно применять тогда, когда необходимо связать какие-либо две структуры. Например, каждой строке табличной части необходимо сопоставить строку из таблицы значений.
В этом случае в качестве ключа Соответствия используется строка табличной части и указывается соответствующее значение.
Например: НашеСоответствие = Новый Соответствие;
Соответствие[777] = 999;
Т.е. если элемент в коллекции не присутствовал, то с помощью оператора присваивания он будет добавлен, а если присутствовал, то будет обновлен.
Это является отличием от Структуры.
Универсальная коллекция Таблица значений
ТаблицаЗначений представляет из себя таблицу с произвольным количеством строк и произвольным количеством колонок. На пересечении могут храниться значения любого типа данных. При необходимости колонки можно типизировать, т. е. определить в какой колонке какой тип данных хранится.
Можно оставить колонки нетипизированными, тогда в одной колонке в разных строках могут храниться значения разных типов.
Отличия ТаблицыЗначений от двухмерного Массива:
ТаблицаЗначений используется как некий буфер хранения информации. ТаблицаЗначений возвращается и принимается как параметр многими методами системы. К Таблице значений возможно построить запрос.
Итак, ТаблицаЗначений состоит из набора строк и набора колонок. И строки, и колонки представляют собой коллекции.
Т.е. внутри коллекции ТаблицаЗначений есть еще две коллекции. Обратимся к синтакс-помощнику и найдем ТаблицуЗначений.
Поддерживаемые типы данных: сама ТаблицаЗначений, которая состоит из строк. Каждая строка представлена типом данных СтрокаТаблицыЗначений, у которой есть свои свойства и свои методы. Имеется КоллекцияКолонок ТаблицыЗначений. КолонкаТаблицыЗначений также обладает определенными свойствами.
Важный момент! Процедура, которая формирует ТаблицуЗначений, должна компилироваться & НаСервере.
Прежде, чем начать работать с ТаблицейЗначений, необходимо определить, какие в ней будут содержаться колонки (т.е. создать их). Синтаксис:
Для вызова данной процедуры будем использовать команду.
В описании ТаблицыЗначений в качестве элементов коллекции выступают именно СтрокиТаблицыЗначений.
В отличии от колонок, которые состоят только из свойств (Имя, Тип, Заголовок, Ширина), в СтрокеТаблицыЗначений существуют как свойства (обращение по имени колонки), так и методы (можно получать и устанавливать значение, работать с владельцами).
Чтобы добавить новую строку в таблицу нужно использовать метод либо Добавить(), либо Вставить( ). Во втором случае следует указать, на какую позицию нужно выставлять требуемую строку.
Чтобы присвоить значение колонке, мы через точку обращаемся по имени колонки или по индексу (с помощью квадратных скобок).
Для заполнения ТаблицыЗначений могут использоваться следующие методы:
Очистить() – для удаления всех строк из ТаблицыЗначений.
Два последних метода удобно использовать, когда нужно перебросить колонку из одной таблицы значений в другую.
Можно скопировать структуру ТаблицыЗначений. Для этого существует соответствующий метод СкопироватьКолонки( ). Мы получим пустую ТаблицуЗначений с требуемой структурой.
В ТаблицеЗначений существует метод Итог( ). Можно указать ту колонку, в которой нужно просуммировать числовые величины. Применительно к ранее показанному коду в Табло можно рассчитать значение: ТЗ.Итог(“Сумма”).
Применительно к ранее показанному коду в Табло можно рассчитать значение: ТЗ.Свернуть(“ДеньНедели”,“Сумма”).
ТаблицуЗначений можно показать на пользовательском экране, чтобы с ней можно было совершать какие-либо действия. Но в отличии от СпискаЗначений из программного кода нельзя просто так вызвать таблицу на экран.
Чтобы отобразить ТаблицуЗначений на экране, создадим реквизит формы и присвоим ему тип данных ТаблицаЗначений.
Далее у этого объекта («Таблица») нужно будет создать колонки с соответствующим именем и типом данных.
После чего полученную таблицу следует вывести на форму.
В модуле формы в конце ранее составленного алгоритма (в Процедуре СозданиеТаблицыЗначений) следует дописать:
ЗначениеВДанныеФормы(ТЗ, Таблица);
Универсальная коллекция Дерево значений
ДеревоЗначений универсальная коллекция, которая очень похожа на ТаблицуЗначений. Отличие от таблицы заключается в том, что строки дерева могут быть подчинены друг другу, т.е. может быть образована некая иерархия.
ДеревоЗначений тоже может быть отражено на экране. Дерево значений в явном виде состоит из коллекции строк и коллекции колонок. В дереве существуют такие два свойства как Строки и Колонки.
Поскольку строки могут быть подчинены друг другу, то для каждой строки может быть указан Родитель, а также подчиненные ей строки.
Создадим соответствующую команду Дерево и ее процедуру обработки.
Создадим ДеревоЗначений в котором одна родительская строка и две подчиненные.
Создадим реквизит формы ДерЗн (тип данных – ДеревоЗначений).
Для этого реквизита создадим колонки Год и Месяц.
Переместим соответствующий элемент ДерЗн на форму.
В конце Процедуры ДеревоНаСервере() допишем:
Проверим, что получилось в пользовательском режиме.
С помощью кнопки Добавить можно добавлять новые строки. Они могут также образовывать иерархию.
Чтобы обойти все элементы дерева значений, нам понадобится использовать рекурсию, т.е. вызов процедуры самой из себя. Например, обработка дерева значений может выглядеть так:
На этом мы завершаем наше первое знакомство с универсальными коллекциями.
В следующей статье рассмотрим, при помощи какого важного механизма разработчик может упростить обращение к элементу справочника из программного кода.
PDF-версия статьи для участников группы ВКонтакте
Если Вы еще не вступили в группу – сделайте это сейчас и в блоке ниже (на этой странице) появятся ссылка на скачивание материалов.
Статья в PDF-формате
Вы можете скачать эту статью в формате PDF по следующей ссылке:Ссылка доступна для зарегистрированных пользователей)
Ссылка доступна для зарегистрированных пользователей)
Ссылка доступна для зарегистрированных пользователей)
Ссылка доступна для зарегистрированных пользователей)