Предназначен для моделирования наборов записей в данных формы клиентского приложения.
Полное описание, параметры и ограничения
ДанныеФормыСтруктураСКоллекцией (FormDataStructureAndCollection)
ДанныеФормыСтруктураСКоллекцией (FormDataStructureAndCollection)
Доступен, начиная с версии 8.2.
Элементы коллекции:
ДанныеФормыЭлементКоллекции
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются элементы коллекции.
Возможно обращение к элементу коллекции посредством оператора [...]. В качестве аргумента передается индекс элемента (нумерация с 0).
Свойства:
<Имя свойства> (<Property name>)
Методы:
Вставить (Insert)
Выгрузить (Unload)
Добавить (Add)
Загрузить (Load)
Индекс (IndexOf)
Итог (Total)
Количество (Count)
НайтиПоИдентификатору (FindByID)
НайтиСтроки (FindRows)
Очистить (Clear)
Получить (Get)
Свойство (Property)
Сдвинуть (Move)
Сортировать (Sort)
Удалить (Delete)
Описание:
Предназначен для моделирования наборов записей в данных формы клиентского приложения.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
См. также:
Глобальный контекст, метод ДанныеФормыВЗначение
Глобальный контекст, метод ЗначениеВДанныеФормы
ФормаКлиентскогоПриложения, метод ЗначениеВРеквизитФормы
ФормаКлиентскогоПриложения, метод РеквизитФормыВЗначение
ДанныеФормыСтруктураСКоллекцией, метод Удалить
Использование в версии:
Доступен, начиная с версии 8.2.
Методическая информация
Практические примеры
Найти Книгу и выгрузить независимый снимок её полей
НайтиСтроки выдаёт ссылки на строки модели, а Выгрузить — самостоятельную серверную ТаблицуЗначений. Показываем оба варианта выгрузки.
Где и как запускать
Полный модуль управляемой формы своей внешней обработки, ПриСозданииНаСервере.
Подготовка
Используйте отдельную свою конфигурацию УчебнаяКонфигурацияСинтаксиса. В Конфигураторе создайте независимый непериодический регистр сведений УчебныеСтроки. Не используйте существующий рабочий регистр.
Добавьте измерения Номер типа Число (10, 0) и Товар типа Строка (64). Добавьте ресурсы Количество типа Число (10, 0), Сумма типа Число (12, 2). Обновите только свою учебную конфигурацию базы.
Создайте собственную внешнюю обработку с пустой управляемой основной формой. Реквизит УчебныеЗаписи и таблицу вручную не добавляйте: их создаёт код.
Вставьте весь модуль выбранного урока. В свойствах формы назначьте событию ПриСозданииНаСервере одноимённую процедуру. Сохраните EPF и откройте её в своей учебной базе.
Набор создаётся пустым и заполняется только в памяти. В коде нет Прочитать, Записать, транзакций, привилегированного режима, запросов, файлов или сети. Таблица на форме только для просмотра.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Реквизиты = Новый Массив;
Реквизиты.Добавить(Новый РеквизитФормы("УчебныеЗаписи",
Новый ОписаниеТипов("РегистрСведенийНаборЗаписей.УчебныеСтроки")));
ЭтаФорма.ИзменитьРеквизиты(Реквизиты);
Набор = РегистрыСведений.УчебныеСтроки.СоздатьНаборЗаписей();
Для Каждого ИсходнаяСтрока Из СтрРазделить("1|Книга|3|750;2|Ручка|1|50;3|Коробка|2|60", ";") Цикл
Поля = СтрРазделить(ИсходнаяСтрока, "|");
Запись = Набор.Добавить();
Запись.Номер = Число(Поля[0]);
Запись.Товар = Поля[1];
Запись.Количество = Число(Поля[2]);
Запись.Сумма = Число(Поля[3]);
КонецЦикла;
ЭтаФорма.ЗначениеВРеквизитФормы(Набор, "УчебныеЗаписи");
Записи = ЭтаФорма.УчебныеЗаписи;
Если ТипЗнч(Записи) <> Тип("ДанныеФормыСтруктураСКоллекцией") Тогда
ВызватьИсключение "Ожидалась модель набора записей, а не обычная таблица формы";
КонецЕсли;
Сообщить(Записи.Количество() = 3);
Сообщить(Записи.Итог("Сумма") = 860);
Отбор = Новый Структура("Товар", "Книга");
Найденные = Записи.НайтиСтроки(Отбор);
Если Найденные.Количество() <> 1 Тогда
ВызватьИсключение "В собственных исходных строках должна быть одна Книга";
КонецЕсли;
Книга = Найденные[0];
ПоМассиву = Записи.Выгрузить(Найденные, "Товар,Количество,Сумма");
ПоСтруктуре = Записи.Выгрузить(Отбор, "Товар,Количество,Сумма");
Сообщить(ПоМассиву.Количество() = 1);
Сообщить(ПоСтруктуре.Количество() = 1);
Сообщить(ПоМассиву.Получить(0).Сумма = 750);
Сообщить(ПоСтруктуре.Колонки.Количество() = 3);
Книга.Количество = 4;
Книга.Сумма = 1000;
Сообщить(Найденные[0].Количество = 4);
Сообщить(Найденные[0].Сумма = 1000);
Сообщить(ПоМассиву.Получить(0).Количество = 3);
Сообщить(ПоСтруктуре.Получить(0).Сумма = 750);
Сообщить(Записи.Количество() = 3);
Сообщить(Записи.Итог("Сумма") = 1110);
Сообщить(ПоМассиву.Итог("Сумма") = 750);
Сообщить(ПоСтруктуре.Итог("Сумма") = 750);
Таблица = ЭтаФорма.Элементы.Добавить("ТаблицаУчебныхЗаписей", Тип("ТаблицаФормы"));
Таблица.ПутьКДанным = "УчебныеЗаписи";
Таблица.Заголовок = "Только собственные строки в памяти — регистр не записывается";
Таблица.ТолькоПросмотр = Истина;
Таблица.АвтоВводНезаполненного = Ложь;
Таблица.АвтоВводНовойСтроки = Ложь;
Для Каждого ИмяКолонки Из СтрРазделить("Номер,Товар,Количество,Сумма", ",") Цикл
Поле = ЭтаФорма.Элементы.Добавить("УчебноеПоле" + ИмяКолонки, Тип("ПолеФормы"), Таблица);
Поле.Вид = ВидПоляФормы.ПолеВвода;
Поле.ПутьКДанным = "УчебныеЗаписи." + ИмяКолонки;
Поле.Заголовок = ИмяКолонки;
КонецЦикла;
КонецПроцедурыРазбор по шагам
Найти одну Книгу по структуре Товар=Книга, проверить количество до обращения к индексу 0.
Выгрузить выбранные строки двумя способами: массивом строк и структурой отбора. Во втором аргументе указать одинаковые три колонки.
Изменить только собственную Книгу в модели на количество 4 и сумму 1000. Найденные содержит живую ссылку и видит новые значения.
Обе выгруженные таблицы остаются снимками с количеством 3 и суммой 750. Остальные две строки остаются в модели; отбор не удаляет их.
Итог модели теперь 1000+50+60=1110. Никакой автоматической формулы суммы нет — оба значения изменяются явно.
Как проверить результат
Все булевы сообщения Истина. На форме Книга 4/1000, Ручка 1/50 и Коробка 2/60.
Снимки содержат только одну Книгу 3/750 и три колонки. Их итог 750, итог модели 1110.
Ожидаемый результат
Наглядно разобраны живые строки, независимые выгрузки и два родственных, но разных контракта.
На что обратить внимание
Выгрузить доступен только на сервере; не переносите вызов в тонкий клиентский обработчик.
НайтиСтроки возвращает ссылки, а не резервную копию. Для независимого снимка нужна выгрузка.
Структура отбора этой операции не равна отбору записи регистра и не меняет SQL-запросы.
Отбор не сортирует результат, а набор имён колонок не является произвольным выражением запроса.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Сохранить идентификатор Книги при сортировке набора
Идентификатор строки модели не равен её позиции. Проверяем собственную Книгу после сортировки и отсутствие заранее несуществующего свойства.
Где и как запускать
Полный модуль управляемой формы своей внешней обработки, ПриСозданииНаСервере.
Подготовка
Используйте отдельную свою конфигурацию УчебнаяКонфигурацияСинтаксиса. В Конфигураторе создайте независимый непериодический регистр сведений УчебныеСтроки. Не используйте существующий рабочий регистр.
Добавьте измерения Номер типа Число (10, 0) и Товар типа Строка (64). Добавьте ресурсы Количество типа Число (10, 0), Сумма типа Число (12, 2). Обновите только свою учебную конфигурацию базы.
Создайте собственную внешнюю обработку с пустой управляемой основной формой. Реквизит УчебныеЗаписи и таблицу вручную не добавляйте: их создаёт код.
Вставьте весь модуль выбранного урока. В свойствах формы назначьте событию ПриСозданииНаСервере одноимённую процедуру. Сохраните EPF и откройте её в своей учебной базе.
Набор создаётся пустым и заполняется только в памяти. В коде нет Прочитать, Записать, транзакций, привилегированного режима, запросов, файлов или сети. Таблица на форме только для просмотра.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Реквизиты = Новый Массив;
Реквизиты.Добавить(Новый РеквизитФормы("УчебныеЗаписи",
Новый ОписаниеТипов("РегистрСведенийНаборЗаписей.УчебныеСтроки")));
ЭтаФорма.ИзменитьРеквизиты(Реквизиты);
Набор = РегистрыСведений.УчебныеСтроки.СоздатьНаборЗаписей();
Для Каждого ИсходнаяСтрока Из СтрРазделить("1|Книга|3|750;2|Ручка|1|50;3|Коробка|2|60", ";") Цикл
Поля = СтрРазделить(ИсходнаяСтрока, "|");
Запись = Набор.Добавить();
Запись.Номер = Число(Поля[0]);
Запись.Товар = Поля[1];
Запись.Количество = Число(Поля[2]);
Запись.Сумма = Число(Поля[3]);
КонецЦикла;
ЭтаФорма.ЗначениеВРеквизитФормы(Набор, "УчебныеЗаписи");
Записи = ЭтаФорма.УчебныеЗаписи;
Если ТипЗнч(Записи) <> Тип("ДанныеФормыСтруктураСКоллекцией") Тогда
ВызватьИсключение "Ожидалась модель набора записей, а не обычная таблица формы";
КонецЕсли;
Сообщить(Записи.Количество() = 3);
Сообщить(Записи.Итог("Сумма") = 860);
Книга = Записи.Получить(0);
Идентификатор = Книга.ПолучитьИдентификатор();
Сообщить(Книга.Товар = "Книга");
Сообщить(Записи.НайтиПоИдентификатору(Идентификатор) = Книга);
Записи.Сортировать("Сумма Возр,Номер Возр");
Сообщить(Записи.Индекс(Книга) = 2);
ПослеСортировки = Записи.НайтиПоИдентификатору(Идентификатор);
Сообщить(ПослеСортировки = Книга);
Сообщить(ПослеСортировки.Сумма = 750);
Сообщить(Записи.Получить(0).Товар = "Ручка");
НайденноеЗначение = "Это значение должно быть заменено";
ЕстьСвойство = Записи.Свойство("ЗаведомоОтсутствующееУчебноеСвойство", НайденноеЗначение);
Сообщить(НЕ ЕстьСвойство);
Сообщить(НайденноеЗначение = Неопределено);
Записи.Удалить(Книга);
Сообщить(Записи.НайтиПоИдентификатору(Идентификатор) = Неопределено);
Сообщить(Записи.Количество() = 2);
Сообщить(Записи.Итог("Сумма") = 110);
Таблица = ЭтаФорма.Элементы.Добавить("ТаблицаУчебныхЗаписей", Тип("ТаблицаФормы"));
Таблица.ПутьКДанным = "УчебныеЗаписи";
Таблица.Заголовок = "Только собственные строки в памяти — регистр не записывается";
Таблица.ТолькоПросмотр = Истина;
Таблица.АвтоВводНезаполненного = Ложь;
Таблица.АвтоВводНовойСтроки = Ложь;
Для Каждого ИмяКолонки Из СтрРазделить("Номер,Товар,Количество,Сумма", ",") Цикл
Поле = ЭтаФорма.Элементы.Добавить("УчебноеПоле" + ИмяКолонки, Тип("ПолеФормы"), Таблица);
Поле.Вид = ВидПоляФормы.ПолеВвода;
Поле.ПутьКДанным = "УчебныеЗаписи." + ИмяКолонки;
Поле.Заголовок = ИмяКолонки;
КонецЦикла;
КонецПроцедурыРазбор по шагам
Получить именно первую Книгу собственного начального набора, сохранить её идентификатор через метод строки модели.
Сортировать по сумме по возрастанию: Ручка 50, Коробка 60, Книга 750. Позиция Книги меняется с 0 на 2, идентификатор сохраняется.
Свойство проверяет ключ структуры модели, а не ищет товар или колонку по значению. На заведомо отсутствующем ключе получаем Ложь и Неопределено.
Удалить только строку Книги из собственной модели. НайтиПоИдентификатору теперь возвращает Неопределено; это не удаление справочника и не запись регистра.
Как проверить результат
Все булевы сообщения Истина. После удаления видны Ручка 50 и Коробка 60, сумма 110.
В реальном обработчике всегда проверяйте результат поиска до чтения его полей: удалённая строка не существует.
Ожидаемый результат
На понятном примере разделены индекс, идентификатор строки и ключ структуры.
На что обратить внимание
НайтиПоИдентификатору не возвращает UUID товара, ключ записи регистра или номер строки базы.
Идентификатор имеет смысл в текущей модели. Не обещается сохранение идентичности после её повторной загрузки.
Сортировка меняет представляемую коллекцию в памяти; порядок хранения записей в регистре не проверяется.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.