Как получить путь к картинке в 1С:ERP и вставить её в документ Word на клиенте?

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

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

Разбираемся в механизме хранения файлов в томах

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

Когда вы видите путь вида C:\Users\ИмяПользователя\Desktop\MyFiles\20190222\хрюша.bmp, важно понимать контекст выполнения кода. Если код выполняется НаСервере, то этот путь относится к файловой системе сервера, а не вашего локального компьютера. Выясним причину, по которой файл «не виден»: сервер 1С работает под собственной системной учетной записью (например, USR1CV8), и для него этот путь является локальным. Когда вы, находясь в сеансе отладчика на своем рабочем месте, пытаетесь найти файл по этому адресу, вы ищете его на своем диске C:, где его, естественно, нет.

Для корректной работы системы в промышленной эксплуатации крайне рекомендуется использовать не локальные пути, а UNC-пути (сетевые пути вида \\ServerName\FileStorage). Это обеспечит доступ к файлам со всех рабочих процессов кластера серверов 1С.

Проблема передачи серверного пути в клиентское приложение

Рассмотрим распространенную ошибку. Программист пытается вставить картинку в Word следующим образом:


// ОШИБОЧНЫЙ ПОДХОД
Selection = Word.Selection;  
Selection.InlineShapes.AddPicture(ПолныйПутьСерверный);

Проанализируем ситуацию: приложение Word запущено на стороне клиента (на компьютере пользователя). Метод AddPicture ожидает путь, который доступен этому компьютеру. Но переменная ПолныйПутьСерверный содержит адрес, который существует только на сервере. Клиентский компьютер «не знает» о папках на диске C: сервера. Чтобы решить эту задачу, нам необходимо физически передать данные файла с сервера на клиентскую машину.

Решение №1: Передача через временное хранилище (Рекомендуемый способ)

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

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


&НаСервере
Функция ПолучитьАдресВременногоХранилищаКартинки(ПрисоединенныйФайлСсылка)
    // Получаем двоичные данные файла
    ДанныеФайла = ПрисоединенныеФайлы.ДанныеФайла(ПрисоединенныйФайлСсылка);
    
    Если ДанныеФайла <> Неопределено Тогда
        // Помещаем данные во временное хранилище и возвращаем адрес
        Возврат ПоместитьВоВременноеХранилище(ДанныеФайла.ДвоичныеДанные, ЭтаФорма.УникальныйИдентификатор);
    КонецЕсли;
    
    Возврат "";
КонецФункции

Шаг 2. Сохранение файла на клиенте. Получив адрес во временном хранилище, мы должны «скачать» эти данные на клиент и сохранить их в локальную временную папку пользователя. Посмотрим на пример кода:


&НаКлиенте
Процедура ВставитьКартинкуВWord(ПрисоединенныйФайлСсылка)
    
    // Получаем адрес с сервера
    АдресХранилища = ПолучитьАдресВременногоХранилищаКартинки(ПрисоединенныйФайлСсылка);
    
    Если ЗначениеЗаполнено(АдресХранилища) Тогда
        // Генерируем путь во временной папке пользователя
        ИмяВременногоФайла = ПолучитьИмяВременногоФайла("bmp"); 
        
        // Получаем данные из хранилища и записываем на диск клиента
        ДанныеИзХранилища = ПолучитьИзВременногоХранилища(АдресХранилища);
        ДанныеИзХранилища.Записать(ИмяВременногоФайла);
        
        // Теперь Word может прочитать этот файл, так как он лежит локально
        Word = Новый COMОбъект("Word.Application");
        // ... открытие документа ...
        Word.Selection.InlineShapes.AddPicture(ИмяВременногоФайла);
        
        // Не забываем удалить временный файл после использования, если это необходимо
        // УдалитьФайлы(ИмяВременногоФайла);
    КонецЕсли;
    
КонецПроцедуры

Решение №2: Использование «Файловой шары» (UNC-пути)

Если ваша архитектура позволяет настроить общий сетевой доступ к папке с томами, можно использовать прямой путь. В этом случае папка на сервере должна быть расшарена (Shared) и доступна пользователю MBrovko (из нашего примера) на чтение. Тогда путь будет выглядеть так: \\ИмяСервера\MyFiles\20190222\хрюша.bmp.

Однако у этого метода есть существенные недостатки:

  1. Безопасность: приходится давать всем пользователям права доступа к папке на сервере.
  2. Зависимость от сети: если сетевой ресурс будет недоступен, формирование документов прервется.
  3. Настройка прав: учетная запись службы 1С и учетная запись пользователя Windows должны иметь согласованные права доступа к этому ресурсу.

Важные нюансы работы с объектами 1С

При работе с картинками в ERP полезно помнить следующие моменты:

1. Использование встроенных функций БСП. Старайтесь не изобретать велосипед. Функция ФайловыеФункцииСлужебный.ПолныйПутьТома() возвращает путь, настроенный в системе. Если вы видите там путь к рабочему столу конкретного пользователя, это признак некорректной настройки томов хранения. Тома должны указывать на стабильные серверные директории.

2. Метод ДанныеФайла(). Этот метод универсален. Ему не важно, где физически лежит файл (в базе или в томе). Он возвращает структуру, содержащую ДвоичныеДанные. Это избавляет вас от необходимости вручную склеивать пути и проверять наличие файлов на диске через Новый Файл().

3. Временные файлы. Метод ПолучитьИмяВременногоФайла() — лучший способ получить путь для записи картинки перед передачей в Word. Он гарантирует уникальность имени и наличие прав на запись в эту папку (обычно это %TEMP% в профиле пользователя).

Резюме

Подведем итог. Выяснив причину проблемы, мы понимаем, что в клиент-серверной среде 1С «Путь к файлу» — понятие относительное. Для сервера это может быть локальный диск, а для клиента — недоступная область памяти.

Правильный алгоритм действий при работе с картинками в ERP для вывода во внешние отчеты:

  1. На сервере извлечь ДвоичныеДанные файла через подсистему «Присоединенные файлы».
  2. Поместить эти данные во временное хранилище 1С.
  3. На клиенте выгрузить данные из хранилища в локальный временный файл.
  4. Передать путь к этому локальному файлу в COM-объект Word.Application.

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

← На главную