Создание скриншота для возможности отправки уведомления об ошибке программисту 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 не будет опубликован. Обязательные поля помечены *