Открытие объекта базы 1С 8.2 по навигационной ссылке из письма.

Как известно, конфигурация Документооборота рассылает на пользователей уведомления, в которых указана задача для сотрудника (согласование, ознакомление и т.д.) В письмо вложена навигационная ссылка на задачу. Вопрос автоматизации перехода к задача в базе встал сразу же, так как много ручной работы заключается — запустить 1С, скпировать из письма навигационную ссылку, и переход по ней в задаче.
Написать скрипт, который бы занялся запуском 1С, либо открытием задачи в уже запущенной 1С, только часть проблемы. Труднее было его "вкрутить" в письмо.

Практический
вопрос, который необходимо было решить: добавить в уведомления пользователя по
задачам Документооборота кликабельную ссылку на саму задачу, по нажатию которой
запускалась 1С (если не запущена), и открывалась задача.

Данное решение
состоит из скрипта, написанного на AutoIt, и небольшого кода 1С, который нужно
вставить в процедуру формирования текста письма (для создания cmd-файла запуска
скрипта). Скомпилированный скрипт не требует доработки, и благодаря
настраиваемому ini-файлу, может быть применен к любой базе без изменений.

В состав решения
входит исходный файл AutoIt, скомпилированный exe-файл, файл конфигурирования.

[Конфигурация скрипта]

Скрипт настроен
так, чтобы не зависел от конкретной базы, и не было необходимости его заново
компилировать. Предварительно его необходимо настроить. Для этого внесите
изменения в конфигурационный ini-файл.

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

Параметры BaseServer и BaseName отвечают за размещение базы 1С, которую необходимо
запускать, если 1С неактивна.

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

Параметры RunDirPath1 и RunDirPath2 отвечают за определение каталога локально установленной
1С для 32-х и 64-х битных систем. В параметр RunFile указан файл запуск.

Если скрипт не
находит 1С по локальным путям, считается что она не установлена, и тогда идет
попытка запустить 1С по каталогу, указанному в параметре RunDirPathRemote по
указанному в RunFileRemote файле запуска RemoteApp.

[Выполнение скрипта]

Скрипт работают
с одним ключом запуска – навигационная ссылка объекта базы 1С. Если он не
указан, то работа скрипта прерывается. Далее идет проверка, запущена ли
программа 1С (определяется по названию окна). Если программа запущена, скрипт
активирует окно 1С, помещает навигационную ссылку в буфер обмена, и эмитирует
вызов окна перехода по навигационной ссылке. Содержимое буфера обмена автоматически
подставляется в строку. Далее скрипт эмитирует нажатие Enter (основная кнопка
формы — Перейти), и 1С открывает необходимый объект, если ссылка была
корректной.

Если же
программа 1С не запущена, тогда она будет принудительно запущена. Если происходит
запуск локально установленной 1С, то навигационная ссылка передается как ключ
запуска. Если же 1С локально не установлена, и запускается через ярлык
RemoteApp, то параметр передать невозможно. По этому скрипт ожидает запуска 1С,
затем активирует его окно, и выполняет ранее описанные действия с навигационной
ссылкой.

[Использование скрипта]

Напрямую скрипт
использовать из почты не получится. Исполняемый файл поместить в тело письма, чтобы он запускался с параметрами не выйдет. Для его активации с параметрами пришлось создавать
cmd-файл. Для этого, при генерации письма пользователю необходимо добавить
такой код в 1С:


Функция СоздатьФайлЗапускаДокумента(Задача, ПредставлениеЗадачи)Экспорт
   
   Результат =""; 
   
   ИмяСсылкиПолное = ПолучитьНавигационнуюСсылку(Задача);
   ИмяСсылки = Прав(ИмяСсылкиПолное, СтрДлина(ИмяСсылкиПолное)-Найти(ИмяСсылкиПолное,"="));
   ИмяКаталога = Константы.ПутьЗапускаПрограммыВнешнимиСредствами.Получить();
   ИмяФайла = ИмяКаталога+ИмяСсылки+".cmd";
   
   КаталогНаДиске =Новый Файл(ИмяКаталога);
   ФайлНаДиске =Новый Файл(ИмяФайла);
   ЕслиНе КаталогНаДиске.Существует()Тогда
      
      Возврат ПредставлениеЗадачи;
 
   ИначеЕслиНе ФайлНаДиске.Существует()Тогда
      
      НовыйТекст =Новый ТекстовыйДокумент();
      НовыйТекст.ДобавитьСтроку(ИмяКаталога+"Open1CObjectByNavigationLink.exe "+ИмяСсылкиПолное);
      НовыйТекст.Записать(ИмяФайла,"cp866");
      
   КонецЕсли;     
   
   Результат ="<a href="""+ ИмяФайла +""">"+ ПредставлениеЗадачи +"</a>";
      
   Возврат Результат;
   
КонецФункции

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

В тело письма
подставляем путь на созданный cmd-файл:

ПредставлениеЗадачи = ПредставлениеЗадачи + РаботаСУведомлениями.СоздатьФайлЗапускаДокумента(ЗадачаСтруктура.Ссылка, СокрЛП(ЗадачаСтруктура.Ссылка));

 

Так же напомню,
чтобы 1С обработала передаваемую навигационную ссылку, нужно добавить код в
обработчик ПриНачалеРаботыСистемы,
который будет разбирать на кусочки переменную ПараметрЗапуска. Ниже приведен пример обработки ключа, который
передает скрипт (ключ /С)

Строкапараметровзапуска

«enterprise
/AppAutoCheckMode /DisableStartupMessages /s BaseServerBaseName /CLNKNavLink

Обработчик

Если Лев(ПараметрЗапуск,3)="LNK"Тогда
   НавигационнаяСтрокаСсылка = СтрЗаменить(ПараметрЗапуск,"LNK","");
   Попытка
      ПерейтиПоНавигационнойСсылке(НавигационнаяСтрокаСсылка);
   Исключение
   КонецПопытки;
КонецЕсли;

[Неудобства использования]

Необходимо иметь
каталог, с полным доступом всем участникам, чтобы хранить там скрипт и иметь
возможность от имени любого пользователя создавать cmd-файлы. Так же необходимо
наладить регламентное задание, которое будет удалять неактуальные (по времени
создания) cmd-файлы, чтобы их не накапливалось слишком много. Предположительно
cmd-файлы можно заменить VBScript-ом, буду рад, если кто поделится такой реализацией.

8 Comments

  1. vers139

    Можно ещё поднять веб-сервер, опубликовать базу и рассылать в письме внешнюю http-ссылку. Но это двойная работа в браузере и в тонком клиенте. Не каждому пользователю будет по нутру. Зато вариант.

    Reply
  2. merciful

    Пожалуйста, Помогите! Перерыл весь интернет и нигде не нашел решения, как выводить в информационном письме ссылку на задачу вида http://мойвебсервер/и.т.д Где это настраивается и как????? На мо взгляд тривиальная задача, а нормально описанного решения нигде нет. Спасибо!

    Reply
  3. merciful

    (1) vers139, Пожалуйста, Помогите! Перерыл весь интернет и нигде не нашел решения, как выводить в информационном письме ссылку на задачу вида http://мойвебсервер/и.т.д Где это настраивается и как????? На мо взгляд тривиальная задача, а нормально описанного решения нигде нет. Спасибо!

    Reply
  4. Puk2

    (3) merciful, настройки Документооборота — настройки уведомлений, в окошке внизу адрес публикации базы на веб-сервере, он то и будет подставляться в начале ссылки

    Reply
  5. DPotapov90

    Блин, рейта не хватает скачать 🙂 Тоже такую тему хочу у себя сделать.

    Reply
  6. UNIT68RUS

    Как обойти извещение безопасности при открытии ссылки

    Reply
  7. mudrik6

    (6)

    безопасности

    Прошу прощения за такую длительную задержку.

    Реализовано через CMD файлы, как раз чтобы обойти блокировки безопасности по запуску EXE-файлов.

    Без конкретных скриншотов, на что именно ругается не скажу — лучше решить в паре с сисадмином, и тогда внести изменения на стороне 1С.

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

    Reply
  8. UNIT68RUS

    Спасибо

    Reply

Leave a Comment

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