Из 1С в S3 и обратно. Работа с объектным хранилищем

06.02.24

Интеграция - Облачные сервисы, хостинг

В данной статье демонстрируется работа с объектным хранилищем 1С с использованием подписанных (pre-signed) ссылок. Загрузка, скачивание и удаление реализованы на "чистом" языке 1С без внешних компонент и сервисов. В качестве провайдера хранилища S3 будем использовать Яндекс.Облако

Об S3 (Simple Storage Service)

S3 (Simple Storage Service) — это сервис облачного хранения данных от компании Amazon. Он позволяет хранить и получать данные в любом объеме и в любое время.

Принцип работы S3 заключается в том, что данные хранятся на распределенной сети серверов, расположенных в разных дата-центрах. Это обеспечивает высокую надежность и доступность данных. Кроме того, S3 поддерживает георепликацию данных, то есть автоматическое копирование данных в несколько регионов для обеспечения их доступности в случае аварий или сбоев.

Для работы с S3 используются специальные API, которые позволяют загружать, скачивать и удалять файлы, а также управлять доступом к ним. Также S3 интегрирован с многими другими сервисами Amazon, что позволяет использовать его в комплексе с другими облачными сервисами.

 

Как работает S3

Сервис включает доступ к защищенному облачному хранилищу, API-интерфейс с прямым доступом к хранимым объектам через интернет и дополнительные опции, зависящие от поставщика сервиса.

Объект в S3 — это двоичные данные, которые хранятся в бакете (backet). Каждый объект имеет свой уникальный ключ, который используется для доступа к нему. Ключи объектов могут быть любой длины и содержать любые символы, кроме ‘/’, '' и ‘+’.
Кроме того объект содержит метаданные - прочие значимые атрибуты объекта (размер, тип и другие пользовательские данные для отбора и сортировки). Они нужны, чтобы находить однотипные объекты и работать с ними.

 

Инструменты для работы

Для работы с хранилищем S3 существует несколько инструментов: консольные клиенты (AWS CLIS3cmd), файловые браузеры (CyberduckWinSCP), а так же SDK для популярных языков программирования - JavaJavaScriptPython.NETC++PHPGo.
Для 1С готовых решений нет. Однако, поскольку 1С:Предприятие 8.3 поддерживает выполнение HTTP запросов из коробки, можно реализовать основные функции с использованием механизма подписанных (pre-signed) ссылок.

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

Подписанная ссылка — это URL, содержащий данные для авторизации запроса в своих параметрах. Составить подписанный URL может пользователь, владеющий статическими ключами доступа.  Описание создание подписанной ссылки для Amazon Simple Storage Service можно изучить по ссылке.

В качестве примера для практической реализации механизма мы будем использовать ресурсы Object Storage Яндекс.Облако.

 
 Общий вид подписанной ссылки в Яндекс.Облако

 

 

Создание бакета и получение ключей доступа.

Для работы вы должны предварительно авторизоваться в консоли управления и создать платежный аккаунт. При первой регистрации выдается стартовый грант, который действует в течении 60 дней и позволит использовать ресурсы без оплаты. Подробнее о начале работы в облаке можно прочитать по ссылке.

Далее выберите каталог, в котором хотите создать бакет и нажмите кнопку Создать ресурс и выберите Бакет. Укажите имя бакета, которое должно быть уникальным для всего Object Storage. Это имя используется как часть URL для доступа к данным и его будут видеть пользователи. При необходимости можно ограничить размер. Обратите внимание, что на данный момент первый гигабайт хранения не тарифицируется. В качестве класса хранилище укажите Стандартное. Подробнее о классах хранилищ можно прочитать тут.

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

 

Реализация.

Подписанная ссылка для работы с Object Storage Яндекса должна иметь следующие параметры:

  • X-Amz-Algorithm - идентифицирует версию подписи и алгоритм ее вычисления. Это константа, значение AWS4-HMAC-SHA256.
  • X-Amz-Date - время в формате ISO8601, например, 20180719T094539Z. Указанная дата должна по значению (не по формату) совпадать с датой в параметре X-Amz-Credential.
  • X-Amz-Expires - время в секундах, в течение которого ссылка действительна. Начало отсчета — момент, указанный в параметре X-Amz-Date. Максимальное значение — 2592000 секунд (30 дней).
  • X-Amz-SignedHeaders  - заголовки запроса, которые вы хотите подписать. Обязательно следует подписать заголовок Host и все заголовки X-Amz-*, которые используются в запросе, в том числе заголовки метаданных X-Amz-Meta-*.  Другие заголовки подписывать не обязательно, однако чем больше вы подпишете заголовков, тем безопаснее будет запрос. Заголовки запроса отделяются символами ;.
  • X-Amz-Credential - идентификатор для подписи. Строка формата <идентификатор_ключа_доступа>/<дата>/ru-central1/s3/aws4_request, где <дата> (в формате YYYYMMDD — год, месяц, день) должна совпадать с датой, установленной в заголовке X-Amz-Date.
  • X-Amz-Signature - подпись запроса, формирование которой будет описано далее.

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

 
 Реализация HMAC с SHA256

Опишем вспомогательные функции для формирования подписанной ссылки:

 
 Служебные функции

И собственно сама функция.

 
СоздатьСсылку(КлючДоступа, СекретныйКлюч, Бакет, Путь, Метод="GET", ВремяЖизни=300, Заголовки=Неопределено)

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

  • КлючДоступа, СекретныйКлюч - ключи, полученные в консоли управления Яндекс.Облако
  • Бакет - имя бакета, который Вы создали в консоли.
  • Метод:
    • GET - получение данных из хранилища
    • PUT - отправка данных в хранилище
  • ВремяЖизни - время жизни ссылки, максимальное значение — 2592000 секунд (30 дней).
  • Заголовки - заголовки метаданных. Ключи всегда должны начинаться на X-Amz-Meta-. Например X-Amz-Meta-Author, X-Amz-Meta-KratkoeOpisanie.

По описанию на Amazon, стандарт позволяет производить загрузку данных частями. Т.е. можно обрабатывать большие файлы частями - последовательно или параллельно. Однако у Яндекса я не нашел описания в документации, поэтому не пробовал это реализовать. А с иностранными облаками сейчас проблемы.

 

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

 
 Отправка данных
 
 Получение данных

 

Выводы

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

Описанный вариант интеграции с 1С можно использовать, например, для отправки данных в облачные СУБД (YDB, ClickHouse) для последующего доступа к ним из BI-систем (Datalens).

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

Вступайте в нашу телеграмм-группу Инфостарт

S3 Яндекс.Облако AWS-S3 Хранилище Интеграция

См. также

Оптовая торговля Розничная торговля Логистика, склад и ТМЦ Облачные сервисы, хостинг Программист Пользователь 1С v8.3 Управляемые формы 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Данная система предназначена всем, кому нужно выгружать данные в SPOT 2D или в ОРИМИ. Позволяет гибко настроить получение данных для каждого поля файла и файла выгрузки в целом. Имеет отборы по организации, складу, и папкам номенклатуры. Есть возможность выгружать данные как вручную, с выбором конкретного файла, за конкретный период, так и в автоматическом режиме в указанное вами время. Выгрузка может выполняться в файл или через http напрямую. Имеется подробная справка по настройке, а также примеры запросов для приведенных в примерах файлов выгрузки. Может работать в составе любой конфигурации!

18000 руб.

19.10.2018    29585    8    1    

10

Облачные сервисы, хостинг Программист 1С v8.3 Россия Абонемент ($m)

При выгрузке данных базы 1С для фреш (пункт меню в разделе Администрирование Выгрузка для сервиса или перейти в облачный сервис) столкнулся с кучей ошибок, связанных с дубликатами в справочниках. Обработка позволяет удалить элемент справочника, для которого есть замечания дублирования.

1 стартмани

07.04.2025    784    2    AlexHelmer    0    

1

Облачные сервисы, хостинг 1С v8.3 1С:Бухгалтерия 3.0 Россия Бесплатно (free)

Почему не стоит вести учет у нескольких фирм (клиентов) в единой базе в облаке с разделением доступа по организации.

26.03.2025    2852    PD_AD_Krenev    6    

2

Облачные сервисы, хостинг Программист Бесплатно (free)

SaaS-решения стали популярны за счет быстрого старта, экономии на обслуживании и обновлениях, масштабируемости и стремительной доставке новых возможностей пользователям. Расскажем о том, как 1С «под капотом» стал преимуществом для развития SaaS-сервиса EmplDocs.

16.01.2025    5612    Kistkin    6    

5

Облачные сервисы, хостинг Linux Тестирование QA Сервера Системный администратор Программист 1С v8.3 Бесплатно (free)

Завершающая публикация цикла "В облако на работу:.. Рецепты от Капитана", в ходе которых был собран полнофункциональный рабочий контур 1С в сети на отечественной Ред ОС. С веб-серверами, доменной авторизацией, архивированием, отказоустойчивостью и прочая, прочая... В этой статье мы определяемся с быстродействием системы, проводим нагрузочное тестирование и отпускаем ее в свободное плавание (зачеркнуто) выпускаем ее в продуктовый контур, где, конечно же, придется отлавливать ошибки, мониторить состояние и т.п.

31.10.2024    2893    capitan    0    

1

Облачные сервисы, хостинг Linux Сервера Системный администратор Программист 1С v8.3 Бесплатно (free)

Одна из завершающих публикаций цикла "В облако на работу:.. Рецепты от Капитана", в ходе которых был собран полнофункциональный рабочий контур 1С в сети на отечественной Ред ОС. С веб-серверами, доменной авторизацией, архивированием и прочая, прочая... На закуску разбираемся с отказоустойчивостью. В этой публикации для серверов 1С заодно попробуем подобно сериалу «Разрушители легенд» подтвердить или опровергнуть пару устойчивых мифов о требованиях назначения функциональности.

18.10.2024    4893    capitan    6    

14

Облачные сервисы, хостинг Бесплатно (free)

Перенос 1С в облако — это процесс, который требует тщательного планирования и грамотного исполнения, чтобы избежать простоев и обеспечить бесперебойную работу системы. В этой статье рассмотрим пошаговую инструкцию по переносу 1С в облако, уделяя особое внимание минимизации рисков и обеспечению беспрерывной работы вашего бизнеса.

02.09.2024    1282    Metrika42    0    

-1

Облачные сервисы, хостинг Системный администратор Программист Бесплатно (free)

Примеры решения некоторых насущных проблем при работе с облачными сервисами, покрываемых CLI версией Открытого пакета интеграций - OInt CLI.

05.08.2024    2836    bayselonarrend    7    

28
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Viktor_Ermakov 393 07.02.24 13:17 Сейчас в теме
спасибо за труд, хорошая статья
artbear; Sedaiko; +2 Ответить
2. laperuz 47 07.02.24 17:54 Сейчас в теме
Для полноты статьи стоит упомянуть, что начиная с 8.3.24 в платформе реализована нативная поддержка S3, правда только с КОРП лицензией
https://its.1c.ru/db/v8324doc/bookmark/cs/TI000000349
METAL; Sedaiko; o.nikolaev; +3 Ответить
4. Sedaiko 599 08.02.24 01:04 Сейчас в теме
(2) Спасибо, прозевал инфу. Давно делал реализацию.
Маловероятно, что в ПРОФ появится. Тем более что это фишка клиент-серверного инстанса
11. JohnyDeath 302 11.02.24 19:35 Сейчас в теме
(2) там немного про другое: дали возможность автоматом сохранять двоичные данные в S3, но кодом свой любой файл в нужное тебе хранилище ты никак не отправишь.
Я отправлял запрос в бота 1С, чтобы они дали возможность простым разработчикам удобно работать с S3 хранилищами, ведь внутри платформы всё уже есть, осталось пробросить это для нас наверх и описать в документации.
3. o.nikolaev 217 08.02.24 00:37 Сейчас в теме
5. baracuda 2 08.02.24 09:11 Сейчас в теме
А есть ли бесплатные варианты что у себя на сервере можно было поднять S3 подобное хранилище?
6. S_Vidyaev 08.02.24 11:46 Сейчас в теме
Тоже приходилось реализовывать когда-то. Хочу добавить, что AWS4 аутентификация очень удобно сделана в Коннекторе

(5) Есть, много. например, ceph
kasper076; baracuda; Sedaiko; +3 Ответить
7. Sedaiko 599 08.02.24 13:54 Сейчас в теме
(5) MinIO
Но смысл все на одном сервере? сама фишка объектного хранилища - горизонтальное масштабирование и резервирование данных на разных узлах.
S_Vidyaev; +1 Ответить
8. baracuda 2 08.02.24 14:21 Сейчас в теме
(7) политиками безопасности например может быть запрещено размещение данных на внешних ресурсах.
9. BlizD 1108 08.02.24 20:07 Сейчас в теме
Спасибо. За статью.

Несколько лет назад делал расширение для хранение файлов на s3 вместо томов на диске.

Возможно будет кому полезно.


https://github.com/BlizD/S3_SSL

Расширение для БСП для хранения файлов на s3 (minio, Amazon S3, Mail.Ru Cloud и т.п.)

Разработано совместно с @zotov-vs

Версия БСП: 3.1.2.343

Версия платформы: 8.3.17.1851

При обращении к API используется Connector @vbondarevsky

Спасибо malikov-pro за публикации external-storage-1c-ssl Хранение файлов томов БСП в хранилище с OpenStack API @malikov-pro
Nuuq; clic007; Sedaiko; +3 Ответить
10. Sedaiko 599 09.02.24 03:42 Сейчас в теме
(9) Я, кстати, думал об этом. Но больше склоняюсь к монтированию через s3fs-fuse. Хотя в проде не запускал
12. LjeDmitrii 14.02.24 11:12 Сейчас в теме
Спасибо за статью! Очень помогло в построении обмена с Yandex Object Storage
13. magv 29 09.04.24 10:57 Сейчас в теме
Для Yandex Object Storage - заработало сразу
При проверке для провайдера Selectel - сразу не заработало.
Требуется в функции СоздатьСсылку() поменять строку:
Поля.Добавить("X-Amz-Signature=" + ПолучитьHexСтрокуИзДвоичныхДанных(Сигнатура));

на строку:
Поля.Добавить("X-Amz-Signature=" + НРег(ПолучитьHexСтрокуИзДвоичныхДанных(Сигнатура)));

В описании на сайте Amazon для поля Signature было указано:
The 256-bit signature expressed as 64 lowercase hexadecimal characters.
kholkin; Nuuq; pavlo; user1951539; L0z4; +5 Ответить
14. magv 29 05.09.24 15:12 Сейчас в теме
На днях возникла проблема при загрузке файлов, в имени которых есть пробелы и/или русские буквы.

Ошибка такого рода:
Code: SignatureDoesNotMatch
Message: The request signature we calculated does not match the signature you provided. Check your AWS secret access key and signing method. For more information, see REST Authentication and SOAP Authentication for details.;

Вылечилось (после долгих мучений) передачей параметра "Путь" в функцию СоздатьСсылку():

Путь = СтрЗаменить(КодироватьСтроку(Путь, СпособКодированияСтроки.КодировкаURL, "UTF-8"), "%2F", "/")
15. pavlo 03.07.25 14:53 Сейчас в теме
Странно, но у меня возвращает
The request signature we calculated does not match the signature you provided. Check your key and signing method.
Ключи верные 100%
16. pavlo 07.07.25 08:37 Сейчас в теме
(15) c VK походу это не работает :(
17. pavlo 07.07.25 09:14 Сейчас в теме
(16) c VK только как выше в комментах писали вылечилось
Поля.Добавить("X-Amz-Signature=" + НРег(ПолучитьHexСтрокуИзДвоичныхДанных(Сигнатура)));
18. r.moschenskiy 24 17.07.25 17:29 Сейчас в теме
19. Lupeykin 5 17.09.25 09:25 Сейчас в теме
(18) &НаСервере
Процедура ЗагрузитьФайлыВХранилище() Экспорт

ПараметрыЗапроса = ВернутьПараметрыЗапроса();
КаталогТемп = КаталогВременныхФайлов();
ИмяФайла = "C:\s3\Img.jpg";
ЗаполнитьТипФайла(ПараметрыЗапроса, "jpg");
ЗаполнитьПрефиксИИмяВПараметрах(ПараметрыЗапроса, ИмяФайла, "");
ПараметрыЗапроса.Метод = "PUT";
КомандаВыполненаУспешно = ВыполнитьКоманду(ПараметрыЗапроса);

КонецПроцедуры

&НаСервере
Функция ВыполнитьКоманду(Знач Параметры, ВозвращатьОтвет = Ложь, ПолучитьВсеФайлыВКорзине = Ложь) Экспорт
ХостS3 = Параметры.ТочкаДоступа;
Порт = Параметры.Порт;
SSL = Параметры.OpenSSL;

АбсолютныйПуть = "/" + Параметры.ИмяКорзины + "/";
contentHash = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b785­2b855"; //empty string
ТипФайла = Параметры.ТипФайла;
Если ТипФайла = "" Тогда
ТипФайла = "image/jpeg";
КонецЕсли;

Префикс = СтрЗаменить(КодироватьСтроку(Параметры.ТекущийПрефикс, СпособКодированияСтроки.КодировкаURL), "%2F", "/");
ПрефиксКодированный = КодироватьСтроку(Параметры.ТекущийПрефикс, СпособКодированияСтроки.КодировкаURL);

Если Параметры.Метод = "PUT" Тогда

Метод = "PUT";
ПараметрыЗапроса = "";
ИдентификаторРесурса = АбсолютныйПуть + Параметры.ТекущийПрефикс;
АбсолютныйПуть = ИдентификаторРесурса;

Если НЕ Параметры.ТипФайла = Неопределено Тогда
ТипФайла = Параметры.ТипФайла;
КонецЕсли;

Если НЕ Параметры.ПутьКФайлу = "" Тогда
contentHash = НРег(ПолучитьHexСтрокуИзДвоичныхДанных(РассчитатьХешСуммуФайла(Параметры.ПутьКФайлу, ХешФункция.SHA256)));
КонецЕсли;

ИначеЕсли Параметры.Метод = "DELETE" Тогда

Метод = "DELETE";
ПараметрыЗапроса = "";
ИдентификаторРесурса = АбсолютныйПуть + Параметры.ТекущийПрефикс;
АбсолютныйПуть = ИдентификаторРесурса;

ИначеЕсли Параметры.Метод = "GETFILE" Тогда

Заголовки = Новый Соответствие();

Метод = "GET";

ЗапроснаПолучениеФайла = Параметры.СсылкаНаФайл;
HTTPЗапрос = Новый HTTPЗапрос(ЗапроснаПолучениеФайла, Заголовки);

СоединениеHTTP = Новый HTTPСоединение(ХостS3, Порт,,,,30,?(SSL = Истина, Новый ЗащищенноеСоединениеOpenSSL, Неопределено));

HTTPОтвет = СоединениеHTTP.ВызватьHTTPМетод(Метод, HTTPЗапрос);

Если HTTPОтвет.КодСостояния = 200 Тогда

ДвоичныеДанные = HTTPОтвет.ПолучитьТелоКакДвоичныеДанные();

ДвоичныеДанные.Записать(Параметры.ПутьКФайлу);

Возврат ДвоичныеДанные;
Иначе
Возврат Ложь;
КонецЕсли;

КонецЕсли;

ТекущаяДатаВремя = Формат(ТекущаяУниверсальнаяДата(), "ДФ=yyyyMMddTHHmmssZ");
ТекущаяДата = Формат(ТекущаяУниверсальнаяДата(), "ДФ=yyyyMMdd");

ОбластьВидимости = ТекущаяДата + "/" + Параметры.Регион + "/" + Параметры.Сервис + "/aws4_request";

НоваяСтрока = Символы.ПС;

КаноническийЗапрос = Метод + НоваяСтрока +
АбсолютныйПуть + НоваяСтрока +
ПараметрыЗапроса + НоваяСтрока +
"content-type:" + ТипФайла + НоваяСтрока +
"host:" + ХостS3 + НоваяСтрока +
"x-amz-content-sha256:" + contentHash + НоваяСтрока +
"x-amz-date:" + ТекущаяДатаВремя + НоваяСтрока +
НоваяСтрока +
"content-type;host;x-amz-content-sha256;x-amz-date" + НоваяСтрока +
"" + contentHash;

КаноническийЗапросДвоичныеДанные = РассчитатьХешСумму(КаноническийЗапрос, ХешФункция.SHA256);

КаноническийЗапросХеш = Нрег(ПолучитьHexСтрокуИзДвоичныхДанных(КаноническийЗапросДвоичныеДанные));

СтрокаДляПодписи = "AWS4-HMAC-SHA256" + НоваяСтрока + ТекущаяДатаВремя + НоваяСтрока + ОбластьВидимости + НоваяСтрока + КаноническийЗапросХеш;

Подпись = ПолучитьКлючДляПодписи(Параметры.СекретныйКлюч, ТекущаяДата, Параметры.Регион, Параметры.Сервис);

ПодписьДвоичныеДанные = HMACSHA256(Подпись, ПолучитьДвоичныеДанныеИзСтроки(СтрокаДляПодписи));

ПодписьХеш = Нрег(ПолучитьHexСтрокуИзДвоичныхДанных(ПодписьДвоичныеДанные));

Авторизация = "AWS4-HMAC-SHA256 Credential=" + Параметры.КлючДоступа + "/" + ОбластьВидимости
+ ",SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date,Signature=" + ПодписьХеш;

Заголовки = Новый Соответствие();
Заголовки.Вставить("Host", ХостS3);
Заголовки.Вставить("Content-Type", ТипФайла);
Заголовки.Вставить("x-amz-content-sha256", contentHash);
Заголовки.Вставить("x-amz-date", ТекущаяДатаВремя);
Заголовки.Вставить("Authorization", Авторизация);

HTTPЗапрос = Новый HTTPЗапрос(ИдентификаторРесурса, Заголовки);
Если НЕ Параметры.ПутьКФайлу = "" Тогда
HTTPЗапрос.УстановитьИмяФайлаТела(Параметры.ПутьКФайлу);
КонецЕсли;

СоединениеHTTP = Новый HTTPСоединение(ХостS3, Порт,,,,30,?(SSL = Истина, Новый ЗащищенноеСоединениеOpenSSL, Неопределено));

HTTPОтвет = СоединениеHTTP.ВызватьHTTPМетод(Метод, HTTPЗапрос);

Если HTTPОтвет.КодСостояния = 200
Тогда
ДвоичныеДанные = HTTPОтвет.ПолучитьТелоКакДвоичныеДанные();

Если ВозвращатьОтвет Тогда
Возврат HTTPОтвет;
Иначе
Возврат Истина;
КонецЕсли;
Иначе
Возврат Ложь;
КонецЕсли;

КонецФункции

&НаСервере
Функция ВернутьПараметрыЗапроса()

ПараметрыЗапроса = Новый Структура();
ПараметрыЗапроса.Вставить("ИмяКорзины", "picture");
ПараметрыЗапроса.Вставить("Регион", "us-east-1");
ПараметрыЗапроса.Вставить("Префикс", "/");
ПараметрыЗапроса.Вставить("ТочкаДоступа", "localhost");
ПараметрыЗапроса.Вставить("Порт", 9000);
ПараметрыЗапроса.Вставить("МаксимальноеКоличествоКлючейДляЗапроса", 1000);
ПараметрыЗапроса.Вставить("КлючДоступа", "admin");
ПараметрыЗапроса.Вставить("СекретныйКлюч", "jxxkkkxkdkfhde");
ПараметрыЗапроса.Вставить("Сервис", "s3");
ПараметрыЗапроса.Вставить("Метод", "");
ПараметрыЗапроса.Вставить("ТипФайла", "");
ПараметрыЗапроса.Вставить("ПутьКФайлу", "");
ПараметрыЗапроса.Вставить("СсылкаНаФайл", ""); // пример picture/Img.jpg ,бакет/файл
ПараметрыЗапроса.Вставить("ТекущийПрефикс", "");
ПараметрыЗапроса.Вставить("OpenSSL",Ложь);

Возврат ПараметрыЗапроса;

КонецФункции
20. Lupeykin 5 17.09.25 09:26 Сейчас в теме
(19)
#Область HMAC_SHA256

Функция РассчитатьХешСумму(ДвоичныеДанные, ТипХешФункции)

ОбъектХеш = Новый ХешированиеДанных(ТипХешФункции);
ОбъектХеш.Добавить(ДвоичныеДанные);

Return ОбъектХеш.ХешСумма;

КонецФункции

Функция РассчитатьХешСуммуФайла(ИмяФайла, ТипХешФункции)

ОбъектХеш = Новый ХешированиеДанных(ТипХешФункции);
ОбъектХеш.ДобавитьФайл(ИмяФайла);

Return ОбъектХеш.ХешСумма;

КонецФункции

Функция РассчитатьHMAC(Знач Ключ, Знач ДвоичныеДанные, ТипХешФункции, РазмерБлока)

Если Ключ.Размер() > РазмерБлока Тогда
Ключ = РассчитатьХешСумму(Ключ, ТипХешФункции);
КонецЕсли;

Если Ключ.Размер() < РазмерБлока Тогда
Ключ = ПолучитьHexСтрокуИзДвоичныхДанных(Ключ);
Ключ = Лев(Ключ + СоединитьСтроки("00", РазмерБлока), РазмерБлока * 2);
КонецЕсли;

Ключ = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзHexСтроки(Ключ));

ipad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(СоединитьСтроки("36", РазмерБлока));
opad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(СоединитьСтроки("5c", РазмерБлока));

ipad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ);
ikeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ipad);

opad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ);
okeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(opad);

Возврат РассчитатьХешСумму(ОбъединитьДвоичныеДанные(okeypad, РассчитатьХешСумму(ОбъединитьДвоичныеДанные(ikeypad, ДвоичныеДанные), ТипХешФункции)), ТипХешФункции);

КонецФункции

Функция ОбъединитьДвоичныеДанные(ДвоичныеДанные1, ДвоичныеДанные2)

МассивДанных = Новый Массив;
МассивДанных.Добавить(ДвоичныеДанные1);
МассивДанных.Добавить(ДвоичныеДанные2);

Возврат СоединитьДвоичныеДанные(МассивДанных);

КонецФункции

Функция СоединитьСтроки(Строка, Количество)

Части = Новый Массив(Количество);
Для Счт = 1 To Количество Цикл
Части.Добавить(Строка);
КонецЦикла;

Возврат СтрСоединить(Части, "");

КонецФункции

Функция HMACSHA256(Знач Ключ, Знач ДвоичныеДанные)

Return РассчитатьHMAC(Ключ, ДвоичныеДанные, ХешФункция.SHA256, 64);

КонецФункции

Функция ПолучитьКлючДляПодписи(Ключ, Дата, НазваниеРегиона, ИмяСервиса)

КлючСекрет = ПолучитьДвоичныеДанныеИзСтроки ("AWS4" + Ключ);

КлючДата = HMACSHA256(КлючСекрет, ПолучитьДвоичныеДанныеИзСтроки(Дата));
КлючРегион = HMACSHA256(КлючДата, ПолучитьДвоичныеДанныеИзСтроки(НазваниеРегиона));
КлючСервис = HMACSHA256(КлючРегион, ПолучитьДвоичныеДанныеИзСтроки(ИмяСервиса));
КлючПодпись = HMACSHA256(КлючСервис, ПолучитьДвоичныеДанныеИзСтроки("aws4_request"));

Return КлючПодпись;

КонецФункции




#КонецОбласти
21. Sergo1C 29.09.25 11:37 Сейчас в теме
Есть ли возможность получить список файлов который лежит в определенном бакете?
Для отправки сообщения требуется регистрация/авторизация