Задача загрузки данных из табличных документов, таких как файлы Excel или CSV, в информационную базу 1С:Предприятие является одной из самых распространенных для пользователей. Ручной ввод большого объема информации не только трудоемок, но и чреват ошибками. Поэтому эффективные механизмы импорта данных становятся незаменимыми. В этой статье мы с вами подробно разберем различные подходы к решению этой задачи, рассмотрим готовые инструменты и приведем примеры кода для собственной реализации, чтобы вы могли выбрать наиболее подходящий вариант для вашей ситуации.
Для большинства сценариев загрузки данных из табличных документов в 1С:Предприятие наиболее предпочтительным и мощным решением является использование универсальных обработок или механизмов, входящих в Библиотеку стандартных подсистем (БСП). Такие инструменты, как «Универсальная загрузка данных из табличного документа» или подсистема «Загрузка данных из файла» из БСП, предоставляют широкий спектр возможностей для пользователя.
Рассмотрим подробнее, какие преимущества нам предлагают эти решения:
.xls, .xlsx, а также конвертация из CSV);В современных решениях 1С:Предприятие, особенно при работе с управляемыми формами, для выбора файла на клиенте и его размещения во временном хранилище используются специальные функции БСП. Например, функция ФайловаяСистемаКлиент.ЗагрузитьФайл является современным подходом для безопасной и удобной работы с файлами, исключая прямое взаимодействие с локальными ресурсами клиента на сервере.
Иногда универсальных инструментов бывает недостаточно или требуется специфический функционал, для которого удобнее написать собственный код. В таких случаях мы можем рассмотреть вариант прямого взаимодействия 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С.
КонецПроцедуры
Давайте проанализируем ключевые моменты этой серверной процедуры:
COMОбъект("Excel.Application"): Мы создаем новый COM-объект для взаимодействия с приложением Excel. Важно обернуть эту операцию в блок Попытка...Исключение, поскольку отсутствие Excel на сервере или клиенте (в зависимости от вызова) приведет к ошибке.Excel.Workbooks.Open(ПутьКФайлу) мы открываем указанный файл. Затем получаем доступ к первому листу книги через Workbook.Sheets(1).Sheet.UsedRange.Rows.Count и Sheet.UsedRange.Columns.Count позволяют нам автоматически определить количество занятых строк и колонок на листе, что очень удобно для динамического чтения.ТаблицыЗначений: Мы создаем стандартный объект 1С ТаблицаЗначений. В первой строке Excel-файла мы считываем заголовки колонок и используем их для создания колонок в нашей ТаблицеЗначений. Если заголовок пуст или не является строкой, мы присваиваем колонке имя по умолчанию.Sheet.Cells(Row, Column).Value и добавляем их в ТаблицуЗначений.Workbook.Close()) и завершить процесс Excel (Excel.Quit()), чтобы избежать зависания экземпляров Excel в памяти.Этот подход дает нам полный контроль, но требует большей ответственности за корректную обработку ошибок и управление ресурсами, а также за наличие установленного Microsoft Excel.
В типовых конфигурациях 1С:Предприятие, особенно начиная с версии 8.3, разработчики уже предусмотрели некоторые встроенные механизмы для удобной загрузки данных из внешних файлов непосредственно в табличные части документов. Это упрощенный, но очень полезный способ для пользователя.
Рассмотрим пример. Допустим, мы работаем с документом «Заказ клиента». В его табличной части, где содержится список товаров, мы часто можем найти кнопку «Заполнить». При нажатии на нее нам обычно предлагается пункт «Заполнить из внешнего файла».
Выбрав этот пункт, мы можем указать файл Excel или другого табличного формата. Система 1С затем автоматически попытается скопировать данные из этого файла в табличную часть документа. При этом используются умные алгоритмы поиска:
Этот метод очень удобен для пользователя, поскольку не требует специальных навыков программирования и встроен непосредственно в привычный рабочий процесс с документами.
Мы рассмотрели несколько эффективных способов загрузки данных из табличных документов в 1С:Предприятие. Выбор оптимального подхода зависит от конкретных требований и имеющихся ресурсов:
В любом случае, важно выбирать решение, которое обеспечивает надежность, удобство для пользователя и минимизацию ошибок при импорте данных. Совмещая эти подходы, мы сможем эффективно справляться с задачами загрузки данных в 1С:Предприятие.