При разработке обработок для загрузки данных из внешних источников (например, Excel-файлов или API поставщиков) одной из самых трудоемких задач является программное добавление изображений. В современных конфигурациях, таких как Управление торговлей 11, ERP или Комплексная автоматизация, механизм хранения файлов реализован на базе Библиотеки стандартных подсистем (БСП). Это накладывает определенные требования к коду. Рассмотрим подробнее, как правильно создать номенклатуру и прикрепить к ней картинку, загруженную по ссылке.
Разберем ситуацию, с которой сталкиваются многие начинающие разработчики. При попытке записать объект справочника НоменклатураПрисоединенныеФайлы возникает ошибка: "Ошибка при установке значения атрибута контекста (Владелец): Справочник не имеет владельца". Проанализируем причину. В платформе 1С существует стандартное свойство «Владелец», определяющее иерархию между справочниками. Однако в архитектуре БСП справочники присоединенных файлов не являются подчиненными справочнику номенклатуры на уровне метаданных платформы.
Вместо этого используется обычный реквизит с именем ВладелецФайла. Это сделано для того, чтобы один и тот же справочник файлов мог обслуживать разные типы объектов. Поэтому крайне важно использовать правильное имя реквизита при заполнении программно: КартинкаОбъект.ВладелецФайла = Товар.Ссылка;.
Выясним еще один критический момент: файл нельзя прикрепить к «пустоте». Если мы создаем новую номенклатуру методом Справочники.Номенклатура.СоздатьЭлемент(), у этого объекта еще нет ссылки в базе данных. Попытка записать присоединенный файл, передав в него Товар.Ссылка до вызова метода Записать(), приведет к тому, что поле владельца останется пустым. Это вызовет исключение в типовом обработчике ПередЗаписью общего модуля РаботаСФайлами.
Алгоритм действий должен быть следующим:
Номенклатура.Записать(), чтобы получить уникальный идентификатор (ссылку).Проанализируем процесс получения данных по протоколу HTTP. Для этого мы используем объекты HTTPСоединение и HTTPЗапрос. Важно правильно разбить URL на составляющие с помощью функции СтруктураURI. Посмотрим на пример кода, который выполняет загрузку файла во временный каталог сервера:
// Разбор URL картинки
URL = "https://example.com/images/product123.jpg";
СтруктураURI = ОбщегоНазначенияКлиентСервер.СтруктураURI(URL);
// Подготовка соединения
HTTPСоединение = Новый HTTPСоединение(СтруктураURI.ИмяСервера, , , , , , Новый ЗащищенноеСоединениеOpenSSL());
HTTPЗапрос = Новый HTTPЗапрос(СтруктураURI.ПутьНаСервере);
// Получение файла во временное хранилище
ФайлОтвет = ПолучитьИмяВременногоФайла("jpg");
Результат = HTTPСоединение.Получить(HTTPЗапрос, ФайлОтвет);
Если Результат.КодСостояния = 200 Тогда
ДвоичныеДанныеКартинки = Новый ДвоичныеДанные(ФайлОтвет);
Иначе
Сообщить("Ошибка загрузки файла. Код состояния: " + Результат.КодСостояния);
КонецЕсли;
Обратите внимание на параметр Новый ЗащищенноеСоединениеOpenSSL(). Сегодня большинство сайтов работают по протоколу HTTPS, и без этого параметра соединение не будет установлено.
Вместо того чтобы вручную создавать элементы в справочнике НоменклатураПрисоединенныеФайлы и заполнять регистр сведений ПрисоединенныеФайлы, мы рекомендуем использовать типовые методы БСП. Это гарантирует правильное заполнение всех служебных полей (размер, расширение, дата создания, автор) и корректное размещение файла в томах на диске, если такая настройка включена в системе.
Основным инструментом здесь выступает функция РаботаСФайлами.ДобавитьФайл. Рассмотрим пример её вызова:
// Подготовка параметров для БСП
ПараметрыФайла = Новый Структура;
ПараметрыФайла.Вставить("Автор", Пользователи.АвторизованныйПользователь());
ПараметрыФайла.Вставить("ВладелецФайлов", Товар.Ссылка); // Ссылка на созданную номенклатуру
ПараметрыФайла.Вставить("ИмяБезРасширения", "Изображение_" + Товар.Артикул);
ПараметрыФайла.Вставить("РасширениеБезТочки", "jpg");
// Помещение данных во временное хранилище
АдресФайлаВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки, Новый УникальныйИдентификатор);
// Создание файла через типовой механизм
СсылкаНаПрисоединенныйФайл = РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, АдресФайлаВоВременномХранилище);
После того как файл физически добавлен в систему, нам нужно сделать его "главным" для карточки номенклатуры. В справочнике Номенклатура за это отвечает реквизит ФайлКартинки. Если его не заполнить, файл будет виден в списке "Присоединенные файлы", но само изображение не появится в карточке товара или в прайс-листах.
Завершим наш алгоритм финальным кодом:
// Получаем объект номенклатуры для редактирования
ТоварОбъект = Товар.Ссылка.ПолучитьОбъект();
ТоварОбъект.ФайлКартинки = СсылкаНаПрисоединенныйФайл;
ТоварОбъект.Записать();
Подводя итог, выделим ключевые правила работы с картинками в современных конфигурациях 1С:
ВладелецФайла вместо системного поля Владелец при прямой работе со справочниками присоединенных файлов.РаботаСФайлами. Это избавит вас от необходимости вручную прописывать логику хранения (в базе или в томах на диске).png, webp или jpeg. Лучше определять расширение динамически из заголовков HTTP-ответа или по расширению в ссылке, чтобы избежать ошибок отображения в платформе.ДвоичныеДанные и помещения их в хранилище, используйте команду УдалитьФайлы(ФайлОтвет), чтобы не засорять временную папку сервера.Соблюдение этих правил позволит вам создавать надежные и быстрые инструменты для интеграции 1С с внешними системами и интернет-магазинами.