Интеграция с маркетплейсами — одна из самых востребованных задач для современного разработчика 1С. Зачастую бюджеты клиентов ограничены, и полноценная разработка через API кажется избыточной. В таких случаях на помощь приходит автоматизация выгрузки через стандартные Excel-шаблоны. Однако шаблоны OZON — это не просто таблицы, а сложные документы со скрытыми листами, проверками данных и специфическими требованиями к форматам ячеек. Разберем, как правильно организовать заполнение таких файлов, сохранив их структуру и пройдя валидацию маркетплейса.
Прежде чем приступать к написанию кода, проанализируем структуру целевого файла. Шаблоны OZON содержат макросы и скрытые справочники для выпадающих списков. Если мы попытаемся использовать стандартный метод 1С ТабДок.Записать(Путь, ТипФайлаТабличногоДокумента.XLSX), мы создадим новый файл, который визуально будет похож на оригинал, но лишится всей внутренней логики OZON. В результате маркетплейс выдаст ошибку при загрузке. Выясним причину: OZON проверяет не только наличие данных, но и соответствие файла его внутренним метаданным.
Для корректного заполнения следует использовать COM-объект Excel.Application. Этот метод позволяет открыть оригинальный скачанный шаблон, записать данные в нужные ячейки и сохранить файл, не повредив его структуру. Посмотрим на основные этапы реализации этого процесса.
Рассмотрим алгоритм действий. Сначала необходимо скачать актуальный шаблон из личного кабинета продавца под конкретную категорию товаров (например, "Одежда" или "Электроника"). Программно мы будем открывать именно этот файл как эталон. Важно помнить, что OZON регулярно обновляет эти шаблоны, поэтому в системе 1С стоит предусмотреть механизм выбора актуального файла-образца.
Проанализируем структуру данных в 1С. Нам потребуется собрать данные о товарах (артикулы, цены, весогабаритные характеристики) в таблицу значений или массив структур. Обратите внимание на единицы измерения: OZON требует вес в граммах, а габариты — в миллиметрах. Если в вашей базе данные хранятся в килограммах и метрах, необходимо выполнить конвертацию перед записью.
Разберем конкретный пример кода, который открывает Excel-приложение, находит нужный лист и заполняет его данными из 1С. Основная сложность здесь заключается в том, что колонки в шаблоне могут менять свои индексы при обновлениях. Рекомендуется сначала программно найти номера колонок по их заголовкам.
// Инициализация Excel
Эксель = Новый COMОбъект("Excel.Application");
Эксель.Visible = Ложь;
Эксель.DisplayAlerts = Ложь;
Попытка
Книга = Эксель.Workbooks.Open(ПутьКШаблону);
// Обычно данные заполняются на листе "Озон" или первом листе
Лист = Книга.Sheets(1);
// Определяем соответствие колонок (заголовки обычно во 2-й или 3-й строке)
СоответствиеКолонок = Новый Соответствие;
Для НомКол = 1 По Лист.UsedRange.Columns.Count Цикл
Заголовок = Лист.Cells(2, НомКол).Value; // Проверяем строку с именами полей
Если ЗначениеЗаполнено(Заголовок) Тогда
СоответствиеКолонок.Вставить(ВРег(Сокращенно(Заголовок)), НомКол);
КонецЕсли;
КонецЦикла;
// Начинаем заполнение со строки 4 (стандарт для OZON)
НомерСтрокиЭксель = 4;
Для Каждого СтрокаТовара Из ТаблицаДанных Цикл
// Пример функции записи ячейки по имени колонки
ЗаписатьЯчейкуOZON(Лист, СоответствиеКолонок, НомерСтрокиЭксель, "АРТИКУЛ", СтрокаТовара.Артикул);
ЗаписатьЯчейкуOZON(Лист, СоответствиеКолонок, НомерСтрокиЭксель, "ЦЕНА", СтрокаТовара.Цена);
ЗаписатьЯчейкуOZON(Лист, СоответствиеКолонок, НомерСтрокиЭксель, "НДС", "Не облагается");
ЗаписатьЯчейкуOZON(Лист, СоответствиеКолонок, НомерСтрокиЭксель, "ВЕС С УПАКОВКОЙ, Г", СтрокаТовара.ВесГраммы);
// Габариты обязательны для логистики
ЗаписатьЯчейкуOZON(Лист, СоответствиеКолонок, НомерСтрокиЭксель, "ШИРИНА УПАКОВКИ, ММ", СтрокаТовара.Ширина);
ЗаписатьЯчейкуOZON(Лист, СоответствиеКолонок, НомерСтрокиЭксель, "ВЫСОТА УПАКОВКИ, ММ", СтрокаТовара.Высота);
ЗаписатьЯчейкуOZON(Лист, СоответствиеКолонок, НомерСтрокиЭксель, "ДЛИНА УПАКОВКИ, ММ", СтрокаТовара.Длина);
НомерСтрокиЭксель = НомерСтрокиЭксель + 1;
КонецЦикла;
Книга.SaveAs(ПутьКРезультату);
Книга.Close();
Исключение
Сообщить("Ошибка при работе с Excel: " + ОписаниеОшибки());
КонецПопытки;
Эксель.Quit();
Вспомогательная процедура ЗаписатьЯчейкуOZON помогает абстрагироваться от индексов колонок и делает код более читаемым:
Процедура ЗаписатьЯчейкуOZON(Лист, СооКолонки, НомерСтроки, ИмяПоля, Значение)
НомерКолонки = СооКолонки.Получить(ВРег(ИмяПоля));
Если НомерКолонки <> Неопределено Тогда
Лист.Cells(НомерСтроки, НомерКолонки).Value = Значение;
КонецЕсли;
КонецПроцедуры
Проанализируем ситуацию с категорийными атрибутами. Для многих полей (например, "Тип", "Материал", "Цвет") OZON требует строгого соответствия своим справочникам. Если вы запишете "черный" вместо "черный", выбранного из выпадающего списка (например, если в справочнике OZON это значение имеет другой ID или регистр), загрузка может завершиться с ошибкой.
Важные рекомендации:
Разберем, в каких случаях стоит отказаться от заполнения Excel в пользу других решений. Если номенклатура товаров превышает 1000 позиций или данные меняются ежедневно (например, цены и остатки), ручная загрузка Excel-файлов станет обузой для бизнеса. В этом случае стоит рассмотреть использование API OZON.
Существуют также официальные расширения от OZON для типовых конфигураций 1С (Управление торговлей, ERP, Комплексная автоматизация). Для конфигурации 1С:Управление нашей фирмой (УНФ) может потребоваться адаптация этих модулей, но это часто эффективнее, чем поддержка собственного кода для работы с Excel. Выясним преимущество: официальные модули обновляются разработчиками маркетплейса при изменении протоколов обмена, что снимает часть нагрузки с программиста 1С.
Тем не менее, для небольших магазинов и разовых выгрузок решение через Excel.Application остается самым быстрым и дешевым способом автоматизации, позволяющим избежать ручного ввода данных и минимизировать ошибки "человеческого фактора".