Как загрузить данные из одного Excel-файла в две разные табличные части в 1С:УТ 10.3

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

При автоматизации работы с маркетплейсами, такими как Wildberries, программисты 1С часто сталкиваются с проблемой загрузки отчетов. Особенность таких файлов в том, что данные о продажах и возвратах могут располагаться на одном листе друг под другом. Поскольку количество строк в первой таблице (продажи) всегда меняется, адрес начала второй таблицы (возвраты) динамический. В этой статье мы подробно разберем, как реализовать механизм автоматического определения границ таблиц и эффективной загрузки данных в конфигурацию «Управление торговлей 10.3».

Постановка задачи и анализ структуры файла

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

Рассмотрим основные способы решения этой задачи, от простого перебора до высокопроизводительных методов с использованием объектной модели Excel.

Способ 1. Последовательный обход с поиском ключевого слова

Этот метод является наиболее понятным и гибким. Мы запускаем цикл по строкам файла и проверяем содержимое первой или второй колонки. Как только мы встречаем маркер начала новой секции (например, слово «Возврат» или повторный заголовок таблицы), мы переключаем режим записи данных из первой ТЗ во вторую.

Проанализируем пример реализации такого алгоритма:


Функция ПрочитатьExcelСРазделением(ПутьКФайлу)
    Попытка
        Excel = Новый COMОбъект("Excel.Application");
        Книга = Excel.Workbooks.Open(ПутьКФайлу);
        Лист = Книга.Worksheets(1);
    Исключение
        Сообщить("Ошибка при открытии Excel: " + ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;

    ТЗ_Продажи = Новый ТаблицаЗначений;
    ТЗ_Возвраты = Новый ТаблицаЗначений;
    
    // Предварительно добавим колонки в ТЗ (Артикул, Количество, Сумма и т.д.)
    // ...

    МаксСтрок = Лист.UsedRange.Rows.Count;
    РежимЗагрузки = "Продажи"; // Начальный статус

    Для НомерСтроки = 1 По МаксСтрок Цикл
        
        // Читаем значение контрольной ячейки для определения секции
        ЗначениеЯчейки = СокрЛП(Лист.Cells(НомерСтроки, 1).Value);
        
        // Проверяем, не началась ли секция возвратов
        Если Найти(Врег(ЗначениеЯчейки), "ВОЗВРАТ") > 0 Тогда
            РежимЗагрузки = "Возвраты";
            Продолжить; // Пропускаем строку с заголовком
        КонецЕсли;

        // Пропускаем пустые строки или строки-шапки
        Если ПустаяСтрока(ЗначениеЯчейки) Или ЗначениеЯчейки = "№" Тогда
            Продолжить;
        КонецЕсли;

        Если РежимЗагрузки = "Продажи" Тогда
            НоваяСтр = ТЗ_Продажи.Добавить();
            // Заполнение данных продаж
        ИначеЕсли РежимЗагрузки = "Возвраты" Тогда
            НоваяСтр = ТЗ_Возвраты.Добавить();
            // Заполнение данных возвратов
        КонецЕсли;
        
        // Пример заполнения:
        НоваяСтр.Артикул = Лист.Cells(НомерСтроки, 2).Value;
        НоваяСтр.Количество = Лист.Cells(НомерСтроки, 5).Value;

    КонецЦикла;

    Excel.Quit();
    Возврат Новый Структура("Продажи, Возвраты", ТЗ_Продажи, ТЗ_Возвраты);
КонецФункции

Этот подход хорош тем, что нам не нужно знать точный номер строки. Мы ориентируемся на контент, что делает обработку устойчивой к изменениям формата (например, если Wildberries добавит лишнюю строку в шапку).

Способ 2. Загрузка через Табличный документ и Построитель отчета

Если файл Excel имеет сложную структуру, но данные в нем выглядят как аккуратная печатная форма, мы можем использовать встроенные механизмы 1С. Метод Прочитать() объекта ТабличныйДокумент позволяет быстро загрузить файл, а ПостроительОтчета преобразует выбранную область в таблицу значений.

Разберем, как это работает по шагам:

  1. Загружаем весь Excel в ТабличныйДокумент.
  2. Находим координаты строк начала и конца каждой таблицы.
  3. Используем ПостроительОтчета.ИсточникДанных для формирования ТЗ.

// Загружаем файл
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПутьКФайлу);

// Определяем области. Например, программно найдем текст "Возвраты"
ОбластьВозвратов = ТабДок.НайтиТекст("Возвраты");
Если ОбластьВозвратов <> Неопределено Тогда
    НомерСтрокиВозвратов = ОбластьВозвратов.Верх;
КонецЕсли;

// Выгружаем первую таблицу (Продажи)
ОбластьПродаж = ТабДок.Область(1, 1, НомерСтрокиВозвратов - 1, ТабДок.ШиринаТаблицы);
Построитель = Новый ПостроительОтчета;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластьПродаж);
Построитель.Выполнить();
ТЗ_Продажи = Построитель.Результат.Выгрузить();

Важный нюанс: Метод с построителем очень быстрый, но он чувствителен к объединению ячеек. Если в Excel есть объединенные ячейки в области данных, построитель может выдать ошибку или некорректно заполнить колонки.

Способ 3. Оптимизированное чтение через Range.Value (COM)

При работе с большими отчетами (более 10 000 строк) прямое обращение к каждой ячейке через Cells(r, c).Value в цикле будет работать крайне медленно. Выясним причину: каждый вызов Value — это отдельное обращение через мост COM, что создает большие задержки.

Рассмотрим профессиональный подход: чтение всей области данных одним массивом.


ExcelПоследняяСтрока = Лист.Cells.SpecialCells(11).Row; // xlCellTypeLastCell
ExcelПоследняяКолонка = Лист.Cells.SpecialCells(11).Column;

// Получаем все данные в массив одним махом
ОбластьExcel = Лист.Range(Лист.Cells(1, 1), Лист.Cells(ExcelПоследняяСтрока, ExcelПоследняяКолонка));
ДанныеМассив = ОбластьExcel.Value.Выгрузить(); 

// Теперь работаем с обычным массивом в памяти 1С, что в десятки раз быстрее
Для Каждого СтрМассива Из ДанныеМассив Цикл
    // Логика разделения на Продажи и Возвраты аналогична Способу 1
КонецЦикла;

Практические советы по работе с УТ 10.3

При реализации загрузки в типовую «Управление торговлей 10.3» рекомендуем обратить внимание на следующие моменты:

В завершение отметим, что самым стабильным решением для современного бизнеса является переход на использование API Wildberries. Это позволит избежать проблем с изменением формата Excel-файлов, так как структура JSON-ответа через API меняется гораздо реже и документируется официально.

← На главную