Практика: Передаем произвольный параметр и открываем форму выбранной нами дополнительной обработки

Публикация № 1109416

Программирование - Практика программирования

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

В этой статье я решил собрать 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С с параметрами: //tvb-spb.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. Мои методы не претендуют на истину в последней инстанции. Тут я просто делюсь своими практическими приемами, с которыми сталкивался в своей практике и которые, по моему мнению будут интересны в основном для начинающих разработчиков. Ведь согласитесь, не каждый день приходится открывать окна одно внутри другого, но просто нужно знать, что так сделать можно.

30

См. также

Специальные предложения

Лучшие комментарии
12. skv_79 163 21.08.19 19:52 Сейчас в теме
Добавил доп. обработки в конфигурацию и выложил в гит:
https://github.com/KonstantinSkvortsov/PeredachaParametra1C
Остальные комментарии
Избранное Подписка Сортировка: Древо
1. ivanov660 1563 19.08.19 09:18 Сейчас в теме
Предлагаю еще один вариант: через промежуточное хранилище данных (к примеру, регистр сведений безопасное хранилище данных из БСП) - изначально сохранили настройки, а при открытии учитываем и обрабатываем.
2. skv_79 163 19.08.19 10:11 Сейчас в теме
(1)
вариант: через промежуточное хранилище данных (к примеру, регистр сведений безопасное хранилище данных из БСП) - изначально сохранили настройки, а при открытии учитываем и обрабатываем

Да, так тоже можно, но параметр, как мне кажется используется не так часто как хранилище значений, и поэтому иногда забывается то, что можно так просто передать в приложение какие-либо данные из внешнего приложения, вспоминая о каких-то других способах. Даже сначала про веб-сервисы и COM вспоминают, и только потом, поняв что задача не требует таких сложностей и можно через обычный параметр из внешнего приложения.
3. qwinter 602 19.08.19 10:19 Сейчас в теме
Остается только риторический вопрос "зачем?")))
4. skv_79 163 19.08.19 10:23 Сейчас в теме
(3) Это из практики, значит я когда-то такое делал. В данном случае нужно было из одного приложения не на языке 1С запускать конфигурацию ERP и открывать форму подбора товаров в знакомом пользователям интерфейсе, для этого использовался пользовательский параметр, в котором передавалась информация о сеансе пользователя, а обратно уже по веб-сервису возвращалось в зависимости от переданных в параметре данных. Согласен, что звучит как костыль, но решение такое было и вполне работало.
5. qwinter 602 19.08.19 10:53 Сейчас в теме
(4)
В данном случае нужно было из одного приложения не на языке 1С запускать конфигурацию ERP и открывать форму подбора товаров в знакомом пользователям интерфейсе, для этого использовался пользовательский параметр, в котором передавалась информация о сеансе пользователя, а обратно уже по веб-сервису возвращалось в зависимости от переданных в параметре данных. Согласен, что звучит как костыль
Это и есть костыль, причем жуткий и кривой. Для подобных задач используется automation client/server.
6. alex_bob 221 19.08.19 11:15 Сейчас в теме
(5)
Это и есть костыль, причем жуткий и кривой. Для подобных задач используется automation client/server.

Windows сейчас далеко не везде.
8. qwinter 602 19.08.19 16:00 Сейчас в теме
(6) для никсов это еще больший костыль, я бы даже сказал КОСТЫЛИЩЕ!!!!, в виду полного сохранения всех выполняемых команд)))))) Хотя если целью было собрать пароли пользователей, не имея администраторского доступа к базе 1С то подойдет)))
10. skv_79 163 19.08.19 17:01 Сейчас в теме
(8) Можно не писать пароль, параметр-то передастся.
7. skv_79 163 19.08.19 15:03 Сейчас в теме
(5)
client/server.

Согласен что костыль, но на мой взгляд, все-же более универсальный в отличии от Automation.
9. qwinter 602 19.08.19 16:00 Сейчас в теме
11. skv_79 163 19.08.19 17:02 Сейчас в теме
(9) Не совсем точно выразился, не универсальный а многоплатформенный.
12. skv_79 163 21.08.19 19:52 Сейчас в теме
Добавил доп. обработки в конфигурацию и выложил в гит:
https://github.com/KonstantinSkvortsov/PeredachaParametra1C
13. skv_79 163 21.08.19 19:52 Сейчас в теме
14. ХамитоваРайса 23.08.19 10:18 Сейчас в теме
Добрый день) Не смогла разархивировать, ругается на длинные имена и символы в именах файлов и каталогов
15. skv_79 163 26.08.19 13:56 Сейчас в теме
(14) Добрый, попробуйте положить ближе к корню диска.
16. skv_79 163 26.08.19 13:57 Сейчас в теме
(14) А еще лучше воспользуйтесь EDT.
Оставьте свое сообщение