При автоматизации складского учета и закупок в 1С:Управление торговлей 10.3 (и других конфигурациях на обычных формах) одной из самых частых задач является загрузка данных из Excel. Основная сложность заключается в том, что каждый поставщик присылает файлы в своем формате: у одного колонка с количеством идет второй, а у другого — пятой. Названия заголовков также варьируются: «Товар», «Номенклатура», «Наименование» или «Наименование товара».
В данной статье мы разберем, как построить универсальный механизм загрузки, который позволит пользователю самостоятельно настраивать соответствие колонок без изменения программного кода.
Это самый надежный и часто используемый метод. Вместо того чтобы пытаться найти колонку по её имени в Excel, мы будем хранить в специальном справочнике (например, НастройкиПоставщика) числовые индексы колонок для каждого реквизита документа.
Рассмотрим алгоритм реализации этого метода:
НастройкиПоставщика, где для каждого элемента (связанного с контрагентом) добавляем реквизиты: НомерКолонкиНоменклатура, НомерКолонкиКоличество, НомерКолонкиЦена и НомерСтрокиНачалаДанных.Проанализируем пример кода для реализации обхода файла:
// Предположим, Настройка — это ссылка на справочник НастройкиПоставщика
Для НомерСтроки = Настройка.НомерСтрокиНачалаДанных По ВсегоСтрок Цикл
НоваяСтрока = ТаблицаТоваров.Добавить();
// Получаем данные по номерам колонок из настроек
НоваяСтрока.НоменклатураТекст = СокрЛП(ExcelЛист.Cells(НомерСтроки, Настройка.НомерКолонкиНоменклатура).Value);
НоваяСтрока.Количество = Число(ExcelЛист.Cells(НомерСтроки, Настройка.НомерКолонкиКоличество).Value);
НоваяСтрока.Цена = Число(ExcelЛист.Cells(НомерСтроки, Настройка.НомерКолонкиЦена).Value);
КонецЦикла;
Преимущество этого способа: полная независимость от того, как поставщик назвал колонку. Программе важно только то, что «Номенклатура» всегда находится в столбце №1, а «Цена» — в столбце №4.
Если вы уже считали данные из Excel в промежуточную ТаблицуЗначений (ТЗ), и названия колонок в этой ТЗ соответствуют заголовкам из файла, вы можете использовать обращение через квадратные скобки. Это позволяет писать универсальный код, который подставляет имя колонки из переменной.
Разберем, как это работает на практике:
// ИмяКолонкиИзНастроек — это строка, например, "Наименование" или "Товар"
ИмяКолонкиИзНастроек = Настройка.НазваниеКолонкиТовара;
Для Каждого СтрокаТЗ Из ПолученнаяТаблицаExcel Цикл
// Используем квадратные скобки для динамического обращения
ЗначениеТовара = СтрокаТЗ[ИмяКолонкиИзНастроек];
// Далее выполняем поиск номенклатуры в базе
// ...
КонецЦикла;
Этот метод удобен, когда структура файла относительно стабильна в плане имен заголовков, но сами эти имена различаются у разных контрагентов.
Вместо прямого обращения к COM-объекту Excel (Excel.Application), которое может работать медленно, рекомендуется использовать встроенный объект 1С ТабличныйДокумент. Метод Прочитать() позволяет быстро загрузить данные из файла .xls или .xlsx во внутренний формат 1С.
Рассмотрим по шагам преимущества такого подхода:
ТабличныйДокумент происходит значительно быстрее, чем построчный перебор ячеек через COM.Область(НомерСтроки, НомерКолонки).Текст интуитивно понятна.Пример кода загрузки через ТабДок:
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПутьКФайлу);
// Определяем границы данных
ВсегоСтрок = ТабДок.ВысотаТаблицы;
Для Стр = Настройка.СтартоваяСтрока По ВсегоСтрок Цикл
Артикул = ТабДок.Область(Стр, Настройка.КолонкаАртикул).Текст;
Если ПустаяСтрока(Артикул) Тогда
Продолжить;
КонецЕсли;
// Логика обработки данных...
КонецЦикла;
Чтобы максимально упростить жизнь пользователю, можно реализовать алгоритм «умного поиска». В настройках для каждого реквизита (например, «Номенклатура») можно хранить список возможных синонимов через запятую: "Товар, Номенклатура, Наименование, ТМЦ".
Проанализируем ситуацию: при загрузке программа сканирует первую (заголовочную) строку Excel. Для каждой колонки она проверяет, не совпадает ли её имя с одним из синонимов. Если совпадение найдено, программа автоматически понимает, что данная колонка содержит нужные данные.
При реализации загрузки из Excel важно предусмотреть несколько критических моментов, которые часто игнорируют новички:
СокрЛП() его не удаляет. Рекомендуется написать вспомогательную функцию для очистки строк от мусора.Число()) обязательно удаляйте пробелы.ТаблицаЗначений.Свернуть("Номенклатура", "Количество, Сумма").Для создания гибкой системы загрузки лучше всего использовать комбинацию Справочника настроек (где хранятся индексы колонок) и Табличного документа для чтения файлов. Это обеспечит высокую скорость работы и позволит системе адаптироваться под любые изменения в файлах поставщиков без участия программиста. Достаточно будет один раз настроить номера колонок для нового контрагента в пользовательском режиме.