Загрузка данных из электронных таблиц Microsoft Excel в табличную часть 1С — это классическая задача, с которой сталкивается каждый разработчик. Однако реализация через COM-объект часто превращается в головную боль: ошибки регистрации класса, несовпадение разрядности клиента и сервера, а также отсутствие установленного Excel на сервере блокируют работу. Рассмотрим подробно, как уйти от проблемных COM-технологий и реализовать надежную загрузку данных.
Разберем ситуацию: при попытке выполнить код Excel = Новый COMОбъект("Excel.Application") система выдает ошибку «Недопустимая строка с указанием класса». Это происходит по нескольким причинам:
&НаСервере, 1С ищет установленное приложение Microsoft Office именно на серверной машине. Если его там нет, объект не будет создан.Проанализируем лучший способ решения — полный отказ от использования COM в пользу встроенных механизмов платформы 1С.
Начиная с версии 8.3.6, платформа 1С умеет читать файлы .xlsx напрямую (Native-режим). Это работает на любой операционной системе, не требует установленного Office и работает значительно быстрее. Разберем, как правильно реализовать чтение файла на сервере.
Сначала необходимо передать файл с компьютера пользователя на сервер через временное хранилище. Посмотрим на пример кода для клиентской части:
&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Фильтр = "Excel (*.xlsx)|*.xlsx";
ОписаниеФайла = Ждать ПоместитьФайлНаСерверАсинхронно(,,, ПараметрыДиалога, УникальныйИдентификатор);
Если ОписаниеФайла <> Неопределено И ОписаниеФайла.ПомещениеВыполнено Тогда
ЗагрузитьДанныеНаСервере(ОписаниеФайла.Адрес);
КонецЕсли;
КонецПроцедуры
Теперь рассмотрим серверную часть, где мы превратим двоичные данные файла в ТабличныйДокумент и прочитаем их:
&НаСервере
Процедура ЗагрузитьДанныеНаСервере(АдресХранилища)
// Получаем имя для временного файла на сервере
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
// Извлекаем данные из хранилища и сохраняем в файл
Данные = ПолучитьИзВременногоХранилища(АдресХранилища);
Данные.Записать(ИмяФайла);
ТабДок = Новый ТабличныйДокумент;
Попытка
// Важно использовать СпособЧтенияЗначенийТабличногоДокумента.Значение
ТабДок.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
Сообщить("Ошибка чтения файла: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Удаляем временный файл сразу после чтения
УдалитьФайлы(ИмяФайла);
// Далее работаем с ТабДок как с обычной таблицей
РазборТабличногоДокумента(ТабДок);
КонецПроцедуры
Когда в файле Excel тысячи строк, обычный обход ячеек через цикл Для по... может работать медленно. Выясним причину: обращение к каждой ячейке Область(стр, кол).Текст требует ресурсов. Чтобы ускорить процесс в разы, воспользуемся объектом ПостроительЗапроса, который умеет мгновенно выгружать данные из ТабличногоДокумента в ТаблицуЗначений.
Рассмотрим пример реализации этого метода:
&НаСервере
Функция ПрочитатьExcelЧерезПостроитель(ТабДок)
// Определяем область данных (все заполненные ячейки)
ВсегоСтрок = ТабДок.ВысотаТаблицы;
ВсегоКолонок = ТабДок.ШиринаТаблицы;
ОбластьДанных = ТабДок.Область(1, 1, ВсегоСтрок, ВсегоКолонок);
// Создаем описание источника данных для построителя
ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластьДанных);
ПЗ = Новый ПостроительЗапроса;
ПЗ.ИсточникДанных = ИсточникДанных;
Попытка
ПЗ.Выполнить();
ТЗ = ПЗ.Результат.Выгрузить();
Возврат ТЗ;
Исключение
// Ошибка "Ожидается выражение ВЫБРАТЬ" возникает, если заголовки некорректны
Сообщить("Ошибка при формировании таблицы: " + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции
Важный нюанс: При использовании ПостроителяЗапроса первая строка вашего Excel-файла должна содержать заголовки колонок. Эти заголовки должны соответствовать правилам именования переменных в 1С: никаких пробелов в начале, спецсимволов вроде «№» или «%» и цифр в начале имени. Если заголовки некорректны, вы получите ошибку «Ожидается выражение ВЫБРАТЬ». В таком случае перед вызовом построителя следует программно очистить первую строку ТабличногоДокумента от запрещенных символов.
Часто при выполнении кода Данные.Записать(ИмяФайла) под обычным пользователем возникает ошибка: «Установлен безопасный режим. Выполнение операции запрещено». Это происходит, если вы запускаете внешнюю обработку, а в системе настроены профили безопасности.
Проанализируем способы решения этой проблемы:
СведенияОВнешнейОбработке обязательно укажите ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);.ПолучитьИмяВременногоФайла(). Система обычно разрешает запись во временные каталоги даже в некоторых ограниченных режимах.Подведем итог нашему исследованию. Для стабильной работы загрузки из Excel в 1С следует придерживаться следующих правил:
Прочитать() — самый надежный и кроссплатформенный инструмент.ПоместитьФайлВоВременноеХранилище для передачи данных с клиента на сервер.ПостроительЗапроса или ПостроительОтчета для мгновенного получения ТаблицыЗначений.Следуя этим рекомендациям, мы создадим отказоустойчивый механизм загрузки, который будет работать одинаково стабильно как на локальной базе, так и в сложном клиент-серверном кластере.