Отправка сообщений в файлы
Для сохранения тела сообщения в файле предназначен узел процесса интеграции вида ФайлНазначение. Файл создается в каталоге, который определяется свойством Каталог. Имя файла определяется либо свойством ИмяФайла, либо в обработчике ОбработчикОпределенияИмени.
Что делать с существующим файлом
Вы можете управлять тем, как будет вести себя «1С:Шина», если файл, который нужно записать, уже существует. Для этого предназначено свойство СуществующийФайл. Значение Перезаписывать означает, что существующий файл будет перезаписан. Значение Дописывать означает, что тело сообщения будет дописано в конец существующего файла. Такой файл будет содержать тела нескольких сообщений. Значение Выдавать ошибку означает, что существующий файл не изменится, будет вызвано исключение и сообщение не будет считаться доставленным. Значение Оставлять означает, что существующий файл не изменится, а сообщение будет считаться доставленным.
Как сохранить иерархию файлов
Входящие файлы, из которых формируются сообщения, могут находиться в определенной иерархии внутри исходного каталога Каталог. Например, каждая информационная система помещает свои файлы в каталог со своим именем. В этой ситуации при формировании файлов для получателей вам может потребоваться сохранить ту иерархию файлов, которая была в исходном каталоге, чтобы информационные системы, забирающие файлы, забирали их из каталогов с теми же названиями.
В этом вам поможет свойство ИспользоватьТолькоИмяФайлаБезПути, которое есть у узлов вида ФайлИсточник и ФайлНазначение. Если это свойство установить в значение Ложь
и у отправителя, и у получателя, то информация о полном пути файла будет сохранена в сообщении, а получатель при записи файла создаст внутри каталога Каталог дополнительные каталоги.
Формирование имени файла в обработчике
Для создания имени файла можно использовать обработчик события ОбработчикОпределенияИмени
. Имя, которое вы сформируете в этом обработчике, будет тем самым именем
Пустой файл
Стандартным поведением «1С:Шины» является то, что сообщение с пустым телом нельзя записать в файл. Однако это может потребоваться для того, чтобы, например, создать маркерный файл, в котором важен сам факт его существования, а не его содержимое. Тогда вы можете использовать свойство РазрешитьПустойФайл, его нужно установить в значение Истина
.
Кодировка файла
Получатель сообщения может требовать, чтобы файл был записан в определенной кодировке, которая ему понятна. В этом случае используйте свойство НаборСимволов.
Пример
Есть следующий процесс интеграции: по таймеру создается сообщение, заполняется его тело, после чего сообщение отправляется одновременно в 4 узла вида ФайлНазначение.
Таймер генерирует 5 сообщений с интервалом 1000 секунд (КоличествоПовторов равно 5, Период равно 1000). Это пустые сообщения без тела.
Узел СозданиеТела — это транслятор, единственный вид узла, в котором возможно изменение сообщения. В этом узле с помощью встроенного языка формируется тело сообщения в обработчике события ОбработчикПреобразования.
метод СоздатьТело(Контекст: КонтекстВызоваИнтеграции,
Сообщение: ПримерИнтеграции1.Сообщение): СообщениеИнтеграции
исп Тело = новый ВременныйПотокЗаписи()
Тело.Записать("%{Момент.Сейчас()}\n")
исп Поток = Тело.ОткрытьПотокЧтения()
возврат Сообщение.УстановитьТелоИзПотока(Поток)
;
Здесь в тело сообщения записывается строка, содержащая текущий момент времени (Момент.Сейчас()
).
Дальше это сообщение отправляется в 4 узла типа ФайлНазначение, три из которых связаны с группой участников, а четвертый с ней не связан.
Каталог1, Каталог2 и Каталог3 демонстрируют три разных способа формирования имени файла, при котором используются данные информационной системы получателя. В справочнике Инфосистемы для каждой информационной системы указаны реквизиты Код и Регион.
Каталог1 использует обработчик события ОбработчикОпределенияИмени:
метод ОпределениеИмени(Контекст: ПримерИнтеграции1.КонтекстВызова,
Сообщение: ПримерИнтеграции1.Сообщение): Строка
возврат "%{Контекст.Участник.Регион}/
%{ДатаВремя.Сейчас().Секунда}/
%{Контекст.Участник.Код}.txt"
;
Здесь внутри каталога Каталог будет столько подкаталогов, сколько есть различных регионов у информационных систем получателей (%{Контекст.Участник.Регион}/
). Внутри каждого такого каталога будет каталог, соответствующий секунде, когда пришло сообщение (%{ДатаВремя.Сейчас().Секунда}/
). Внутри этого каталога будет файл, имя которого соответствует коду информационной системы, а расширение — TXT (%{Контекст.Участник.Код}.txt
).
Если для этого участника в эту же секунду придет еще одно сообщение, то второе сообщение перезапишет первое, потому что у узла Каталог1 свойство СуществующийФайл установлено в значение Перезаписывать.
Каталог2 использует свойство ИмяФайла:
%{Участник.Код}.txt
Здесь внутри каталога Каталог будет создаваться свой файл для каждой информационной системы получателя. Этот файл будет иметь имя, соответствующее коду информационной системы, и расширение TXT. Это файл будет перезаписываться, потому что у узла Каталог2 свойство СуществующийФайл тоже установлено в значение Перезаписывать.
Каталог3 тоже использует свойство ИмяФайла:
%{Участник.Регион}/%{Участник.Код}.txt
Здесь внутри каталога Каталог будет созданы каталоги с именами регионов (%{Участник.Регион}/), а внутри файлы с кодом информационной системы и с расширением TXT (%{Участник.Код}.txt).