Глобальный контекст.КопироватьДанныеФормы

Методы · CopyFormData

Копирует данные формы, обладающие совместимой структурой.

Синтаксис

КопироватьДанныеФормы(<Источник>, <Приемник>)
Полное описание, параметры и ограничения

Глобальный контекст.КопироватьДанныеФормы (Global context.CopyFormData)

Глобальный контекст (Global context)

КопироватьДанныеФормы (CopyFormData)

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

Синтаксис:
КопироватьДанныеФормы(<Источник>, <Приемник>)
Параметры:

<Источник> (обязательный)
Тип: ДанныеФормыСтруктураСКоллекцией, ДанныеФормыКоллекция, ДанныеФормыСтруктура.
Объект - источник.

<Приемник> (обязательный)
Тип: ДанныеФормыСтруктураСКоллекцией, ДанныеФормыКоллекция, ДанныеФормыСтруктура.
Объект приемник.
Возвращаемое значение:
Тип: Булево.
Истина - копирование произведено. Ложь - структура объектов абсолютно несовместима.
Описание:

Копирует данные формы, обладающие совместимой структурой.

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

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.

Примечание:
Во внешнем соединении метод игнорируется.
Использование в версии:

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

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

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

Таблица на сервере, данные формы и независимая копия

Перенесём две свои строки в модель управляемой формы, изменим серверный снимок и сравним две независимые коллекции без записи базы.

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

Полный модуль управляемой формы УчебныеДанныеФорм85 → Обработки → УчебныеДанные85 → Формы → Пульт. Сервер с контекстом; в 1С не выполнялся.

Подготовка

  1. Создайте НОВУЮ отдельную файловую базу платформы 8.5.1.1343 с конфигурацией УчебныеДанныеФорм85, совместимость НеИспользовать, управляемое приложение. Не используйте УТ, КА, УНФ, БП или рабочую базу. Здесь 1С не запускалась: runtimeVerifiedScenarios=0.

  2. В своей конфигурации создайте обработку УчебныеДанные85. Реквизит Примечание — Строка (80); табличная часть Строки: Код — Строка (8), Товар — Строка (64), Количество — Число (10,0). Обработчики модуля объекта оставьте пустыми. Эти данные существуют в экземпляре обработки в памяти, не в справочнике или документе.

  3. Создайте у обработки пустую управляемую основную форму Пульт. Для первых четырёх уроков удалите автоматически предложенный реквизит Объект и его элементы, если мастер их создал: у формы не должно быть основного реквизита. Не добавляйте учебные реквизиты и таблицы вручную — модуль создаёт их пакетно при создании формы.

  4. В форме создайте команду Выполнить, действие Выполнить; перетащите команду на форму кнопкой. Событию ПриСозданииНаСервере назначьте одноимённую процедуру. Вставляйте ПОЛНЫЙ модуль выбранного урока целиком вместо предыдущего, не пять модулей одновременно и не внутрь обработчика.

  5. Сделайте F7 и обновление только своей учебной базы; откройте Пульт из списка собственных обработок в тонком либо управляемом толстом клиенте. Не выбирайте команды сохранения обработки, печати или записи объектов. Кнопка вызывает сервер с контекстом формы, обычные ТаблицаЗначений и объект обработки на тонкий клиент не передаются.

  6. Каждое нажатие первых четырёх уроков заново готовит собственные известные данные. Закройте и откройте Пульт после замены модуля. Подготовка регистра требуется только уроку исходного ключа; сохранение настроек допускается только в последнем уроке и только в новом стенде.

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

&НаКлиенте
Процедура Выполнить(Команда)
    Сообщить(ВыполнитьНаСервере());
КонецПроцедуры

&НаСервере
Функция ВыполнитьНаСервере()
    ПроверитьСвойКонтекст();
    Источник = Новый ТаблицаЗначений;
    Источник.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка"));
    Источник.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
    Книга = Источник.Добавить();
    Книга.Товар = "Книга";
    Книга.Количество = 3;
    Ручка = Источник.Добавить();
    Ручка.Товар = "Ручка";
    Ручка.Количество = 1;
    ЗначениеВДанныеФормы(Источник, ЭтотОбъект.Уч85Источник);
    Если ТипЗнч(ЭтотОбъект.Уч85Источник) <> Тип("ДанныеФормыКоллекция")
        Или ЭтотОбъект.Уч85Источник.Количество() <> 2 Тогда
        ВызватьИсключение "Приёмником должна быть совместимая коллекция своей формы";
    КонецЕсли;
    Снимок = ДанныеФормыВЗначение(ЭтотОбъект.Уч85Источник, Тип("ТаблицаЗначений"));
    Если ТипЗнч(Снимок) <> Тип("ТаблицаЗначений") Или Снимок.Итог("Количество") <> 4 Тогда
        ВызватьИсключение "Серверный снимок должен содержать две строки и итог 4";
    КонецЕсли;
    Снимок[0].Количество = 5;
    Если ЭтотОбъект.Уч85Источник[0].Количество <> 3 Тогда
        ВызватьИсключение "Изменение отдельного снимка не должно подменять данные формы";
    КонецЕсли;
    ЗначениеВДанныеФормы(Снимок, ЭтотОбъект.Уч85Источник);
    Если Не КопироватьДанныеФормы(ЭтотОбъект.Уч85Источник, ЭтотОбъект.Уч85Копия) Тогда
        ВызватьИсключение "Две свои коллекции должны иметь одинаковую структуру";
    КонецЕсли;
    Если ЭтотОбъект.Уч85Копия.Количество() <> 2 Или ЭтотОбъект.Уч85Копия[0].Количество <> 5 Тогда
        ВызватьИсключение "Копирование не подтверждено содержимым своего приёмника";
    КонецЕсли;
    ЭтотОбъект.Уч85Копия[0].Количество = 9;
    ИтогИсточника = ДанныеФормыВЗначение(ЭтотОбъект.Уч85Источник, Тип("ТаблицаЗначений"));
    ИтогКопии = ДанныеФормыВЗначение(ЭтотОбъект.Уч85Копия, Тип("ТаблицаЗначений"));
    Если ИтогИсточника.Итог("Количество") <> 6 Или ИтогКопии.Итог("Количество") <> 10 Тогда
        ВызватьИсключение "Свои коллекции после копирования должны изменяться независимо";
    КонецЕсли;
    Возврат "Источник: Книга 5, Ручка 1, итог 6. Копия: Книга 9, Ручка 1, итог 10. Обе таблицы только в памяти.";
КонецФункции

&НаСервереБезКонтекста
Процедура ПроверитьСвойКонтекст()
    Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
        ВызватьИсключение "Нужен собственный стенд УчебныеДанныеФорм85 платформы 8.5.1.1343";
    КонецЕсли;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Учебный вывод не должен выполняться внутри чужой транзакции";
    КонецЕсли;
КонецПроцедуры

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

  1. При создании формы пакетно добавляются две ТаблицаЗначений и по две типизированные колонки. Тип реквизита задаётся как прикладной, а его фактическое значение в форме становится ДанныеФормыКоллекция; конструктор данных формы не выдумывается.

  2. Источник — настоящий Новый ТаблицаЗначений только на сервере. Книга 3 и Ручка 1 дают итог 4; имена и типы колонок совпадают с обеими коллекциями формы.

  3. ЗначениеВДанныеФормы(Источник, приёмник) заполняет уже существующие совместимые данные формы. Второй аргумент — объект данных, не строка с именем реквизита; у метода формы ЗначениеВРеквизитФормы другой контракт.

  4. ДанныеФормыВЗначение требует второй аргумент Тип. Получаем серверную ТаблицаЗначений, не отправляем её на тонкий клиент; клиент получает только итоговое сообщение.

  5. Изменение количества Книги в снимке на 5 не должно сразу менять модель формы. Проверяем её прежние 3, затем явно переносим изменённый снимок обратно: источник теперь 5+1=6.

  6. КопироватьДанныеФормы работает с двумя совместимыми объектами данных формы и возвращает Булево. Ложь не игнорируется; проверяем также размер и реальные значения приёмника.

  7. Изменяем Книгу только в копии на 9 и снова получаем обе серверные таблицы: источник 6, копия 10. Это показывает самостоятельные данные, а не две переменные, ссылающиеся на один приёмник.

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

  1. Будущий ручной тест: F7, Пульт, Выполнить. Две видимые таблицы: источник Книга 5/Ручка 1, копия Книга 9/Ручка 1; сообщение содержит итоги 6 и 10.

  2. Нажмите Выполнить повторно: результат тот же, строки не накапливаются. Учебные исходные данные заново созданы в памяти.

  3. Проверка до обратного переноса требует 3 в форме и 5 в отдельном снимке. Если она падает, не выдавайте дальнейший итог за успешное преобразование.

  4. Для своего опыта замените 5 и 9 вместе с ожидаемыми итогами. Изменение только копии не должно изменять источник.

  5. Тест несовместимой структуры проводите в отдельной копии этого урока: Ложь означает абсолютно несовместимые объекты, частичное совпадение схем не обещает полного копирования. Здесь обе схемы намеренно одинаковы.

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

Будущий результат: два собственных независимых набора формы, 6 и 10; прикладные таблицы остаются на сервере.

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

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

  2. КопироватьДанныеФормы во внешнем соединении игнорируется. Этот пример имеет настоящий контекст управляемой формы, не COM/внешнее соединение.

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

  4. Ни источник, ни копия не доказывают запись базы. Нет Записать, запросов к данным или сохранения на диск; проверка урока здесь статическая, не запуск 1С.

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

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

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

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

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