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

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Ограничения платформы 1С 7.7 при работе с картинками

Прежде чем выбирать архитектуру хранения, проанализируем базовые особенности платформы 1С 7.7:

  1. Метод отображения: Штатный элемент формы «Картинка» умеет выводить изображение только из физического файла на диске с помощью метода Загрузить(). Извлеченный из базы бинарный поток перед отображением на форме обязательно нужно предварительно сохранить во временный файл.
  2. Поддерживаемые форматы: Штатная система отображения рассчитана на форматы BMP, ICO, WMF, EMF. Для работы с популярными форматами JPG или PNG требуется предварительное конвертирование либо применение сторонних ActiveX-компонентов.
  3. Ограничения DBF-версии: В файловом режиме строки неограниченной длины хранятся в файле .DBT (файле мемо-полей), который имеет критический предел размера в 2 ГБ. Массовая загрузка файлов прямо в базу данных приводит к быстрому достижению этого лимита и повреждению информационной базы.
  4. Ограничение длины строк: Строковые реквизиты и переменные имеют лимиты по размеру (около 4 МБ на строку), что накладывает ограничения на объем одного загружаемого файла.

Вариант 1. Хранение бинарных данных в реквизитах базы с помощью ВК

Разберем вариант, когда файлы обязательно должны находиться внутри информационной базы (например, для корректной передачи графики через механизм УРБД без сторонних скриптов синхронизации).

Для реализации этого подхода применяются внешние компоненты:

  1. Внешняя компонента binfile.dll: Позволяет считывать файл с диска в текстовый/бинарный буфер и записывать его в реквизит справочника или документа типа Строка неограниченной длины. При выводе изображения на форму происходит обратный процесс: считывание строки, запись файла во временный каталог (полученный с помощью КаталогВременныхФайлов()) и вызов метода Загрузить().
  2. Класс BinaryData библиотеки 1С++: Предоставляет функционал для считывания, кодирования и сохранения двоичных данных непосредственно в базе данных.

Рассмотрим пример алгоритма работы с бинарными данными через объекты COM (без использования сторонних DLL) с помощью Base64-кодирования:


// Сохранение файла в строку неограниченной длины (Base64)
Функция ФайлВСтрокуBase64(ПутьКФайлу)
    Поток = СоздатьОбъект("ADODB.Stream");
    Поток.Type = 1; // Binary
    Поток.Open();
    Поток.LoadFromFile(ПутьКФайлу);
    
    DOM = СоздатьОбъект("MSXML2.DOMDocument");
    Элемент = DOM.createElement("Base64Data");
    Элемент.dataType = "bin.base64";
    Элемент.nodeTypedValue = Поток.Read();
    
    Возврат Элемент.text;
КонецФункции

При необходимости отображения файла вызовем процедуру декодирования во временный каталог:


// Восстановление файла из строки Base64 во временную папку
Процедура ВосстановитьФайлИзBase64(СтрокаBase64, ПутьВыгрузки)
    DOM = СоздатьОбъект("MSXML2.DOMDocument");
    Элемент = DOM.createElement("Base64Data");
    Элемент.dataType = "bin.base64";
    Элемент.text = СтрокаBase64;
    
    Поток = СоздатьОбъект("ADODB.Stream");
    Поток.Type = 1; // Binary
    Поток.Open();
    Поток.Write(Элемент.nodeTypedValue);
    Поток.SaveToFile(ПутьВыгрузки, 2); // Save overwrite
КонецФункции

Вариант 2. Хранение изображений в отдельной таблице MS SQL

Если используется SQL-версия 1С 7.7, оптимизировать объем основной базы можно путем выноса графики в отдельную пользовательскую таблицу или соседнюю базу данных MS SQL Server.

Посмотрим на преимущества данного метода:

  1. Основная база 1С не раздувается, регламентные операции (индексация, тестирование и исправление) выполняются быстро.
  2. В таблице MS SQL для поля файла используется тип varbinary(max) или image.
  3. Связь между объектом 1С и картинкой осуществляется по внутреннему идентификатору (например, IDD или IDDOC).
  4. Чтение и запись данных производятся напрямую через `ADODB.Connection` и `ADODB.Stream`.

Вариант 3. Хранение файлов во внешнем каталоге (Рекомендуемый подход)

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

Выясним пошагово, как организовать данную схему:

  1. В каталоге информационной базы создается подкаталог для графики (например, Images).
  2. Имя файла формируется на основании уникального внутреннего идентификатора объекта (ЗначениеВСтрокуВнутр() или метод GetID() в 1С++) либо кода справочника. Привязка к уникальному ID более надежна, так как код элемента справочника может быть изменен пользователем.
  3. В базе данных (в реквизите справочника) сохраняется имя файла или относительный путь.
  4. Для филиальных и распределенных баз данных (УРБД) синхронизация файлов внешнего каталога реализуется с помощью сторонних утилит автоматической синхронизации папок или специального специализированного софта (например, УРБД Мастер).

Сравним два базовых подхода к хранению:

  1. Хранение в базе данных (binfile.dll / 1С++ / Base64): Подходит для строго контролируемого объема файлов (например, изображения фиксированного размера до 300 КБ, добавляемые в небольшом количестве). Главный плюс — целостность данных при штатном обмене УРБД.
  2. Хранение во внешнем каталоге: Подходит для нерегулируемого или большого объема файлов (сканы документов, высокодетализированные фото). Исключает критический рост объема базы данных и сохраняет высокую производительность системы.
← На главную