Как скопировать текст в буфер обмена (программно)
Vložit
- čas přidán 6. 11. 2022
- КАК В 1С СКОПИРОВАТЬ ТЕКСТ В БУФЕР ОБМЕНА (программно)?
Привет, друзья! Хороший программист 1С старается думать об удобстве пользователей при работе с 1С. Сегодня мы с вами научимся копировать текст в буфер обмена по кнопке.
Обработка с примером из видео: clck.ru/32bpqM
Поддержать канал можно по ссылке: donate.stream/ya410011655962993
☝Записаться на курс "Профессия программист 1С: с нуля до профи": ironskills.by/programmist-1c
#1с #ironskills
---
С уважением, команда IRONSKILLS
не знал что с помощью страниц можно скрыть элемент, спасибо, познавательно)
Ссылку можно выводить в реквизит с типом ФорматированыйДокумент. Потом на вкладке Команды у формы раскрыть этот реквизит и там будут стандартные команды форматированного документа. Вырезать, копировать и т.д. Их можно перетаскивать на форму как обычные команды.
Перетаскиваем кнопку Копировать на форму. И надо дописать код при открытии формы: программно выделить текст Документа (процедура УстановитьГраницыВыделения).
По итогу: форма открывается с выделенной строкой. Пользователь нажимает кнопку и текст копируется стандартным образом. Работает везде и никакого огорода с HTML.
Браво, Иван! Мало того, что по теме видео всегда все очень информативно, так и косвенно совершаемые Вами действия прямо открывают глаза на новые возможности. Спасибо!
Иван, как всегда на высоте! очень все доходчиво объясняете!!
В УХе это сделано так
ОбъектКопирования = Новый COMОбъект("htmlfile");
ДанныеБуфера =ОбъектКопирования.ParentWindow.ClipboardData.GETdata("Text");
Объект = Новый COMОбъект("htmlfile");
Объект.ParentWindow.ClipboardData.Setdata("Text", СодержимоеВБуферОбмена);
Красавчик Иван, отличный урок.
Блин, давно занимаюсь программированием и каждый раз что то новое из видео узнаю :)
Лайк видосу :)
Иван, спасибо! Возьму на заметку
Иван, спасибо, как всегда, все доступно и понятно
Доступно и коротко объяснил, спасибо!
Очень круто! Спасибо!
Спасибо огромное, ценная инфа
Отличное видео! Спасибо!👍
Спасибо за пример работы с буфером
Часто стоит задача по работе с платежными системами в частности и по ссылкам на оплату. В своей ИБ так же сделаю копирование.
Но, конечно, работа с HTML и видимостью это какой-то костыль костыля. В 1с в целом не очень приятно работать с дом структурами. Спасибо еще раз.
Подход интересный, но смотрится костыльно, даже для 1С.
Если клиент работает на Windows, то можно через COM сделать, намного проще:
Функция УстановитьТекстВБуферОбмена(Текст) Экспорт
Объект = Новый COMОбъект("htmlfile");
Объект.ParentWindow.ClipboardData.Setdata("Text", Текст);
Возврат Текст;
КонецФункции
Если для Linux, то надо хотя бы программно создавать элемент, на время копирования показать, потом удалить. Пользователь ничего не увидит, но все отработает.
Код примерно такой:
&НаКлиенте
Процедура ПоместитьВБуферНаСервере(Команда)
СоздатьЭлементНаСервере();
document = Элементы.Поле_HTML.Документ.defaultView.document;
document.write(СтрШаблон("", ЧтоПоместить));
document.getElementById("forCopy").select();
document.execCommand("copy");
УдалитьЭлементыНаСервере();
КонецПроцедуры
Процедура УдалитьЭлементыНаСервере()
Элементы.удалить(Элементы.Найти("Поле_HTML"));
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить("Поле_HTML");
ИзменитьРеквизиты(,ДобавляемыеРеквизиты);
КонецПроцедуры
&НаСервере
Процедура СоздатьЭлементНаСервере()
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Поле_HTML",Новый ОписаниеТипов("Строка")));
ИзменитьРеквизиты(ДобавляемыеРеквизиты);
ПолеВвода = Элементы.Добавить("Поле_HTML", Тип("ПолеФормы"), ЭтаФорма);
ПолеВвода.Вид = ВидПоляФормы.ПолеHTMLДокумента;
ПолеВвода.ПутьКДанным = "Поле_HTML";
КонецПроцедуры
У Вашего первого способа также есть недостаток - нужна COM-компонента.
По второй части: создать элемент программно можно, но в чем будет выйгрыш?
@@ironskills-1c Именно эту COM-компоненту специально регистрировать не надо, она из коробки идет во всех windows. Если бы надо было отдельно регистрировать, то да, возможно было бы не универсально. По программному созданию, это просто удобнее. Функцию создания можно вынести в отдельный клиентский модуль, и просто вызывать метод, передавая ему форму и текст который надо поместить в буфер. н.п. так "ОбщийМодульНаКлиенте.ПоместитьВБуферЧерезHTMLПоле(ЭтаФорма, "Некий текст")". Это же намного удобнее, чем каждый раз делать столько действий, да и к тому же на форме будет всегда храниться это поле и закладки...
Проверил для винды - работает) Занес к себе в заметки)
Люблю Белоруссию, она хороша во всем и в еде и в качестве одежды, обуви, ну и конечно же самое главное в людях. Спасибо Ваня.
Спасибо за добрые слова, Юрий)
Уважаемый Ведущий! Спасибо Вам за серию очень полезных видео, огромное! Очень познавательно, легко воспринимаемо, потому что хорошо подаётся (что не каждому дано). Давно ъотел спросить: как мне настроить такую же штучку как у Вас в браузере? Там циферки какие-то бегут на пустой странице. :)
Лайк, интересный подход.
Если решение пишется только под Windows, то можно реализовать в две строки
ОбъектКопирования = Новый COMОбъект("htmlfile");
ОбъектКопирования.ParentWindow.ClipboardData.SetData("Text", ПлатежнаяСсылка);
Подскажи откуда узнавать такие ком объекты? Это документация виндовс или что?
А если запустим вэб-клиента??
Просто офигенно!
Твик отличный!
Кстати, интересно как реализована эта кнопка когда копируешь ссылку на какой-нибудь объект в 1С?
спасибо!
Как всегда интересное видео! Иван, подскажи как у тебя сделано закладками снизу основная конфигурация и расширение? А то у меня отдельными окнами открывается и не могу найти как это сделать
Дословно не помню, но примерно так. В конкретном меню окна выбрать Восстановить положение окна.
@@Asakra-irk , я пробовал. Не помогает!
@@user-ny5pp9oh1c, затягиваешь мышкой окно расширения на окно основной кофигурации. Когда окна соединятся и будут видны оба (без вкладок), надо восстановить положение окна основной конфигурации.
Вкладки тоже перетаскиваются мышкой...
@@Asakra-irk , не получается. Поставил у обоих окон вид "Обычное" (галочкой), затащил расширение на конфигурацию, на основной конфигурации восстановил положение окна, оно стало ровно прижато к левой части, а расширение так и осталось отдельно
Можно ли подобным образом очистить буфер обмена?
Можно создать общую форму, открывать ее с параметром текст, при событии поля хтмл "Документ сформирован" закрывать форму и выдавать сообщение об успешном копировании. Пользователь открытия формы не увидит, только сообщение об успешном копировании нужного текста.
Тоже вариант, спасибо за комментарий)
Вы можете поделиться файлом базы данных?
Здравствуйте у меня такая проблема. Есть конфигурация 1С Бухгалтерии, в которой есть документ "РеализацияТоваровИУслуг" в документе есть форма в которой при нажатии на кнопку "выгрузить ТТН" должна выгружаться товарно-транспортная накладная. И документ должен появляться в поле таблицы. Но выгрузки не происходить и документ не появляется, подскажите в чем может быть проблема?
Сходу сказать трудно, нужно смотреть код. У нас есть сообщество в telegram, можете там вопрос задать: t.me/ironskills_community1c
А є якісь варіанти копіювання в буфер обміну на мобільному клієнті?
Можно вопросы
Может кто подсказать, как в таком "механизме" сделать перенос строки? Ибо стандартные символы 1С не работают (строка просто не копируется)
Если вам нужно, чтобы текст разделялся автоматически, то можно вставить в места где нужен перенос строки какой-нибудь символ, который не будет встречаться в вашем тексте, типа: ~
А в js скрипте заменить:
“” НА ""
Чтобы поле было не однострочным в самом html
И
"var text = '%1';" НА "var text = `%1`.replace(/~/g, '
');"
Чтобы ваш символ заменялся на "
", который движок интерпретирует как перенос строки
Таким образом в буфере обмена будет текст с переносами в необходимых местах
А решение работает на всех тонких клиентах? Работает на вебклиенте?
В веб-клиенте не тестировал, работает в тонком)
@@ironskills-1c а. В тонком на линуксе пробовали?
в вебе не работает.
Привет
А вот так нельзя:
Процедура СкопироватьВБуферОбмена(Команда)
ОбъектКопирования = Новый COMОбъект("htmlfile");
ОбъектКопирования.ParentWindow.ClipboardData.SetData("Text", Объект.Логин);
КонецПроцедуры ??
более того, мы так передавали вообще кучу данных. Кодируем в XML любой тип данных, а потом делаем вставку. Удобно списки какие-нибудь копировать или даже таблицы значений для вставки в другие элементы справочника. даже между разными однотипными базами ссылки копировал так из тесовой в рабочую. В линухе наверное не заработает правда.
Сделал так, все работает) Зачем тогда эти пляски с хтмл?
cmd /c echo Мой текст | clip
Не, не. Мы пойдем другим путем! Велосипед должен быть с квадратными колесами!!!
Спасибо за альтернативный способ, Алексей)
В Линуксе не прокатит
@@grekovtube в линуксе есть питон
@@grekovtube xclip есть в никсах и много других для баша. Не факт, что скрипт на видео корректно отработает. А нас скоро ждет увлекательный переход госов на никсы. И куча проблем типовых связанных с этим.
Почему не работает тот же самый код только в конце закрываю форму( Закрыть(); ). Пробовал даже сделать паузу на 3 секунды все равно не работает.
А попробуйте в метод Закрыть() передать скопированную ссылку, а на стороне формы, из которой открывалась форма со ссылкой, обработать результат закрытия.
@@ironskills-1c Сделал на форме владельца обработчик закрытия вызываемой формы и думал его вызывать в обоих случаях(скопировать и скопировать и закрыть) но тоже не взлетело. По итогу получился задублированный функционал(в обоих формах есть реквизит буфер обмена) который работает.
а что если текст многострочный?
Попробуйте включить у элемента формы, который связан со строковым реквизитом, многострочный режим.
Слишком много лишних действий пользователя. В буфер обмена ссылка должна копироваться при открытии формы, где она генерируется; естественно, что генерация тоже будет выполняться при открытии формы.
В идеале, конечно, отдельная форма вообще не должна открываться.
В остальном, методика очень полезная - раньше я знал только способ через виндовый комобъект копировать
Все супер, но оказалось что копируется только в том случае когда текст в поле идет одной строкой)
Кто то может подсказать что делать если есть переносы строки в тексте?)))
А попробуйте для элемента формы включить многострочный режим)
А у меня нет поля на форме из которого я беру значение для копирования в буфер. Я это значение формирую программно. А если речь о Поле HTML документа то у него вроде как нет такой опции. @@ironskills-1c
@@dazz1eshp Если вам нужно, чтобы текст разделялся автоматически, то можно вставить в места где нужен перенос строки какой-нибудь символ, который не будет встречаться в вашем тексте, типа: ~
А в js скрипте заменить:
“” НА ""
Чтобы поле было не однострочным в самом html
И
"var text = '%1';" НА "var text = `%1`.replace(/~/g, '
');"
Чтобы ваш символ заменялся на "
", который движок интерпретирует как перенос строки
Таким образом в буфере обмена будет текст с переносами в необходимых местах
ВОт почему разработка 1С (платформы ) такая тормознутая... Еще с 8,1 люди извращались костылями , что бы просто скопировать в буфер обмена. Только включили в 8,3,24!!!! Очень жду когда ж форматированный текст включат в ячейку табличного документа где нибудь в 8,3,52 :)
Спасибо за комментарий) Форматированный текст в ячейке табличного документа тоже в 8.3.24 анонсировали, поэтому ждать осталось не так долго)
што???
А теперь представьте обьем вот таких вот говно-решений во всей конфигурации, потом ERP весит как гта 5.Лучше уж вообще не делать чем делать так.Мне чуть плохо не стало от такого решения...А скопировать можно и ручками.
Предложите более красивое решение, наверняка у Вас оно есть ;)