Создание скриншота для возможности отправки уведомления об ошибке программисту 1С

Ознакомившись  с публикациями на тему «Отправка уведомления об ошибке программисту 1С с приложением скриншота» возник вопрос, а можно ли сделать процесс создания скриншота без поддержки ВК и универсальным по отношению к платформе…

Ознакомившись  с публикациями на тему «Отправка уведомления об ошибке программисту 1С с приложением скриншота» возник вопрос, а можно ли сделать процесс создания скриншота без поддержки ВК и универсальным по отношению к платформам 7.7 и 8.Х… Оказалось можно, но для этого нужно сделать скриншот сторонней системной утилитой. Пробороздив просторы гугла пришел к выводу, что простой и быстрой утилиты нет. Многие предлагают использовать сторонний софт и разные методы адаптации его в среде 1С. Тогда вооружившись минимальными знаниями, что были по программированию и имея под рукой пакет Microsoft Visual Basic 2010 Express написал небольшую утилиту весом в 81KB. Суть использования утилиты довольно таки проста, из любой платформы 1С даем команду выполнить внешнюю команду с параметрами… В результате получаем в определенном месте файл с нашим скриншотом. Что с ним потом делать… Всё что хотите… отправляйте на мыло, печатайте, и.т.д. Как транспортировать утилиту, да как угодно, можно в папке с базой, можно в составе конфигурации, а затем сохранять её на диск и запускать…

Какие параметры мы можем задать:

& — разделитель команд

path=”c: emp1cПоложить скриншотФайл” – путь и имя файла для скриншота

type = “png” – формат в котором будет сохранен скриншот.

Поддерживаемые форматы:  jpg, jpeg, gif, bmp, emf, wmf, png, tiff

pause=”True” – включить вывод сообщения после скриншота

interval = “1000” – интервал паузы в милисекундах вывода сообщения после скриншота

text = “Улыбайтесь Вас снимает скрытая камера…” – сам текст сообщения после скриншота

help – краткая подсказка… видна на представленном скриншоте.

красным — обязательная комбинация параметров для создания скриншота

Утилита писана с использованием microsoft net framework 2.0 поэтому на компьютере должен быть этот пакет установлен, что на текущий момент используется практически на всех компьютерах. Поэтому проблем с использованием думаю, что не будет…

Пример для 1С:Предприятие 7.7

Процедура глЗадатьИмяСкриншота(ПолноеИмяФайла)
    Перем
ТекЧас,ТекМин,ТекСек;
   
ПутьКИБ = КаталогИБ()+«СообщитьОбОшибке»;
   
ТекДата = Формат(ТекущаяДата(),«ДДММММГГГГ»);
   
ТекДата = СтрЗаменить(ТекДата,«.»,«»);
   
ТекущееВремя(ТекЧас,ТекМин,ТекСек);
   
ТекВремя = Формат(Число(ТекЧас),«Ч(0)2.0»)+Формат(Число(ТекМин),«Ч(0)2.0»)+Формат(Число(ТекСек),«Ч(0)2.0»);
   
ПолноеИмяФайла = ПутьКИБ + «Скрин_»+ТекДата+«_»+ТекВремя;
КонецПроцедуры
// глЗадатьИмяСкриншота
//======================================================================
Функция глСоздатьСкриншот() Экспорт
    Перем
ПолноеИмяФайла;
   
// Получаем имя файла для скриншота
   
глЗадатьИмяСкриншота(ПолноеИмяФайла);
    Пока
ФС.СуществуетФайл(ПолноеИмяФайла)=1 Цикл
       
// Это из теории вероятности что более одного пользователя в один и
        // тотже момент времени нажмут на кнопку для скриншота
        // и если случилось сие чудо создать новое имя файла…
       
глЗадатьИмяСкриншота(ПолноеИмяФайла);
    КонецЦикла;
   
// соберем командную строку
   
Команда = КаталогИБ()+«ScreenShot.exe «+«path=»»»+ПолноеИмяФайла+«»»»+» & type=»»bmp»»»;
   
// на всяк случай проверим размер свободного места на диске
   
Если ФС.СвободноеМестоНаДиске(Лев(КаталогИБ(),2))>104857600 Тогда
       
ЗапуститьПриложение(Команда);
       
// нужно дождаться появления файла
       
Счетчик = 1000000;
        Пока
Счетчик>0 Цикл
           
// Ждем отработки ScreenShot.exe
           
Счетчик = Счетчик 1;
        КонецЦикла;
    КонецЕсли;
    Возврат
ПолноеИмяФайла+«.bmp»;
КонецФункции
// глСоздатьСкриншот

С удовольствием выслушаю все замечания…

Если кому-то покажется баяном, просьба резко не критиковать… 😉

ЗЫ: По просьбе добавил исходники

39 Comments

  1. TrinitronOTV

    хорошая вещь — пригодиться

    Reply
  2. Andry.Boris

    (1) TrinitronOTV,

    Не забываем ставить + мне очень приятно если пригодиться…

    Reply
  3. Misanets
    Из описания к публикации:

    «из любой платформы 1С даем команду выполнить внешнюю команду с параметрами…»

    Пример кода можно?

    Reply
  4. Ichigo

    Прикольная и главное актуальная вещь! Спасибо.

    Reply
  5. Andry.Boris

    Спасибо.

    Функционал можно развить, кому что нужно пишите…

    допишем…

    Reply
  6. Misanets

    Ответ то будет на вопрос (3)?

    Reply
  7. romansun

    (5)

    Сделайте копирование скрина в буфер обмена. В 75% случаев это именно то, что нужно — вставить в письмо, в скайп, в документацию и пр.

    я сам и заказчик на постоянной основе пользуемся getgreenshot.org

    Reply
  8. Анатолий50

    Не видел, но одобряю, идея очень хорошая. Еще бы и отправляла сама, или хотя бы собирала сведения, в каком месте остановилась программа. Поставил +

    Reply
  9. oav

    Вещь хорошая. Надо попробовать… так ли все удобно???

    Reply
  10. Andry.Boris

    (3) Пример для 7.7 добавлен… см. статью.

    Reply
  11. Andry.Boris

    (8) В следующей редакции добавлю отправку по почте через SSL…

    для 7.7 думаю это тоже особо актуально…

    Reply
  12. Misanets

    Что-то не получается никак в 8.2.

    Процедура ВыполнитьНажатие(Кнопка)

    ПолноеИмяФайла = «C:Скрин_»+ТекущаяДата();

    Команда = «C:ScreenShot.exe «+»path=»»»+ПолноеИмяФайла+»»»»+» & type=»»bmp»»»;

    ЗапуститьПриложение(Команда);

    КонецПроцедуры

    В результате вроде должен появиться файл скрина на диске С: (там же и эксешник лежит), но нет, ничего нет.

    В чем беда?

    Reply
  13. pumbaE

    (12) Misanets, а просто так срабатывает? Не всегда ведь можно писать в корень диска С:, например в windows 7 нельзя по умолчанию.

    Reply
  14. Andry.Boris

    (12) Возможно в єтой строке проблема

    >> ПолноеИмяФайла = «C:Скрин_»+ТекущаяДата();

    Формируется имя с большим содержанием точек.

    Воспользуйтесь моим методом, где формируется имя без точек…

    и отрегулируйте количество кавычек:

    >> Команда = «C:ScreenShot.exe «+»path=»»»+ПолноеИмяФайла+»»»+» & type=»»bmp»»»;

    Reply
  15. Andry.Boris

    (13) Поэтому и использовал строку

    >> Команда = КаталогИБ()+»ScreenShot.exe «+»path=»»»+ПолноеИмяФайла+»»»»+» & type=»»bmp»»»;

    Если из командной строки запустить:

    100% работает…

    ScreenShot.exe path=»C:Program Filesscreenshot»&type=»png»

    Дальше транслируйте команду в формате 1С

    Reply
  16. Misanets
    Andry.Boris пишет:

    (12) Возможно в єтой строке проблема

    >> ПолноеИмяФайла = «C:Скрин_»+ТекущаяДата();

    Формируется имя с большим содержанием точек.

    Воспользуйтесь моим методом, где формируется имя без точек…

    и отрегулируйте количество кавычек:

    >> Команда = «C:ScreenShot.exe «+»path=»»»+ПолноеИмяФайла+»»»+» & type=»»bmp»»»;

    Показать

    Спасибо, действительно проблема видимо в точках входящих в состав даты.

    Решил файл хранить в темпе под простым именем типа

    КаталогВременныхФайлов() + «screen»

    и от туда брать его. Каждый раз файл будут перезаписан, если он существует.

    Reply
  17. gaglo

    Пробороздив просторы гугла, значит? Так рекомендую произведение неподражаемого Нира Софера —

    NirCmd v2.65 ! Просто и быстро позволяет сделать из командной строки около сотни самых разных вещей; среди них и создание скриншота: в файл или в буфер обмена, возможно с задержкой, поддерживаются разные форматы графического файла, и если несколько мониторов подключено, то можно по желанию получать скриншоты со всех доступных или только с главного…

    ЗЫ. А Microsoft Net Framework всех версий отсутствует приблизительно на 120 из 130 компьютеров нашей фирмы, потому, что он там никому не нужен…

    Reply
  18. CheBurator

    мегакруто:

    а можно ли сделать процесс создания скриншота без поддержки ВК и универсальным по отношению к платформам 7.7 и 8.Х… Оказалось можно, но для этого нужно сделать скриншот сторонней системной утилитой

    — суперподход! вк — нам не нравятся, сделаем стороннюю утилиту…

    ..мдя…

    .

    для 7.7 — с использованием сторонней утилиты — то есть ВК: http://infostart.ru/public/14659/

    + у абадонны в миракле есть такой функционал.

    + к этому реально можно обойтись безо всяких ВК и сторонних утилит — принтскрин клавишу еще нгикто не отменял…

    Reply
  19. alexanderal

    а мне понравилось…. всяко с удаленщиками проще работать… эффект одной кнопки

    Reply
  20. Andry.Boris

    (17) gaglo,

    Я и не претендую на первенство изобретения велосипеда…

    Это мой взгляд на вопрос, можете пользоваться любыми обработками как Вам желается…

    Reply
  21. Andry.Boris

    (18) CheBurator,

    ВК — сидит в памяти, это и есть то что может не нравиться,

    причем зачем держать ВК если Вам нужна функция из неё только при возникновении

    ситуации… К тому же избыток ВК в работающей может приводить к сбоям…

    Про сторонние разработки те что Вы описали я в курсе,…

    К тому же данная вещь на любителя…

    Утилита универсальна, запустить всегда можно и не сложно…

    Пользоваться или нет Вам решать, вариантов решения вопроса можно разложить множество…

    Спасибо за комментарий.

    Reply
  22. CheBurator

    ВК загружать имеет смысл те, которые во время работы используются регулярно…

    загруженная ВК — будет работать… по идее… (?)

    а вот запуск сторонней утилыта запросто может обломаться из-за политик безопасности — раз, из-за нехватки зависимостей/софта — два (впрочем как и ВК ;0-)

    .

    поэтому я не люблю ВК/утилты в виде комбайнов… — если мне что-то надо — то ради одной возможности тянуть огромноый хвост невостребованных — бяка.. 😉

    .

    так что, при существенном хотении задачу скриншота экрана можно полностью решить встроенными штатными средствами 1С/виндов… или с минимальным привлечением сторонних ВК/утилит

    Reply
  23. pt_olga

    мы своих пользователей научили пользоваться Снагитом… на свою голову)))

    удобней программки по скриншотам не видела

    Reply
  24. Andry.Boris

    (23) pt_olga,

    Как альтернатива Снагита можете посмотреть в сторону Gadwin PrintScreen — умеет делать

    много и размер очень мал… сидит в трее, реагирует на кнопочку «PrintScreen»

    может и отправить по электронке… Но статья не о том…

    Не каждый пользователь сообразит, что нужно нажать PrintScreen и сохранить ошибку для

    админа… а в данном разрезе можно автоматизировать процесс отлова ошибок и пользователю будет

    незаметно…

    Reply
  25. gaglo

    (20) Мне жаль (почему-то), что моё заявление вызвало именно такую реакцию.

    Светлая сторона: Вы сами соорудили стороннюю утилиту под свои цели. И она работает. Похвально!

    Тёмная сторона: Вы не нашли готовой утилиты, хотя могли и найти… (Непохвально?)

    Мне лично не нравится в Ваших ответах лейтмотив «можете пользоваться любыми обработками как Вам желается…», «Пользоваться или нет Вам решать». Похоже, Вы все-таки обиделись даже на не самую резкую критику ;-[

    Однако подождем следующую (см.11) редакцию велосипеда.

    Reply
  26. Nikola23

    Думаю, что будет сильно полезно при работе с множеством БД (соотв. с множеством пользователей).

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

    А тут можно будет видеть не только работу с БД, но и попутно запущенные приложения.

    Reply
  27. warenic

    Почитал описание, глянул на комменты… Зачем все эти сложности? Alt+PrintScreen — копируем снимок экрана в буфер. Теперь его можно вставить хоть в Paint, хоть в Word. Да хоть куда! И никаких ВК и изменений в коде…

    Reply
  28. Leannet

    Полезно на мой взгляд

    Reply
  29. milkers

    Я бы с удовольствием воспользовался этим экзешником, если б смог проверить его на отсутствие закладок… Нужен исходный код.

    Reply
  30. NSerget

    Отличная вещь.

    У себя немного поправил:

    //// нужно дождаться появления файла

    //Счетчик = 10000;

    //Пока Счетчик>0 Цикл

    // // Ждем отработки ScreenShot.exe

    // Счетчик = Счетчик — 1;

    //КонецЦикла;

    Счетчик = 1000000;

    Пока НЕ ПроверитьСуществованиеФайла(КаталогВременныхФайлов() + ИмяФайлаСкринфота + «.jpg») Цикл

    Счетчик = Счетчик — 1;

    Если Счетчик = 0 Тогда

    Возврат Ложь; // Скриншот не был создан

    КонецЕсли;

    КонецЦикла;

    Reply
  31. EastGuy

    А вовремя открытого модального окна работает, можно сделать скрин?

    Reply
  32. the1

    полагаю, можно копнуть в сторону SendKeys + PrintScreen, а там уже вызывать или почту, или Пэйнт, или черта лысого. Но все равно плюс!

    Reply
  33. MishanyaMeepo

    (27) warenic, а если требуется автоматически при ошибках делать скрин и отправлять админам, без участия пользователя? А если нужно сделать большое количество снимков? Всяко легче написать обработку, а не нажимать много раз PrintScreen и вставлять в Paint.

    Reply
  34. MishanyaMeepo

    И еще насчет задержки/ожидания/delay:

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

    Поэтому можно сделать такую функцию:

    //Установить задержку

    Procedure delay(t) export
    
    cmdLine= «ping -n 1 -w » + Формат(1000*t, «ЧГ=0″)+» 1.0.0.0″;
    
    WshShell = Новый COMОбъект(«WScript.Shell»);
    
    WshShell.Run(cmdLine, 0, -1);
    
    EndProcedure
    

    Показать

    Reply
  35. stifano

    Вещь!!! Очень пригодилась. Спасибо.

    Reply
  36. Andry.Boris

    (35) stifano, На здоровья если помогло и не жалко + подкиньте мне пригодиться… 😉

    Reply
  37. DrZombi

    А где для 1С 8.2 УФ и Вэб клиента?

    Где использование технологии Нативел:)

    Reply
  38. unichkin

    (37) DrZombi, какой native 🙂 Это же не ВК))) И в УФ работает прекрасно. Из винды ессно. Автору зачет)

    ох, вот это я археолог))

    Reply
  39. imax26

    (7)

    Копирование в буфер обмена делается — сюрприз — клавишей PrintScreen

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *