Как загрузить из Excel в 1С 8.3 и 8.2 — пошаговая инструкция для программиста

MS Excel на данный момент является одной из самых распространенных и любимых программ для работы с электронными таблицами. Поэтому зачастую программистам приходится сталкиваться с просьбами пользователей загрузить Excel файл в 1С 8.3.

Ниже будут рассмотрены два способа загрузки: в документ (накладная или установка цены) и в табличный документ. Получившиеся обработку можно скачать по ссылке.

Загрузка из Excel в документ 1С

В качестве примера выберем такой документ, как «Установка цен номенклатуры» в программе 1С Бухгалтерия 3.0. Задачей будет создать документ, заполнить основные реквизиты шапки и заполнить табличную часть «Товары» из Excel файла.

1 шаг – интерфейс

В рамках данной задачи достаточно разместить на форме поле ввода с кнопками выбора, очистки и открытия для выбора файла Excel и кнопку «Загрузить» для выполнения обработки по созданию и заполнению документа «Установка цен номенклатуры».

диалог выбора файла

2 шаг – процедура выбора файла

Для того чтобы открыть и выбрать Excel файл из 1С 8.3, необходимо в событии «НачалоВыбора» поля ввода вызвать ДиалогВыбораФайла с заранее установленным фильтром:

Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите excel - файл";
Диалог.ПолноеИмяФайла = "c:\";
Диалог.Фильтр = "Таблицы (*.xls,*.xlsx)|*.xls;*.xlsx;|Microsoft Excel 97/2000/XP/2003 (*.xls)|*.xls|Microsoft Excel 2007/2010 (*.xlsx)|*.xlsx";

Если Диалог.Выбрать() Тогда
Объект.ФайлExcel = Диалог.ПолноеИмяФайла;
КонецЕсли;

Для работы на web-клиенте, в браузере необходимо подключить расширение работы с файлами.

3 шаг – обработка файла Excel

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

// Попытка открытия файла Excel
Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.WorkBooks.Open(Объект.ФайлExcel);
Исключение
Сообщить("При открытии файла произошла ошибка! Операция прервана!");
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
	
// Попытка выбрать первый лист
// Можно указать любой другой
Попытка 
Excel.Sheets(1).Select();    
Исключение
// Закрытие файла в том случае, если первый лист не найден
Excel.ActiveWorkbook.Close(); 	
Excel = 0;
Сообщить("Первый лист не найден!");
ОтменитьТранзакцию();
Возврат;
КонецПопытки;
	
// Вычисление количества строк и колонок в зависимости от версии Excel
vExcel = Лев(Excel.Version, Найти(Excel.Version,".")-1);
Если vExcel = "8" тогда
КоличествоСтрок = Excel.Cells.CurrentRegion.Rows.Count;
КоличествоКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
Иначе
КоличествоСтрок = Excel.Cells(1,1).SpecialCells(11).Row;
КоличествоКолонок = Excel.Cells(1,1).SpecialCells(11).Column;
Конецесли;

4 шаг – создание документа и заполнение его данными

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

Ниже приведен алгоритм, которым можно воспользоваться в том случае, если файл содержит множество колонок, но загрузить нужно лишь те, которые есть в документе 1С. Так же его можно использовать, когда есть необходимость проверить имена колонок на соответствие именам реквизитов для исключения ошибок.

// Проверка корректности заполнения колонок
// Имена колонок в Excel файле должны совпадать с именами реквизитов табличной части, в которую загружаются данные
// Переменная МассивКолонок содержит список номеров колонок, которые будут перегружаться

МассивКолонок = Новый ТаблицаЗначений;
МассивКолонок.Колонки.Добавить("НомерКолонки");
МассивКолонок.Колонки.Добавить("НазваниеКолонки");

Для КолонкаОтсчета = 1 по КоличествоКолонок Цикл
ИмяКолонки = Excel.Cells(1, КолонкаОтсчета).Text;

// Удаление лишних пробелов из имен колонок
ИмяБезПробелов = СтрЗаменить(ИмяКолонки," ","");

// Проверка наличия реквизитов табличной части "Товары" в документе "УстановкаЦен"
Если НЕ НаличиеРеквизитаТЧ(ИмяБезПробелов, Метаданные.Документы.УстановкаЦенНоменклатуры, "Товары") Тогда

Сообщить("Не найден реквизит с именем " + ИмяБезПробелов + "! Колонка не будет загружена!");

Иначе

НовСтрока = МассивКолонок.Добавить();
НовСтрока.НомерКолонки = КолонкаОтсчета;
НовСтрока.НазваниеКолонки = ИмяБезПробелов;

КонецЕсли;

КонецЦикла;

Вызываемая функция «НаличиеРеквизитаТЧ(ИмяРекв, МетаданныеДок, ИмяТЧ)» проверяет в метаданных документа наличие реквизита выбранной нами табличной части (в данном случае «Товары») по его имени. Функция является универсальной, но если на практике задача загрузки файлов из Excel встречается не часто можно вместо нее сразу указать имена реквизитов табличной части документа для сравнения.

// Проверка наличия реквизита табличной части документа
// Возвращает тип Булево
// Истина - реквизит найден
// Ложь - реквизит не найден

&НаСервере
Функция НаличиеРеквизитаТЧ(ИмяРекв, МетаданныеДок, ИмяТЧ)

// Проверка наличия ТЧ
ТЧ = МетаданныеДок.ТабличныеЧасти.Найти(ИмяТЧ);

Если ТЧ = Неопределено Тогда // Нет такой таб. части в документе
Возврат Ложь;
Иначе
Возврат НЕ (ТЧ.Реквизиты.Найти(ИмяРекв) = Неопределено);
КонецЕсли;

КонецФункции

После того, как был сформирован список загружаемых колонок, нужно приступать  к созданию и заполнению самого документа. В данном примере обязательным условием является наличие в файле Excel колонки с названием «Номенклатура» потому что данный реквизит является обязательным к заполнению.

// Если есть колонки для загрузки
// и есть колонка "Номенклатура, которая является обязательным к заполнению реквизитом

Если МассивКолонок.Количество() <> 0 и МассивКолонок.НайтиСтроки(Новый Структура("НазваниеКолонки", "Номенклатура")).Количество() <> 0 Тогда

// Создание документа и заполнение реквизитов шапки
НовыйДокумент = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Оптовая цена", Истина);
НовыйДокумент.Ответственный = ПараметрыСеанса.ТекущийПользователь;
НовыйДокумент.Комментарий = "Загружено из файла " + Объект.ФайлExcel;

// Заполнение табличной части "Товары"
// Переменная СтрокаОтсчета - номер строки в Excel, с которой начинается заполнение
Для СтрокаОтсчета = 2 по КоличествоСтрок Цикл

НСтр = НовыйДокумент.Товары.Добавить();
НСтр.Валюта = НовыйДокумент.ТипЦен.ВалютаЦены;

Для каждого СтрокаМассив из МассивКолонок Цикл

ТекущееЗначение = Excel.Cells(СтрокаОтсчета, СтрокаМассив.НомерКолонки).Text;

// Получение имени колонки
ИмяКолонки = Excel.Cells(1, СтрокаМассив.НомерКолонки).Text;

// Заполнение строки данными
Если ИмяКолонки = "Номенклатура" Тогда

НСтр.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(ТекущееЗначение, Истина);

ИначеЕсли ИмяКолонки = "Цена" Тогда

НСтр.Цена = ТекущееЗначение;

КонецЕсли;

КонецЦикла;

КонецЦикла;

// Запись и проведение документа
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Создан и заполнен документ " + Строка(НовыйДокумент));

Иначе

Сообщить("В Excel файле не достаточно данных для заполнения документа!");

КонецЕсли;

В результате данной обработки был создан, заполнен данными и проведен документ «Установка цен номенклатуры».

После завершения всех манипуляций с Excel файлом, его необходимо закрыть:

Excel.DisplayAlerts = 0; 
Excel.Quit();
Excel.DisplayAlerts = 1;

Загрузка данных из Excel в табличный документ

Начиная с версии платформы 8.3.6, фирма 1С добавила очень полезный метод, который позволяет загружать данные из Excel в табличный документ 1С. Данный метод применим для таких форматов, как *.xlsx, *.xls, *, ods.

В версии технологической платформы 1C 8.3.10 данный метод позволяет считывать отдельные листы файла, а не весь документ целиком.

Данный функционал реализован в виде метода «Прочитать» у объекта с типом «ТабличныйДокумент».

В качестве примера добавим на форму обработки табличный документ, куда будет выводиться Excel файл и кнопку со следующим кодом, выполняющимся на сервере:

ТабличныйДокумент.Прочитать(Объект.ФайлExcel);

В качестве параметра методу передается адрес нахождения файла текстовой строкой. Для больших файлов Excel данный метод может отрабатывать значительное время.

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

интерфейс обработки

Смотрите также видео о загрузке с помощью типовой обработки: