ЭлементБуфераОбмена.Данные

Свойства · Data

Тип: Строка, ДвоичныеДанные, Картинка. Данные элемента буфера обмена.

Полное описание, параметры и ограничения

ЭлементБуфераОбмена.Данные (ClipboardItem.Data)

ЭлементБуфераОбмена (ClipboardItem)

Данные (Data)

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

Использование:
Только чтение.
Описание:
Тип: Строка, ДвоичныеДанные, Картинка.
Данные элемента буфера обмена.
Доступность:

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

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

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

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

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

Скопировать свою карточку текстом и HTML, проверить обещания и вернуть только собственную метку

Полный управляемый пульт использует реальный API буфера обмена. Исходная метка подготовлена вручную, данные создаются конструкторами ЭлементБуфераОбмена, а успешная запись и чтение подтверждаются отдельно.

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

Полный модуль управляемой формы собственной внешней обработки УчебныйБуфер85 в новом пустом стенде УчебныйБуферОбмена85. Клиентские Асинх процедуры/функции с Ждать, не серверный модуль и не браузерный JavaScript.

Подготовка

  1. Работайте только в отдельной собственной Windows VM/учебном сеансе без личного содержимого буфера. Создайте новую пустую базу8.5.1.1343 с именем конфигурации УчебныйБуферОбмена85, русский встроенный язык, режим совместимости Не использовать, управляемый интерфейс Такси. Предметные объекты, расширения и фоновые задания запрещены проверкой стенда.

  2. Создайте внешнюю обработку УчебныйБуфер85 с одной основной управляемой формой. Добавьте строковые реквизиты Метка85, ИсходныйУчебныйТекст, ПоследнийСвойТекст длиной200 и Статус85 длиной0, булевы ЗаписьМоглаВыполниться и УрокЗавершен. Для поля исходной метки разрешите выделение/копирование, но ТолькоПросмотр=Истина. Все служебные строки и булевы поля также только для просмотра или скрыты. Статус85 — многострочное поле только для просмотра.

  3. Создайте пять команд ПроверитьМетки85, ЗаписатьТекст85, ЗаписатьКарточку85, ПроверитьКарточку85, ВернутьМетку85. У каждой действие ВыполнитьОперацию85, снимите ИзменяетСохраняемыеДанные и разместите пять кнопок. Назначьте ПриСозданииНаСервере и ПриОткрытии. Вставьте полный код в модуль этой формы. Другой модуль или готовый неизвестный объект не требуются.

  4. В своей учебной базе откройте обработку вручную тонким или толстым управляемым клиентом Windows. Веб/мобильный положительный путь этим уроком не объявляется: требования жеста пользователя, HTTPS и разрешений зависят от клиента. Во время опыта не запускайте другие приложения, которые автоматически меняют буфер, и не используйте менеджер истории буфера.

  5. Скопируйте показанный ИсходныйУчебныйТекст в свой Блокнот, выделите именно всю строку собственной UUID-метки без перевода строки и вручную нажмите Ctrl+C. Это осознанная первоначальная замена только учебного буфера. Пульт принимает точное совпадение, не любой похожий префикс. Исходные личные данные этим уроком не сохраняются и не восстанавливаются.

  6. Для первого опыта выберите ЗаписатьТекст85. Для второго после завершения/возврата метки закройте форму и откройте новый экземпляр с новым UUID, снова подготовьте метку вручную и выберите ЗаписатьКарточку85. Одновременные опыты и повторная запись после неизвестного результата запрещены флагом состояния.

  7. Ничего в буфере автоматически здесь не выполнялось. При вашем ручном запуске ПоместитьДанныеАсинх меняет реальный общий буфер Windows. Не проверяйте на рабочем компьютере с личными данными. При закрытии пульта автоматической записи или восстановления нет.

&НаКлиенте
Перем Выполняется85;

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ПроверитьСвойПустойСтенд();
    Метка85 = "Уч85Буфер:" + Строка(Новый УникальныйИдентификатор);
    ИсходныйУчебныйТекст = Метка85;
    ПоследнийСвойТекст = "";
    ЗаписьМоглаВыполниться = Ложь;
    УрокЗавершен = Ложь;
    Статус85 = "Вручную скопируйте только собственную исходную метку в учебный буфер";
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    Выполняется85 = Ложь;
КонецПроцедуры

&НаКлиенте
Асинх Процедура ВыполнитьОперацию85(Команда)
    Если Выполняется85 Тогда
        Сообщить("Предыдущая асинхронная операция еще выполняется");
        Возврат;
    КонецЕсли;
    Если УрокЗавершен Тогда
        ВызватьИсключение "Опыт завершен. Для нового опыта откройте новую собственную форму";
    КонецЕсли;
    Операция = Команда.Имя;
    Операции = СтрРазделить("ПроверитьМетки85,ЗаписатьТекст85,ЗаписатьКарточку85,ПроверитьКарточку85,ВернутьМетку85", ",");
    Если Операции.Найти(Операция) = Неопределено Тогда
        ВызватьИсключение "Неизвестная учебная операция";
    КонецЕсли;
    Выполняется85 = Истина;
    Статус85 = "Операция не подтверждена: " + Операция;
    Попытка
        ПроверитьСеансНаСервере85();
        #Если ТонкийКлиент Или ТолстыйКлиентУправляемоеПриложение Тогда
            Если Не СредстваБуфераОбмена.ИспользованиеДоступно() Тогда
                ВызватьИсключение "API буфера недоступен";
            КонецЕсли;
            Если Не СредстваБуфераОбмена.ПоддерживаетсяФорматДанных(СтандартныйФорматДанныхБуфераОбмена.Текст) Тогда
                ВызватьИсключение "Текстовый формат не поддержан";
            КонецЕсли;
            Если Операция = "ПроверитьМетки85" Тогда
                ПрочитанныйТекст = Ждать ПолучитьСвойТекст85(ИсходныйУчебныйТекст);
                Статус85 = "Исходная собственная метка прочитана без изменения буфера";
            ИначеЕсли Операция = "ЗаписатьТекст85" Или Операция = "ЗаписатьКарточку85" Тогда
                Если ЗаписьМоглаВыполниться Тогда
                    ВызватьИсключение "Запись уже могла выполниться. Используйте проверку или явный возврат метки";
                КонецЕсли;
                ПрочитанныйТекст = Ждать ПолучитьСвойТекст85(ИсходныйУчебныйТекст);
                ТекстКарточки = Метка85 + " | Учебная карточка Книга | Количество: 3 | Цена: 250";
                ТекстовыйЭлемент = Новый ЭлементБуфераОбмена(СтандартныйФорматДанныхБуфераОбмена.Текст, ТекстКарточки);
                Если ТекстовыйЭлемент.ФорматДанных <> СтандартныйФорматДанныхБуфераОбмена.Текст Или ТекстовыйЭлемент.Данные <> ТекстКарточки Тогда
                    ВызватьИсключение "Паспорт созданного текстового элемента неверен";
                КонецЕсли;
                ДанныеЗаписи = ТекстовыйЭлемент;
                Если Операция = "ЗаписатьКарточку85" Тогда
                    Если Не СредстваБуфераОбмена.ПоддерживаетсяФорматДанных(СтандартныйФорматДанныхБуфераОбмена.HTML) Тогда
                        ВызватьИсключение "HTML не поддержан. Эта ветвь не подменяется текстовым успехом";
                    КонецЕсли;
                    HTMLКарточки = "<p>" + Метка85 + "</p><p><strong>Учебная карточка Книга</strong></p><p>Количество: 3; Цена: 250</p>";
                    HTMЭлемент = Новый ЭлементБуфераОбмена(СтандартныйФорматДанныхБуфераОбмена.HTML, HTMLКарточки);
                    Если HTMЭлемент.ФорматДанных <> СтандартныйФорматДанныхБуфераОбмена.HTML Или HTMЭлемент.Данные <> HTMLКарточки Тогда
                        ВызватьИсключение "Паспорт собственного HTML-элемента неверен";
                    КонецЕсли;
                    ДанныеЗаписи = Новый Массив;
                    ДанныеЗаписи.Добавить(ТекстовыйЭлемент);
                    ДанныеЗаписи.Добавить(HTMЭлемент);
                КонецЕсли;
                ПоследнийСвойТекст = ТекстКарточки;
                ЗаписьМоглаВыполниться = Истина;
                Записано = Ждать СредстваБуфераОбмена.ПоместитьДанныеАсинх(ДанныеЗаписи);
                Если ТипЗнч(Записано) <> Тип("Булево") Или Не Записано Тогда
                    ВызватьИсключение "Положительный результат записи не получен. Ответ не доказывает неизменность буфера";
                КонецЕсли;
                ПрочитанныйТекст = Ждать ПолучитьСвойТекст85(ПоследнийСвойТекст);
                Статус85 = "Запись подтверждена Булево=Истина и точным повторным чтением своего текста";
            ИначеЕсли Операция = "ПроверитьКарточку85" Тогда
                Если Не ЗаписьМоглаВыполниться Тогда
                    ВызватьИсключение "Сначала выполните собственную запись";
                КонецЕсли;
                ПрочитанныйТекст = Ждать ПолучитьСвойТекст85(ПоследнийСвойТекст);
                Если Не СредстваБуфераОбмена.ПоддерживаетсяФорматДанных(СтандартныйФорматДанныхБуфераОбмена.HTML) Тогда
                    ВызватьИсключение "HTML недоступен; полный положительный путь HTML не подтвержден";
                КонецЕсли;
                ЕстьHTML = Ждать СредстваБуфераОбмена.СодержитДанныеАсинх(СтандартныйФорматДанныхБуфераОбмена.HTML);
                Если ТипЗнч(ЕстьHTML) <> Тип("Булево") Или Не ЕстьHTML Тогда
                    ВызватьИсключение "HTML не найден или доступ отказан. Текстовый успех не доказывает HTML";
                КонецЕсли;
                ПрочитанныйHTML = Ждать СредстваБуфераОбмена.ПолучитьДанныеАсинх(СтандартныйФорматДанныхБуфераОбмена.HTML);
                Если ТипЗнч(ПрочитанныйHTML) <> Тип("Строка") Тогда
                    ВызватьИсключение "Не получена реальная HTML-строка";
                КонецЕсли;
                Если СтрНайти(ПрочитанныйHTML, Метка85) = 0 Или СтрНайти(ПрочитанныйHTML, "Учебная карточка Книга") = 0 Тогда
                    ВызватьИсключение "В HTML отсутствуют собственная метка или заголовок";
                КонецЕсли;
                Статус85 = "Собственный текст совпал, HTML содержит свою метку и заголовок. Точное оформление не обещается";
            ИначеЕсли Операция = "ВернутьМетку85" Тогда
                Если Не ЗаписьМоглаВыполниться Тогда
                    ВызватьИсключение "Этот пульт еще не записывал. Буфер не меняется";
                КонецЕсли;
                ПрочитанныйТекст = Ждать ПолучитьСвойТекст85(ПоследнийСвойТекст);
                ЭлементМетки = Новый ЭлементБуфераОбмена(СтандартныйФорматДанныхБуфераОбмена.Текст, ИсходныйУчебныйТекст);
                ВозвращенаМетка = Ждать СредстваБуфераОбмена.ПоместитьДанныеАсинх(ЭлементМетки);
                Если ТипЗнч(ВозвращенаМетка) <> Тип("Булево") Или Не ВозвращенаМетка Тогда
                    ВызватьИсключение "Возврат метки не подтвержден; не считайте опыт очищенным";
                КонецЕсли;
                ПрочитанныйТекст = Ждать ПолучитьСвойТекст85(ИсходныйУчебныйТекст);
                УрокЗавершен = Истина;
                Статус85 = "Собственная исходная текстовая метка возвращена. Остальные форматы прежнего буфера не восстановлены";
            КонецЕсли;
            Сообщить("Длина подтвержденного собственного текста: " + Строка(СтрДлина(ПрочитанныйТекст)));
        #Иначе
            ВызватьИсключение "Урок проверяйте вручную в собственном тонком или толстом управляемом клиенте Windows, не в веб/мобильном клиенте";
        #КонецЕсли
    Исключение
        Сообщить("Операция не подтверждена: " + Операция + ". Проверьте стадию в отладчике, не публикуйте чужое содержимое буфера. При неизвестном результате записи не повторяйте ее автоматически");
    КонецПопытки;
    Выполняется85 = Ложь;
КонецПроцедуры

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

&НаСервереБезКонтекста
Процедура ПроверитьСеансНаСервере85()
    ПроверитьСвойПустойСтенд();
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

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

  1. ПроверитьМетки85 сначала проверяет собственный пустой стенд, доступность API и поддержку текстового формата. Ждать СодержитДанныеАсинх получает именно итоговый Булево, затем Ждать ПолучитьДанныеАсинх получает реальную строку. Отсутствие/отказ и несовпадение метки останавливают опыт, содержимое не выводится.

  2. ЗаписатьТекст85 создает свою карточку из UUID-метки, Книги, количества3 и цены250. Конструктор ЭлементБуфераОбмена получает формат и данные; readonly ФорматДанных и Данные только читаются для проверки паспорта. Сам элемент, не голая строка и не Обещание, передается ПоместитьДанныеАсинх.

  3. ЗаписатьКарточку85 сначала проверяет поддержку HTML. Создает два настоящих элемента — Текст и HTML — и помещает их в Массив через Добавить. В HTML нет скриптов, внешних ссылок и пользовательских вставок: только своя UUID-метка и постоянный текст карточки. Если HTML не поддержан, вся HTML-ветвь отказана, текстовый успех вместо нее не выдается.

  4. Перед ожиданием записи сохраняются ПоследнийСвойТекст и консервативный флаг ЗаписьМоглаВыполниться. Если ответ потерялся/пришло Ложь/исключение, прежнее содержимое буфера не обещается. Флаг не сбрасывается и повторная запись не выполняется автоматически.

  5. Ждать ПоместитьДанныеАсинх должен завершиться Булево=Истина. После этого текст читается заново и сравнивается с собственной карточкой целиком. Доступность, поддержка формата, факт наличия данных и итог записи — разные проверки. Одно Истина от ИспользованиеДоступно не заменяет остальные.

  6. Для HTML-опыта нажмите ПроверитьКарточку85: нужен точный свой текст, наличие HTML, результат Строка и собственная метка/заголовок внутри полученного HTML. Точное побайтовое совпадение оформления не требуется: платформа предупреждает, что часть оформления может теряться. Полученный HTML не исполняется и не помещается в ПолеHTMLДокумента.

  7. Попробуйте повторное нажатие во время ожидания: Выполняется85 не допускает второй команды этого пульта. Попробуйте после собственных проверок вручную скопировать другой учебный текст: проверки и возврат метки должны отказать, чужой текст не выводится и не перезаписывается.

  8. ВернутьМетку85 разрешена только после возможной собственной записи и точного совпадения текущего текстового формата с ПоследнийСвойТекст. Она помещает текстовый элемент исходной метки, проверяет Булево и перечитывает метку. Затем УрокЗавершен запрещает новые команды этого пульта.

  9. Возврат метки — не полное восстановление буфера: HTML, картинки, пользовательские MIME-форматы и дополнительные форматы до опыта не сохранялись. Между асинхронной проверкой и записью другая программа может изменить буфер; атомарного compare-and-swap API здесь нет. Поэтому нужен изолированный учебный сеанс и ручной контроль.

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

  1. До собственной записи статус подтверждает только точное чтение метки. Нажатие ВернутьМетку85 до записи должно отказать без вызова ПоместитьДанныеАсинх.

  2. После успешного ЗаписатьТекст85 при вставке в собственный Блокнот виден полный текст карточки с вашим UUID. Положительный статус требует и Булево=Истина от записи, и точного собственного повторного чтения.

  3. В HTML-опыте ПроверитьКарточку85 подтверждает текст, фактическое наличие HTML и свою метку/заголовок. Оформление и наличие других форматов проверьте вручную в своей учебной среде; код не выдает их за подтвержденные.

  4. При отказе, Неопределено, Ложь, чужом тексте или повторной записи успех не показан. Состояние возможной записи сохранено. Вызов возврата после вмешательства другой программы должен отказаться от перезаписи.

  5. После подтвержденного возврата в текстовом формате снова точная исходная метка, УрокЗавершен=Истина. Это подтверждение только собственного текстового состояния, не полного восстановления прежнего буфера.

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

Собственная текстовая/HTML-карточка прошла реальные асинхронные проверки либо зафиксирован отказ. Пульт умеет вернуть только свою заранее подготовленную текстовую метку и не объявляет чужие данные, неопределенный исход или полное восстановление буфера успешным.

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

  1. ЭлементБуфераОбмена — описание пары формат/данные, а не содержимое системного буфера. Его readonly свойства нельзя назначать после создания. Для Текст и HTML данные имеют тип Строка; для произвольного строкового формата нужны ДвоичныеДанные, для Картинка — объект Картинка. Эти другие варианты здесь не выполняются.

  2. ПоместитьДанныеАсинх принимает ЭлементБуфераОбмена или Массив таких элементов, а его обещание заканчивается Булево. ПолучитьДанныеАсинх заканчивается данными либо Неопределено; СодержитДанныеАсинх заканчивается Булево. Обещание не сравнивается с данными и не выдается за результат.

  3. В веб-клиенте доступность/форматы/жесты/разрешения отличаются. В частности, отказ чтения может дать Неопределено или Ложь в зависимости от метода. Эти сведения сверены по установленной справке8.5.1.1343, не являются подтверждением актуального поведения конкретного браузера. Сам учебный положительный путь ограничен Windows thin/thick.

  4. Свой текст проверяется точным равенством. UUID-маркер не шифрует данные, не блокирует другие приложения и не делает проверку/запись атомарной. Другие программы могут заменить буфер между ожиданиями. На рабочем буфере такой опыт недопустим.

  5. Если результат записи неизвестен, возврат метки не выполняется автоматически в Исключение. Пользователь явно проверяет текущее состояние и выбирает возврат. При несовпадении текстового формата код не затирает чужое содержимое.

  6. После Возвратить метку остальные форматы старого буфера не восстанавливаются. Резервных данных и файлов нет, сообщения не раскрывают прочитанную чужую строку. При аварийном закрытии сохраненная в форме метка/карточка может потеряться; это не повод угадывать чужой буфер.

  7. Пример не запускался в1С и не касался настоящего буфера. Проверены код, сигнатуры, контексты, readonly и статические пути состояния. Все положительные/отрицательные GUI-действия должны проверяться вручную только на своем изолированном стенде.

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

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

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

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

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