Как реализовать загрузку данных из Excel в 1С при разных названиях и расположении колонок у поставщиков?

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

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

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

Метод 1. Сопоставление по номерам колонок (индексам)

Это самый надежный и часто используемый метод. Вместо того чтобы пытаться найти колонку по её имени в Excel, мы будем хранить в специальном справочнике (например, НастройкиПоставщика) числовые индексы колонок для каждого реквизита документа.

Рассмотрим алгоритм реализации этого метода:

  1. Создаем справочник НастройкиПоставщика, где для каждого элемента (связанного с контрагентом) добавляем реквизиты: НомерКолонкиНоменклатура, НомерКолонкиКоличество, НомерКолонкиЦена и НомерСтрокиНачалаДанных.
  2. В обработке загрузки пользователь выбирает поставщика, и программа считывает эти настройки.
  3. При обходе строк файла Excel данные извлекаются по зафиксированным номерам.

Проанализируем пример кода для реализации обхода файла:


// Предположим, Настройка — это ссылка на справочник НастройкиПоставщика
Для НомерСтроки = Настройка.НомерСтрокиНачалаДанных По ВсегоСтрок Цикл
    НоваяСтрока = ТаблицаТоваров.Добавить();
    
    // Получаем данные по номерам колонок из настроек
    НоваяСтрока.НоменклатураТекст = СокрЛП(ExcelЛист.Cells(НомерСтроки, Настройка.НомерКолонкиНоменклатура).Value);
    НоваяСтрока.Количество = Число(ExcelЛист.Cells(НомерСтроки, Настройка.НомерКолонкиКоличество).Value);
    НоваяСтрока.Цена = Число(ExcelЛист.Cells(НомерСтроки, Настройка.НомерКолонкиЦена).Value);
КонецЦикла;

Преимущество этого способа: полная независимость от того, как поставщик назвал колонку. Программе важно только то, что «Номенклатура» всегда находится в столбце №1, а «Цена» — в столбце №4.

Метод 2. Использование динамического обращения к свойствам (квадратные скобки)

Если вы уже считали данные из Excel в промежуточную ТаблицуЗначений (ТЗ), и названия колонок в этой ТЗ соответствуют заголовкам из файла, вы можете использовать обращение через квадратные скобки. Это позволяет писать универсальный код, который подставляет имя колонки из переменной.

Разберем, как это работает на практике:


// ИмяКолонкиИзНастроек — это строка, например, "Наименование" или "Товар"
ИмяКолонкиИзНастроек = Настройка.НазваниеКолонкиТовара; 

Для Каждого СтрокаТЗ Из ПолученнаяТаблицаExcel Цикл
    // Используем квадратные скобки для динамического обращения
    ЗначениеТовара = СтрокаТЗ[ИмяКолонкиИзНастроек];
    
    // Далее выполняем поиск номенклатуры в базе
    // ...
КонецЦикла;

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

Метод 3. Предварительная загрузка в Табличный документ

Вместо прямого обращения к COM-объекту Excel (Excel.Application), которое может работать медленно, рекомендуется использовать встроенный объект 1С ТабличныйДокумент. Метод Прочитать() позволяет быстро загрузить данные из файла .xls или .xlsx во внутренний формат 1С.

Рассмотрим по шагам преимущества такого подхода:

Пример кода загрузки через ТабДок:


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

// Определяем границы данных
ВсегоСтрок = ТабДок.ВысотаТаблицы;

Для Стр = Настройка.СтартоваяСтрока По ВсегоСтрок Цикл
    Артикул = ТабДок.Область(Стр, Настройка.КолонкаАртикул).Текст;
    Если ПустаяСтрока(Артикул) Тогда
        Продолжить;
    КонецЕсли;
    // Логика обработки данных...
КонецЦикла;

Метод 4. Интеллектуальное определение колонок по ключевым словам

Чтобы максимально упростить жизнь пользователю, можно реализовать алгоритм «умного поиска». В настройках для каждого реквизита (например, «Номенклатура») можно хранить список возможных синонимов через запятую: "Товар, Номенклатура, Наименование, ТМЦ".

Проанализируем ситуацию: при загрузке программа сканирует первую (заголовочную) строку Excel. Для каждой колонки она проверяет, не совпадает ли её имя с одним из синонимов. Если совпадение найдено, программа автоматически понимает, что данная колонка содержит нужные данные.

Важные технические нюансы и «подводные камни»

При реализации загрузки из Excel важно предусмотреть несколько критических моментов, которые часто игнорируют новички:

  1. Очистка данных: Текст из Excel часто содержит невидимые символы, например, «неразрывный пробел» (код 160). Обычная функция СокрЛП() его не удаляет. Рекомендуется написать вспомогательную функцию для очистки строк от мусора.
  2. Типизация: Помните, что число в Excel может прийти в 1С как строка с пробелами-разделителями (например, "1 500,00"). Перед преобразованием в число (Число()) обязательно удаляйте пробелы.
  3. Поиск номенклатуры: Никогда не полагайтесь только на наименование. Лучше всего использовать приоритетную цепочку поиска: Штрихкод -> Артикул -> Наименование.
  4. Свертка данных: Поставщики могут дублировать строки в прайсах. Перед созданием документа 1С всегда делайте ТаблицаЗначений.Свернуть("Номенклатура", "Количество, Сумма").

Итоги

Для создания гибкой системы загрузки лучше всего использовать комбинацию Справочника настроек (где хранятся индексы колонок) и Табличного документа для чтения файлов. Это обеспечит высокую скорость работы и позволит системе адаптироваться под любые изменения в файлах поставщиков без участия программиста. Достаточно будет один раз настроить номера колонок для нового контрагента в пользовательском режиме.

← На главную