gifts2017

Библиотека замены модальных и синхронных вызовов, Мастер рассылки e-mail 2.1 для управляемых форм

Опубликовал Олег Молочников (milkers) в раздел Программирование - Практика программирования

Для авторов обработок: Библиотека процедур для замены модальных и синхронных вызовов. Получившийся код работает на любых версиях платформы, автоматически выбирая модальный и синхронный режим работы в зависимости от настроек конфигурации и платформы.
Для пользователей: переделанный из старый разработки под 8.2 с использованием библиотеки Мастер рассылки e-mail 2.1 (ERP, УТ, БП) (Только управляемые формы), который теперь может запускаться под любой версией платформы с разрешенными или запрещенными модальными/синхронными вызовами в конфигурации.
Также удобный выбор e-mail и их владельцев с помощью отбора динамического списка по любым критериям и галочки исключения.

С появлением платформы 8.3  появилась возможность настройки работы в конфигурации без модальных/ синхронных вызовов для поддержки работы через браузеры. При вызове старых методов теперь либо происходит ошибка, либо предупреждение. Подробнее об этом Вы можете  прочитать вот здесь: http://its.1c.ru/docs/v8nonmodal/

То есть теперь надо переписывать старые обработки с использованием новых методов. Но если переписать без затей, то клиент не сможет запустить ее на старой платформе/конфигурации.

Я столкнулся с решением этой проблемы в тексте обработки консоли управляемых запросов. Начав переделывать по этой технологии свои обработки, я столкнулся с недопустимым временем переделки. Для упрощения переделки я предлагаю свою библиотеку подмены  модальных/синхронных вызовов, и пример ее использования.

Библиотека замены модальных и синхронных вызовов 1.02

#Область LibreUniModal_1_02


////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ Библиотеки универсальных вызовов с автоматической поддержкой модальности
// Предназначены для простоты написания кода работающего в любой версии 8.2 - 8.3 с поддержкой модальности или без оной.
// Молочников Олег 2015г. Версия библиотеки 1.02
// Если Вы будете дорабатывать библиотеку, пожалуйста поделитесь исправлениями oleg.molochnikov@mail.ru
// 
// Для работы библиотеки необходимо добавить две переменные объекта
// МодальностьРазрешена Булево 
// ВерсияПриложения Строка
// 
// Следующий код нужно включить в процедуру "При создании на сервере"
// 
// СисИнфо = Новый СистемнаяИнформация;
// Объект.ВерсияПриложения = СисИнфо.ВерсияПриложения;
// 
// Если Лев(Объект.ВерсияПриложения, 3) = "8.2" Тогда
// Объект.МодальностьРазрешена = Истина;
// Иначе
// Выполнить("Объект.МодальностьРазрешена = Метаданные.РежимИспользованияМодальности = Метаданные.СвойстваОбъектов.РежимИспользованияМодальности.Использовать;");
// КонецЕсли;
//

&НаКлиенте
Процедура УниверсальныйПредупреждение(ТекстПредупреждения,ТаймаутПредупреждения=0,ЗаголовокПредупреждения="",КодПослеобработки="",ДополнительныеПараметры="")
	Если ТипЗнч(ДополнительныеПараметры) <> Тип("Структура") Тогда
		ДополнительныеПараметры=Новый Структура;
	КонецЕсли;
	
	ДополнительныеПараметры.Вставить("КодПослеобработки",КодПослеобработки);
	ДополнительныеПараметры.Вставить("ТекстПредупреждения",ТекстПредупреждения);
	
	Если Объект.МодальностьРазрешена Тогда
		КодВыполнения = 
		" Предупреждение(ТекстПредупреждения,ТаймаутПредупреждения,ЗаголовокПредупреждения);
 | УниверсальныйПредупреждениеЗавершение(ДополнительныеПараметры);";
	Иначе
		КодВыполнения = "
 | ПоказатьПредупреждение(Новый ОписаниеОповещения(""УниверсальныйПредупреждениеЗавершение"", ЭтаФорма,ДополнительныеПараметры), ТекстПредупреждения,ТаймаутПредупреждения,ЗаголовокПредупреждения);";
	КонецЕсли;
	
	Выполнить(КодВыполнения);
	
КонецПроцедуры
&НаКлиенте
Процедура УниверсальныйПредупреждениеЗавершение(ДополнительныеПараметры) Экспорт
	Если ДополнительныеПараметры.Свойство("КодПослеобработки") И ДополнительныеПараметры.КодПослеобработки<>"" Тогда
		Выполнить(ДополнительныеПараметры.КодПослеобработки);
	КонецЕсли;
КонецПроцедуры


&НаКлиенте
Процедура УниверсальныйОткрытьЗначение(ОбъектОткрытия,КодПослеобработки="",ДополнительныеПараметры="")
	Если ДополнительныеПараметры="" Тогда
		ДополнительныеПараметры=Новый Структура;
		ДополнительныеПараметры.Вставить("КодПослеобработки",КодПослеобработки);
		ДополнительныеПараметры.Вставить("ОбъектОткрытия",ОбъектОткрытия);
	КонецЕсли;
	
	Если Объект.МодальностьРазрешена Тогда
		КодВыполнения = 
		" ОткрытьЗначение(ОбъектОткрытия);
 | УниверсальныйОткрытьЗначениеЗавершение(ДополнительныеПараметры);";
	Иначе
		КодВыполнения = "
 | ПоказатьЗначение(Новый ОписаниеОповещения(""УниверсальныйОткрытьЗначениеЗавершение"", ЭтаФорма,ДополнительныеПараметры), ОбъектОткрытия);"; 
	КонецЕсли;
	
	Выполнить(КодВыполнения);
	
КонецПроцедуры
&НаКлиенте
Процедура УниверсальныйОткрытьЗначениеЗавершение(ДополнительныеПараметры) Экспорт
	Если ДополнительныеПараметры="" Тогда
		Возврат;
	КонецЕсли;
	Если ДополнительныеПараметры.Свойство("КодПослеобработки") И ДополнительныеПараметры.КодПослеобработки<>"" Тогда
		Выполнить(ДополнительныеПараметры.КодПослеобработки);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УниверсальныйЗапуститьПриложение(СтрокаКоманды,ТекущийКаталог="",КодПослеобработки="",ДополнительныеПараметры="")
	Если ДополнительныеПараметры="" Тогда
		ДополнительныеПараметры=Новый Структура;
		ДополнительныеПараметры.Вставить("КодПослеобработки",КодПослеобработки);
		ДополнительныеПараметры.Вставить("ТекущийКаталог",ТекущийКаталог);
	КонецЕсли;
	
	Если Объект.МодальностьРазрешена Тогда
		КодВыполнения = 
		" ЗапуститьПриложение(СтрокаКоманды,ТекущийКаталог);
 | УниверсальныйЗапуститьПриложениеЗавершение(ДополнительныеПараметры);";
	Иначе
		КодВыполнения = "
 | НачатьЗапускПриложения(Новый ОписаниеОповещения(""УниверсальныйЗапуститьПриложениеЗавершение"", ЭтаФорма), СтрокаКоманды,ТекущийКаталог);"; 
	КонецЕсли;
	
	
	Выполнить(КодВыполнения);
	
КонецПроцедуры
&НаКлиенте
Процедура УниверсальныйЗапуститьПриложениеЗавершение(ДополнительныеПараметры) Экспорт
	Если ТипЗнч(ДополнительныеПараметры) <> Тип("Структура") Тогда
		ДополнительныеПараметры=Новый Структура;
	КонецЕсли;
	Если ДополнительныеПараметры.Свойство("КодПослеобработки") И ДополнительныеПараметры.КодПослеобработки<>"" Тогда
		Выполнить(ДополнительныеПараметры.КодПослеобработки);
	КонецЕсли;
КонецПроцедуры


&НаКлиенте
Процедура УниверсальныйВыборФайлов(Режим,МодульОбработкиФайла,ПолноеИмяФайла="",Фильтр="*",МножественныйВыбор=Ложь,Заголовок="Выберите файл",ДополнительныеПараметры="")
	
	Если ТипЗнч(ДополнительныеПараметры) <> Тип("Структура") Тогда
		ДополнительныеПараметры=Новый Структура;
	КонецЕсли;
	ДополнительныеПараметры.Вставить("МодульОбработкиФайла",МодульОбработкиФайла);
	ДополнительныеПараметры.Вставить("ПолноеИмяФайла",ПолноеИмяФайла);
	
    ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
    ДиалогОткрытияФайла.ПолноеИмяФайла = ПолноеИмяФайла;
    ДиалогОткрытияФайла.Фильтр = Фильтр;
    ДиалогОткрытияФайла.МножественныйВыбор = МножественныйВыбор;
    ДиалогОткрытияФайла.Заголовок = Заголовок;

	Если Объект.МодальностьРазрешена Тогда
		КодВыполнения = 
		"Если ДиалогОткрытияФайла.Выбрать() Тогда
 | УниверсальныйВыборФайловЗавершение(ДиалогОткрытияФайла.ВыбранныеФайлы, ДополнительныеПараметры);
 |КонецЕсли;";
	Иначе
		КодВыполнения = "
 |Оповещение = Новый ОписаниеОповещения(""УниверсальныйВыборФайловЗавершение"", ЭтаФорма,ДополнительныеПараметры);
 |ДиалогОткрытияФайла.Показать(Оповещение);"; 
	КонецЕсли;
	
	Выполнить(КодВыполнения);
	
КонецПроцедуры

&НаКлиенте
Процедура УниверсальныйВыборФайловЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
	
	Если ВыбранныеФайлы=Неопределено ИЛИ ВыбранныеФайлы.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	Для Каждого  ВыбранныйФайл из ВыбранныеФайлы Цикл
		Выполнить(ДополнительныеПараметры.МодульОбработкиФайла);
	КонецЦикла;	
КонецПроцедуры

&НаКлиенте
Процедура УниверсальныйВопрос(ТекстВопроса,МодульОбработки1,РежимДиалогаВопроса,Ответ1,Ответ2="", МодульОбработки2="",ДополнительныеПараметры="");
	Если ТипЗнч(ДополнительныеПараметры) <> Тип("Структура") Тогда
		ДополнительныеПараметры=Новый Структура;
	КонецЕсли;
	ДополнительныеПараметры.Вставить("Ответ1",Ответ1);
	ДополнительныеПараметры.Вставить("Ответ2",Ответ2);
	ДополнительныеПараметры.Вставить("МодульОбработки1",МодульОбработки1);
	ДополнительныеПараметры.Вставить("МодульОбработки2",МодульОбработки2);
	Если Объект.МодальностьРазрешена Тогда
		КодВыполнения = "
 |Результат = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да);
 |УниверсальныйВопросЗавершение(Результат, ДополнительныеПараметры);";
	Иначе
		КодВыполнения = "
 |Оповещение = Новый ОписаниеОповещения(""УниверсальныйВопросЗавершение"", ЭтаФорма,ДополнительныеПараметры);
 |ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет);"; 
	КонецЕсли;
	Выполнить(КодВыполнения);
КонецПроцедуры

&НаКлиенте
Процедура УниверсальныйВопросЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат=ДополнительныеПараметры.Ответ1 Тогда
		Выполнить(ДополнительныеПараметры.МодульОбработки1);
	ИначеЕсли ДополнительныеПараметры.МодульОбработки2<>"" И Результат=ДополнительныеПараметры.Ответ2 Тогда	
		Выполнить(ДополнительныеПараметры.МодульОбработки2);
	КонецЕсли;
КонецПроцедуры

 #КонецОбласти

Для пользователей: Предлагаю вашему вниманию переделанный по этой технологии 

Мастер рассылки e-mail 2.1 (ERP,УТ, БП) (Только управляемые формы)

За основу, взята http://infostart.ru/public/155390/?rate=1

Добавлены: Динамический список для отбора e-mail и их владельцев. Можно осуществлять быстрый отбор по любым полям справочников партнеры, контактной информации партнеров. Например отобрать по ответственному менеджеру, а  потом исключить галочками ненужных контактных лиц. 

Если поле "кому" пустое, то используется динамический список.

Добавлена кнопка предварительного тестирования перед отправкой.

Скачать файлы

Наименование Файл Версия Размер
Отправка Электронных Писем УФ 7
.epf 32,83Kb
29.12.15
7
.epf 2_1 32,83Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Франко Деллиани (Franco) 30.12.15 14:28
Господа, а что значит «Выполнить(»?! Пользователи веб-клиента - идите лесом?!
2. Олег Молочников (milkers) 30.12.15 14:36
(1) Franco, Пока да. Иначе обработка несовместима с 8.2. Надо думать, что можно сделать.
3. aspirator 23 (aspirator23) 02.01.16 15:48
Аналогично решал. Кроме стандартных вызовов, есть проблема с 1с-языком. В 8.3 появились функции и процедуры, которых нет в 8.2.
Решение похоже: либо использовать старые, либо выносить исполнение новых в зависимости от платформы в разные общие модули, формы обработок, отчетов.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа