Ознакомившись с публикациями на тему «Отправка уведомления об ошибке программисту 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»;
КонецФункции // глСоздатьСкриншот
С удовольствием выслушаю все замечания…
Если кому-то покажется баяном, просьба резко не критиковать… 😉
ЗЫ: По просьбе добавил исходники
хорошая вещь — пригодиться
(1) TrinitronOTV,
Не забываем ставить + мне очень приятно если пригодиться…
«из любой платформы 1С даем команду выполнить внешнюю команду с параметрами…»
Пример кода можно?
Прикольная и главное актуальная вещь! Спасибо.
Спасибо.
Функционал можно развить, кому что нужно пишите…
допишем…
Ответ то будет на вопрос (3)?
(5)
Сделайте копирование скрина в буфер обмена. В 75% случаев это именно то, что нужно — вставить в письмо, в скайп, в документацию и пр.
я сам и заказчик на постоянной основе пользуемсяgetgreenshot.org
Не видел, но одобряю, идея очень хорошая. Еще бы и отправляла сама, или хотя бы собирала сведения, в каком месте остановилась программа. Поставил +
Вещь хорошая. Надо попробовать… так ли все удобно???
(3) Пример для 7.7 добавлен… см. статью.
(8) В следующей редакции добавлю отправку по почте через SSL…
для 7.7 думаю это тоже особо актуально…
Что-то не получается никак в 8.2.
Процедура ВыполнитьНажатие(Кнопка)
ПолноеИмяФайла = «C:Скрин_»+ТекущаяДата();
Команда = «C:ScreenShot.exe «+»path=»»»+ПолноеИмяФайла+»»»»+» & type=»»bmp»»»;
ЗапуститьПриложение(Команда);
КонецПроцедуры
В результате вроде должен появиться файл скрина на диске С: (там же и эксешник лежит), но нет, ничего нет.
В чем беда?
(12) Misanets, а просто так срабатывает? Не всегда ведь можно писать в корень диска С:, например в windows 7 нельзя по умолчанию.
(12) Возможно в єтой строке проблема
>> ПолноеИмяФайла = «C:Скрин_»+ТекущаяДата();
Формируется имя с большим содержанием точек.
Воспользуйтесь моим методом, где формируется имя без точек…
и отрегулируйте количество кавычек:
>> Команда = «C:ScreenShot.exe «+»path=»»»+ПолноеИмяФайла+»»»+» & type=»»bmp»»»;
(13) Поэтому и использовал строку
>> Команда = КаталогИБ()+»ScreenShot.exe «+»path=»»»+ПолноеИмяФайла+»»»»+» & type=»»bmp»»»;
Если из командной строки запустить:
100% работает…
ScreenShot.exe path=»C:Program Filesscreenshot»&type=»png»
Дальше транслируйте команду в формате 1С
>> ПолноеИмяФайла = «C:Скрин_»+ТекущаяДата();
Формируется имя с большим содержанием точек.
Воспользуйтесь моим методом, где формируется имя без точек…
и отрегулируйте количество кавычек:
>> Команда = «C:ScreenShot.exe «+»path=»»»+ПолноеИмяФайла+»»»+» & type=»»bmp»»»;
Показать
Спасибо, действительно проблема видимо в точках входящих в состав даты.
Решил файл хранить в темпе под простым именем типа
КаталогВременныхФайлов() + «screen»
и от туда брать его. Каждый раз файл будут перезаписан, если он существует.
Пробороздив просторы гугла, значит? Так рекомендую произведение неподражаемого Нира Софера —
NirCmd v2.65 ! Просто и быстро позволяет сделать из командной строки около сотни самых разных вещей; среди них и создание скриншота: в файл или в буфер обмена, возможно с задержкой, поддерживаются разные форматы графического файла, и если несколько мониторов подключено, то можно по желанию получать скриншоты со всех доступных или только с главного…
ЗЫ. А Microsoft Net Framework всех версий отсутствует приблизительно на 120 из 130 компьютеров нашей фирмы, потому, что он там никому не нужен…
мегакруто:
— суперподход! вк — нам не нравятся, сделаем стороннюю утилиту…
http://infostart.ru/public/14659/
..мдя…
.
для 7.7 — с использованием сторонней утилиты — то есть ВК:
+ у абадонны в миракле есть такой функционал.
+ к этому реально можно обойтись безо всяких ВК и сторонних утилит — принтскрин клавишу еще нгикто не отменял…
а мне понравилось…. всяко с удаленщиками проще работать… эффект одной кнопки
(17) gaglo,
Я и не претендую на первенство изобретения велосипеда…
Это мой взгляд на вопрос, можете пользоваться любыми обработками как Вам желается…
(18) CheBurator,
ВК — сидит в памяти, это и есть то что может не нравиться,
причем зачем держать ВК если Вам нужна функция из неё только при возникновении
ситуации… К тому же избыток ВК в работающей может приводить к сбоям…
Про сторонние разработки те что Вы описали я в курсе,…
К тому же данная вещь на любителя…
Утилита универсальна, запустить всегда можно и не сложно…
Пользоваться или нет Вам решать, вариантов решения вопроса можно разложить множество…
Спасибо за комментарий.
ВК загружать имеет смысл те, которые во время работы используются регулярно…
загруженная ВК — будет работать… по идее… (?)
а вот запуск сторонней утилыта запросто может обломаться из-за политик безопасности — раз, из-за нехватки зависимостей/софта — два (впрочем как и ВК ;0-)
.
поэтому я не люблю ВК/утилты в виде комбайнов… — если мне что-то надо — то ради одной возможности тянуть огромноый хвост невостребованных — бяка.. 😉
.
так что, при существенном хотении задачу скриншота экрана можно полностью решить встроенными штатными средствами 1С/виндов… или с минимальным привлечением сторонних ВК/утилит
мы своих пользователей научили пользоваться Снагитом… на свою голову)))
удобней программки по скриншотам не видела
(23) pt_olga,
Как альтернатива Снагита можете посмотреть в сторону Gadwin PrintScreen — умеет делать
много и размер очень мал… сидит в трее, реагирует на кнопочку «PrintScreen»
может и отправить по электронке… Но статья не о том…
Не каждый пользователь сообразит, что нужно нажать PrintScreen и сохранить ошибку для
админа… а в данном разрезе можно автоматизировать процесс отлова ошибок и пользователю будет
незаметно…
(20) Мне жаль (почему-то), что моё заявление вызвало именно такую реакцию.
Светлая сторона: Вы сами соорудили стороннюю утилиту под свои цели. И она работает. Похвально!
Тёмная сторона: Вы не нашли готовой утилиты, хотя могли и найти… (Непохвально?)
Мне лично не нравится в Ваших ответах лейтмотив «можете пользоваться любыми обработками как Вам желается…», «Пользоваться или нет Вам решать». Похоже, Вы все-таки обиделись даже на не самую резкую критику ;-[
Однако подождем следующую (см.11) редакцию велосипеда.
Думаю, что будет сильно полезно при работе с множеством БД (соотв. с множеством пользователей).
Иногда из пользователей и пытками не вытянешь чо там за ошибка произошла, когда, при каких условиях.
А тут можно будет видеть не только работу с БД, но и попутно запущенные приложения.
Почитал описание, глянул на комменты… Зачем все эти сложности? Alt+PrintScreen — копируем снимок экрана в буфер. Теперь его можно вставить хоть в Paint, хоть в Word. Да хоть куда! И никаких ВК и изменений в коде…
Полезно на мой взгляд
Я бы с удовольствием воспользовался этим экзешником, если б смог проверить его на отсутствие закладок… Нужен исходный код.
Отличная вещь.
У себя немного поправил:
//// нужно дождаться появления файла
//Счетчик = 10000;
//Пока Счетчик>0 Цикл
// // Ждем отработки ScreenShot.exe
// Счетчик = Счетчик — 1;
//КонецЦикла;
Счетчик = 1000000;
Пока НЕ ПроверитьСуществованиеФайла(КаталогВременныхФайлов() + ИмяФайлаСкринфота + «.jpg») Цикл
Счетчик = Счетчик — 1;
Если Счетчик = 0 Тогда
Возврат Ложь; // Скриншот не был создан
КонецЕсли;
КонецЦикла;
А вовремя открытого модального окна работает, можно сделать скрин?
полагаю, можно копнуть в сторону SendKeys + PrintScreen, а там уже вызывать или почту, или Пэйнт, или черта лысого. Но все равно плюс!
(27) warenic, а если требуется автоматически при ошибках делать скрин и отправлять админам, без участия пользователя? А если нужно сделать большое количество снимков? Всяко легче написать обработку, а не нажимать много раз PrintScreen и вставлять в Paint.
И еще насчет задержки/ожидания/delay:
Делать цикл с счетчиком неправильно, т.к. задержка предполагает приостановку процесса выполнения программы.
Поэтому можно сделать такую функцию:
//Установить задержку
Показать
Вещь!!! Очень пригодилась. Спасибо.
(35) stifano, На здоровья если помогло и не жалко + подкиньте мне пригодиться… 😉
А где для 1С 8.2 УФ и Вэб клиента?
Где использование технологии Нативел:)
(37) DrZombi, какой native 🙂 Это же не ВК))) И в УФ работает прекрасно. Из винды ессно. Автору зачет)
ох, вот это я археолог))
(7)
Копирование в буфер обмена делается — сюрприз — клавишей PrintScreen