Как мы учили «1С: Предприятие» работать с объектным хранилищем S3: предпосылки, алгоритм, результат

от автора

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

В этой статье расскажем, как компания «ЦЛР ГРУПП» перестраивала работу «1С:Управление торговлей» с локального дискового хранилища на S3: с чего мы начинали, зачем понадобилась миграция, как ее реализовали и что мы получили в результате.

Немного контекста

«ЦЛР ГРУПП» — международная транспортно-логистическая группа компаний, специализирующаяся на решении логистических задач для отечественных и китайских автопроизводителей, импортеров и дистрибьюторов автомобилей и спецтехники.

В состав комплекса услуг ЦЛР ГРУПП входят:

  • автомобильное, Ж/Д и портовое экспедирование,

  • перемещение грузового автотранспорта своим ходом,

  • 3PL/4PL оператор для автопроизводителей, 

  • таможенное оформление транспортных средств,

  • хранение автомобильной техники в разных регионах РФ. 

Компания оказывает комплексные логистические услуги и экспедирование грузов и автотранспорта по территории РФ, стран СНГ и Китая. 

В качестве основного инструмента для документооборота, управления заказами, учета перевозимой и хранимой техники, а также для ведения финансовой деятельности мы используем «1С:Управление торговлей». И в каждом из этих направлений ежедневно генерируется большой объем неструктурированных данных: от скан-копий накладных и фотографий техники до актов приема-передачи. 

Для работы со всеми файлами «1С» мы изначально применяли локальное хранилище. Но с ростом объемов данных и усложнением бизнес-процессов мы столкнулись с необходимостью замены локального хранилища. Причин было несколько.

  • Ограниченная масштабируемость. Локальное хранилище требует четкой организации данных в виде фиксированных блоков. Когда количество файлов достигло миллионов, производительность системы начала снижаться. При этом масштабировать локальное хранилище сложно, долго и дорого, поэтому не всегда рационально.

  • Отсутствие четкой структуры. В локальном хранилище сложно выстроить иерархию и структуру хранения. В результате поиск нужных файлов среди хаотично размещенных документов часто затруднялся — нередко на поиск нужной информации уходило много времени, из-за чего простаивали другие процессы.

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

  • Риски потери данных. Несмотря на регулярное резервное копирование, существовала вероятность потери данных из-за аппаратных сбоев или человеческих ошибок. А восстановление данных из локального хранилища могло занять дни, что было неприемлемо.

От блоков к другим решениям

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

После сравнения вариантов мы остановились на объектном хранилище S3 — облачной системе, где данные хранятся в виде объектов.

Преимущества S3 стали для нас определяющими. Так, объектные хранилища:

  • легко и практически без ограничений масштабируются;

  • хранят метаданные к каждому объекту, что упрощает их поиск;

  • подходят для хранения неструктурированных данных;

  • позволяют автоматизировать управление данными: при загрузке или удалении объектов могут запускаться автоматические процедуры;

  • обеспечивают высокий уровень надежности хранения за счет георепликации данных;

  • экономичны за счет развертывания хранилища в облаке с оплатой по модели Pay-as-you-go (только за фактически использованные ресурсы).

В качестве платформы для развертывания S3-хранилища под свою инсталляцию «1С:Управление торговлей» мы выбрали VK Cloud с сервисом Object Storage

Учим «1С:Предприятие» работать с S3: пошаговая реализация на примере нашего кейса

Найти подходящее под запросы хранилище и даже выбрать платформу — половина дела. Далее нам предстояло научить «1С:Управление торговлей» работать с объектным хранилищем.

Для работы с S3 есть несколько инструментов: консольные клиенты, файловые менеджеры и SDK для разных языков программирования. Нюанс в том, что для «1С» готовых решений нет. Но «1С» «из коробки» поддерживает выполнение HTTP-запросов, то есть, используя механизм подписанных (pre-signed) ссылок, можно реализовать поддержку разных сценариев взаимодействия с S3 — например, возможность скачивания, загрузки и удаления объектов.

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

Решением для нас стали наработки, доступные на GitHub, а именно расширение и инструкция по подключению S3 к конфигурации «1С:Документооборот».

Она сводится к простым шагам:

  1. В «1С» открывается раздел «Настройка и администрирование», выбирается «Настройка программы», далее — «Работа с файлами».

  2. Далее выбирается пункт «Хранить файлы в томах на диске», затем — «Тома хранения файлов».

  3. В разделе «Группа по умолчанию» прописывается новый элемент (например, «Облако S3») и все данные для него (название, тип, адрес, имя префикса и другие по списку).

Для переноса файлов из текущей БД в S3:

  1. В «1С» открывается «Настройка и администрирование», выбирается «Настройка программы», потом — «Работа с файлами».

  2. Далее открывается «Тома хранения файлов».

  3. Следом выбирается «Перенос в тома», указывается количество файлов для переноса. Готово.

Но расширение S3_SSL и инструкция к нему разработаны для конфигурации «1С:Документооборот», а мы используем конфигурацию «1С:Управление торговлей». Интерфейсы работы с файлами в инструментах различаются. Вместе с тем это нам не помешало — принцип настройки остался неизменным.

Примечание: Реализации и способы интеграции S3 у разных облачных провайдеров могут различаться. Поэтому любые манипуляции с «1С» и хранилищем лучше выстраивать на основе документации конкретного вендора. Например, все настройки подключения S3 к «1С» мы выполняли с учетом не только инструкции к упомянутому расширению, но и официальной документации VK Cloud к объектному хранилищу Object Storage

За основу мы взяли два общих модуля:

  • s3_API;

  • s3_КоннекторHTTP.

Дальше мы подготовили справочник «Тома Хранения Файлов» — добавили реквизиты, присутствующие в готовом расширении конфигурации, и изменили форму элемента справочника для настройки доступа к хранилищу S3.

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

Дальше мы внесли правки в интерфейс нашей конфигурации «1С:Управление торговлей», а именно в модули:

  • работа с файлами служебный;

  • работа с файлами служебный вызов сервера;

  • работа с файлами.

В каждом из модулей мы определили процедуры и функции, описывающие операции над файлами (добавление, изменение, удаление). 

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

&ИзменениеИКонтроль ("ПоместитьДвоичныеДанныеВХранилище") Функция s3_ПоместитьДвоичныеДанныеВХранилище (Том, ПутьКФайлу, УникальныйИдентификатор)  ПолныйПуть = ПолныйПутьТома (Том) + ПутьКФайлу; УникальныйИдентификатор = УникальныйИдентификатор;  #Удаление ДвоичныеДанные = Новый ДвоичныеДанные (ПолныйПуть); #КонецУдаления #Вставка ДвоичныеДанные = s3_API.ПолучитьДвоичныеДанныеФайла (Том, ПолныйПуть); #КонецВставки Возврат Новый ХранилищеЗначения (ДвоичныеДанные);  КонецФункции

Затем мы последовательно изменили механизмы подготовки файлов и добавления или удаления на/из S3:

Если ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске И НЕ Том.Пустая() Тогда ПолныйПуть = ПолныйПутьТома (Том) + ПутьКФайлу; #Удаление УдалитьФайлВТоме (ПолныйПуть); #КонецУдаления #Вставка Если s3_АРI.ЭтоТипХранилища_ОбъектноеS3 (Том) Тогда      s3_АРI.УдалитьФайлСТома (Том, ПолныйПуть); Иначе      УдалитьФайлВТоме (Полныйпуть); КонецЕсли; #КонецВставки КонецЕсли; 
#Вставка Если пЭтоТипХранилища_ОбъектноеS3 тогда  ПутьДня = Формат (Дата, "ДФ=ггггЕММдд"); ПутьДня = s3_API.ДобавитьКонечныйРазделительПутиS3 (ПутьДня);  ВТДопПараметры = Новый Структура (); ВТДопПараметры.Вставить ("СсылкаНаТом", СсылкаНаТом); ВТДопПараметры.Вставить ("ПутьДня", ПутьДня); ВТДопПараметры.Вставить ("ПутьКТому", ПутьКТому); ВТДопПараметры.Вставить ("ВерсияСсылка", Справочники.ВерсииФайлов.ПустаяСсылка()); ВТДопПараметры.Вставить ("Расширение", Расширение); ВтДопПараметры.Вставить ("НомерВерсии", НомерВерсии);  ИмяФайлаСПутем = s3_API.ПолучитьУникальноеИмяСПутем (ВТДопПараметры);  ПолноеИмяФайлаСПутем = ПутьКТому + ИмяФайлаСПутем;  s3_API.ДобавитьФайлНаДискS3 (СсылкаНаТом, ДвоичныеДанныеИлиПуть, ПолноеИмяФайлаСПутем);  ПутьКФайлуВТоме = ИмяФайлаСПутем; Иначе ПутьДня = Формат(Дата, "ДФ=ггггЕММдд") + ПолучитьРазделительПути (); ПутьКТому = ПутьКТому + ПутьДня;  ИмяФайлаСПутем = РаботаСФайламиСлужебныйКлиентСервер.ПолучитьУникальноеИмяСПутем (ПутьКТому, ИмяФайла) ; ПолноеИмяФайлаСПутем = ПутьКТому + ИмяФайлаСПутем;  Если ТипЗнч (ДвоичныеДанныеИлиПуть) = Тип ("ДвоичныеДанные") Тогда      ДвоичныеДанныеИлиПуть.Записать (ПолноеИмяФайлаСПутем); Иначе // Считаем, что иначе это путь к файлу на диске.      КопироватьФайл (ДвоичныеДнныеИлиПуть, ПолноеИмяфайлаСПутем); КонецЕсли;  // Установка времени изменения файла таким, как оно стоит в текущей версии. ФайлНаДиске = Новый Файл (ПолноеИмяФайлаСПутем); ФайлНаДиске.УстановитьУниверсальноеВремяИзменения (ВремяИзмененияУниверсальное); ФайлНаДиске.УстановитьТолькоЧтение (Истина); КонецЕсли; #КонецВставки  #Удаление Возврат Новый Структура ("Том,ПутьКФайлу", СсылкаНаТом, ПутьДня + ИмяФайлаСПутем); #КонецУдаления #Вставка Возврат ? (пЭтоТипХранилища_ОбъектноеSз,     Новый Структура ("Том,ПутьКФайлу", СсылкаНаТом, ИмяФайлаСПутем),     Новый Структура ("Том,ПутьКФайлу", СсылкаНаТом, ПутьДня + ИмяФайлаСПутем) ); #КонецВставки 

Таким образом мы пришли к ситуации, когда путь к папке на сервере «1С» (то есть том хранения файлов) — это ссылка на хранилище S3. Далее происходит: 

  • получение полного пути до места хранения файла;

  • аутентификация;

|Функция ДанныеАутентификации (СсылкаНаТом) Экспорт  Аутентификация = Новый Структура; Аутентификация.Вставить ("Тип", "АWS4-НМАС-SНА256"); Аутентификация.Вставить ("ИдентификаторКлючаДоступа", СсылкаНаТом.s3_ИдентификаторКлючаДоступа); Аутентификация.Вставить ("СекретныйКлюч", СсылкаНаТом.s=3_СекретныйКлюч); Аутентификация.Вставить ("Регион", СсылкаНаТом.s3_Регион); Аутентификация.Вставить ("Сервис", "s3");  Возврат Аутентификация; КонецФункции
  • передача двоичных данных файла на S3. 

Аутентификация = ДанныеАутентификации (СсылкаНаТом);  Заголовки = Новый Соответствие;  ДополнительныеПараметры = Новый Структура; ДополнительныеПараметры.Вставить ("Заголовки", Заголовки); ДополнительныеПараметры.Вставить ("Аутентификация", Аутентификация); ДополнительныеПараметры.Вставить ("Таймаут", 300);  Ответ = s3_КоннекторНТТР.Put (ПолныйПуть, ДвоичныеДанные, ДополнительныеПараметры);

Получение данных для просмотра или изменения файла в «1С» происходит в обратной последовательности: в ИБ уже известен том хранения (ссылка на S3), полный путь до файла, а также его имя и расширение. На основании этого происходит получение двоичных данных файла уже из S3 и преобразование его к типу файла с указанным расширением и человекопонятным для чтения.

Результаты и выводы

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

Наш кейс не уникален. К необходимости интеграции сторонних хранилищ, часто именно S3, со временем приходит много компаний, работающих с разными конфигурациями «1С». Вместе с тем наш опыт показывает, что перестроить «1С» на работу с S3 не просто возможно, но и довольно легко: для этого нам оказалось достаточно инструкции на GitHub, документации VK Cloud к сервису Object Storage и небольшой команды.


ссылка на оригинал статьи https://habr.com/ru/articles/892824/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *