Обработчики 1С

В контексте выполнения доступна переменная СостояниеСообщения, доступная для всех направлений интеграции (В / Из Platform).

Статусы обработки сообщения (Перечисления.сшпСтатусыСообщений):

  • Обработано: устанавливается автоматически. Сообщение регистрируется с событием Receive, если сообщение отправлялось из 1С, и с событием Send, если сообщение приходило в 1С. Уровень логирования событий - Info.

  • ОшибкаОбработки: устанавливается автоматически в случае исключения при выполнении кода обработчика. Сообщение помещается в архив с событием Receive, если сообщение отправлялось из 1С, и с событием Send, если сообщение приходило в 1С. Уровень логирования событий - Info.

  • НеВалидно: устанавливается автоматически в случае некорректного формата сообщения. Сообщение помещается в архив с событием Receive, если сообщение отправлялось из 1С, и с событием Send, если сообщение приходило в 1С. Уровень логирования событий - Info.

  • ОтсутствуетОбработчик: устанавливается автоматически, когда не удается подобрать обработчик для сообщения. Код 114: [Ошибка создания сообщения в 1С]. Причина ошибки: В обработчике установлено недопустимое состояние сообщения Код. 558: [Ошибка обработки сообщения] Причина ошибки: В обработчике установлено недопустимое состояние сообщения. Сообщение помещается в архив с событием Send или Receive.

  • ОбработкаОтменена: устанавливается программно в теле обработчика. Позволяет отменить обработку текущего сообщения. Данное состояние устанавливается автоматически, если обработчик не найден. Сообщение помещается в архив с событием Cancel. Уровень логирования событий - Info.

  • ОжиданиеОбработки: устанавливается программно в теле обработчика. Позволяет отложить обработку текущего сообщения на интервал, указанный в переменной Задержка. Сообщение помещается в очередь, а не в архив. Сообщение возвращается в обработку через интервал, указанный в переменной Задержка. При каждом попадании сообщения в обработку регистрируется событие Delay. Уровень логирования событий - Debug.

Пример использования переменной РезультатОбработки:

Если ОбъектОбработки.РеквизитБулево тогда*
СостояниеСообщения = Перечисления.сшпСтатусыСообщений.ОбработкаОтменена;*
КонецЕсли;*

Обработчики Из Platform

Для обработчиков направления интеграции Из Platform в контексте выполнения доступны следующие переменные:

  • Идентификатор: идентификатор передаваемого сообщения. Соответствует Идентификатору в очереди входящих сообщений.

  • ДатаРегистрации: дата регистрации объекта в очереди входящих сообщений, тип: дата.

  • Задержка: указывается количество секунд. Позволяет отложить обработку на указанный период. Для корректной работы необходимо также указать СостояниеСообщения – значение ОжиданиеОбработки.

  • ТелоСообщения: в переменной хранится тело пакета.

  • КоличествоПопытокОжидания: счетчик количества ожиданий обработки сообщения. Увеличивается каждый раз когда переменная СостояниеСообщения принимает значение ОжиданиеОбработки.

При написании кода обработчика Из Platform чтобы получить значение реквизита из структуры сообщения используется метод GetJSONElementValue, доступный при обращении к Компоненте.

Пример:

Допустим, что записи в системе ищутся по коду, для этого в коде обработчика создается переменная, в которую записывается значение реквизита «Код» из JSON структуры сообщения, которое нужно передать из Platform в систему-получатель.

ЗначениеДляПоиска = Компонента.GetJSONElementValue("Код", 1);*

Затем по данному значению ищется элемент в справочнике:

новыйОбъект = Справочники.ИмяСправочника.НайтиПоКоду(ЗначениеДляПоиска);*

Это необходимо, чтобы присвоить значения реквизитам найденного элемента, либо создать новый элемент с такими значениями. Для этого также можно использовать метод GetJSONElementValue:

Присвоение значения реквизиту Наименование*
новыйОбъект.Наименование = Компонента.GetJSONElementValue("Наименование", 1);*

Доступные методы для логирования:

  • Процедура СобытиеФатальнаяОшибка(Текст)

  • Процедура СобытиеОшибка(Текст)

  • Процедура СобытиеПредупреждение(Текст)

  • Процедура СобытиеИнформация(Текст)

  • Процедура СобытиеОтладка(Текст)

  • Процедура СобытиеПодробности(Текст)

Доступные методы для получения свойств сообщения:

  • Функция СвойствоСообщения(ИмяСвойства)

  • Функция ПолучитьПараметрыСообщенияСтруктурой()

  • Функция ПолучитьПараметрыСообщенияСоответствием()

  • Функция РазмерСообщения() с аналогом на английском - GetMessageSize()

  • Функция ИсточникСообщения() с аналогом на английском - GetSource() - возвращает значение InitialSource

  • Функция ИдентификаторКорреляцииСообщения() с аналогом на английском - GetCorrelationId()

  • Функция ИдентификаторКорреляцииПлатформыСообщения() с аналогом на английском - GetPlatformCorrelationId()

  • Функция ТипДанныхСообщения() с аналогом на английском - GetDataType()

  • Функция КоличествоПопытокОжидания() с аналогом на английском - GetDelayCount()

  • Функция ИдентификаторСообщения() с аналогом на английском - GetId()

  • Функция ТипСообщения() с аналогом на английском - GetType()

  • Функция ВремяСозданияСообщения() с аналогом на английском - GetCreationTime()

Для работы с телом из компоненты используются следующие методы:

  • int result = GetJSONPathExists(string jsonPath, int isFail, out int isExist) - возвращает 0 или 1, указывает существует ли указанный путь в теле принятого сообщения.

  • int result = GetJSONArraySize(string jsonPath, int isFail, out int size) - возвращает 0 или 1, размер массива по указанному пути в теле принятого сообщения.

  • var result = GetJSONElementValue(string jsonPath, int isFail) - возвращает значение из тела для принятого сообщения по указанному пути (до простых элементов).

  • int result = GetJSONPathIsArray(string jsonPath, int isFail, out int pathIsArray) - возвращает 0 или 1, указывает является ли значение по указанному пути в теле сообщения массивом.

Параметр isFail в методах - флаг для генерации ошибки (если 1, то при возникновении ошибки, она будет выведена).

Обработчики В Platform

Для обработчиков направления интеграции В Platform в контексте выполнения доступны следующие переменные:

  • ОбъектОбработки: зарегистрированный к выгрузке объект.

    Используется в качестве источника для формирования тела исходящего сообщения. Тип данных зависит от метода хранения, события регистрации и типа объекта метаданных:

    • Метод хранения По ссылке, событие ПриЗаписи:

      • Регистры: тип: отбор

      • Ссылочные типы (справочники, документы и т.п.), тип: ссылка

    • Метод хранения Сериализация, событие ПриЗаписи, тип: объект XDTO

    • Метод хранения Сериализация, событие ПередУдалением:

      • Регистры: событие не регистрируется

      • Ссылочные типы (справочники, документы и т.п.), тип: объект XDTO.

  • Идентификатор: идентификатор передаваемого сообщения. Соответствует Идентификатору в очереди входящих сообщений.

  • ИдентификаторСобытия: идентификатор события.

  • ТипОбъекта: в переменной хранится объект интеграции, для которого создается обработчик. Например, Справочник.Контрагенты.

  • ФорматСообщения: формат отправляемого сообщения (Перечисления.сшпФорматыСообщений). Доступные форматы: JSON и XML.

  • МетодХранения: метод хранения сообщения (Перечисления.сшпМетодХранения). Доступные методы: ПоСсылке и Сериализация.

  • ОбъектСобытия: в переменной может храниться любой объект (структура или сериализованный объект).

  • ДатаРегистрации: дата регистрации объекта в очереди входящих сообщений, тип: дата.

  • Задержка: указывается количество секунд. Позволяет отложить обработку на указанный период. Для корректной работы необходимо также указать СостояниеСообщения – значение ОжиданиеОбработки.

  • ЭтоУдаление: булевая переменная, обозначает признак полного удаления записи.

  • СсылкаНаОбъект: ссылка на объекта обработки.

  • РезультатОбработки: структура пакета, который будет выгружен из 1С. В поле Body содержится тело пакета.

При написании кода обработчика В Platform нужно получать данные из системы и преобразовывать их в структуру сообщения для отправки. Реализуется следующими способами:

  • Через объектную модель

  • Через запрос

В первом случае используется переменная ОбъектОбработки, значения которой инициализируются подсистемой Datareon при выгрузке из 1С. Для составления структуры сообщения используется переменная РезультатОбработки, в которую записываются данные в нужном формате. Для этого используется переменная ФорматСообщения:

ФорматСообщения = Перечисления.сшпФорматыСообщений.JSON;

Затем создается структура, в которую записываются данные из системы с использованием переменной ОбъектОбработки:

Данные = Новый Структура;*
Данные.Вставить("Наименование", ОбъектОбработки.Наименование);*
Данные.Вставить("РазрешенаПродажа", ОбъектОбработки.РазрешенаПродажа);*
Данные.Вставить(... ...*

Далее эта структура записывается в РезультатОбработки для задания тела сообщения:

РезультатОбработки.Body =сшпОбщегоНазначения.ПреобразоватьСтруктуруПоФормату(ФорматСообщения,Данные);*

где Данные - это структура, а ФорматСообщения - это значение перечисления сшпФорматыСообщений.

Метод сшпОбщегоНазначения.ПреобразоватьСтруктуруПоФормату(<Формат>,<Данные>) - используется для преобразования структуры данных к указанному формату. Например, если ФорматСообщения JSON, структура будет преобразована в JSON-представление объекта.

Итоговый текст кода обработчика:

ФорматСообщения = Перечисления.сшпФорматыСообщений.JSON;*
Данные = Новый Структура;*
Данные.Вставить("Наименование", ОбъектОбработки.Наименование);*
Данные.Вставить("Код", ОбъектОбработки.Код);*
Данные.Вставить("РазрешенаПродажа", ОбъектОбработки.РазрешенаПродажа);*
Данные.Вставить("ТестовыйОбщийРеквизит1",*
ОбъектОбработки.ТестовыйОбщийРеквизит1);*
РезультатОбработки.Body =*
сшпОбщегоНазначения.ПреобразоватьСтруктуруПоФормату(ФорматСообщения, Данные);*

Аналог объектной модели через запрос в коде обработчика. Пример кода:

Запрос = Новый Запрос; Запрос.Текст =
"ВЫБРАТЬ
| Продукты.Наименование КАК Наименование,
| Продукты.Код КАК Код,
| Продукты.РазрешенаПродажа КАК РазрешенаПродажа,
| Продукты.ТестовыйОбщийРеквизит1 КАК ТестовыйОбщийРеквизит1
|ИЗ
| Справочник.Продукты КАК Продукты
|ГДЕ
| Продукты.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", ОбъектОбработки.Ссылка);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
ВыборкаДетальныеЗаписи.Следующий();
Данные = Новый Структура;
Данные.Вставить("Наименование", ВыборкаДетальныеЗаписи.Наименование);
Данные.Вставить("Код", ВыборкаДетальныеЗаписи.Код);
Данные.Вставить("РазрешенаПродажа",
ВыборкаДетальныеЗаписи.РазрешенаПродажа);
Данные.Вставить("ТестовыйОбщийРеквизит1",
ВыборкаДетальныеЗаписи.ТестовыйОбщийРеквизит1);
РезультатОбработки.Body =
сшпОбщегоНазначения.ПреобразоватьСтруктуруПоФормату(ФорматСообщения,Данные);

Вместо переменной ОбъектОбработки в коде объявляется переменная ВыборкаДетальныеЗаписи, в которую записываются результаты запроса к базе. Последняя часть кода практически идентична объектной модели.

Для логирования доступны те же методы, что и в для направления Из Platform.

Для доступа к свойствам сообщения доступен метод УстановитьСвойствоСообщения(ИмяСвойства, ЗначениеСвойства).

Также в коде обработчиков доступен вызов функций 1С - еще одного типа обработчиков.

Чтобы вызвать функцию из обработчика или другой функции нужно прописать следующий код:

ВыполнитьФункцию(ИмяФукнции, параметры через запятую)

В случае вызова функции из бизнес процесса необходимо передать в переменную Результат тело ответного сообщения:

Результат =
сшпОбщегоНазначения.ПреобразоватьСтруктуруПоФормату(Перечисления.сшпФорматыСообщений.JSON, Данные);

Отображение изменений кода обработчиков 1С

При редактировании кода можно отслеживать изменения в сравнении с оригинальным кодом обработчика (до их сохранения). Для этого установите флажок Показать изменения. В результате в левой части рабочей области отобразится оригинал кода, в правой части - отредактированный код.

../../_images/image331.png

Отладка кода обработчиков 1С

В процессе отладки во внешнюю систему 1С отправляется сообщение с кодом обработчика, json-телом отладочного сообщения (в случае обработчика Из Platform), параметрами и запросом 1С для выбора объекта из базы 1С (в случае обработчика В Platform). Код обработчика полностью выполняется во внешней системе 1С перед началом отображения шагов отладки. Результат выполнения приходит из внешней системы также до начала отображения шагов отладки. Если в коде обработчика 1С присутствует инициализация переменных (присвоение значений), результат выполнения содержит шаги, каждый из которых соответствует инициализации переменной в коде обработчика 1С. Эти шаги отображаются после запуска отладки (при этом возможен переход от шага к шагу). В списке переменных отображаются актуальные значения переменных, которые были инициализированы на текущем и на предыдущих шагах. Таким образом, отладка кода обработчиков 1С представляет собой имитацию пошаговой отладки. При этом отладка позволяет найти ошибки в коде без использования инструментов разработки 1С.

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

../../_images/image34.png

Для установки точек прерывания необходимо нажать на выбранную строку в левой части кода. Для запуска отладки нажмите на соответствующую кнопку в редакторе или на клавишу F5. Для перемещения по коду используйте клавиши «стрелки» либо следующие горячие клавиши:

  • F9 - предыдущий шаг.

  • F10 - следующий шаг.

  • F5 - продолжить (дойти до следующей точки останова или до конца кода, если точек останова нет).

В нижней части рабочей области будут отображаться данные, которые заполняются во время отладки. Для завершения отладки нажмите на значок «крестик».

Отладка обработчиков Из Platform

Процесс отладки зависит от наличия добавленного в обработчик типа данных (или внешнего типа данных).

Если в обработчике на вкладке Из Platform добавлен тип данных (или внешний тип данных), структура этого типа данных определяет структуру отладочного сообщения. Значения каждого поля отладочного сообщения могут быть указаны в режиме Структура. Для перехода в этот режим активируйте переключатель в правом верхнем углу рабочей области:

../../_images/structure.png

Редактирование отладочного сообщения в режиме Структура:

../../_images/structure_edit.png

Если в обработчике на вкладке Из Platform не добавлен тип данных, отладочное сообщение может быть отредактировано только в режиме Произвольное тело сообщения в формате json. Для перехода в этот режим активируйте переключатель в правом верхнем углу рабочей области:

../../_images/random_body.png

Редактирование отладочного сообщения в режиме Произвольное тело сообщения:

../../_images/random_body_edit.png

Примечание

При переключении между режимами информация не переносится, значения пустые по умолчанию.

Отладка обработчиков В Platform

Обработчики 1С В Platform реагируют на изменение элементов объекта конфигурации базы 1С, который указан в поле Имя таблицы. Этот объект доступен в коде обработчика В Platform через переменную ОбъектОбработки (cм. раздел Обработчики В Platform).

../../_images/table_name.png

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

../../_images/object_select.png

В результате отобразится всплывающее окно выбора значения:

../../_images/menu_select.png

Доступны следующие варианты выбора объекта:

  • Первый элемент из: будет выбран элемент запросом 1С (subscriptionObject - объект в поле Имя таблицы обработчика):

    ВЫБРАТЬ ПЕРВЫЕ 1
       Ссылка
    ИЗ
       subscriptionObject
    
  • С помощью запроса 1С: откроется форма редактирования запроса 1С.

  • С помощью произвольного кода 1С: откроется форма редактирования произвольного кода 1С.

Примечание

Если элемент объекта конфигурации не указан в качестве переменной ОбъектОбработки, при запуске отладки будет выбран вариант Первый элемент из.

Результат выполнения кода обработчика будет отображен в первой строке панели результатов и переменных отладки.

Переменные ОбъектОбработки и РезультатОбработки будут отображены в первых строках списка переменных отладки.

Особенности версии 1С 3.0.1.232

В обработчиках 1С доступны и рекомендованы следующие методы для задержки:

  • ОжиданиеМСек(Задержка)

  • Ожидание(Задержка)

При использовании устаревших методов в обработчиках 1С (сшпОбщегоНазначения.ОжиданиеМСек(), сшпОбщегоНазначения.Ожидание()) будет выполняться ожидание, превышающее указанное значение.