Решили мы запилить интеграцию обмена сообщениями с не 1С системой (и даже не с одной). Причем мы на тот момент уже использовали "Систему взаимодействия1С", поэтому решили не пилить функциональность с нуля, а "просто" интегрировать "Систему взаимодействия 1С" и "не 1С". Одни ребята из изъявивших желание обмениваться с нами сообщениями уже имели с нами интеграцию по soap, другие по http. Соответственно мы на своей стороне реализовали новые ws и http сервисы и написали код по дерганью их за их аналогичные места))). Далее задача усложнилась, потому что возникла потребность обмениваться файлами. И завертелось. Возникла куча вопросов:
Продолжать ли на нашей стороне пользоваться «Системой взаимодействия 1С»?
Если да, то как положить и еще интереснее, как достать файлы?
Как при этом минимизировать передачу по сети?
Как обеспечить одно место хранения файлов?
Оказалось, что на другой стороне умеют общаться с s3 хранилищами файлов. Тогда, проведя «мозговой штурм», придумали следующую схему:
1С --> не 1С
- Перехватываем управление ПослеОтправкиСообщения()
- Получаем данные ИД обсуждения и ИД сообщения
- Далее по ним каким-то образом находим адрес файла в хранилище s3
- Передаем полученные адреса файлов при вызове сервиса.
Не 1С --> 1С
- При вызове нашего сервиса создаем сообщение
- Из полученных параметров вызова понимаем, с каким расширением файл планируется получить (то есть нам в сервис передают только имя и расширение файлов, но не сами файлы).
- Мы, зная имя и расширение, прикрепляем к сообщению файлы пустышки с нужным именем и расширением.
- Получаем их адреса в хранилище s3 и передаем эти адреса в ответе на вызов нашего сервиса.
- На той стороне, получив адреса, меняют наши файлы пустышки на реальные.
Как же получить путь к файлам в хранилище s3.Все просто:
лсТекстЗапроса = "
|SELECT DISTINCT
| s_file.prefix AS Catalog_file,
| s_file.id::varchar AS Name_file,
| att.name AS Name_file_real
|FROM vb_subscriber_ХХ_ХХ.conversation_message con_m
| INNER JOIN vb_subscriber_ХХ_ХХ.attachment AS att
| ON con_m.id = att.message_id
| INNER JOIN vb_subscriber_ХХ_ХХ.stored_file AS s_file
| ON att.file_id = s_file.id
| AND att.subscriber_id = s_file.subscriber_id
|WHERE
| con_m.conversation_id = '" + асИДОбсуждения + "'
| AND con_m.id = '" + асИДСообщенияб + "';
|";
Мы обращаемся к таблице conversation_message (сообщения обсуждений), устанавливаем отбор по ИД нашего обсуждения и ИД нашего сообщения. Далее соединяемся с таблицей attachment (прикрепления) по ИД сообщения. Из нее мы возьмем реальное имя файла (это важно, в тот момент, когда мы свой файл хотим кому-то передать) и также отсюда берем имя файла в хранилище s3. Далее по нему мы соединяемся с таблицей stored_file (хранилище файлов), из которой мы берем каталог, где лежат наши прикрепления. Вот, собственно, и все: мы знаем, где лежат, как называются в хранилище и как называются реально наши прикрепления.
Если интересно, могу расширить статью следующей информацией:
- Выложить ws и http, реализованный на нашей стороне
- Код по перехвату события ПослеОтправкиСообщения() и код дальнейших действий по вызову другой стороны для передачи сообщения с прикреплениями или без.
- Также могу выложить полный код обращения к PG SQL, для получения адресов прикреплений (если в этом есть необходимость).
- Отдельно могу описать структуру таблиц PG SQL «Системы взаимодействия 1С», если это кому-то нужно
Потребности пишите в комментариях. Ну и, конечно же, ставьте лайк, подписывайтесь на канал!))))