Загрузка данных из внешних файлов, таких как Microsoft Excel, является одной из самых частых задач в практике программиста 1С. Существует множество способов реализации этой задачи: от прямого чтения через COM-объекты до использования современных библиотек. В рамках данной статьи мы подробно разберем наиболее элегантный и быстрый метод через ТабличныйДокумент и ПостроительОтчета, а также выясним, как правильно отобразить полученные данные на управляемой форме.
Этот способ хорош тем, что он не требует установленного Microsoft Excel на сервере или компьютере пользователя. Мы используем внутренние механизмы платформы 1С для парсинга файла. Сначала мы считываем файл в объект ТабличныйДокумент, а затем используем ПостроительОтчета, чтобы быстро превратить визуальные ячейки в структурированную таблицу значений.
Рассмотрим пошагово программный код этого процесса:
// 1. Создаем объект табличного документа и читаем файл
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.Прочитать(ПутьКФайлу);
// 2. Определяем границы заполненной области
ВсегоСтрок = ТабДокумент.ВысотаТаблицы;
ВсегоКолонок = ТабДокумент.ШиринаТаблицы;
Если ВсегоСтрок = 0 Тогда
Возврат;
КонецЕсли;
// 3. Создаем описание источника данных на основе области табличного документа
Область = ТабДокумент.Область(1, 1, ВсегоСтрок, ВсегоКолонок);
ИсточникДанных = Новый ОписаниеИсточникаДанных(Область);
// 4. Используем построитель для выгрузки в Таблицу Значений
ПостроительОтчета = Новый ПостроительОтчета;
ПостроительОтчета.ИсточникДанных = ИсточникДанных;
ПостроительОтчета.Выполнить();
// Результат попадает в обычную таблицу значений
ТЗРезультат = ПостроительОтчета.Результат.Выгрузить();
Проанализируем ситуацию: на данном этапе у нас есть объект ТаблицаЗначений в оперативной памяти. Однако, если мы работаем в управляемом приложении, эта таблица еще не видна пользователю. Нам нужно передать эти данные в реквизит формы.
На управляемой форме таблица представлена типом ДанныеФормыКоллекция. Чтобы данные из ТЗРезультат попали в таблицу на форме (например, с именем СписокСФ), имена колонок в обоих объектах должны полностью совпадать. Часто бывает так, что в Excel колонки называются произвольно (например, "Номер счет-фактуры"), а в коде 1С мы используем программные идентификаторы (например, НомерСФ).
Разберем, как лаконично выполнить сопоставление и загрузку:
// Допустим, в ТЗ после построителя колонка называется "НомерСчет_фактуры"
// А в реквизите формы СписокСФ колонка называется "НомерСФ"
// Переименовываем колонку в исходной ТЗ перед загрузкой
Если ТЗРезультат.Колонки.Найти("НомерСчет_фактуры") <> Неопределено Тогда
ТЗРезультат.Колонки.НомерСчет_фактуры.Имя = "НомерСФ";
КонецЕсли;
// Теперь используем метод Загрузить для заполнения реквизита формы
Объект.СписокСФ.Загрузить(ТЗРезультат);
Важный нюанс: если вы работаете в контексте серверной процедуры и хотите полностью заменить содержимое таблицы формы, можно использовать метод ЗначениеВРеквизитФормы(). Это работает быстрее при больших объемах данных, так как платформа оптимизирует передачу коллекции между сервером и клиентом.
При загрузке из Excel часто возникает проблема несовпадения типов. Например, в ячейке ожидается число, а там записан текст или стоит прочерк. ПостроительОтчета пытается автоматически определить тип колонки по первой строке. Если первая строка содержит заголовок (текст), то и вся колонка в итоговой ТаблицеЗначений может стать строковой.
Чтобы этого избежать, проанализируем следующие рекомендации:
ТаблицаЗначений соответствуют типам в ДанныеФормыКоллекция. Если типы не совпадут, значения в соответствующих ячейках формы будут пустыми.СокрЛП() к строковым значениям.ОписаниеИсточникаДанных можно указать, содержит ли первая строка заголовки. Это поможет ПостроительОтчета правильно именовать колонки.Если метод с табличным документом не подходит (например, нужно читать скрытые листы или формулы), рассмотрим альтернативы:
1. COM-объект (Excel.Application). Позволяет управлять приложением Excel напрямую. Это самый гибкий, но и самый медленный способ. Он требует обязательного наличия установленного Microsoft Excel на компьютере.
Попытка
Excel = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Excel не установлен!");
Возврат;
КонецПопытки;
Книга = Excel.Workbooks.Open(ПутьКФайлу);
Лист = Книга.Sheets(1);
// Чтение конкретной ячейки
Значение = Лист.Cells(1, 1).Value;
Excel.Quit();
2. Чтение через ADO. Позволяет работать с файлом Excel как с базой данных через SQL-запросы. Этот метод работает значительно быстрее COM-объекта, но чувствителен к разрядности операционной системы и драйверам (Microsoft.ACE.OLEDB).
3. Использование БСП. Если ваша конфигурация построена на базе "Библиотеки стандартных подсистем", рекомендуется использовать встроенную подсистему "Загрузка данных из файла". Она предоставляет готовое окно сопоставления колонок, которое избавляет программиста от написания рутинного кода по переименованию реквизитов.
Выясним причину, почему данные могут не отображаться: чаще всего это происходит из-за того, что разработчик забыл создать колонки в таблице на форме. Помните, что метод Загрузить() не создает структуру колонок автоматически, он лишь наполняет данными уже существующие идентификаторы.
Подводя итог, можно сказать, что связка ТабличныйДокумент + ПостроительОтчета является оптимальным балансом между скоростью разработки и производительностью системы для большинства задач по импорту данных.