Отправка сообщений в файлы

Для сохранения тела сообщения в файле предназначен узел процесса интеграции вида ФайлНазначение. Файл создается в каталоге, который определяется свойством Каталог. Имя файла определяется либо свойством ИмяФайла, либо в обработчике ОбработчикОпределенияИмени.

Что делать с существующим файлом

Вы можете управлять тем, как будет вести себя «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).

См. также Свойства узла процесса интеграции вида «ФайлНазначение».