В этой статье я решил собрать 2 практических случая, которые используются не так часто, но которые нужно знать, чтобы вообще знать что так можно. Все это я решил сделать и показать в одной конфигурации на базе БСП. Для данного примера скачал с официального сайта 1с (https://releases.1c.ru/) версию БСП 3.0.1.428.
1. Передача пользовательского параметра в управляемое приложение.
Варианты передачи пользовательского параметра.
УП (управляемое приложение) может принимать пользовательские параметры, которые могут передаваться из других приложений. Этот параметр можно обработать произвольным образом. В данной статье в зависимости от его значения будем открывать разные дополнительные обработки, которые используются в любой конфигурации на БСП (библиотеки стандартных подсистем). Существует множество способов передать пользовательский параметр в управляемое приложение, все их описать не представляется возможным, поэтому расскажу про 3 самых простых для меня:
Просто через командную строку (Выполнить > cmd)
"C:\Program Files (x86)\1cv8\8.3.14.1779\bin\1cv8.exe" ENTERPRISE /F C:\Users\konstantin.skvortsov\Documents\1C\DemoSSL1 /C МойПараметр /N Администратор /P
В этом случае можно просто указать полный путь к базе 1С и необходимый минимум параметров: "C:\Program Files (x86)\1cv8\8.3.14.1779\bin\1cv8.exe"
Через “батник” (.bat файл)
Все то же самое, только в файле:
echo "Запускаем 1С..."
"C:\Program Files (x86)\1cv8\8.3.14.1779\bin\1cv8.exe" ENTERPRISE /F C:\Users\konstantin.skvortsov\Documents\1C\DemoSSL1 /C МойПараметр /N Администратор /P
Pause
Pause нужно для того, чтобы окно не закрылось, как правило останавливать выполнение скрипта считается плохим тоном. Если не установить кодировку 866, то система не сможет корректно прочитать кириллицу.
Вызов через скрипт visual basic (.vbs скрипт)
Пример vbs:
Option Explicit
Dim WshShell
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run """C:\Program Files (x86)\1cv8\8.3.14.1779\bin\1cv8.exe"" ENTERPRISE /F C:\Users\konstantin.skvortsov\Documents\1C\DemoSSL1 /C МойПараметр /N Администратор /P ",1,false
Set WshShell = Nothing
Чтобы не было проблем с кириллицей, можно сохранить в кодировке Windows-1251.
/C [строка текста] — передача параметра в конфигурацию.
Хорошая статья про запуск 1С с параметрами: //infostart.ru/public/104654/
При отладке параметр можно передавать из конфигуратора:
2. Открытие дополнительной обработки на начальной странице.
Создаем новую обработку.
В конфигурации БиблиотекаСтандартныхПодсистемДемо добавляем новую обработку, предварительно включив возможность редактирования:
Переименуем обработку, например, в ОсновноеРабочееМестоПользователя. В модуле управляемого приложения в событии ПриНачалеРаботыСистемы прописываем следующий код:
Процедура ПриНачалеРаботыСистемы()
// СтандартныеПодсистемы
СтандартныеПодсистемыКлиент.ПриНачалеРаботыСистемы();
// Конец СтандартныеПодсистемы
ПередаваемыйПараметр = ПараметрЗапуска;
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("ПередаваемыйПараметр", ПередаваемыйПараметр);
Если ЗначениеЗаполнено(ПередаваемыйПараметр) Тогда
ОткрытьФорму("Обработка.ОсновноеРабочееМестоПользователя.Форма.Форма", ПараметрыОткрытия);
КонецЕсли;
КонецПроцедуры
ПараметрЗапуска - это параметр глобального контекста, доступный на клиенте и содержащий значение типа Строка с передаваемым в конфигурацию параметром через ключ командной строки /C. В Метод ОткрытьФорму() передадим ПараметрыОткрытия с передаваемым параметром.
Создадим обработку “Моя обработка”.
Далее создадим простую внешнюю обработку, для подключения ее как дополнительную. Назовем ее, к примеру, Моя обработка.
В модуле объекта напишем:
/////////////////////////////////////////////////////////////////////////
// ********************************************************************
// Функции для использования системой БСП
//Функция ВерсияСтандартныхФункцийОтчетов()
//Версия стандартных подсистем 3.0.1.428
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("3.0.1.428");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Версия = "06.08.2019";
ПараметрыРегистрации.Вставить("Информация",
"Моя обработка.
|
|История изменений:
|06.08.2019
| Первая версия.
|");
ПараметрыРегистрации.БезопасныйРежим = Ложь;
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = НСтр("ru = Моя обработка");
Команда.Идентификатор = "МояОбработка";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
Команда.ПоказыватьОповещение = Ложь;
Возврат ПараметрыРегистрации;
КонецФункции
В Функции СведенияОВнешнейОбработке() получим ПараметрыРегистрации:
- укажем версию (удобнее всего указывать дату, сразу понятно что за версия);
- вставим в них новое свойство “Информация”, и нашей информацией;
- укажем БезопасныйРежим = Ложь;
- добавим новую команду, укажем представление, идентификатор, тип команды в свойстве Использование и ПоказыватьОповещение = Ложь;
Создадим форму обработки и назначим ее как основная. На форме создадим декорацию и укажем у нее Заголовок “Это моя обработка”.
После того как подключим, по имени обработки (он же ИдентификаторОбработки по которому в системе определяется уникальность обработки), можно будет к ней обращаться.
Создадим обработку “Моя новая обработка”.
По такому же принципу создадим еще одну дополнительную обработку, но с идентификатором МояНоваяОбработка. Теперь у нас есть выбор из двух обработок, и в зависимости от значения передаваемого параметра мы можем выбирать любую. Чтобы не было совсем скучно на форме нашей новой обработки помимо декорации давайте создадим новую Группу вида Коммандная панель.
А в ней Подгруппу вида Подменю.
Затем создадим две команды и назначим им обработчики. Теперь у нас в группе коммандной панели есть группа подменю, в которой содержатся две команды.
В модуле объекта нашей второй обработки МояНоваяОбработка напишем:
/////////////////////////////////////////////////////////////////////////
// ********************************************************************
// Функции для использования системой БСП
//Функция ВерсияСтандартныхФункцийОтчетов()
//Версия стандартных подсистем 3.0.1.428
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("3.0.1.428");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Версия = "06.08.2019";
ПараметрыРегистрации.Вставить("Информация",
"Моя обработка.
|
|История изменений:
|06.08.2019
| Первая версия.
|");
ПараметрыРегистрации.БезопасныйРежим = Ложь;
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = НСтр("ru = Моя новая обработка");
Команда.Идентификатор = "МояНоваяОбработка";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
Команда.ПоказыватьОповещение = Ложь;
Возврат ПараметрыРегистрации;
КонецФункции
Вернемся к встроенной в конфигурацию обработке.
Теперь вернемся к встроенной в конфигурацию обработке ОсновноеРабочееМестоПользователя и в форме в событии ПриСозданииНаСервере напишем:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Перем ПередаваемыйПараметр;
Если Параметры.Свойство("ПередаваемыйПараметр", ПередаваемыйПараметр) Тогда
УстановитьПривилегированныйРежим(Истина);
Запрос = новый Запрос();
Запрос.Текст = "ВЫБРАТЬ первые 1
| ДополнительныеОтчетыИОбработки.Ссылка КАК Ссылка
|ИЗ
| Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки
|ГДЕ
| ДополнительныеОтчетыИОбработки.ИмяОбъекта = &ИмяОбъекта";
Запрос.УстановитьПараметр("ИмяОбъекта", ПередаваемыйПараметр);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ДополнительнаяОбработкаДляРабочегоМеста = Выборка.Ссылка;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Далее создадим новую процедуру ОткрытьФормуОбработки и в событии ПриОткрытии ее вызовем:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПодключитьОбработчикОжидания("ОткрытьФормуОбработки",1,Истина);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьФормуОбработки() Экспорт
Если ЗначениеЗаполнено(ДополнительнаяОбработкаДляРабочегоМеста) Тогда
мПараметры = новый Структура;
ИмяОбработки = ПодключитьВнешнююОбработку();
ОткрытьФорму("ВнешняяОбработка."+ИмяОбработки+".Форма",мПараметры,ЭтаФорма,ЭтаФорма.УникальныйИдентификатор,ЭтаФорма.Окно);
КонецЕсли;
КонецПроцедуры
Опытным путем удалось установить, что если обращаться в событии ПриОткрытии к ЭтаФорма.Окно и передавать его как параметр для метода ОткрытьФорму(), то обработка не будет открываться в текущем окне. Поэтому тут используется метод глобального контекста ПодключитьОбработчикОжидания() в котором указали имя процедуры, которая должна быть обязательно с ключевым словом Экспорт.
&НаСервере
Функция ПодключитьВнешнююОбработку()
СтруктураРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ДополнительнаяОбработкаДляРабочегоМеста,"ХранилищеОбработки,БезопасныйРежим");
ХранилищеОбработки = СтруктураРеквизитов.ХранилищеОбработки;
ДвоичныеДанные = ХранилищеОбработки.Получить();
АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
ОписаниеЗащитыОтОпасныхДействий = новый ОписаниеЗащитыОтОпасныхДействий();
ОписаниеЗащитыОтОпасныхДействий.ПредупреждатьОбОпасныхДействиях = СтруктураРеквизитов.БезопасныйРежим;
БезопасныйРежим = СтруктураРеквизитов.БезопасныйРежим;
Попытка
Возврат ВнешниеОбработки.Подключить(АдресХранилища,,БезопасныйРежим,ОписаниеЗащитыОтОпасныхДействий);
Исключение
Возврат ВнешниеОбработки.Подключить(АдресХранилища,,БезопасныйРежим);
КонецПопытки;
КонецФункции
В Функции ПодключитьВнешнююОбработку() подключается обработка из справочника ДополнительныеОбработкиИОтчеты. Метод ОбщегоНазначения.ЗначенияРеквизитовОбъекта() получает сразу одним запросом значение двух реквизитов и возращает их в структуре. Затем из ХранилищеОбработки получаем данные обработки в бинарном формате (ДвоичныеДанные), помещаем во временное хранилище, чтобы методом ВнешниеОбработки.Подключить(), можно было подключить эту обработку в системе и затем уже обращаться к ней в строковом параметре метода ОткрытьФорму().
Как вы поняли, мы будем передавать и анализировать какой параметр приходит. Он строкового типа, поэтому в нем можно передать, к примеру, имя обработки, чтобы она сразу открылась.
Если мы будем передавать пользовательский параметр “МояОбработка”, откроется наша первая обработка, если параметр “МояНоваяОбработка”, откроется наша вторая обработка.
Как видно на скриншоте, в открытой обработке ОсновноеРабочееМестоПользователя мы программно подключили другую обработку, которую определили в нашем пользовательском параметре и открыли основную форму этой обработки внутри окна другой формы.
P.S. Мои методы не претендуют на истину в последней инстанции. Тут я просто делюсь своими практическими приемами, с которыми сталкивался в своей практике и которые, по моему мнению будут интересны в основном для начинающих разработчиков. Ведь согласитесь, не каждый день приходится открывать окна одно внутри другого, но просто нужно знать, что так сделать можно.