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-файл:
Так же напомню, чтобы 1С обработала передаваемую навигационную ссылку, нужно добавить код в обработчик ПриНачалеРаботыСистемы, который будет разбирать на кусочки переменную ПараметрЗапуска. Ниже приведен пример обработки ключа, который передает скрипт (ключ /С)
"enterprise /AppAutoCheckMode /DisableStartupMessages /s BaseServer\BaseName /CLNKNavLink
[Неудобства использования]
Необходимо иметь каталог, с полным доступом всем участникам, чтобы хранить там скрипт и иметь возможность от имени любого пользователя создавать cmd-файлы. Так же необходимо наладить регламентное задание, которое будет удалять неактуальные (по времени создания) cmd-файлы, чтобы их не накапливалось слишком много. Предположительно cmd-файлы можно заменить VBScript-ом, буду рад, если кто поделится такой реализацией.
Данная статья является анонсом новой функциональности.
Не рекомендуется использовать содержание данной статьи для освоения новой функциональности.
Полное описание новой функциональности будет приведено в документации к соответствующей версии.
Полный список изменений в новой версии приводится в файле v8Update.htm.
Планируется в версии 8.3.19 Пробовать
Как известно, практически на любой объект информационной базы можно получить навигационную ссылку, которую, например, можно переслать коллеге, чтобы однозначно сослаться на документ, отчёт и т.д. В версии платформы 8.3.19 мы расширим функциональность навигационных ссылок – в них можно будет передавать дополнительные параметры.
С помощью этой функциональности можно будет не просто передать ссылку на отчёт, а передать ссылку на отчёт с конкретными параметрами (например, с заранее указанным периодом). Или передать ссылку на форму с динамическим списком с выбранной текущей строкой. Или передать ссылку на команду с параметрами.
Изменится диалог получения навигационной ссылки (который открывается по системной кнопке «Получить ссылку» или по сочетанию клавиш Ctrl + F11). Теперь его внешний вид зависит от типа объекта, на котором его вызвали. Вот как он выглядит для формы с динамическим списком:
А вот как – для отчёта:
При получении «расширенной» ссылки можно задать ее имя:
Платформа поддерживает автоматическое формирование и обработку навигационных ссылок с дополнительными параметрами для следующих объектов:
Отчеты. Поддерживаются варианты отчетов и настройки.
Формы с динамическими списками. Поддерживаются текущие настройки и текущая строка динамического списка.
У форм появилось два новых обработчика – ОбработкаПолученияСпискаНавигационныхСсылок и ОбработкаПолученияНавигационнойСсылки.
СписокНавигационыхСсылок.Добавить("СегодняшниеПисьма", "Сегодняшние письма");
СписокНавигационыхСсылок.Добавить("ПисьмаОтКлиентов", "Письма от клиентов");
// Получения навигационной ссылки - форма который открывается по системной кнопке Получить ссылку (или Ctrl + F11).
// 1С 8.3.19 поддерживает автоматическое формирование и обработку навигационных ссылок с дополнительными параметрами
// для отчетов (настроек) и форм с динамическими списками (настройки и текущая строка). Соответствующие обработчики
// форм: ОбработкаПолученияСпискаНавигационныхСсылок и ОбработкаПолученияНавигационнойСсылки.
Процедура ОбработкаПолученияСпискаНавигационныхСсылок ( СписокНавигационыхСсылок , КлючПоУмолчанию )
Процедура ОбработкаПолученияНавигационнойСсылки ( Ключ , Представление , НавигационнаяСсылка , СтандартнаяОбработка )
Пример использования доп.параметров в навиг.ссылках в 1С 8.3://Методы для формирования навигационных ссылок с дополнительными параметрами в расширениях соотвествующих типов:
// ПолучитьНавигационнуюСсылкуОтчета
// ПолучитьНавигационнуюСсылкуТекущегоВариантаОтчета
// ПолучитьНавигационнуюСсылкуТекущихНастроекОтчета
// ПолучитьНавигационнуюСсылкуОбработки
// ПолучитьНавигационнуюСсылкуСписка
// ПолучитьНавигационнуюСсылкуТекущихНастроекСписка
// ПолучитьНавигационнуюСсылкуОбъекта
// ПолучитьНавигационнуюСсылкуЗаписи
//Параметры метода (необ.):
// ПредставлениеНавигационнойСсылки (строка). Представление, кот.будет помещено в хранилище внешних данных навиг.ссылок
// ВнешниеДанныеНавигационнойСсылки (структура). Сюда можно поместить любые необходимые данные.
// Главный бухгалтер отправляет бухгалтеру ссылку на документ "Амортизация ОС"
// с ссылкой на определенное основное средство:
Процедура ОбработкаПолученияСпискаНавигационныхСсылок ( СписокНавигационыхСсылок , КлючПоУмолчанию )
СписокНавигационыхСсылок . Добавить ( "СсылкаОсновноеСредство" , "Ссылка на основное средство" );
Процедура ОбработкаПолученияНавигационнойСсылки ( Ключ , Представление , НавигационнаяСсылка , СтандартнаяОбработка )
Если Ключ = "СсылкаОсновноеСредство" Тогда
СтандартнаяОбработка = Ложь;
ОтборОС = Новый Структура ( "СсылкаОС" , Элементы . ОсновныеСредства . ТекущаяСтрока );
НавигационнаяСсылка = ПолучитьНавигационнуюСсылкуОбъекта ( Представление , ОтборОС );
// Создание отбора по поступлению материала за 2020 год
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Ссылка
|ИЗ
| Документ.ПоступлениеМатериалов
|ГДЕ
| Дата МЕЖДУ &НачДата И &КонДата
|УПОРЯДОЧИТЬ ПО
| Дата ВОЗР" );
Запрос . УстановитьПараметр ( "НачДата" , '20200101000000' );
Запрос . УстановитьПараметр ( "КонДата" , '20201231235959' );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ПередачаПараметровСсылочныхТиповВЗапросе ()
// Создание отбора по материалам с единицей измерения "Куб.см."
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| ЕдиницаИзмерения
|ИЗ
| Справочник.Материалы
|ГДЕ
| ЕдиницаИзмерения = &ЕдинИзмер" );
Запрос . УстановитьПараметр ( "ЕдинИзмер" , Справочники . ЕдиницыИзмерения . НайтиПоНаименованию ( "Куб.см." ));
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ПередачаПараметровСписочногоТипаВЗапросе ()
// Создание отбора по материалам, единицы измерения входят в переданный список
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| ЕдиницаИзмерения
|ИЗ
| Справочник.Материалы
|ГДЕ
| ЕдиницаИзмерения В (&СписокЕдиницИзмерения)" );
СписокЕИ = Новый Массив ;
СписокЕИ . Добавить ( Справочники . ЕдиницыИзмерения . НайтиПоНаименованию ( "Куб.см." ));
СписокЕИ . Добавить ( Справочники . ЕдиницыИзмерения . НайтиПоНаименованию ( "Куб.дм." ));
СписокЕИ . Добавить ( Справочники . ЕдиницыИзмерения . НайтиПоНаименованию ( "Куб.м." ));
Запрос . УстановитьПараметр ( "СписокЕдиницИзмерения" , СписокЕИ );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ПередачаПараметраВВидеТаблицыЗначенийВЗапросе ()
// Создание отбора по материалам в соответствии с параметром в виде
// комбинированной таблицы значений: "Срок Использования" и "Производитель"
ТЗ_СрокИсп_Произв = новый ТаблицаЗначений ;
ТЗ_СрокИсп_Произв . Колонки . Добавить ( "СрокИспользования" , Новый ОписаниеТипов ( "СправочникСсылка.КлассификаторСроковПИ" ));
ТЗ_СрокИсп_Произв . Колонки . Добавить ( "Производитель" , Новый ОписаниеТипов ( "СправочникСсылка.Контрагенты" ));
// "12 месяцев" + "Гомелькабель"
СтрокаТЗ = ТЗ_СрокИсп_Произв . Добавить ();
СтрокаТЗ . СрокИспользования = Справочники . КлассификаторСроковПИ . НайтиПоНаименованию ( "12 месяцев" );
СтрокаТЗ . Производитель = Справочники . Контрагенты . НайтиПоНаименованию ( "Гомелькабель" );
// "18 месяцев" + "Гомельстекло"
СтрокаТЗ = ТЗ_СрокИсп_Произв . Добавить ();
СтрокаТЗ . СрокИспользования = Справочники . КлассификаторСроковПИ . НайтиПоНаименованию ( "18 месяцев" );
СтрокаТЗ . Производитель = Справочники . Контрагенты . НайтиПоНаименованию ( "Гомельстекло" );
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| СрокИспользования,
| Производитель
|ИЗ
| Справочник.Материалы
|ГДЕ
| (СрокИспользования, Производитель) В (&СписокСочетаний)" );
Запрос . УстановитьПараметр ( "СписокСочетаний" , ТЗ_СрокИсп_Произв );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ИспользованиеТаблицыЗначенийПереданнойВЗапросКакПараметр ()
// Программное создание Таблицы Значений и передача её в запрос
ДрагМеталл = новый ТаблицаЗначений ;
ДрагМеталл . Колонки . Добавить ( "Название" , Новый ОписаниеТипов ( "Строка" ));
ДрагМеталл . Колонки . Добавить ( "РынЦена" , Новый ОписаниеТипов ( "Число" ));
НоваяСтрока = ДрагМеталл . Добавить ();
НоваяСтрока . Название = "Золото" ;
НоваяСтрока . РынЦена = 127.29 ;
НоваяСтрока = ДрагМеталл . Добавить ();
НоваяСтрока . Название = "Серебро" ;
НоваяСтрока . РынЦена = 1.30 ;
НоваяСтрока = ДрагМеталл . Добавить ();
НоваяСтрока . Название = "Платина" ;
НоваяСтрока . РынЦена = 62. 00 ;
НоваяСтрока = ДрагМеталл . Добавить ();
НоваяСтрока . Название = "Родий" ;
НоваяСтрока . РынЦена = 568.27 ;
// Сперва выбираем данные во временную таблицу, а потом работаем как с обычной таблицей
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Название,
| РынЦена
|ПОМЕСТИТЬ
| ВременнаяТаблица
|ИЗ
| &ТаблицаДрагМеталлов КАК ДрагМеталлы
|;
|ВЫБРАТЬ
| Название,
| РынЦена
|ИЗ
| ВременнаяТаблица
|УПОРЯДОЧИТЬ ПО
| РынЦена УБЫВ" );
Запрос . УстановитьПараметр ( "ТаблицаДрагМеталлов" , ДрагМеталл );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
Читайте также: