В платформе 1С:Предприятие 7.7 отсутствует встроенный объект для прямой работы с бинарными данными (такой как ХранилищеЗначения в 8.х). В связи с этим при необходимости привязки графических файлов (фотографий товаров, сканов сертификатов или документов) к объектам базы данных возникают сложности. Рассмотрим доступные варианты решения этой задачи, их особенности, ограничения и технические нюансы.
Прежде чем выбирать архитектуру хранения, проанализируем базовые особенности платформы 1С 7.7:
Загрузить(). Извлеченный из базы бинарный поток перед отображением на форме обязательно нужно предварительно сохранить во временный файл.BMP, ICO, WMF, EMF. Для работы с популярными форматами JPG или PNG требуется предварительное конвертирование либо применение сторонних ActiveX-компонентов..DBT (файле мемо-полей), который имеет критический предел размера в 2 ГБ. Массовая загрузка файлов прямо в базу данных приводит к быстрому достижению этого лимита и повреждению информационной базы.Разберем вариант, когда файлы обязательно должны находиться внутри информационной базы (например, для корректной передачи графики через механизм УРБД без сторонних скриптов синхронизации).
Для реализации этого подхода применяются внешние компоненты:
Строка неограниченной длины. При выводе изображения на форму происходит обратный процесс: считывание строки, запись файла во временный каталог (полученный с помощью КаталогВременныхФайлов()) и вызов метода Загрузить().Рассмотрим пример алгоритма работы с бинарными данными через объекты 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
КонецФункции
Если используется SQL-версия 1С 7.7, оптимизировать объем основной базы можно путем выноса графики в отдельную пользовательскую таблицу или соседнюю базу данных MS SQL Server.
Посмотрим на преимущества данного метода:
varbinary(max) или image.IDD или IDDOC).Проанализируем архитектуру, которой придерживается большинство разработчиков при работе с файлами большого объема. Вместо записи самих файлов в базу данных сохраняются только относительные пути к ним.
Выясним пошагово, как организовать данную схему:
Images).ЗначениеВСтрокуВнутр() или метод GetID() в 1С++) либо кода справочника. Привязка к уникальному ID более надежна, так как код элемента справочника может быть изменен пользователем.Сравним два базовых подхода к хранению: