Как загрузить данные из Excel в таблицу значений или табличную часть 1С начиная с 3-й строки?

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

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

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

Анализ распространенных ошибок при загрузке

Рассмотрим основные причины, из-за которых возникают сложности при чтении данных из файлов Excel через ТабличныйДокумент:

  1. Неверный диапазон цикла. В объекте ТабличныйДокумент нумерация строк и колонок начинается с единицы. Свойство ВысотаТаблицы возвращает точное количество строк. Если написать условие вида Для Сч = 4 По ТабДок.ВысотаТаблицы - 1, последняя строка с данными не будет обработана.
  2. Ошибки приведения типов из-за шапки. Если в колонке с суммами в первых строках находится текст заголовка, автоопределение типов может считать значения как строковые. Кроме того, в Excel к числам часто применяется разделение разрядов (пробелы или неразрывные пробелы), из-за чего функция Число() падает с ошибкой преобразования.
  3. Пустые строки в конце файла. Excel часто сохраняет форматирование (границы, заливку) на пустых строках ниже основных данных. В результате ВысотаТаблицы оказывается больше фактического количества заполненных строк.

Пошаговый алгоритм загрузки с пропуском шапки

Для универсальной и кроссплатформенной загрузки (работающей как на Windows, так и на Linux серверах без установки Microsoft Excel) используем встроенные возможности объекта ТабличныйДокумент.

Разберем реализацию по шагам:

  1. Получаем файл во временное хранилище на клиенте и передаем его на сервер.
  2. Загружаем файл в ТабличныйДокумент с явным указанием способа чтения значений.
  3. Запускаем цикл со строки, в которой начинаются реальные данные (например, с 3-й строки).
  4. Проверяем строки на заполненность, очищаем числа от спецсимволов и заполняем приемник данных (табличную часть или таблицу значений).

Реализация загрузки на сервере

Посмотрим на пример процедуры чтения файла, сохраненного во временный файл на сервере:


&НаСервере
Процедура ЗагрузитьДанныеИзФайлаНаСервере(ИмяВременногоФайла, ДокументОбъект)
    
    ТабДок = Новый ТабличныйДокумент;
    
    // Читаем файл Excel с типизацией значений
    ТабДок.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
    
    ТабЧасть = ДокументОбъект.Начисления;
    ТабЧасть.Очистить();
    
    ВсегоСтрок = ТабДок.ВысотаТаблицы;
    
    // Начинаем обход с 3-й строки, пропуская шапку
    Для НомерСтроки = 3 По ВсегоСтрок Цикл
        
        ТекстСотрудника = СокрЛП(ТабДок.Область(НомерСтроки, 1).Текст);
        ЗначениеСуммы   = ТабДок.Область(НомерСтроки, 2).Значение;
        
        // Пропускаем пустые строки, которые могли попасть из-за форматирования в Excel
        Если ПустаяСтрока(ТекстСотрудника) И (ЗначениеСуммы = Неопределено Или ЗначениеСуммы = 0) Тогда
            Продолжить;
        КонецЕсли;
        
        // Преобразуем сумму к числовому типу
        СуммаЧислом = 0;
        Если ТипЗнч(ЗначениеСуммы) = Тип("Строка") Тогда
            СуммаЧислом = ПреобразоватьСтрокуВЧисло(ЗначениеСуммы);
        ИначеЕсли ЗначениеСуммы <> Неопределено Тогда
            СуммаЧислом = Число(ЗначениеСуммы);
        КонецЕсли;
        
        // Добавляем строку в табличную часть
        НоваяСтрока = ТабЧасть.Добавить();
        НоваяСтрока.Сотрудник = ТекстСотрудника;
        НоваяСтрока.Сумма = СуммаЧислом;
        
    КонецЦикла;
    
КонецПроцедуры

Функция безопасного преобразования строк в числа

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


&НаСервере
Функция ПреобразоватьСтрокуВЧисло(Знач ИсходныйТекст)
    
    // Удаляем неразрывные пробелы (код 160) и стандартные пробелы
    ТекстЧисла = СтрЗаменить(ИсходныйТекст, Символы.НПП, "");
    ТекстЧисла = СтрЗаменить(ТекстЧисла, " ", "");
    
    // Приводим разделитель дробной части к стандартной точке
    ТекстЧисла = СтрЗаменить(ТекстЧисла, ",", ".");
    
    Попытка
        Возврат Число(ТекстЧисла);
    Исключение
        Возврат 0;
    КонецПопытки;
    
КонецФункции

Рекомендации по оптимизации и надежности

При работе с загрузкой из внешних файлов обратите внимание на следующие нюансы:

  1. Параметр чтения значений. Использование СпособЧтенияЗначенийТабличногоДокумента.Значение позволяет сразу получать даты и числа в соответствующих типах платформы 1С, если ячейки Excel были отформатированы штатно.
  2. Удаление временных файлов. После завершения процедуры чтения всегда удаляйте временные файлы с диска с помощью процедуры УдалитьФайлы(), чтобы не засорять дисковое пространство сервера.
  3. Сопоставление ссылочных данных. Если в колонке передан текст (например, ФИО сотрудника или наименование номенклатуры), перед записью в табличную часть следует выполнить поиск ссылки через соответствующие менеджеры справочников (например, Справочники.Сотрудники.НайтиПоНаименованию()).
← На главную