Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

27.06.23

Разработка - Механизмы платформы 1С

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

 

Буфер обмена настолько сильно проник в нашу жизнь, что мы используем его даже не задумываясь о принципах работы. Ну копирует и вставляет.

А тем временем в 1С до сих пор не было встроенной возможности программной работы с этим самым "буфером". Но вот выходит тестовая версия 8.3.24, которая наконец-то даст 1Сникам СредстваБуфераОбмена. Но, как обычно это бывает, с нюансами...

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

Поэтому данная статья будет обновляться и дополняться с выходом новых релизов. 

 

Содержание

 

Форматы буфера обмена  ^

Все мы знаем как им пользоваться, но как он устроен внутри? Кажется просто скопировал "что-то" и вставил. Но на самом деле главный принцип буфера в том, что он хранит это "что-то" в разных форматах одновременно.

Допустим, мы копируем статью с Википедии. И вставляет к себе в блокнот. В таком случае вставляется просто текст, который лежит в буфере в своей отдельной "ячейке".
А можем вставить в Word. И тогда мы получим из буфера текст с форматированием, картинками и так далее. Это содержимое формата HTML.

Т.е. вот уже мы имеем два формата, с которыми работаем постоянно. Но их, конечно, намного больше. Картинки, ссылки на файлы и так далее. Это всё разные форматы и буфер может содержать их значения одновременно.

 


Вот ещё пример, который знаком каждому 1Снику. Когда вы в конфигураторе нажимаете Ctrl+C на каком-то реквизите или элементе формы, то помещаете его в буфер обмена. И можете вставить его в блокнот, получив тем самым имя копируемого объекта. А можете вставить в другом объекте, форме и даже конфигураторе другой базы. Как же 1С понимает, что это именно реквизит и перетягивает его свойства?

А просто платформа помещает в буфер не только имя реквизита\элемента, но и полные данные о нём. Специальный формат, описывающий копируемый объект и все его свойства. И когда вы нажимаете Ctrl+V в блокноте, то он читает из буфера только интересующий его формат - Текст. А когда вставляете в конфигураторе, то 1С ищет в буфере свой особый формат.

 

Содержимое буфера можно посмотреть при помощи специальных приложений

 

Каждый формат имеет свой строковый ключ. Сколько же их? Вообще, каждое приложение может использовать свой формат (как это происходит с метаданными 1C:MD8 Data), но, так как в платформе из-за универсальности часто появляются ограничения связанные с работой веб-клиента в браузерах, то лучше использовать список MIME-типов. Это такие как "text/html", "application/json", "application/zip" и т.д. Но чаще всего нас устроит просто несколько стандартных форматов, которые в 1С выражены отдельным системным перечислением. И вот мы плавно переходим к изменениям платформы ↓

 

Работа с буфером в 1С ^

Ранее у программиста 1С не было платформенных методов работы с буфером. Но 1Сники привыкли искать всякие костыльные решения, чтобы обойти ограничения платформы. Поэтому периодически можно встретить использование COMОбъект или ПолеHTMLДокумента.

Но теперь в платформе появилось новое свойство клиентского глобального контекста.

- СредстваБуфераОбмена с методами:

  • ИспользованиеДоступно() - Доступно ли использование буфера обмена
  • СодержитДанныеАсинх(<Формат>) - Проверяет, содержит ли буфер обмена данные конкретного формата
  • ПолучитьДанныеАсинх(<Формат>) - Возвращает содержимое буфера обмена по переданному формату
  • ПоддерживаетсяФорматДанных(<Формат>) - Поддерживается ли передача в буфер конкретного формата данных
  • ПоместитьДанныеАсинх(<Массив из ЭлементБуфераОбмена>) - Помещает данные в буфер обмена в разрезе форматов

 

- Появились новые типы данных для работы с буфером:

  • СтандартныйФорматДанныхБуфераОбмена - специальная коллекция со стандартными форматами
    • Текст
    • HTML
    • Картинка
  • ЭлементБуфераОбмена - Объект для помещения данных в буфер. Содержит свойства:
    • Данные - Строка, ДвоичныеДанные, Картинка
    • ФорматДанных - СтандартныйФорматДанныхБуфераОбмена

 

- Добавлено новое клиентское событие ПриВставкеИзБуфераОбмена(). Точнее даже событиЯ, потому что помимо глобального в модуле приложения каждая форма обладает своим одноименным событием. 

- А для типа СсылкаНаФайл добавлены методы

  • ПолучитьКакСтрокуАсинх()
  • ПолучитьКакДвоичныеДанныеАсинх()

 

Описание нововведений в документации можно найти здесь и здесь.

Рассмотрим же все пункты подробнее, а заодно напишем простые методы по работе с буфером ↓

 

СредстваБуфераОбмена  ^

Создадим простую функцию, которая будет возвращать текст из буфера. Если же по какой-то причине не удалось текст получить, то пусть возвращает Неопределено. 

Так как методы работы с буфером асинхронны и доступны только на клиенте, то делаем метод Асинх

&НаКлиенте
Асинх Функция ТекстИзБуфераОбмена()
	
  Возврат Неопределено;
		
КонецФункции

 

СредстваБуфераОбмена.ИспользованиеДоступно() ^

Данный метод необходимо использовать перед тем как начинать работу с буфером обмена. Зачем это нужно?

Как мы всем помним, 1С может быть запущена не только в тонком клиенте, но и в мобильном и веб. Работа с буфером обмена недоступна на мобильных устройствах. А браузеры по причине безопасности могут не позволить приложению читать или изменять данные в буфере пользователя. Например, для Firefox должно быть установлено расширение для работы с 1С. Поэтому, чтобы далее код тупо не упал в ошибку на методе чтения\помещения, нам лучше сначала самостоятельно убедиться, что буфер доступен. А если же не доступен, то как-то отразить это на интерфейсе. Скрыть нерабочие кнопки, сообщить пользователю о проблеме ну или хотя бы просто не упасть.

Доработаем нашу функцию:

&НаКлиенте
Асинх Функция ТекстИзБуфераОбмена()
	
    Если СредстваБуфераОбмена.ИспользованиеДоступно() Тогда
        <...>
    КонецЕсли;
	
    Возврат Неопределено;
		
КонецФункции

 

СредстваБуфераОбмена.СодержитДанныеАсинх(<Формат>) ^

Прежде чем получить данные из буфера обмена, рекомендуется проверить, а содержатся ли там такие данные? Для этого и есть этот метод.

В качестве формата (и здесь и в последующих методах) используется либо СтандартныйФорматДанныхБуфераОбмена, либо строка с ключом формата. В веб-клиенте при этом ключ формата обязательно должен соответствовать списку MIME-типов (о чём пишут в справке). И это важное ограничение, если вы предполагаете возможность работы вашего кода в браузере. 

Сейчас мы попробуем просто извлечь текст. Так как метод Асинх, то обязательно Ждем Результат

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

 

СредстваБуфераОбмена.ПолучитьДанныеАсинх(<Формат>) ^

Применив предыдущие два метода, мы уже можем приступить к извлечению данных. Опять Ждем результат Асинх метода (хотя на самом деле можем просто вернуть обещание)

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

 

Всё, наша функция по извлечению текста готова!

А теперь сделаем такую же функцию, но которая поместит текст в буфер обмена и вернет признак успеха. Если поместить не удалось, то вернет Ложь. При успехе же Истину.


&НаКлиенте
Асинх Функция ПоместитьТекстВБуфераОбмена(Текст)
	
    Если СредстваБуфераОбмена.ИспользованиеДоступно() Тогда
        <...>
    КонецЕсли;
	
    Возврат Ложь;
		
КонецФункции

 

СредстваБуфераОбмена.ПоддерживаетсяФорматДанных(<Формат>) ^

Прежде чем поместить данные буфера обмена, необходимо проверить поддержку нужного формата. Работает метод по аналогии СодержитДанныеАсинх, но проверяет можно ли вообще данный формат поместить в буфер. И снова всё это из-за веба)

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

 

СредстваБуфераОбмена.ПоместитьДанныеАсинх(<ЭлементБуфераОбмена>) ^

Все проверки выполнены и теперь можем просто поместить текст в буфер. Для этого в метод нужно передать объект ЭлементБуфераОбмена, который содержит в себе формат данных и сами данные (наш текст)

&НаКлиенте
Асинх Функция ПоместитьТекстВБуфераОбмена(Текст)
	
    Если СредстваБуфераОбмена.ИспользованиеДоступно() Тогда
        ФорматДанных = СтандартныйФорматДанныхБуфераОбмена.Текст;
        Если Ждать СредстваБуфераОбмена.ПоддерживаетсяФорматДанных(ФорматДанных) Тогда
            ПомещаемыеДанные = Новый ЭлементБуфераОбмена(ФорматДанных, Текст);
            Возврат Ждать СредстваБуфераОбмена.ПоместитьДанныеАсинх(ПомещаемыеДанные);
        КонецЕсли;
    КонецЕсли;
	
    Возврат Ложь;
		
КонецФункции

 

И вот у нас уже есть два метода для самой базовой работы с буфером обмена. Но ведь помимо текста, мы можем ещё работать и с другими видами данных. Сделаем функции более универсальными:

Теперь в них нужно передавать необходимый формат, а они уже сами выполняют все проверки и возвращают главное - результат:

//Примеры использования:

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

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

 

 

Работа с несколькими форматами ^

 

 

Но, как мы помним, использовать можно не только текст, но и другие типы форматов. 

  • СтандартныйФорматДанныхБуфераОбмена
    • Текст
    • HTML
    • Картинка

И мы можем получить или поместить одновременно несколько форматов. Используем наши функции, чтобы получить из буфера и текст и HTML.

    Текст = Ждать СодержимоеБуфераОбмена(СтандартныйФорматДанныхБуфераОбмена.Текст);
    HTML = Ждать СодержимоеБуфераОбмена(СтандартныйФорматДанныхБуфераОбмена.HTML);

Попробуем скопировать это слово

 

Как видим, первая строка просто получила слово без форматирования. А уже вторая получала текст HTML, который можно преобразовать, например, в форматированный документ.

Но как нам в буфер обмена передать одновременно и строку и HTML? Используя наши методы, поместим в буфер строку и HTML, а потом попробуем извлечь их же:

    Ждать ПоместитьВБуфераОбмена(СтандартныйФорматДанныхБуфераОбмена.Текст, "слово");
    Ждать ПоместитьВБуфераОбмена(СтандартныйФорматДанныхБуфераОбмена.HTML, "<h1>слово<h1>");
	
    Текст = Ждать СодержимоеБуфераОбмена(СтандартныйФорматДанныхБуфераОбмена.Текст);
    HTML = Ждать СодержимоеБуфераОбмена(СтандартныйФорматДанныхБуфераОбмена.HTML);
	

Результат нас может удивить. Мы и в тексте и в HTML получили только текст:

 

Но всё верно. Дело в том, что читать из буфера обмена мы можем сколько угодно раз и при этом получать текущее состояние буфера. Но вот каждое помещение в буфер полностью перезатирает его содержимое. И поэтому мы сначала вставили текст, а после уже HTML, но текст затерли. Чтобы поместить несколько результатов, необходимо доработать нашу универсальную функцию.

Теперь функция на вход получает или ЭлементБуфераОбмена, или массив с ними. И проверяет поддержку всех форматов. Можно, конечно, доработать так, чтобы функция помещала те форматы, которые доступны. Но тогда нам придется возвращать уже какую-то коллекцию с результатами, а сейчас для наших целей это не нужно:

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

 

Поместим же теперь и HTML и строку:

    Данные = Новый Массив;
    Данные.Добавить(Новый ЭлементБуфераОбмена(СтандартныйФорматДанныхБуфераОбмена.HTML, "<h1>слово<h1>"));
    Данные.Добавить(Новый ЭлементБуфераОбмена(СтандартныйФорматДанныхБуфераОбмена.Текст, "слово"));
		
    Ждать ПоместитьВБуфераОбмена(Данные);
		
    Текст = Ждать СодержимоеБуфераОбмена(СтандартныйФорматДанныхБуфераОбмена.Текст);
    HTML = Ждать СодержимоеБуфераОбмена(СтандартныйФорматДанныхБуфераОбмена.HTML);
		
	

Ну вот, совсем другое дело:

 

 

 

Собственные форматы ^

Как мы поняли, прелесть буфера обмена в том, что мы можем положить в него помимо обычного текста ещё и свои произвольные данные. Это дает нам много интересных возможностей.

Например, мы можем положить в буфер обмена табличную часть  документа одновременно и в виде простого текста с отступами, и окрашенного HTML, а ещё и дополнительно в виде массива структур со ссылками (сериализовать в XML). 

И тогда, если пользователь попытается вставить содержимое буфера в блокнот, то увидит красиво отформатированный текст. Если вставит в Word, то получит раскрашенную таблицу. А если же нажмет нашу кнопку "Вставить" в форме документа, то мы извлечем содержимое XML и поместим в табличную часть. 

 

 

Главное понимать, что использовать можно и свои придуманные ключи формата буфера. Хоть "МойКлюч", хоть "blabla". И в тонком клиенте это будет работать. Но если приложение планируется запускать в браузере, то необходимо придерживаться списком MIME-форматов. Их на самом деле очень много и для любой задачи их будет достаточно. Например, для сериализации в XML можно использовать "text/xml". А что туда уже помещать - наше личное дело.

 

ПриВставкеИзБуфераОбмена(Значение, СтандартнаяОбработка) ^

Данное событие есть у каждой управляемой формы + глобальное в модуле приложения

Событие срабатывает, если пользователь, находясь на форме, делает вставку из буфера (Ctrl+V) картинки или файлов. К сожалению только такие данные приводят событие в действие (но об этом мы ещё поговорим ниже).

В Значение попадает картинка или массив в элементами типа "СсылкаНаФайл". Здесь мы можем поместить данные в реквизит формы, прикрепить файл к карточке номенклатуры или же просто установить картинку.

 

 

Для удобной работы со ссылками на файлы добавлены методы ПолучитьКакСтрокуАсинх() и ПолучитьКакДвоичныеДанныеАсинх().

Глобальное же событие отрабатывает после события текущей формы. Но его вызов можно отменить, установив СтандартнаяОбработка = Ложь. 

 

Конфигурация с примерами использования ^

Для тестирования возможностей работы с буфером обмена сделал обработку и поместил её в конфигурацию на GitHub

Тут есть наши разработанные выше методы, пример с копированием табличной части, обработка события при вставке из буфера и анализ содержимого буфера (с учетом всех доступных MIME-форматов).

Конфигурация вообще нужна для демонстрации новых возможностей 1С и будет дополняться. 

На данный момент репозиторий содержит инструменты:

Все обработки можно скачать отдельно или же полным комплектом в виде конфигурации. С выходом новых возможностей платформы, репозиторий будет дополняться.

Ссылка на проект: github.com/SeiOkami/ExamplesOneS

 

 

 

Нюансы, ошибки и замечания ^

 

 

В данном пункте будут собираться баги или недостатки, а при выходе нового релиза платформы статья будет обновляться.
Все замечания и баги отправляю в 1С.

Что имеем на данный момент?

  • СредстваБуфераОбмена не возвращают файл. Это странно, но нет такого формата данных, который бы позволил извлечь файл из буфера обмена. Да, выше мы упоминали про тип СсылкаНаФайл, но его мы можем получить только в событии формы. Э если пользователь сам нажмёт сочетание клавиш для вставки из буфера. Но не программно в любой момент.
     
  • СредстваБуфераОбмена не возвращают табличный документ или его область. Когда пользователь копирует в буфер обмена табличный документ или его область, то 1С помещает в буфер не только HTML со строкой, но и специальный внутренний формат. Это позволяет вставить кусок документа в другой документ с сохранением всех 1Сных свойств данного типа. Т.е. платформа помещает, извлекает и обрабатывает такие данные. Но для разработчика нет возможности программно получить из буфера таб.док или его область. Только текст или HTML, который придется обрабатывать.
     
  • Нет возможности получить все содержимое буфера. Или хотя бы просто посмотреть лежащие там форматы, чтобы потом извлечь циклом. Поэтому для разработки "просмотрщика" буфера мне пришлось добавлять в качестве макета перечисление из всех возможных MIME-типов. И это всё равно может быть не всем возможным содержимым.
     
  • ПриВставкеИзБуфераОбмена работает только с файлами и картинками. Считаю это странным и крайне неудобным ограничением. В результате, мы получаем отдельно методы по извлечению данных кроме файлов, а ещё и событие, которое срабатывает только на файлах и картинках. И код приходится раскидывать между кнопкой и событием. Хотя если бы событие просто срабатывало всегда, то для ряда случаев и дополнительные кнопки могли бы не понадобиться.
     
  • Баг. ПриВставкеИзБуфераОбмена не всегда срабатывает. Например, если у формы не будет активного элемента (какого-то редактирования), то срабатывают оба события. И формы и глобальное. Но если попытаться, например, сделать вставку при редактировании поля ТЧ, то вызывается только глобальное событие всего приложения, а форма игнорируется. А вот если пытаться вставить в поле текстового документа, то не срабатывает вообще никакое событие. 
     
  • Значение произвольного формата обязано быть двоичными данными. Не страшный, но неприятный нюанс, не дающий нам просто извлечь или поместить, к примеру, текст XML. Обязательно надо производить сериализацию в двоичные данные. 
    Если столкнулись с этим, то просто используйте методы ПолучитьСтрокуИзДвоичныхДанных() и ПолучитьДвоичныеДанныеИзСтроки()
     
  • Баг метода помещения в буфер. Если в массиве данных будет сначала текст, а потом HTML, то в оба формата попадет HTML. Поэтому надо сначала HTML, а потом уже текст.
     
  • Баг. Картинки, помещенные в буфер из 1С, воспринимаются не всеми приложениями. Например, проблемы есть с Word и Outlook. Можно даже скопировать картинку в буфер (скриншотером, например), а потом в 1С извлечь и её же поместить обратно в буфер. И точно такая же картинка, но помещенная при помощи платформы, вставляться в Word не будет. 
     
  • Баг. Если назначить произвольной команде формы сочетание клавиш Ctrl+V, то перестает работать событие ПриВставкеИзБуфераОбмена(). И не только текущей формы, но и глобальное. Разработчик может случайно сломать в своей обработке логику конфигурации.
     
  • Нашли ещё какой-то нюанс? Пишите в комментариях - добавлю в список.

  •  

Итоги ^

 

 

Буфер обмена - базовая возможность, которая позволяет значительно облегчить работу с приложением. И скоро ответственность за реализацию связанных с ним "фишек" упадет на плечи рядовых 1Сников. Поэтому лучше уже сейчас приглядываться к этой возможности и с переходом на 8.3.24 использовать её в своих инструментах. Тем более, что снятие режима совместимости не требуется.

Если находите какой-то баг, нюанс или интересный способ применения, то пишите в комментариях. Я буду дополнять статью так, чтобы сделать её полным источников информации по работе с буфером обмена в 1С.

 

Было интересно?

 

Другие статьи:

 

Буфер обмена новые возможности программирование обзор документация код шаблоны

См. также

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    8137    bayselonarrend    20    

156

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    6324    dsdred    18    

80

Инструментарий разработчика Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Расскажу про разработку расширения-фреймворка на 1С на примере проекта "Расширенный глобальный поиск", про нюансы, с которыми столкнулся, и способы их обхода.

20.02.2024    5562    SeiOkami    5    

59

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    19237    YA_418728146    26    

72

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    24209    SeiOkami    48    

135
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. quazare 3818 27.06.23 18:52 Сейчас в теме
не сравнивали на сколько эффективнее чем ClipboardData?

помнится делал что-то через клипбоард - особо проблем не было
5. tormozit 7238 27.06.23 20:15 Сейчас в теме
(1)
ClipboardData

COM HTML документ периодически выдает ошибку при работе с буфером обмена. Так что проблемы случались с ним нередко. Ну и COM только в ОС Windows
2. ZhilichMaksim 27.06.23 19:09 Сейчас в теме
Отличная статья, спасибо за разъяснение!
3. ZhilichMaksim 27.06.23 19:09 Сейчас в теме
4. biimmap 2022 27.06.23 19:58 Сейчас в теме
Где купить клавиатуру с картинки?)
user865160; +1 Ответить
7. e9504100606 92 27.06.23 20:19 Сейчас в теме
11. Romyl01 38 28.06.23 08:54 Сейчас в теме
(4)razer tartus посоветую можно какие угодно комбинации клавиш задать, если дорого можно предыдущую модель на авито поискать.
21. DrAku1a 1746 29.06.23 12:19 Сейчас в теме
Полезность сильно зависит от двух моментов:
1.) Как работает в тонком клиенте на разных платформах?
2.) Как работает в веб-клиенте, требует ли "установить расширение"?
В мобильном, понятное дело, - своя дискотека.
15. gorenski 365 29.06.23 07:46 Сейчас в теме
(4) Можно не клавиатуру, а например мышь Logitech Triathlon, на ней куча доп кнопок, можно вешать Copy/Paste Home/End и т.д.
FeliceYa; +1 Ответить
22. DrAku1a 1746 29.06.23 12:22 Сейчас в теме
Прикрепленные файлы:
Летяга; user1816391; check2; +3 Ответить
6. tormozit 7238 27.06.23 20:16 Сейчас в теме
Еще бы номера обращений по ошибкам платформы. А то можно заподозрить что о них не сообщалось в компанию 1С.
anderson; JohnyDeath; +2 Ответить
8. kser87 2473 27.06.23 23:18 Сейчас в теме
1С совсем взрослый стал
dhurricane; kuzyara; Aleksey.Bochkov; +3 Ответить
9. PerlAmutor 155 28.06.23 05:35 Сейчас в теме
Вот было бы интересно посмотреть на реализацию такого сценария:
- в рабочей базе копируем навигационную ссылку на документ в буфер обмена
- открываем навигационную ссылку в копии базы и есть такого объекта нет, то предлагается создать новый со всеми скопированными через XDTO реквизитами

Если к этому прикрутить какие-нибудь правила конвертации данных (Универсальный форма обменами данных например), то можно будет перетаскивать данные даже между различными типовыми конфигурациями.
10. sapervodichka 6917 28.06.23 08:36 Сейчас в теме
(9) у меня в публикациях такая работа с буфером есть, позволяет копировать <объект не найден> из одной базы и вставлять в отбор универсального обмена или выгрузки загрузки XML в другой уже как ссылку (затем уже дело техники перегрузить)
23. sapervodichka 6917 30.06.23 21:06 Сейчас в теме
(10) вот ссылка https://infostart.ru/1c/tools/1740836/
Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов
13. user618912_redgad 14 28.06.23 13:31 Сейчас в теме
(9) Взять текущий механизм обмена. С помощью него сформировать файл. Поместить результат в буфер обмена.
В приемнике выбрать "Вставить" - программа должна будет использовать имеющийся обмен данными и загрузить файл из буфера обмена.
starik-2005; +1 Ответить
12. SGordon1 28.06.23 09:09 Сейчас в теме
В форточках , для экономии памяти, как мне помнится можно вставлять функцию возвращающую актуальные данные по запросу.... Тут такое не поддерживается?
14. maksal 51 28.06.23 19:10 Сейчас в теме
Спасибо за статью, но пока не понимаю где это реально может пригодится в наших «калькуляторахэксель» для сдачи отчётности.
lvictor58; w.r.; +2 Ответить
16. starik-2005 3091 29.06.23 09:51 Сейчас в теме
(14)
где это реально может пригодится
Ну, например, есть у Вас база тестовая и реальная. В реальную базу что-то там довнесли, а тестовую придется или накатывать (а она может быть большая), ну или написать кнопку с сериализатором, который в буфер добавит сериализованный объект (при копировании из списка справочника/журнала документов), а в тестовой базе при вставке десериализует и запишет. Имхо, вещь! )))
ЗЫ: Можно так расширение наваять, которое просто добавит глобальную команду к всем объектам для копипасты.
17. maksal 51 29.06.23 10:00 Сейчас в теме
(16) пожалуй это единственная фича, которая заслуживает внимание, но:
1. Выгрузить базу средствами скуля или через dt надёжнее.
2. При вашем варианте переноса, я должен учитывать то, что мой тестировщик может получить баги не от плохо выполненной задачи, а от ошибок переноса данных через буфер обмена. Тем самым увеличиваем риски тестирования функционала.
3. Служба безопасности и генеральный директор, будут не очень рады такому функционалу «выноса информации» из продакшн базы) NDA и все такое

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

И вопрос: как планируют запилить новый функционал в самом 1С? В типовых. Наверняка запилят кнопку о которой (16) вы написали
18. starik-2005 3091 29.06.23 10:03 Сейчас в теме
(17) Не единственная.
Вот есть у вас документ, есть приехавшая заявка в почте. Ну или в какой-то программе что-то такое-этакое. И вот вы в этой программе/почте/... жмете Контрл+Цэ, в документе контрл+Вэ. Да, можно кнопарь вкатить, как сейчас много где сделано, который открывает текстовое или табличное поле для вставки, а тут это все будет не нужно - сразу сработает )))
19. maksal 51 29.06.23 10:05 Сейчас в теме
(18) Сергей, поживем увидим
20. starik-2005 3091 29.06.23 10:07 Сейчас в теме
(19) Такие приспособы много где уже сделаны. Например, открываешь форму, а она заполняется из буфера. Просто теперь будет работать не только в винде.
24. пользователь 01.08.23 21:52
Сообщение было скрыто модератором.
...
25. Serg2000mr 700 02.09.23 14:06 Сейчас в теме
Если у вас еще нет платформы 8.3.24, то используйте способы из публикации:
Работа с буфером обмена до 1С 8.3.24
27. SeiOkami 3522 13.02.24 19:56 Сейчас в теме
(26) Если в видео найдено что-то не освещенное в статье, то опишите в комменарии. Статья написана, чтобы собрать в одном месте все нюансы новой платформенной возможности
28. signum2009 1039 13.02.24 20:23 Сейчас в теме
(27) Статья - это статья, видео - это видео)) Разные форматы подачи
29. signum2009 1039 13.02.24 20:33 Сейчас в теме
(27) у меня, кстати, к статье были вопросы, когда я готовился к видео)) может их позже в виде отдельного комментария озвучу)
Единственно, что я к видео готовился по боевой платформе, а статья на учебной платформе....
30. SeiOkami 3522 13.02.24 20:37 Сейчас в теме
(29) Статья не на учебной платформе, а на тестовой. Максимальной версии платформы, которая была доступна на момент написания статьи. Если с этого времени что-то изменилось и какие-то зарегистрированные мною баги были пофиксены, то с удовольствием актуализирую статью.
31. signum2009 1039 13.02.24 20:38 Сейчас в теме
(30) да, сорри, на тестовой
32. signum2009 1039 19.02.24 09:40 Сейчас в теме
(30) На вашей конфигурации в платформе 8.3.24.1368 вставка картинки из буфера обмена не работает. Выполнял на закладке "Средства буфера обмена" командой "Вставить из буфера обмена", файл формата jpg.
Метод СредстваБуфераОбмена.СодержитДанныеАсинх(ФорматДанных) возвращает результат выполнения обещания Ложь

upd Разобрались)) метод работает если картинку вставлять из телеги, браузера, ворда и тд. Если вставлять картинку как файл, то нужно использовать Ctrl+V
33. Klok22 02.12.24 11:27 Сейчас в теме
Обновили платформу до 8.3.24.1758 и столкнулись с очень неприятной ошибкой платформы на Linux (Ubuntu).
В толстом клиенте при открытой любой не управляемой форме в 1С, при копировании в буфер обмена любой картинки клиент 1С начинает пожирать оперативную память с гигантской скоростью, пока память на закончится и компьютер просто не повиснет. Скриншот экрана буквально приводит к пожиранию оперативки со скоростью 300-500 мегабайт в 10 секунд. Ситуация легко воспроизводиться на любой конфигурации.
Оставьте свое сообщение