Как программно создать номенклатуру и загрузить картинку по URL в 1С:Управление торговлей 11

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

При разработке обработок для загрузки данных из внешних источников (например, Excel-файлов или API поставщиков) одной из самых трудоемких задач является программное добавление изображений. В современных конфигурациях, таких как Управление торговлей 11, ERP или Комплексная автоматизация, механизм хранения файлов реализован на базе Библиотеки стандартных подсистем (БСП). Это накладывает определенные требования к коду. Рассмотрим подробнее, как правильно создать номенклатуру и прикрепить к ней картинку, загруженную по ссылке.

Разбор типичной ошибки: Владелец vs ВладелецФайла

Разберем ситуацию, с которой сталкиваются многие начинающие разработчики. При попытке записать объект справочника НоменклатураПрисоединенныеФайлы возникает ошибка: "Ошибка при установке значения атрибута контекста (Владелец): Справочник не имеет владельца". Проанализируем причину. В платформе 1С существует стандартное свойство «Владелец», определяющее иерархию между справочниками. Однако в архитектуре БСП справочники присоединенных файлов не являются подчиненными справочнику номенклатуры на уровне метаданных платформы.

Вместо этого используется обычный реквизит с именем ВладелецФайла. Это сделано для того, чтобы один и тот же справочник файлов мог обслуживать разные типы объектов. Поэтому крайне важно использовать правильное имя реквизита при заполнении программно: КартинкаОбъект.ВладелецФайла = Товар.Ссылка;.

Обязательная предварительная запись объекта

Выясним еще один критический момент: файл нельзя прикрепить к «пустоте». Если мы создаем новую номенклатуру методом Справочники.Номенклатура.СоздатьЭлемент(), у этого объекта еще нет ссылки в базе данных. Попытка записать присоединенный файл, передав в него Товар.Ссылка до вызова метода Записать(), приведет к тому, что поле владельца останется пустым. Это вызовет исключение в типовом обработчике ПередЗаписью общего модуля РаботаСФайлами.

Алгоритм действий должен быть следующим:

  1. Создаем объект Номенклатура.
  2. Заполняем основные реквизиты (Наименование, Артикул, Вид номенклатуры).
  3. Выполняем метод Записать(), чтобы получить уникальный идентификатор (ссылку).
  4. Только после этого приступаем к загрузке и привязке файла.

Загрузка изображения из интернета

Проанализируем процесс получения данных по протоколу 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С:

  1. Всегда записывайте владельца (номенклатуру, контрагента и т.д.) до начала работы с его файлами.
  2. Используйте ВладелецФайла вместо системного поля Владелец при прямой работе со справочниками присоединенных файлов.
  3. Отдавайте предпочтение модулю РаботаСФайлами. Это избавит вас от необходимости вручную прописывать логику хранения (в базе или в томах на диске).
  4. Проверяйте расширение файла. Если вы загружаете картинки по URL, они могут быть в форматах png, webp или jpeg. Лучше определять расширение динамически из заголовков HTTP-ответа или по расширению в ссылке, чтобы избежать ошибок отображения в платформе.
  5. Очищайте временные файлы. После создания объекта ДвоичныеДанные и помещения их в хранилище, используйте команду УдалитьФайлы(ФайлОтвет), чтобы не засорять временную папку сервера.

Соблюдение этих правил позволит вам создавать надежные и быстрые инструменты для интеграции 1С с внешними системами и интернет-магазинами.

← На главную