Как эффективно и удобно загружать данные из табличных документов (Excel, CSV) в 1С:Предприятие для конечного пользователя?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет Промышленность, строительство и АПК
← На главную

Задача загрузки данных из табличных документов, таких как файлы Excel или CSV, в информационную базу 1С:Предприятие является одной из самых распространенных для пользователей. Ручной ввод большого объема информации не только трудоемок, но и чреват ошибками. Поэтому эффективные механизмы импорта данных становятся незаменимыми. В этой статье мы с вами подробно разберем различные подходы к решению этой задачи, рассмотрим готовые инструменты и приведем примеры кода для собственной реализации, чтобы вы могли выбрать наиболее подходящий вариант для вашей ситуации.

Используем универсальные обработки и подсистему БСП для гибкой загрузки

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

Рассмотрим подробнее, какие преимущества нам предлагают эти решения:

  1. Гибкость загрузки в различные объекты: Мы можем загружать данные практически в любые объекты информационной базы. Это могут быть:
    • Справочники (в том числе через универсальную загрузку);
    • Табличные части документов;
    • Независимые регистры сведений.
    Некоторые расширенные версии обработок также позволяют загружать данные в зависимые регистры сведений и регистры накопления, часто используя при этом вспомогательные документы, такие как «Корректировка регистров» или «Перенос данных», в качестве регистраторов.
  2. Поддержка разнообразных форматов файлов: Нам не придется беспокоиться о формате исходных данных. Эти инструменты поддерживают работу с такими файлами, как:
    • Excel (файлы с расширениями .xls, .xlsx, а также конвертация из CSV);
    • CSV;
    • MXL (собственный формат 1С);
    • ODS (OpenDocument Spreadsheet);
    • DBF;
    • XML.
    Это обеспечивает широкие возможности для импорта данных из самых разных источников.
  3. Настройка и сопоставление данных: Пользователю предоставляется интуитивно понятный интерфейс для сопоставления колонок из загружаемого табличного документа с реквизитами объектов 1С. Мы можем: Такая гибкость позволяет адаптировать загрузку под специфические требования нашей информационной системы.
  4. Интеллектуальная обработка существующих данных: При загрузке нам предоставляются опции для работы с уже существующими элементами в информационной базе. Мы можем:
    • Искать существующие элементы по заданным критериям;
    • Обновлять найденные элементы новыми данными;
    • Пропускать элементы, если они уже существуют;
    • Создавать новые элементы, если они не найдены.
    Поиск может осуществляться по таким ключевым полям, как штрихкод, код, артикул или наименование.
  5. Автоматизация и контроль заполнения: Некоторые обработки поддерживают возможность автоматической загрузки данных с заданным интервалом. Кроме того, мы можем выполнить предварительный контроль заполнения данных до их непосредственной загрузки, что позволяет минимизировать ошибки и обеспечивает корректность информации.

В современных решениях 1С:Предприятие, особенно при работе с управляемыми формами, для выбора файла на клиенте и его размещения во временном хранилище используются специальные функции БСП. Например, функция ФайловаяСистемаКлиент.ЗагрузитьФайл является современным подходом для безопасной и удобной работы с файлами, исключая прямое взаимодействие с локальными ресурсами клиента на сервере.

Разрабатываем собственную загрузку на основе COM-объектов Excel

Иногда универсальных инструментов бывает недостаточно или требуется специфический функционал, для которого удобнее написать собственный код. В таких случаях мы можем рассмотреть вариант прямого взаимодействия 1С с Microsoft Excel через COM-объекты. Это позволяет нам полностью контролировать процесс чтения данных из файла Excel.

Разберем по шагам пример такой реализации, который был предложен нашими коллегами. Он демонстрирует, как выбрать файл Excel, открыть его, считать данные в ТаблицуЗначений и затем закрыть объекты Excel. Данный подход требует наличия установленного Excel на клиентской машине, где будет выполняться серверная часть кода, или на клиентской машине при клиентском вызове COM-объекта.

Сначала нам потребуется процедура для выбора файла на клиенте:


&НаКлиенте
Процедура ЗагрузитьФайлExcel(Команда)
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Заголовок = "Выберите файл Excel";
    Диалог.Фильтр = "Файлы Excel (*.xls;*.xlsx)|*.xls;*.xlsx";
    Если Диалог.Выбрать() Тогда
        ПутьКФайлу = Диалог.ПолноеИмяФайла;
        ЗагрузитьДанныеИзExcel(ПутьКФайлу);
    КонецЕсли;
КонецПроцедуры

В этой клиентской процедуре мы используем объект ДиалогВыбораФайла для предоставления пользователю стандартного интерфейса выбора файла. Мы устанавливаем заголовок диалога и фильтр для отображения только файлов Excel. После успешного выбора файла, его полный путь передается в серверную процедуру ЗагрузитьДанныеИзExcel.

Далее рассмотрим основную серверную процедуру, которая выполняет непосредственное чтение данных:


&НаСервере
Процедура ЗагрузитьДанныеИзExcel(ПутьКФайлу)
    Попытка
        Excel = Новый COMОбъект("Excel.Application");
    Исключение
        Сообщить("Не удалось открыть Excel. Убедитесь, что Microsoft Excel установлен на компьютере.");
        Возврат;
    КонецПопытки;
 
    Попытка
        Workbook = Excel.Workbooks.Open(ПутьКФайлу);
    Исключение
        Сообщить("Не удалось открыть файл Excel: " + ПутьКФайлу + ". Возможно, файл поврежден или используется другим приложением.");
        Excel.Quit();
        Возврат;
    КонецПопытки;
 
    Sheet = Workbook.Sheets(1); // Получаем первый лист
    RowsCount = Sheet.UsedRange.Rows.Count; // Определяем количество занятых строк
    ColumnsCount = Sheet.UsedRange.Columns.Count; // Определяем количество занятых колонок
 
    ТаблицаЗначений = Новый ТаблицаЗначений;
 
    // Считываем имена колонок из первой строки
    Для Column = 1 По ColumnsCount Цикл
        ИмяКолонки = Sheet.Cells(1, Column).Value;
        Если Тип(ИмяКолонки) = Тип("Строка") Тогда
            ИмяКолонки = СокрЛП(ИмяКолонки);
            ТаблицаЗначений.Колонки.Добавить(ИмяКолонки);
        Иначе
            ТаблицаЗначений.Колонки.Добавить("Колонка_" + Column);
        КонецЕсли;
    КонецЦикла;
 
    // Считываем данные, начиная со второй строки
    Для Row = 2 По RowsCount Цикл
        НоваяСтрока = ТаблицаЗначений.Добавить();
        Для Column = 1 По ColumnsCount Цикл
            Значение = Sheet.Cells(Row, Column).Value;
            НоваяСтрова[Column - 1] = Значение;
        КонецЦикла;
    КонецЦикла;
 
    // Очистка COM-объектов и закрытие Excel
    Workbook.Close();
    Excel.Quit();
 
    Сообщить("Данные из файла Excel успешно загружены в ТаблицуЗначений.");
    // Здесь мы можем добавить код для дальнейшей обработки полученной ТаблицыЗначений,
    // например, для ее сохранения в документы или регистры 1С.
КонецПроцедуры

Давайте проанализируем ключевые моменты этой серверной процедуры:

  1. Инициализация COMОбъект("Excel.Application"): Мы создаем новый COM-объект для взаимодействия с приложением Excel. Важно обернуть эту операцию в блок Попытка...Исключение, поскольку отсутствие Excel на сервере или клиенте (в зависимости от вызова) приведет к ошибке.
  2. Открытие книги и листа: С помощью Excel.Workbooks.Open(ПутьКФайлу) мы открываем указанный файл. Затем получаем доступ к первому листу книги через Workbook.Sheets(1).
  3. Определение границ данных: Методы Sheet.UsedRange.Rows.Count и Sheet.UsedRange.Columns.Count позволяют нам автоматически определить количество занятых строк и колонок на листе, что очень удобно для динамического чтения.
  4. Формирование ТаблицыЗначений: Мы создаем стандартный объект 1С ТаблицаЗначений. В первой строке Excel-файла мы считываем заголовки колонок и используем их для создания колонок в нашей ТаблицеЗначений. Если заголовок пуст или не является строкой, мы присваиваем колонке имя по умолчанию.
  5. Чтение данных: Начиная со второй строки (предполагая, что первая строка – это заголовки), мы построчно и поколоночно считываем значения из ячеек Excel с помощью Sheet.Cells(Row, Column).Value и добавляем их в ТаблицуЗначений.
  6. Очистка ресурсов: Критически важно после завершения работы с Excel-файлом корректно закрыть книгу (Workbook.Close()) и завершить процесс Excel (Excel.Quit()), чтобы избежать зависания экземпляров Excel в памяти.

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

Используем типовые механизмы загрузки в документах 1С

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

Рассмотрим пример. Допустим, мы работаем с документом «Заказ клиента». В его табличной части, где содержится список товаров, мы часто можем найти кнопку «Заполнить». При нажатии на нее нам обычно предлагается пункт «Заполнить из внешнего файла».

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

  1. Поиск номенклатуры: Система будет искать номенклатуру в нашей базе данных по различным ключевым полям:
    • По штрихкоду;
    • По коду;
    • По артикулу;
    • По наименованию.
    Это существенно упрощает процесс заполнения, так как нам не нужно вручную подбирать каждую позицию.
  2. Предварительная проверка: Перед окончательным сохранением данных в документ, система предоставляет возможность проверить найденную информацию. Мы можем увидеть, какие позиции были успешно сопоставлены, а какие требуют дополнительного внимания, что позволяет нам внести корректировки до фиксации данных.

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

Заключение: выбираем оптимальный подход

Мы рассмотрели несколько эффективных способов загрузки данных из табличных документов в 1С:Предприятие. Выбор оптимального подхода зависит от конкретных требований и имеющихся ресурсов:

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

← На главную