Как мы учили «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/companies/vktech/articles/892824/

Опубликовано в категории: Статьи