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

18.08.19

Разработка - Механизмы платформы 1С

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

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    3628    dsdred    48    

66

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5043    YA_418728146    25    

62

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6173    dsdred    36    

110

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18204    SeiOkami    46    

116

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    11779    human_new    27    

72

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8566    YA_418728146    6    

139

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6205    sebekerga    54    

93

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15540    SeiOkami    31    

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

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

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

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