ДанныеФормыКоллекция.Выгрузить

Методы · Unload

Создает таблицу значений и копирует в нее данные коллекции. Имена колонок таблицы значений совпадают с именами колонок коллекции. Колонка, содержащая номер строки, выгружается в колонку с именем НомерСтроки.

Синтаксис

Выгрузить(<Строки>, <Колонки>)
Выгрузить(<ПараметрыОтбора>, <Колонки>)
Полное описание, параметры и ограничения

ДанныеФормыКоллекция.Выгрузить (FormDataCollection.Unload)

ДанныеФормыКоллекция (FormDataCollection)

Выгрузить (Unload)

Доступен, начиная с версии 8.2.

Вариант синтаксиса: Выгрузить колонки

Синтаксис:
Выгрузить(<Строки>, <Колонки>)
Параметры:

<Строки> (необязательный)
Тип: Массив.
Массив строк для выгрузки. Если не указан, выгружаются все строки коллекции.

<Колонки> (необязательный)
Тип: Строка.
Строка, задающая список колонок для копирования в формате: "Колонка1, Колонка2...". Если список не задан, то будут скопированы все колонки.
Вариант синтаксиса: Выгрузить по отбору

Синтаксис:
Выгрузить(<ПараметрыОтбора>, <Колонки>)
Параметры:

<ПараметрыОтбора> (необязательный)
Тип: Структура.
Ключ структуры - идентификатор колонки, а значение структуры - значение отбора.

<Колонки> (необязательный)
Тип: Строка.
Список колонок для копирования в формате: "Колонка1, Колонка2,...,КолонкаN".
Описание варианта метода:
Если указан отбор, то только строки из отбора будут выгружены.
Если отбор не указан, то будут выгружены все строки коллекции.
Если указаны колонки, то только эти колонки будут выгружены.
Иначе, будут выгружены все колонки коллекции.
Возвращаемое значение:
Тип: ТаблицаЗначений.

Описание:

Создает таблицу значений и копирует в нее данные коллекции. Имена колонок таблицы значений совпадают с именами колонок коллекции. Колонка, содержащая номер строки, выгружается в колонку с именем НомерСтроки.

Доступность:

Сервер, мобильное приложение (сервер), мобильный автономный сервер.

Использование в версии:

Доступен, начиная с версии 8.2.

Методическая информация

Практические примеры

Выгрузить ручку по массиву строк, а книгу — по отбору

Две перегрузки одного метода принимают разные первые аргументы. Массив содержит сами строки коллекции, а Структура связывает имя колонки с нужным значением.

Где и как запускать

Модуль новой управляемой формы учебной внешней обработки. Код содержит готовые процедуры с директивами; вставляйте на уровне модуля, не внутрь другого обработчика. Каждую задачу запускайте в отдельной копии формы.

Подготовка

  1. В учебной базе: Файл → Новый → Внешняя обработка. Создайте управляемую форму и назначьте её основной. Дайте обработке имя УчебнаяТаблица.

  2. Не добавляйте вручную реквизит Товары и одноимённые элементы: код создаст их при открытии. Модуль формы для этой задачи должен быть пустым.

  3. В свойствах формы → События свяжите ПриСозданииНаСервере с одноимённой процедурой. Сохраните отдельную учебную EPF и откройте через Файл → Открыть.

  4. Данные Книга/Ручка создаются в памяти формы. Справочники, документы и регистры вашей конфигурации не читаются и не записываются.

  5. Каждая команда сначала сбрасывает ТОЛЬКО собственный реквизит Товары к двум учебным строкам. Ручные изменения этой учебной таблицы при запуске задачи будут потеряны; рабочие формы не используйте.

  6. ДанныеФормыКоллекция не создаётся через Новый. Она возникает у реквизита формы, описанного как ТаблицаЗначений. Выгрузить/Загрузить выполняются только на сервере.


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    НовыеРеквизиты = Новый Массив;
    НовыеРеквизиты.Добавить(Новый РеквизитФормы("Товары", Новый ОписаниеТипов("ТаблицаЗначений")));
    НовыеРеквизиты.Добавить(Новый РеквизитФормы("Код", Новый ОписаниеТипов("Строка"), "Товары", "Код"));
    НовыеРеквизиты.Добавить(Новый РеквизитФормы("Наименование", Новый ОписаниеТипов("Строка"), "Товары", "Название"));
    НовыеРеквизиты.Добавить(Новый РеквизитФормы("Количество", Новый ОписаниеТипов("Число",
        Новый КвалификаторыЧисла(9, 0, ДопустимыйЗнак.Неотрицательный)), "Товары", "Количество"));
    ЭтаФорма.ИзменитьРеквизиты(НовыеРеквизиты);
    Данные = Новый ТаблицаЗначений;
    Данные.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка"));
    Данные.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
    Данные.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число",
        Новый КвалификаторыЧисла(9, 0, ДопустимыйЗнак.Неотрицательный)));

    СтрокаТовара = Данные.Добавить();
    СтрокаТовара.Код = "A-01";
    СтрокаТовара.Наименование = "Книга";
    СтрокаТовара.Количество = 3;
    СтрокаТовара = Данные.Добавить();
    СтрокаТовара.Код = "B-02";
    СтрокаТовара.Наименование = "Ручка";
    СтрокаТовара.Количество = 1;

    ЭтаФорма.ЗначениеВРеквизитФормы(Данные, "Товары");
    Таблица = ЭтаФорма.Элементы.Добавить("ТаблицаТоваров", Тип("ТаблицаФормы"));
    Таблица.ПутьКДанным = "Товары";
    Таблица.Заголовок = "Учебные товары";
    Таблица.Шапка = Истина;
    Таблица.АвтоВводНезаполненного = Ложь;
    Таблица.АвтоВводНовойСтроки = Ложь;
    Для Каждого ИмяКолонки Из СтрРазделить("Код,Наименование,Количество", ",") Цикл
        Колонка = Элементы.Добавить("Товары" + ИмяКолонки, Тип("ПолеФормы"), Таблица);
        Колонка.Вид = ВидПоляФормы.ПолеВвода;
        Колонка.ПутьКДанным = "Товары." + ИмяКолонки;
        Колонка.Заголовок = ИмяКолонки;
    КонецЦикла;
    КомандаДействия = ЭтаФорма.Команды.Добавить("УчебноеДействие");
    КомандаДействия.Действие = "УчебноеДействие";
    КомандаДействия.Заголовок = "Сравнить два способа выгрузки";
    КомандаДействия.Подсказка = "Действие только над данными учебной формы";
    КомандаДействия.ИзменяетСохраняемыеДанные = Ложь;
    Кнопка = Элементы.Добавить("КнопкаУчебноеДействие", Тип("КнопкаФормы"));
    Кнопка.ИмяКоманды = КомандаДействия.Имя;
    Кнопка.Заголовок = КомандаДействия.Заголовок;
КонецПроцедуры

&НаКлиенте
Процедура УчебноеДействие(Команда)
    СброситьТолькоУчебныеТовары();
    ПроверитьДваОтбораНаСервере();
КонецПроцедуры

&НаСервереБезКонтекста
Функция СоздатьДваУчебныхТовара()
    Данные = Новый ТаблицаЗначений;
    Данные.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка"));
    Данные.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
    Данные.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число",
        Новый КвалификаторыЧисла(9, 0, ДопустимыйЗнак.Неотрицательный)));
    Книга = Данные.Добавить();
    Книга.Код = "A-01";
    Книга.Наименование = "Книга";
    Книга.Количество = 3;
    Ручка = Данные.Добавить();
    Ручка.Код = "B-02";
    Ручка.Наименование = "Ручка";
    Ручка.Количество = 1;
    Возврат Данные;
КонецФункции

&НаСервере
Процедура СброситьТолькоУчебныеТовары()
    Товары.Загрузить(СоздатьДваУчебныхТовара());
КонецПроцедуры

&НаСервере
Процедура ПроверитьДваОтбораНаСервере()
    Выбранные = Новый Массив;
    Выбранные.Добавить(Товары.Получить(1));
    Ручки = Товары.Выгрузить(Выбранные, "Код,Количество");
    Сообщить(Ручки.Количество() = 1);
    Сообщить(Ручки[0].Код = "B-02");
    Сообщить(Ручки[0].Количество = 1);
    Книги = Товары.Выгрузить(Новый Структура("Код", "A-01"), "Код,Количество");
    Сообщить(Книги.Количество() = 1);
    Сообщить(Книги[0].Код = "A-01");
    Книги[0].Количество = 55;
    Сообщить(Товары.Количество() = 2);
    Сообщить(Товары.Получить(0).Количество = 3);
КонецПроцедуры

Разбор по шагам

  1. Коллекция содержит две собственные строки, исходная ручка имеет индекс 1.

  2. В массив помещаем строку, не её индекс и не строковый код.

  3. Вторая перегрузка получает Структура("Код", "A-01"); Код — идентификатор колонки.

  4. Обе выгрузки ограничивают колонки и выполняются на сервере.

  5. Изменяем количество только в копии книги, затем проверяем исходные данные формы.

Как проверить результат

  1. Семь логических сообщений дают Истина.

  2. Первая копия содержит только B-02/1, вторая — A-01; количество 55 не попадает обратно в форму.

Ожидаемый результат

На разных товарах показано различие выбора по объектам строк и отбора по значению колонки.

На что обратить внимание

  1. Не передавайте Массив чисел вместо Массив строк коллекции в эту перегрузку.

  2. Массив строк должен относиться к этой коллекции, не к другой форме.

  3. Изменение копии не является редактированием исходной строки; для этого нужен отдельный осмысленный шаг.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Выгрузить копию Код/Количество на сервере и не изменить форму

Выгрузить возвращает ТаблицаЗначений, не клиентскую коллекцию. Выбираем две колонки и изменяем копию, чтобы проверить независимость числового значения.

Где и как запускать

Модуль новой управляемой формы учебной внешней обработки. Код содержит готовые процедуры с директивами; вставляйте на уровне модуля, не внутрь другого обработчика. Каждую задачу запускайте в отдельной копии формы.

Подготовка

  1. В учебной базе: Файл → Новый → Внешняя обработка. Создайте управляемую форму и назначьте её основной. Дайте обработке имя УчебнаяТаблица.

  2. Не добавляйте вручную реквизит Товары и одноимённые элементы: код создаст их при открытии. Модуль формы для этой задачи должен быть пустым.

  3. В свойствах формы → События свяжите ПриСозданииНаСервере с одноимённой процедурой. Сохраните отдельную учебную EPF и откройте через Файл → Открыть.

  4. Данные Книга/Ручка создаются в памяти формы. Справочники, документы и регистры вашей конфигурации не читаются и не записываются.

  5. Каждая команда сначала сбрасывает ТОЛЬКО собственный реквизит Товары к двум учебным строкам. Ручные изменения этой учебной таблицы при запуске задачи будут потеряны; рабочие формы не используйте.

  6. ДанныеФормыКоллекция не создаётся через Новый. Она возникает у реквизита формы, описанного как ТаблицаЗначений. Выгрузить/Загрузить выполняются только на сервере.


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    НовыеРеквизиты = Новый Массив;
    НовыеРеквизиты.Добавить(Новый РеквизитФормы("Товары", Новый ОписаниеТипов("ТаблицаЗначений")));
    НовыеРеквизиты.Добавить(Новый РеквизитФормы("Код", Новый ОписаниеТипов("Строка"), "Товары", "Код"));
    НовыеРеквизиты.Добавить(Новый РеквизитФормы("Наименование", Новый ОписаниеТипов("Строка"), "Товары", "Название"));
    НовыеРеквизиты.Добавить(Новый РеквизитФормы("Количество", Новый ОписаниеТипов("Число",
        Новый КвалификаторыЧисла(9, 0, ДопустимыйЗнак.Неотрицательный)), "Товары", "Количество"));
    ЭтаФорма.ИзменитьРеквизиты(НовыеРеквизиты);
    Данные = Новый ТаблицаЗначений;
    Данные.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка"));
    Данные.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
    Данные.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число",
        Новый КвалификаторыЧисла(9, 0, ДопустимыйЗнак.Неотрицательный)));

    СтрокаТовара = Данные.Добавить();
    СтрокаТовара.Код = "A-01";
    СтрокаТовара.Наименование = "Книга";
    СтрокаТовара.Количество = 3;
    СтрокаТовара = Данные.Добавить();
    СтрокаТовара.Код = "B-02";
    СтрокаТовара.Наименование = "Ручка";
    СтрокаТовара.Количество = 1;

    ЭтаФорма.ЗначениеВРеквизитФормы(Данные, "Товары");
    Таблица = ЭтаФорма.Элементы.Добавить("ТаблицаТоваров", Тип("ТаблицаФормы"));
    Таблица.ПутьКДанным = "Товары";
    Таблица.Заголовок = "Учебные товары";
    Таблица.Шапка = Истина;
    Таблица.АвтоВводНезаполненного = Ложь;
    Таблица.АвтоВводНовойСтроки = Ложь;
    Для Каждого ИмяКолонки Из СтрРазделить("Код,Наименование,Количество", ",") Цикл
        Колонка = Элементы.Добавить("Товары" + ИмяКолонки, Тип("ПолеФормы"), Таблица);
        Колонка.Вид = ВидПоляФормы.ПолеВвода;
        Колонка.ПутьКДанным = "Товары." + ИмяКолонки;
        Колонка.Заголовок = ИмяКолонки;
    КонецЦикла;
    КомандаДействия = ЭтаФорма.Команды.Добавить("УчебноеДействие");
    КомандаДействия.Действие = "УчебноеДействие";
    КомандаДействия.Заголовок = "Выгрузить только две колонки";
    КомандаДействия.Подсказка = "Действие только над данными учебной формы";
    КомандаДействия.ИзменяетСохраняемыеДанные = Ложь;
    Кнопка = Элементы.Добавить("КнопкаУчебноеДействие", Тип("КнопкаФормы"));
    Кнопка.ИмяКоманды = КомандаДействия.Имя;
    Кнопка.Заголовок = КомандаДействия.Заголовок;
КонецПроцедуры

&НаКлиенте
Процедура УчебноеДействие(Команда)
    СброситьТолькоУчебныеТовары();
    ПроверитьУчебнуюВыгрузкуНаСервере();
КонецПроцедуры

&НаСервереБезКонтекста
Функция СоздатьДваУчебныхТовара()
    Данные = Новый ТаблицаЗначений;
    Данные.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка"));
    Данные.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
    Данные.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число",
        Новый КвалификаторыЧисла(9, 0, ДопустимыйЗнак.Неотрицательный)));
    Книга = Данные.Добавить();
    Книга.Код = "A-01";
    Книга.Наименование = "Книга";
    Книга.Количество = 3;
    Ручка = Данные.Добавить();
    Ручка.Код = "B-02";
    Ручка.Наименование = "Ручка";
    Ручка.Количество = 1;
    Возврат Данные;
КонецФункции

&НаСервере
Процедура СброситьТолькоУчебныеТовары()
    Товары.Загрузить(СоздатьДваУчебныхТовара());
КонецПроцедуры

&НаСервере
Процедура ПроверитьУчебнуюВыгрузкуНаСервере()
    Копия = Товары.Выгрузить(, "Код,Количество");
    Сообщить(Копия.Количество() = 2);
    Сообщить(Копия.Колонки.Количество() = 2);
    Сообщить(Копия.Колонки.Найти("Наименование") = Неопределено);
    Сообщить(Копия[0].Код = "A-01");
    Сообщить(Копия[0].Количество = 3);
    Копия[0].Количество = 99;
    Сообщить(Товары.Получить(0).Количество = 3);
    Сообщить(Копия[0].Количество = 99);
КонецПроцедуры

Разбор по шагам

  1. На клиенте вызываем серверную процедуру; сам метод Выгрузить там и выполняется.

  2. Первый параметр пропущен — выгружаются все собственные строки. Второй ограничивает список колонок.

  3. Наименование не включено, поэтому его колонки в полученной таблице нет.

  4. Изменение числа 3 на 99 в таблице-копии не меняет данные формы. Загрузить обратно мы не вызываем.

  5. Таблицу значений не возвращаем в клиентский обработчик: она остаётся на сервере.

Как проверить результат

  1. Семь логических проверок дают Истина.

  2. В форме по-прежнему Книга/3, Ручка/1. Значение 99 существует только в серверной копии.

Ожидаемый результат

Показаны серверный контекст, ограничение колонок и независимость скалярных значений копии.

На что обратить внимание

  1. Не вызывайте Выгрузить у этой коллекции в клиентском обработчике.

  2. Таблица-копия не является сохранённым документом и не синхронизируется с формой автоматически.

  3. Проверка касается числового поля; для вложенных изменяемых объектов глубокое копирование надо исследовать отдельно.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.