В статье описан пример создания регламентного задания и необходимых для этого объектов метаданных.

Приведен пример интеграции на базе конфигурации «1С:Управление торговлей ред. 10.3» и платформе 1С:Предприятие 8.3.


Конфигурация для интеграции


Конфигурация для платформы 1С:Предприятие 8.2

  1. Добавляем подсистему «ст_ИнтеграцияМобиком». В неё будут включены все вновь создаваемые объекты. 

    1. Синоним: «Интеграция с Мобиком (st-mobi.com)»

    2. Отключаем флаг «Включать в командный интерфейс»

       Настройка метаданных...

  2. Добавляем общий модуль «ст_ИнтеграцияМобиком». В нем будут реализованы все процедуры для работы регламентного задания.

    1. Синоним: «Интеграция с Мобиком (st-mobi.com)»

    2. Устанавливаем признаки «Сервер», «Внешнее соединение» и «Клиент (обычное приложение)». 

      Настройка контекста выполнена согласно стандарту «Правила создания общих модулей» для серверного (содержащего методы недоступные для использования из клиентского кода) модуля.

       Настройка метаданных...

    3. Пример текста модуля:

       ст_ИнтеграцияМобиком

      ////////////////////////////////////////////////////////////////////////////////
      // Модуль интеграции с Мобиком (st-mobi.com)
      //    Общий модуль интеграции  
      ////////////////////////////////////////////////////////////////////////////////
      
      #Область ПрограммныйИнтерфейс
      
      // Обработчик регламентного задания обмена с Мобиком
      Процедура ОбменДанными() Экспорт
      	
      	Попытка
      		
      		ДвоичныеДанные = ПолучитьДвоичныеДанныеВнешнейОбработки();
      		Если ЗначениеЗаполнено(ДвоичныеДанные) Тогда
      			
      			ОбъектОбработки = ПолучитьОбъектВнешнейОбработки(ДвоичныеДанные);
      			ОбъектОбработки.ВыполнитьКоманду("ОбменДанными");
      				
      		Иначе
      			
      			ЗаписьЖурналаРегистрации("ИнтеграцияМобиком.Интеграция", УровеньЖурналаРегистрации.Предупреждение, 
      				Метаданные.РегламентныеЗадания.ст_ОбменДаннымиМобиком,,
      				НСтр("ru = 'Не заполнена обработка обмена!'", ПолучитьКодЯзыка())
      				);
      			
      		КонецЕсли;
      		
      	Исключение
      		
      		ИнформацияОбОшибке = ИнформацияОбОшибке();
      		ЗаписьЖурналаРегистрации("ИнтеграцияМобиком.Интеграция", УровеньЖурналаРегистрации.Ошибка, 
      			Метаданные.РегламентныеЗадания.ст_ОбменДаннымиМобиком,,
      			ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)
      			);
      		
      	КонецПопытки;
      	
      КонецПроцедуры
      
      // Добавляет имена определенных в модуле интеграции обработчиков событий
      // 
      // Параметры:
      //   Обработчики - Массив - массив строк, например, "ОбработчикПередЗагрузкой".
      //
      // Пример использования:
      //   Обработчики.Добавить(<ИмяОбработчика>);
      //
      Процедура УстановитьОбработчикиСобытий(Обработчики) Экспорт
      	
      КонецПроцедуры
      
      #КонецОбласти
      
      #Область СлужебныеПроцедурыИФункции
      
      Функция ПолучитьДвоичныеДанныеВнешнейОбработки()
      	
      #Если Сервер Тогда
      	УстановитьПривилегированныйРежим(Истина);
      #Иначе
      	
      	Если Не ПравоДоступа("Чтение", Метаданные.Константы.ст_ВнешняяОбработкаМобиком) Тогда
      		ВызватьИсключение НСтр("ru = 'Нет права чтения константы ""Обработка обмена с Мобиком""'", ПолучитьКодЯзыка());
      	КонецЕсли;
      	
      	Если Не ПравоДоступа("Чтение", Метаданные.Справочники.ВнешниеОбработки) Тогда
      		ВызватьИсключение НСтр("ru = 'Нет права чтения справочника ""Внешние отчеты""'", ПолучитьКодЯзыка());
      	КонецЕсли;
      	
      #КонецЕсли
      
      	Запрос = Новый Запрос;
      	Запрос.Текст = 
      	"ВЫБРАТЬ ПЕРВЫЕ 1
      	|	ВнешниеОбработки.ХранилищеВнешнейОбработки
      	|ИЗ
      	|	Константы КАК Константы
      	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ВнешниеОбработки КАК ВнешниеОбработки
      	|		ПО Константы.ст_ВнешняяОбработкаМобиком = ВнешниеОбработки.Ссылка";
      
      	РезультатЗапроса = Запрос.Выполнить();
      	
      	ХранилищеОбработки = Неопределено;
      	Если НЕ РезультатЗапроса.Пустой() Тогда
      		
      		Выборка = РезультатЗапроса.Выбрать();
      		Если Выборка.Следующий() Тогда
      			ХранилищеОбработки = Выборка.ХранилищеВнешнейОбработки;	
      		КонецЕсли;
      		
      	КонецЕсли;
      	
      	ДвоичныеДанные = Неопределено;
      	Если ТипЗнч(ХранилищеОбработки) = Тип("ХранилищеЗначения") Тогда
      		
      		ДанныеХранилища = ХранилищеОбработки.Получить();
      		Если ТипЗнч(ДанныеХранилища) = Тип("ДвоичныеДанные") И ДанныеХранилища.Размер() > 0 Тогда
      			ДвоичныеДанные = ДанныеХранилища;
      		КонецЕсли;
      		
      	КонецЕсли;
      	
      	Возврат ДвоичныеДанные;
      	
      КонецФункции
      
      Функция ПолучитьОбъектВнешнейОбработки(ДвоичныеДанные)
      	
      	#Если ТолстыйКлиентОбычноеПриложение Тогда
      		ИмяОбработки = ПолучитьИмяВременногоФайла();
      		ДвоичныеДанные.Записать(ИмяОбработки);
      	#Иначе	
      		АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
      		ИмяОбработки = ВнешниеОбработки.Подключить(АдресВоВременномХранилище, , Ложь);
      	#КонецЕсли
      	
      	Возврат ВнешниеОбработки.Создать(ИмяОбработки);
      	
      КонецФункции
      
      Функция ПолучитьКодЯзыка()
      	Возврат Метаданные.ОсновнойЯзык.КодЯзыка;
      КонецФункции
      
      #КонецОбласти
      

      Текст модуля для версии платформы 8.2

       ст_ИнтеграцияМобиком

      ////////////////////////////////////////////////////////////////////////////////
      // Модуль интеграции с Мобиком (st-mobi.com)
      //    Общий модуль интеграции  
      ////////////////////////////////////////////////////////////////////////////////
      
      // Обработчик регламентного задания обмена с Мобиком
      Процедура ОбменДанными() Экспорт
      	
      	Попытка
      		
      		ДвоичныеДанные = ПолучитьДвоичныеДанныеВнешнейОбработки();
      		Если ЗначениеЗаполнено(ДвоичныеДанные) Тогда
      			
      			ОбъектОбработки = ПолучитьОбъектВнешнейОбработки(ДвоичныеДанные);
      			ОбъектОбработки.ВыполнитьКоманду("ОбменДанными");
      				
      		Иначе
      			
      			ЗаписьЖурналаРегистрации("ИнтеграцияМобиком.Интеграция", УровеньЖурналаРегистрации.Предупреждение, 
      				Метаданные.РегламентныеЗадания.ст_ОбменДаннымиМобиком,,
      				НСтр("ru = 'Не заполнена обработка обмена!'", ПолучитьКодЯзыка())
      				);
      			
      		КонецЕсли;
      		
      	Исключение
      		
      		ИнформацияОбОшибке = ИнформацияОбОшибке();
      		ЗаписьЖурналаРегистрации("ИнтеграцияМобиком.Интеграция", УровеньЖурналаРегистрации.Ошибка, 
      			Метаданные.РегламентныеЗадания.ст_ОбменДаннымиМобиком,,
      			ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)
      			);
      		
      	КонецПопытки;
      	
      КонецПроцедуры
      
      // Добавляет имена определенных в модуле интеграции обработчиков событий
      // 
      // Параметры:
      //   Обработчики - Массив - массив строк, например, "ОбработчикПередЗагрузкой".
      //
      // Пример использования:
      //   Обработчики.Добавить(<ИмяОбработчика>);
      //
      Процедура УстановитьОбработчикиСобытий(Обработчики) Экспорт
      	
      КонецПроцедуры
      
      
      Функция ПолучитьДвоичныеДанныеВнешнейОбработки()
      	
      #Если Сервер Тогда
      	УстановитьПривилегированныйРежим(Истина);
      #Иначе
      	
      	Если Не ПравоДоступа("Чтение", Метаданные.Константы.ст_ВнешняяОбработкаМобиком) Тогда
      		ВызватьИсключение НСтр("ru = 'Нет права чтения константы ""Обработка обмена с Мобиком""'", ПолучитьКодЯзыка());
      	КонецЕсли;
      	
      	Если Не ПравоДоступа("Чтение", Метаданные.Справочники.ВнешниеОбработки) Тогда
      		ВызватьИсключение НСтр("ru = 'Нет права чтения справочника ""Внешние отчеты""'", ПолучитьКодЯзыка());
      	КонецЕсли;
      	
      #КонецЕсли
      
      	Запрос = Новый Запрос;
      	Запрос.Текст = 
      	"ВЫБРАТЬ ПЕРВЫЕ 1
      	|	ВнешниеОбработки.ХранилищеВнешнейОбработки
      	|ИЗ
      	|	Константы КАК Константы
      	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ВнешниеОбработки КАК ВнешниеОбработки
      	|		ПО Константы.ст_ВнешняяОбработкаМобиком = ВнешниеОбработки.Ссылка";
      
      	РезультатЗапроса = Запрос.Выполнить();
      	
      	ХранилищеОбработки = Неопределено;
      	Если НЕ РезультатЗапроса.Пустой() Тогда
      		
      		Выборка = РезультатЗапроса.Выбрать();
      		Если Выборка.Следующий() Тогда
      			ХранилищеОбработки = Выборка.ХранилищеВнешнейОбработки;	
      		КонецЕсли;
      		
      	КонецЕсли;
      	
      	ДвоичныеДанные = Неопределено;
      	Если ТипЗнч(ХранилищеОбработки) = Тип("ХранилищеЗначения") Тогда
      		
      		ДанныеХранилища = ХранилищеОбработки.Получить();
      		Если ТипЗнч(ДанныеХранилища) = Тип("ДвоичныеДанные") И ДанныеХранилища.Размер() > 0 Тогда
      			ДвоичныеДанные = ДанныеХранилища;
      		КонецЕсли;
      		
      	КонецЕсли;
      	
      	Возврат ДвоичныеДанные;
      	
      КонецФункции
      
      Функция ПолучитьОбъектВнешнейОбработки(ДвоичныеДанные)
      	
      	#Если ТолстыйКлиентОбычноеПриложение Тогда
      		ИмяОбработки = ПолучитьИмяВременногоФайла();
      		ДвоичныеДанные.Записать(ИмяОбработки);
      	#Иначе	
      		АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
      		ИмяОбработки = ВнешниеОбработки.Подключить(АдресВоВременномХранилище, , Ложь);
      	#КонецЕсли
      	
      	Возврат ВнешниеОбработки.Создать(ИмяОбработки);
      	
      КонецФункции
      
      Функция ПолучитьКодЯзыка()
      	Возврат Метаданные.ОсновнойЯзык.КодЯзыка;
      КонецФункции
      

  3. Константу «ст_ВнешняяОбработкаМобиком».

    1. Синоним: «Обработка обмена с Мобиком (st-mobi)»

    2. Тип: СправочникСсылка.ВнешниеОбработки

       Настройка метаданных...

  4. Регламентное задание «ст_ОбменДаннымиМобиком».

    1. Синоним: «Обмен данными с Мобиком (st-mobi)»

    2. Установить флаг «Предопределенное»

    3. Имя метода: «ст_ИнтеграцияМобиком.ОбменДанными»

       Настройка метаданных...

Установка значения константы

 При использовании "управляемых" форм

При использовании "Обычных" форм

Запустить 1С в режиме "Тонкого клиента" (из конфигуратора)


  1. Выбрать: Главное меню - «Все функции»
  2. В открывшемся окне "раскрыть" пункт «Константы» и найти константу «Обработка обмена с Мобиком (st-mobi)»
  3. Выбрать значение для константы:
    1. Нажимаем символ "...", откроется справочник «Внешние обработки»
    2. Выбираем обработку обмена, которую необходимо добавить заранее
    3. Обработка выбрана, необходимо сохранить, для этого выбираем пункт «Записать и закрыть»
 При использовании "Обычных" форм в режиме совместимости с 8.1

Внимание!

В данном разделе описан процесс добавления константы на форму.

  1. В дереве конфигурации переходим к общим формам «Общие»-«Общие формы»
  2. В «1С:Управление торговлей ред. 10.3» для отображения констант используется общая форма «НастройкаПараметровУчета»
  3. Выбираем ту страницу, на которой необходимо расположить константу, в нашем случае - страница «Новые»
  4. Необходимо добавить надпись и поле, отображающее значение константы
  5. Для поля необходимо задать «Данные»
    1. Нажимаем символ "...", откроется список «Данные», необходимо "раскрыть" группировку  «КонстантыНабор» и выбрать константу «ст_ВнешняяОбработкаМобиком»
    2. Значение заполнено 
    3. Для возможности редактирования, необходимо добавить константу в состав формы
  6. Обновляем конфигурацию
  7. Устанавливаем значение константы
    1. Запускам 1С:Предприятие в пользовательском режиме, 
       
    2. Переходим в пункт меню «Операции»-«Константы» и выбираем нужную страницу
    3. Устанавливаем значение константы нажатием на "..." и выбираем обработку из предоставленного списка
    4. Подтверждаем изменения нажатием кнопки "ОК"
  8. Настройка закончена


Примечание.

В версии платформы 1С:Предприятия 8.3.8 введен механизм защиты от опасных действий препятствующий загрузке произвольных внешних отчетов и обработок. Для обеспечения работы регламентного задания необходимо выполнить, как минимум, один пункт:

  1. Снять флаг «Защита от опасных действий» у пользователя под которым запускается регламентное задание

  2. Использовать параметр «DisableUnsafeActionProtection» в файле conf.cfg

  3. При подключении внешней обработки при вызове метода ВнешниеОбработки.Подключить() использовать параметр «ЗащитаОтОпасныхДействий». Пример кода приведен в п. 2.c.



  • No labels