Как скопировать текст в буфер обмена (программно)

Sdílet
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

Komentáře • 81

  • @user-ob8qz1en7m
    @user-ob8qz1en7m Před rokem +9

    не знал что с помощью страниц можно скрыть элемент, спасибо, познавательно)

  • @user-xw6on2gz2r
    @user-xw6on2gz2r Před rokem +4

    Ссылку можно выводить в реквизит с типом ФорматированыйДокумент. Потом на вкладке Команды у формы раскрыть этот реквизит и там будут стандартные команды форматированного документа. Вырезать, копировать и т.д. Их можно перетаскивать на форму как обычные команды.
    Перетаскиваем кнопку Копировать на форму. И надо дописать код при открытии формы: программно выделить текст Документа (процедура УстановитьГраницыВыделения).
    По итогу: форма открывается с выделенной строкой. Пользователь нажимает кнопку и текст копируется стандартным образом. Работает везде и никакого огорода с HTML.

  • @NikolaiKrylofff
    @NikolaiKrylofff Před rokem +2

    Браво, Иван! Мало того, что по теме видео всегда все очень информативно, так и косвенно совершаемые Вами действия прямо открывают глаза на новые возможности. Спасибо!

  • @anwarakramovch7127
    @anwarakramovch7127 Před rokem +5

    Иван, как всегда на высоте! очень все доходчиво объясняете!!

  • @igorkolegov
    @igorkolegov Před rokem +6

    В УХе это сделано так
    ОбъектКопирования = Новый COMОбъект("htmlfile");
    ДанныеБуфера =ОбъектКопирования.ParentWindow.ClipboardData.GETdata("Text");

    • @Nosferatudima
      @Nosferatudima Před rokem +1

      Объект = Новый COMОбъект("htmlfile");
      Объект.ParentWindow.ClipboardData.Setdata("Text", СодержимоеВБуферОбмена);

  • @mynumbers5746
    @mynumbers5746 Před rokem +3

    Красавчик Иван, отличный урок.

  • @MotoCrankshaft
    @MotoCrankshaft Před rokem +1

    Блин, давно занимаюсь программированием и каждый раз что то новое из видео узнаю :)
    Лайк видосу :)

  • @Username6547
    @Username6547 Před rokem

    Иван, спасибо! Возьму на заметку

  • @shuvol7516
    @shuvol7516 Před rokem +1

    Иван, спасибо, как всегда, все доступно и понятно

  • @ultrabiba9064
    @ultrabiba9064 Před rokem

    Доступно и коротко объяснил, спасибо!

  • @user-fp7jn9ev4v
    @user-fp7jn9ev4v Před rokem

    Очень круто! Спасибо!

  • @user-bd3kc8iw6h
    @user-bd3kc8iw6h Před 9 dny

    Спасибо огромное, ценная инфа

  • @seastraus1
    @seastraus1 Před rokem

    Отличное видео! Спасибо!👍

  • @user-mb6rs6fu7m
    @user-mb6rs6fu7m Před rokem +1

    Спасибо за пример работы с буфером
    Часто стоит задача по работе с платежными системами в частности и по ссылкам на оплату. В своей ИБ так же сделаю копирование.
    Но, конечно, работа с HTML и видимостью это какой-то костыль костыля. В 1с в целом не очень приятно работать с дом структурами. Спасибо еще раз.

  • @fastAbout1s
    @fastAbout1s Před rokem +3

    Подход интересный, но смотрится костыльно, даже для 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";
    КонецПроцедуры

    • @ironskills-1c
      @ironskills-1c  Před rokem

      У Вашего первого способа также есть недостаток - нужна COM-компонента.
      По второй части: создать элемент программно можно, но в чем будет выйгрыш?

    • @fastAbout1s
      @fastAbout1s Před rokem +1

      @@ironskills-1c Именно эту COM-компоненту специально регистрировать не надо, она из коробки идет во всех windows. Если бы надо было отдельно регистрировать, то да, возможно было бы не универсально. По программному созданию, это просто удобнее. Функцию создания можно вынести в отдельный клиентский модуль, и просто вызывать метод, передавая ему форму и текст который надо поместить в буфер. н.п. так "ОбщийМодульНаКлиенте.ПоместитьВБуферЧерезHTMLПоле(ЭтаФорма, "Некий текст")". Это же намного удобнее, чем каждый раз делать столько действий, да и к тому же на форме будет всегда храниться это поле и закладки...

    • @lord40200
      @lord40200 Před 6 měsíci

      Проверил для винды - работает) Занес к себе в заметки)

  • @user-eq2yn2ju2s
    @user-eq2yn2ju2s Před rokem +1

    Люблю Белоруссию, она хороша во всем и в еде и в качестве одежды, обуви, ну и конечно же самое главное в людях. Спасибо Ваня.

    • @ironskills-1c
      @ironskills-1c  Před rokem

      Спасибо за добрые слова, Юрий)

  • @serg0ffan
    @serg0ffan Před měsícem

    Уважаемый Ведущий! Спасибо Вам за серию очень полезных видео, огромное! Очень познавательно, легко воспринимаемо, потому что хорошо подаётся (что не каждому дано). Давно ъотел спросить: как мне настроить такую же штучку как у Вас в браузере? Там циферки какие-то бегут на пустой странице. :)

  • @user-cl1tm8id4z
    @user-cl1tm8id4z Před rokem +3

    Лайк, интересный подход.
    Если решение пишется только под Windows, то можно реализовать в две строки
    ОбъектКопирования = Новый COMОбъект("htmlfile");
    ОбъектКопирования.ParentWindow.ClipboardData.SetData("Text", ПлатежнаяСсылка);

    • @vladyan01
      @vladyan01 Před rokem +1

      Подскажи откуда узнавать такие ком объекты? Это документация виндовс или что?

    • @user-sd9oc4qh2c
      @user-sd9oc4qh2c Před 7 měsíci

      А если запустим вэб-клиента??

  • @user-we4cl7mp2b
    @user-we4cl7mp2b Před rokem

    Просто офигенно!

  • @grekovtube
    @grekovtube Před rokem

    Твик отличный!

  • @iyad9813
    @iyad9813 Před rokem

    Кстати, интересно как реализована эта кнопка когда копируешь ссылку на какой-нибудь объект в 1С?

  • @SharapovaMasha
    @SharapovaMasha Před rokem +1

    спасибо!

  • @user-ny5pp9oh1c
    @user-ny5pp9oh1c Před rokem +2

    Как всегда интересное видео! Иван, подскажи как у тебя сделано закладками снизу основная конфигурация и расширение? А то у меня отдельными окнами открывается и не могу найти как это сделать

    • @Asakra-irk
      @Asakra-irk Před rokem +1

      Дословно не помню, но примерно так. В конкретном меню окна выбрать Восстановить положение окна.

    • @user-ny5pp9oh1c
      @user-ny5pp9oh1c Před rokem

      @@Asakra-irk , я пробовал. Не помогает!

    • @Asakra-irk
      @Asakra-irk Před rokem

      @@user-ny5pp9oh1c, затягиваешь мышкой окно расширения на окно основной кофигурации. Когда окна соединятся и будут видны оба (без вкладок), надо восстановить положение окна основной конфигурации.

    • @Asakra-irk
      @Asakra-irk Před rokem

      Вкладки тоже перетаскиваются мышкой...

    • @user-ny5pp9oh1c
      @user-ny5pp9oh1c Před rokem

      @@Asakra-irk , не получается. Поставил у обоих окон вид "Обычное" (галочкой), затащил расширение на конфигурацию, на основной конфигурации восстановил положение окна, оно стало ровно прижато к левой части, а расширение так и осталось отдельно

  • @user-lb3em4pj1m
    @user-lb3em4pj1m Před 8 měsíci

    Можно ли подобным образом очистить буфер обмена?

  • @user-mi8ms5zc7d
    @user-mi8ms5zc7d Před 2 měsíci

    Можно создать общую форму, открывать ее с параметром текст, при событии поля хтмл "Документ сформирован" закрывать форму и выдавать сообщение об успешном копировании. Пользователь открытия формы не увидит, только сообщение об успешном копировании нужного текста.

    • @ironskills-1c
      @ironskills-1c  Před 2 měsíci

      Тоже вариант, спасибо за комментарий)

  • @KorayKeles
    @KorayKeles Před rokem

    Вы можете поделиться файлом базы данных?

  • @IT-Science
    @IT-Science Před rokem

    Здравствуйте у меня такая проблема. Есть конфигурация 1С Бухгалтерии, в которой есть документ "РеализацияТоваровИУслуг" в документе есть форма в которой при нажатии на кнопку "выгрузить ТТН" должна выгружаться товарно-транспортная накладная. И документ должен появляться в поле таблицы. Но выгрузки не происходить и документ не появляется, подскажите в чем может быть проблема?

    • @ironskills-1c
      @ironskills-1c  Před rokem

      Сходу сказать трудно, нужно смотреть код. У нас есть сообщество в telegram, можете там вопрос задать: t.me/ironskills_community1c

  • @Podorozhnyky
    @Podorozhnyky Před rokem

    А є якісь варіанти копіювання в буфер обміну на мобільному клієнті?

  • @matinjonsafarov8479
    @matinjonsafarov8479 Před rokem +2

    Можно вопросы

  • @baconpancake6316
    @baconpancake6316 Před 9 měsíci

    Может кто подсказать, как в таком "механизме" сделать перенос строки? Ибо стандартные символы 1С не работают (строка просто не копируется)

    • @yumit677
      @yumit677 Před měsícem

      Если вам нужно, чтобы текст разделялся автоматически, то можно вставить в места где нужен перенос строки какой-нибудь символ, который не будет встречаться в вашем тексте, типа: ~
      А в js скрипте заменить:
      “” НА ""
      Чтобы поле было не однострочным в самом html
      И
      "var text = '%1';" НА "var text = `%1`.replace(/~/g, '
      ');"
      Чтобы ваш символ заменялся на "
      ", который движок интерпретирует как перенос строки
      Таким образом в буфере обмена будет текст с переносами в необходимых местах

  • @arxxximed
    @arxxximed Před rokem

    А решение работает на всех тонких клиентах? Работает на вебклиенте?

    • @ironskills-1c
      @ironskills-1c  Před rokem

      В веб-клиенте не тестировал, работает в тонком)

    • @arxxximed
      @arxxximed Před rokem

      @@ironskills-1c а. В тонком на линуксе пробовали?

    • @rom-x
      @rom-x Před 8 měsíci

      в вебе не работает.

  • @matinjonsafarov8479
    @matinjonsafarov8479 Před rokem +1

    Привет

  • @user-qu7nf7ru5j
    @user-qu7nf7ru5j Před rokem +1

    А вот так нельзя:
    Процедура СкопироватьВБуферОбмена(Команда)
    ОбъектКопирования = Новый COMОбъект("htmlfile");
    ОбъектКопирования.ParentWindow.ClipboardData.SetData("Text", Объект.Логин);
    КонецПроцедуры ??

    • @evgenievgeni2016
      @evgenievgeni2016 Před rokem +3

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

    • @salvatoreganacci9002
      @salvatoreganacci9002 Před rokem

      Сделал так, все работает) Зачем тогда эти пляски с хтмл?

  • @Asakra-irk
    @Asakra-irk Před rokem +4

    cmd /c echo Мой текст | clip

    • @uppinua
      @uppinua Před rokem

      Не, не. Мы пойдем другим путем! Велосипед должен быть с квадратными колесами!!!

    • @ironskills-1c
      @ironskills-1c  Před rokem +1

      Спасибо за альтернативный способ, Алексей)

    • @grekovtube
      @grekovtube Před rokem +1

      В Линуксе не прокатит

    • @Asakra-irk
      @Asakra-irk Před rokem

      @@grekovtube в линуксе есть питон

    • @uppinua
      @uppinua Před rokem +1

      @@grekovtube xclip есть в никсах и много других для баша. Не факт, что скрипт на видео корректно отработает. А нас скоро ждет увлекательный переход госов на никсы. И куча проблем типовых связанных с этим.

  • @bsnchita
    @bsnchita Před 11 měsíci

    Почему не работает тот же самый код только в конце закрываю форму( Закрыть(); ). Пробовал даже сделать паузу на 3 секунды все равно не работает.

    • @ironskills-1c
      @ironskills-1c  Před 11 měsíci

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

    • @bsnchita
      @bsnchita Před 11 měsíci

      @@ironskills-1c Сделал на форме владельца обработчик закрытия вызываемой формы и думал его вызывать в обоих случаях(скопировать и скопировать и закрыть) но тоже не взлетело. По итогу получился задублированный функционал(в обоих формах есть реквизит буфер обмена) который работает.

  • @dazz1eshp
    @dazz1eshp Před 9 měsíci +1

    а что если текст многострочный?

    • @ironskills-1c
      @ironskills-1c  Před 9 měsíci

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

  • @AlexeySimf
    @AlexeySimf Před 8 měsíci +1

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

  • @dazz1eshp
    @dazz1eshp Před 9 měsíci

    Все супер, но оказалось что копируется только в том случае когда текст в поле идет одной строкой)
    Кто то может подсказать что делать если есть переносы строки в тексте?)))

    • @ironskills-1c
      @ironskills-1c  Před 9 měsíci

      А попробуйте для элемента формы включить многострочный режим)

    • @dazz1eshp
      @dazz1eshp Před 9 měsíci

      А у меня нет поля на форме из которого я беру значение для копирования в буфер. Я это значение формирую программно. А если речь о Поле HTML документа то у него вроде как нет такой опции. @@ironskills-1c

    • @yumit677
      @yumit677 Před měsícem

      @@dazz1eshp Если вам нужно, чтобы текст разделялся автоматически, то можно вставить в места где нужен перенос строки какой-нибудь символ, который не будет встречаться в вашем тексте, типа: ~
      А в js скрипте заменить:
      “” НА ""
      Чтобы поле было не однострочным в самом html
      И
      "var text = '%1';" НА "var text = `%1`.replace(/~/g, '
      ');"
      Чтобы ваш символ заменялся на "
      ", который движок интерпретирует как перенос строки
      Таким образом в буфере обмена будет текст с переносами в необходимых местах

  • @arxxximed
    @arxxximed Před rokem +1

    ВОт почему разработка 1С (платформы ) такая тормознутая... Еще с 8,1 люди извращались костылями , что бы просто скопировать в буфер обмена. Только включили в 8,3,24!!!! Очень жду когда ж форматированный текст включат в ячейку табличного документа где нибудь в 8,3,52 :)

    • @ironskills-1c
      @ironskills-1c  Před rokem

      Спасибо за комментарий) Форматированный текст в ячейке табличного документа тоже в 8.3.24 анонсировали, поэтому ждать осталось не так долго)

  • @krutoyinfo
    @krutoyinfo Před 4 měsíci

    што???

  • @user-ii4rq2ry4n
    @user-ii4rq2ry4n Před rokem

    А теперь представьте обьем вот таких вот говно-решений во всей конфигурации, потом ERP весит как гта 5.Лучше уж вообще не делать чем делать так.Мне чуть плохо не стало от такого решения...А скопировать можно и ручками.

    • @ironskills-1c
      @ironskills-1c  Před rokem +1

      Предложите более красивое решение, наверняка у Вас оно есть ;)