Как организовать выносное хранение изображений и выбрать идентификатор для быстрой выборки в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Хранение графических файлов непосредственно в рабочей базе 1С приводит к стремительному росту объема таблиц СУБД, замедлению создания резервных копий и повышенной нагрузке на дисковую подсистему. Когда администраторы запрещают использовать общие сетевые папки (SMB-ресурсы), разработчики часто приходят к идее выноса файлов в отдельную сервисную базу 1С или внешнее хранилище. Проанализируем, как правильно организовать структуру хранения, выбрать оптимальный тип идентификатора для быстрого поиска и какие архитектурные альтернативы существуют.

Выбор типа идентификатора для быстрого поиска

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

  1. Строковый GUID (фиксированная строка 36 символов): Тип данных УникальныйИдентификатор в платформе 1С нельзя напрямую передавать в параметры запросов для фильтрации в секции ГДЕ. Поэтому на уровне базы данных идентификатор сохраняется как строка фиксированной длины (36 символов) с обязательной установкой свойства Индексировать. Поиск по индексированному строковому полю фиксированной длины в реляционных СУБД выполняется предельно быстро.
  2. MD5 или SHA-хэш содержимого файла (строка 32 или 40 символов): Вычисление хэша от бинарных данных изображения позволяет использовать его в качестве естественного первичного ключа. Это дает автоматическую дедупликацию: одинаковые картинки не будут записываться повторно, а поиск по индексированному хэшу работает с максимальной производительностью.
  3. Стандартное поле Код справочника: Если для регистрации файлов используется отдельный справочник, проще всего записывать строковый идентификатор или GUID непосредственно в стандартный реквизит Код. Он уже проиндексирован на уровне платформы, что исключает создание избыточных реквизитов.

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

Оптимальная структура метаданных во вспомогательной базе 1С

Если для хранения файлов решено использовать вспомогательную конфигурацию 1С, нельзя сохранять бинарные данные в реквизитах самого справочника. Поля типа ХранилищеЗначений размещаются СУБД в отдельных LOB-таблицах, и обращение к объекту справочника может приводить к избыточному чтению больших объемов данных в память.

Разберем правильную схему разделения метаданных:

  1. Создаем справочник Файлы, где хранятся только метаданные: Код (строковый GUID или MD5), дата загрузки, размер, расширение, имя файла и MIME-тип.
  2. Создаем непериодический регистр сведений ДвоичныеДанныеФайлов с измерением Файл (тип СправочникСсылка.Файлы, ведущее) и ресурсом Данные (тип ХранилищеЗначений).

Посмотрим на пример извлечения двоичных данных по строковому идентификатору:


Функция ПолучитьДвоичныеДанныеПоКоду(Знач СтроковыйИдентификатор) Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |	ДвоичныеДанныеФайлов.Данные КАК Данные
        |ИЗ
        |	РегистрСведений.ДвоичныеДанныеФайлов КАК ДвоичныеДанныеФайлов
        |ГДЕ
        |	ДвоичныеДанныеФайлов.Файл.Код = &Код";
    
    Запрос.УстановитьПараметр("Код", СокрЛП(СтроковыйИдентификатор));
    Выборка = Запрос.Выполнить().Выбрать();
    
    Если Выборка.Следующий() Тогда
        Хранилище = Выборка.Данные;
        Если Хранилище <> Неопределено Тогда
            Возврат Хранилище.Получить();
        КонецЕсли;
    КонецЕсли;
    
    Возврат Неопределено;
КонецФункции

Передача файлов: HTTP-сервисы против SOAP Web-сервисов

Выясним причину, почему для передачи бинарных файлов не рекомендуется использовать классические SOAP Web-сервисы 1С. При вызове SOAP-методов бинарные данные упаковываются в текстовый формат Base64. Это увеличивает объем передаваемого по сети трафика примерно на 33% и создает значительную нагрузку на процессор при кодировании и декодировании.

Вместо SOAP следует использовать встроенные HTTP-сервисы 1С. Они позволяют отдавать двоичные данные напрямую в теле HTTP-ответа:


Функция ИзображенияGET(Запрос)
    Идентификатор = Запрос.ПараметрыЗапроса.Получить("id");
    ДвоичныеДанные = ПолучитьДвоичныеДанныеПоКоду(Идентификатор);
    
    Если ДвоичныеДанные = Неопределено Тогда
        Возврат Новый HTTPСервисОтвет(404);
    КонецЕсли;
    
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.Заголовки.Вставить("Content-Type", "image/jpeg");
    Ответ.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанные);
    Возврат Ответ;
КонецФункции

Альтернативные архитектурные решения без второй базы 1С

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

  1. Объектное хранилище S3 (MinIO, Ceph или облачные провайдеры): Наиболее масштабируемый и современный подход. В локальной сети разворачивается бесплатный сервис MinIO. База 1С через объект HTTPСоединение отправляет файл методом PUT и получает ключ объекта. В базе 1С хранится только строка-идентификатор. При необходимости тонкий или веб-клиент может запрашивать картинку напрямую из S3 по HTTP-ссылке без участия сервера 1С.
  2. Подключение локального тома на сервере приложений 1С: Если сетевая папка запрещена политиками безопасности, том хранения файлов на диске настраивается локально на том же физическом сервере, где работает кластер серверов 1С. В этом случае чтение и запись файлов осуществляет сам процесс сервера 1С от системной учетной записи, а доступ пользователей по сети к папке не открывается.
  3. Внешние источники данных 1С: Если файлы сохраняются во внешней СУБД (PostgreSQL, MS SQL), встроенный механизм «Внешние источники данных» платформы 1С позволяет работать с таблицами внешних баз через ODBC напрямую без создания промежуточных баз и сервисов.
  4. NoSQL базы данных: Хранилища документов или Key-Value базы отлично справляются с хранением бинарных данных произвольного объема и отдают их по REST API с минимальными задержками.
← На главную