Как программно добавить картинку из Base64 в присоединенные файлы 1С (БСП)?

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

Часто при интеграции с внешними системами или работе с COM-объектами перед разработчиками встает задача сохранить полученное изображение (например, скриншот или скан документа) в справочник присоединенных файлов. Если ваша конфигурация построена на Библиотеке Стандартных Подсистем (БСП), например, УТ 11, ERP, КА или современные версии Бухгалтерии, "классический" подход с прямой записью в справочник не сработает.

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

Почему не работает прямая запись в справочник?

Рассмотрим ситуацию, с которой столкнулся автор вопроса. Попытка выглядела следующим образом: создавался элемент справочника СправочникПрисоединенныеФайлы, и двоичные данные записывались напрямую в реквизит Хранилище. В результате файл создавался в списке, но при попытке открытия он оказывался пустым или недоступным для просмотра.

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

  1. Метаданные (имя, автор, расширение, размер) хранятся в справочнике (например, ЗаказПокупателяПрисоединенныеФайлы).
  2. Двоичные данные (сам контент файла) хранятся отдельно. В зависимости от настроек программы, это может быть регистр сведений ДвоичныеДанныеФайлов или тома на жестком диске сервера.

Когда мы пытаемся записать данные просто в реквизит справочника, механизмы БСП "не видят" их там, где ожидают найти (в регистре или томе). Поэтому файл отображается как "битый". Чтобы избежать этого, необходимо использовать специальный программный интерфейс (API) подсистемы работы с файлами.

Правильное решение: использование модуля РаботаСФайлами

Для корректного добавления файла в системе существует общий модуль РаботаСФайлами и его экспортная процедура ДобавитьФайл. Этот метод берет на себя всю "грязную" работу: проверяет настройки хранения (в базе или в томах), создает запись в регистре сведений, формирует метаданные в справочнике и даже может извлекать текст для поиска.

Разберем по шагам алгоритм, который нам необходимо реализовать:

  1. Преобразовать строку Base64 в ДвоичныеДанные.
  2. Поместить эти данные во временное хранилище. Это обязательное требование метода ДобавитьФайл.
  3. Подготовить структуру параметров, описывающую файл (кто владелец, какое имя, расширение).
  4. Вызвать метод добавления файла.
  5. Очистить временное хранилище (правило хорошего тона для управления памятью).

Пример программного кода

Посмотрим на реализации этого алгоритма. Предположим, у нас есть переменная СтрокаBase64, содержащая данные картинки, и мы знаем номер заказа, к которому нужно прикрепить файл.


// 1. Находим владельца файла (документ или справочник)
СсылкаНаВладельца = Документы.ЗаказПокупателя.НайтиПоНомеру("000000123"); 

// 2. Получаем двоичные данные из строки Base64
// Если у вас уже есть ДвоичныеДанные, этот шаг можно пропустить
ДвоичныеДанныеФайла = Base64Значение(СтрокаBase64); 

// 3. Помещаем данные во временное хранилище
// Создаем новый уникальный идентификатор, чтобы адрес был уникальным
АдресФайлаВоВременномХранилище = ПоместитьВоВременноеХранилище(
    ДвоичныеДанныеФайла, 
    Новый УникальныйИдентификатор
);

// 4. Подготавливаем параметры для функции БСП
ПараметрыФайла = Новый Структура;
ПараметрыФайла.Вставить("Автор", Пользователи.ТекущийПользователь()); // Или Неопределено
ПараметрыФайла.Вставить("ВладелецФайлов", СсылкаНаВладельца);
ПараметрыФайла.Вставить("ИмяБезРасширения", "Скриншот заказа");
ПараметрыФайла.Вставить("РасширениеБезТочки", "jpg");
ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное", ТекущаяДатаСеанса());

// Дополнительные параметры (опционально)
// ПараметрыФайла.Вставить("ГруппаФайлов", СсылкаНаПапку); // Если нужно положить в папку

// 5. Вызываем функцию добавления
Попытка
    РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, АдресФайлаВоВременномХранилище);
Исключение
    // Обработка ошибки, если что-то пошло не так (например, файл заблокирован)
    Сообщить("Ошибка добавления файла: " + ОписаниеОшибки());
КонецПопытки;

// 6. Освобождаем память
УдалитьИзВременногоХранилища(АдресФайлаВоВременномХранилище);

Давайте подробнее разберем ключевые параметры структуры ПараметрыФайла:

Важные нюансы

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

Также, если вы хотите не добавлять новый файл, а обновлять существующий (создавать новую версию), в БСП следует использовать метод РаботаСФайлами.СохранитьВерсию, предварительно найдя ссылку на существующий присоединенный файл.

← На главную