4 — 07.08.10 — 11:58
Перем Эксель, Книга, Лист;
Перем ТабСпр;
Перем Листы;
Перем СпСпрВыгр, СпСпрРегл;
Перем СпНеРегСчетов;
Перем ТабНеРег;
Перем Таб10, Таб43, Таб60, Таб62, Таб76;
//*********************************************************
//
Процедура ВыборФайла(ИмяФайла, Фильтр=»txt»)
Каталог = «»;
Стр = «Файл настройки (*.» + Фильтр + «)|*.» + Фильтр + «»;
Если ФС.ВыбратьФайл(0, ИмяФайла, Каталог, «Выберите файл», Стр, , ) = 1 Тогда
ИмяФайла = Каталог + ИмяФайла;
КонецЕсли;
КонецПроцедуры
//*********************************************************
//
Процедура ПриНачалеВыбораЗначения( Элемент, Флаг )
Если Элемент = «ФайлДляЗагрузки» Тогда
Флаг = 0;
ВыборФайла(ФайлДляЗагрузки, «xls»);
КонецЕсли;
КонецПроцедуры
//******************************************************************************
// ЗапуститьПриложениеЭксель(Знач Путь)
//
// Параметры:
//
//
// Описание:
// Процедура
//
Процедура ЗапуститьПриложениеЭксель(Знач Путь,ТекЛист=»»)
Если ФС.СуществуетФайл(Путь)=0 Тогда
Предупреждение(«Неверно задан путь или не существует файл по пути » + СокрЛП(Путь));
Возврат;
КонецЕсли;
Попытка
// запускаем Эксель-Server
Эксель = СоздатьОбъект(«Excel.Application»);
Исключение
Сообщить(ОписаниеОшибки(),»!»);
КонецПопытки;
Попытка
// открываем файл
Путь=СокрЛП(Путь);
Книга=Эксель.Application.Workbooks.Open(Путь);
Если ТекЛист=»» Тогда
Книга.Worksheets(1).Activate();
Иначе
Книга.Worksheets(ТекЛист).Activate();
КонецЕсли;
Исключение
Сообщить(ОписаниеОшибки(),»!»);
КонецПопытки;
Эксель.Visible=0;
Эксель.DisplayAlerts = 0;
КонецПроцедуры //ЗапуститьПриложениеЭксель(Знач Путь)
//*********************************************************
Процедура СоздатьЗакладки()
Для СчетчикЦикла = -Книга.Worksheets.Count По -2 Цикл
Книга.Worksheets(-СчетчикЦикла).Delete();
КонецЦикла;
Книга.Worksheets(1).Name = «Лист1»;
Для СчетчикЦикла = 1 По Листы.РазмерСписка() Цикл
Книга.Worksheets.Add();
Книга.Worksheets(1).Name = Листы.ПолучитьЗначение(СчетчикЦикла);
КонецЦикла;
Книга.Worksheets(Книга.Worksheets.Count).Delete();
КонецПроцедуры
//*********************************************************
//
Процедура ПриОткрытии()
Если (ПустоеЗначение(НачДата)=1) Тогда
НачДата = КонГода(ДобавитьМесяц(ТекущаяДата(), -12));
КонецЕсли;
КонецПроцедуры
Функция ВернутьЗначениеРеквизита(ЗнРекв)
Перем ВозврЗнач;
Если ТипЗначенияСтр(ЗнРекв) = «Перечисление» Тогда
ВозврЗнач = Строка(ЗнРекв);
ИначеЕсли ТипЗначенияСтр(ЗнРекв) = «Справочник» Тогда
Если СпСпрРегл.НайтиЗначение(ЗнРекв.Вид()) = 0 Тогда
Если ЗнРекв.Вид() = «Подразделения» Тогда
Таб = СоздатьОбъект(«Таблица»);
Таб.ИсходнаяТаблица(ЗнРекв.Вид());
Таб.Вывести();
Для СчетчикЦикла = 1 По Таб.ВысотаТаблицы() Цикл
Если СокрЛП(Таб.Область(СчетчикЦикла,1).Текст) = СокрЛП(ЗнРекв.Код) Тогда
ВозврЗнач = «П» + СокрЛП(Таб.Область(СчетчикЦикла,2).Текст);
Если Прав(ВозврЗнач, 1) = «.» Тогда
ВозврЗнач = Лев(ВозврЗнач, СтрДлина(ВозврЗнач) — 1);
КонецЕсли;
Прервать;
КонецЕсли;
КонецЦикла;
//ВозврЗнач = «П» + ЗнРекв.IDD;
Иначе
ВозврЗнач = ЗнРекв.IDD;
КонецЕсли;
Иначе
Таб = СоздатьОбъект(«Таблица»);
Таб.ИсходнаяТаблица(ЗнРекв.Вид());
Таб.Вывести();
Для СчетчикЦикла = 1 По Таб.ВысотаТаблицы() Цикл
Если СокрЛП(Таб.Область(СчетчикЦикла,1).Текст) = СокрЛП(ЗнРекв.Код) Тогда
ВозврЗнач = СокрЛП(Таб.Область(СчетчикЦикла,2).Текст);
Если Прав(ВозврЗнач, 1) = «.» Тогда
ВозврЗнач = Лев(ВозврЗнач, СтрДлина(ВозврЗнач) — 1);
КонецЕсли;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ИначеЕсли ТипЗначенияСтр(ЗнРекв) = «Счет» Тогда
Таб = СоздатьОбъект(«Таблица»);
Таб.ИсходнаяТаблица(«МэпСчета»);
Таб.Вывести();
Для СчетчикЦикла = 1 По Таб.ВысотаТаблицы() Цикл
Если СокрЛП(Таб.Область(СчетчикЦикла,1).Текст) = СокрЛП(ЗнРекв.Код) Тогда
ВозврЗнач = СокрЛП(Таб.Область(СчетчикЦикла,2).Текст);
Прервать;
КонецЕсли;
КонецЦикла;
Иначе
ВозврЗнач = ЗнРекв;
КонецЕсли;
Возврат ВозврЗнач;
КонецФункции
//*******************************************
Процедура ВыгрузитьПеремещения()
Док = СоздатьОбъект(«Документ.ТребованиеНакладная»);
Для СчетчикЦикла = 1 По Книга.Worksheets.Count Цикл
Если СокрЛП(Книга.Worksheets(СчетчикЦикла).Name) = «ПеремещениеТМЦ» Тогда
Лист = Книга.Worksheets(СчетчикЦикла);
Прервать;
КонецЕсли;
КонецЦикла;
Таб = СоздатьОбъект(«Таблица»);
Таб.ИсходнаяТаблица(«ВидЗатрат»);
Таб.Вывести();
НомСтр = 0;
Док.ВыбратьДокументы(НачДата, КонДата);
Пока Док.ПолучитьДокумент() = 1 Цикл
Если Док.ПометкаУдаления() = 1 Тогда
Продолжить;
КонецЕсли;
Если Док.Проведен() = 0 Тогда
Продолжить;
КонецЕсли;
Если Док.ВидПеремещения = 1 Тогда
Продолжить;
КонецЕсли;
НомСтр = НомСтр + 1;
Лист.Cells(НомСтр, 1).Value = «‘» + Док.IDD;
Подр = «»;
Для СчетчикЦикла = 1 По 3 Цикл
Рекв = Док.ПолучитьАтрибут(«Субконто» + СчетчикЦикла);
Если ТипЗначенияСтр(Рекв) = «Справочник» Тогда
Если Рекв.Вид() = «Подразделения» Тогда
Лист.Cells(НомСтр, 2).Value = «‘» + ВернутьЗначениеРеквизита(Рекв);
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Для СчетчикЦикла = 1 По Таб.ВысотаТаблицы() Цикл
Если лев(Док.СчетЗатрат, 2) = Таб.Область(СчетчикЦикла, 1).текст Тогда
Лист.Cells(НомСтр, 3).Value = «‘» + Таб.Область(СчетчикЦикла, 2).текст;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
//*******************************************
Процедура ВыгрузитьВыписки()
Док = СоздатьОбъект(«Документ.Выписка»);
ТабКонтр = СоздатьОбъект(«ТаблицаЗначений»);
ТабКонтр.НоваяКолонка(«ИДД»);
ТабКонтр.НоваяКолонка(«ДДС»);
ТабКонтр.НоваяКолонка(«Комментарий»);
ТабКонтр.НоваяКолонка(«Контрагент»);
ТабКонтр.НоваяКолонка(«Договор»);
ТабКонтр.НоваяКолонка(«Поступление»);
ТабКонтр.НоваяКолонка(«Списание»);
ТабКонтр.НоваяКолонка(«ДатаДок»);
ТабКонтр.НоваяКолонка(«НомерДок»);
ТабКонтр.НоваяКолонка(«ВидОплаты»);
ТабПодотчет = СоздатьОбъект(«ТаблицаЗначений»);
ТабПодотчет.НоваяКолонка(«ИДД»);
ТабПодотчет.НоваяКолонка(«ДДС»);
ТабПодотчет.НоваяКолонка(«Комментарий»);
ТабПодотчет.НоваяКолонка(«КоррСчет»);
ТабПодотчет.НоваяКолонка(«Сотрудники»);
ТабПодотчет.НоваяКолонка(«Субконто2»);
ТабПодотчет.НоваяКолонка(«Субконто3»);
ТабПодотчет.НоваяКолонка(«Поступление»);
ТабПодотчет.НоваяКолонка(«Списание»);
ТабПроч = СоздатьОбъект(«ТаблицаЗначений»);
ТабПроч.НоваяКолонка(«ИДД»);
ТабПроч.НоваяКолонка(«ДДС»);
ТабПроч.НоваяКолонка(«Комментарий»);
ТабПроч.НоваяКолонка(«КоррСчет»);
ТабПроч.НоваяКолонка(«Субконто1»);
ТабПроч.НоваяКолонка(«Субконто2»);
ТабПроч.НоваяКолонка(«Субконто3»);
ТабПроч.НоваяКолонка(«Поступление»);
ТабПроч.НоваяКолонка(«Списание»);
Док.ВыбратьДокументы(НачДата, КонДата);
Пока Док.ПолучитьДокумент() = 1 Цикл
Если Док.ПометкаУдаления() = 1 Тогда
Продолжить;
КонецЕсли;
Если Док.Проведен() = 0 Тогда
Продолжить;
КонецЕсли;
док.ВыбратьСтроки();
Пока док.ПолучитьСтроку() = 1 Цикл
Если (Лев(Док.КоррСчет, 2) = «60»)
ИЛИ (Лев(Док.КоррСчет, 2) = «62»)
ИЛИ (Лев(Док.КоррСчет, 2) = «76») Тогда
ТабКонтр.НоваяСтрока();
ТабКонтр.ИДД = Док.IDD;
ТабКонтр.ДДС = ВернутьЗначениеРеквизита(Док.ВидДвижения);
ТабКонтр.Комментарий = Док.НазначениеПлатежа;
ТабКонтр.Контрагент = ВернутьЗначениеРеквизита(Док.Субконто1);
ТабКонтр.Договор = ВернутьЗначениеРеквизита(Док.Субконто2);
ТабКонтр.Поступление = Док.Приход;
ТабКонтр.Списание = Док.Расход;
ТабКонтр.ДатаДок = Док.ДатаДокВходящий;
ТабКонтр.НомерДок = Док.НомерДокВходящий;
Если Док.Приход <> 0 Тогда
Если (Лев(Док.КоррСчет, 2) = «60») Тогда
ТабКонтр.ВидОплаты = «Возврат от поставщика»;
Иначе
ТабКонтр.ВидОплаты = «Оплата от покупателя»;
КонецЕсли;
ИначеЕсли Док.Расход <> 0 Тогда
Если (Лев(Док.КоррСчет, 2) = «60») Тогда
ТабКонтр.ВидОплаты = «Оплата поставщику»;
Иначе
ТабКонтр.ВидОплаты = «Возврат покупателю»;
КонецЕсли;
КонецЕсли;
ИначеЕсли (Лев(Док.КоррСчет, 2) = «71») Тогда
ТабПодотчет.НоваяСтрока();
ТабПодотчет.ИДД = Док.IDD;
ТабПодотчет.ДДС = ВернутьЗначениеРеквизита(Док.ВидДвижения);
ТабПодотчет.Комментарий = Док.НазначениеПлатежа;
ТабПодотчет.КоррСчет = ВернутьЗначениеРеквизита(Док.КоррСчет);
ТабПодотчет.Сотрудники = ВернутьЗначениеРеквизита(док.Субконто1);
ТабПодотчет.Субконто2 = ВернутьЗначениеРеквизита(док.Субконто2);
ТабПодотчет.Субконто3 = ВернутьЗначениеРеквизита(док.Субконто3);
ТабПодотчет.Поступление = Док.Приход;
ТабПодотчет.Списание = Док.Расход;
Иначе
ТабПроч.НоваяСтрока();
ТабПроч.ИДД = Док.IDD;
ТабПроч.ДДС = ВернутьЗначениеРеквизита(Док.ВидДвижения);
ТабПроч.Комментарий = Док.НазначениеПлатежа;
ТабПроч.КоррСчет = ВернутьЗначениеРеквизита(Док.КоррСчет);
ТабПроч.Субконто1 = ВернутьЗначениеРеквизита(док.Субконто1);
ТабПроч.Субконто2 = ВернутьЗначениеРеквизита(док.Субконто2);
ТабПроч.Субконто3 = ВернутьЗначениеРеквизита(док.Субконто3);
ТабПроч.Поступление = Док.Приход;
ТабПроч.Списание = Док.Расход;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Для СчетчикЦикла = 1 По Книга.Worksheets.Count Цикл
Если СокрЛП(Книга.Worksheets(СчетчикЦикла).Name) = «ВыпискаКонтрагенты» Тогда
Лист = Книга.Worksheets(СчетчикЦикла);
Прервать;
КонецЕсли;
КонецЦикла;
ТабКонтр.ВыбратьСтроки();
Пока ТабКонтр.ПолучитьСтроку() = 1 Цикл
Для СчетчикЦикла = 1 По ТабКонтр.КоличествоКолонок() Цикл
Лист.Cells(ТабКонтр.НомерСтроки, СчетчикЦикла).Value = «‘» + ТабКонтр.ПолучитьЗначение(ТабКонтр.НомерСтроки, СчетчикЦикла);
КонецЦикла;
КонецЦикла;
Для СчетчикЦикла = 1 По Книга.Worksheets.Count Цикл
Если СокрЛП(Книга.Worksheets(СчетчикЦикла).Name) = «ВыпискаПодотчет» Тогда
Лист = Книга.Worksheets(СчетчикЦикла);
Прервать;
КонецЕсли;
КонецЦикла;
ТабПодотчет.ВыбратьСтроки();
Пока ТабПодотчет.ПолучитьСтроку() = 1 Цикл
Для СчетчикЦикла = 1 По ТабПодотчет.КоличествоКолонок() Цикл
Лист.Cells(ТабПодотчет.НомерСтроки, СчетчикЦикла).Value = «‘» + ТабПодотчет.ПолучитьЗначение(ТабПодотчет.НомерСтроки, СчетчикЦикла);
КонецЦикла;
КонецЦикла;
Для СчетчикЦикла = 1 По Книга.Worksheets.Count Цикл
Если СокрЛП(Книга.Worksheets(СчетчикЦикла).Name) = «ВыпискаПрочее» Тогда
Лист = Книга.Worksheets(СчетчикЦикла);
Прервать;
КонецЕсли;
КонецЦикла;
ТабПроч.ВыбратьСтроки();
Пока ТабПроч.ПолучитьСтроку() = 1 Цикл
Для СчетчикЦикла = 1 По ТабПроч.КоличествоКолонок() Цикл
Лист.Cells(ТабПроч.НомерСтроки, СчетчикЦикла).Value = «‘» + ТабПроч.ПолучитьЗначение(ТабПроч.НомерСтроки, СчетчикЦикла);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
//*******************************************
Процедура ВыгрузитьРКО()
Док = СоздатьОбъект(«Документ.РасходныйОрдер»);
Для СчетчикЦикла = 1 По Книга.Worksheets.Count Цикл
Если СокрЛП(Книга.Worksheets(СчетчикЦикла).Name) = «РасходныйОрдер» Тогда
Лист = Книга.Worksheets(СчетчикЦикла);
Прервать;
КонецЕсли;
КонецЦикла;
НомСтр = 0;
Док.ВыбратьДокументы(НачДата, КонДата);
Пока Док.ПолучитьДокумент() = 1 Цикл
НомСтр = НомСтр + 1;
Лист.Cells(НомСтр, 1).Value = «‘» + Док.IDD;
Если (Лев(Док.КоррСчет.Код, 2) = «60») ИЛИ (Лев(Док.КоррСчет.Код, 2) = «76») Тогда
Лист.Cells(НомСтр, 2).Value = «Расчеты с контрагентами»;
Лист.Cells(НомСтр, 3).Value = «‘» + ВернутьЗначениеРеквизита(Док.Субконто1);
Лист.Cells(НомСтр, 4).Value = «‘» + ВернутьЗначениеРеквизита(Док.Субконто2);
ИначеЕсли Лев(Док.КоррСчет.Код, 2) = «71» Тогда
Лист.Cells(НомСтр, 2).Value = «Расчеты с подотчетными лицами»;
Лист.Cells(НомСтр, 3).Value = «‘» + ВернутьЗначениеРеквизита(Док.Субконто1);
ИначеЕсли Лев(Док.КоррСчет.Код, 2) = «70» Тогда
Лист.Cells(НомСтр, 2).Value = «Прочие операции»;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
//*******************************************
Процедура ВыгрузитьАО()
Для СчетчикЦикла = 1 По Книга.Worksheets.Count Цикл
Если СокрЛП(Книга.Worksheets(СчетчикЦикла).Name) = «АвансовыйОтчет» Тогда
Лист = Книга.Worksheets(СчетчикЦикла);
Прервать;
КонецЕсли;
КонецЦикла;
НомСтр = 0;
Док = СоздатьОбъект(«Документ.АвансовыйОтчет»);
Док.ВыбратьДокументы(НачДата, КонДата);
Пока Док.ПолучитьДокумент() = 1 Цикл
Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку() = 1 Цикл
НомСтр = НомСтр + 1;
Лист.Cells(НомСтр, 1).Value = «‘» + Док.IDD;
Лист.Cells(НомСтр, 2).Value = «‘» + ВернутьЗначениеРеквизита(Док.Сотрудник);
Лист.Cells(НомСтр, 3).Value = «‘» + ВернутьЗначениеРеквизита(Док.НаименованиеАванса);
Лист.Cells(НомСтр, 4).Value = «‘» + ВернутьЗначениеРеквизита(Док.КоррСчет);
Лист.Cells(НомСтр, 5).Value = «‘» + ВернутьЗначениеРеквизита(Док.Субконто1);
Лист.Cells(НомСтр, 6).Value = «‘» + ВернутьЗначениеРеквизита(Док.Субконто2);
Лист.Cells(НомСтр, 7).Value = «‘» + ВернутьЗначениеРеквизита(Док.Субконто3);
Лист.Cells(НомСтр, 8).Value = «‘» + ВернутьЗначениеРеквизита(Док.КомуЗаЧто);
Лист.Cells(НомСтр, 9).Value = «‘» + ВернутьЗначениеРеквизита(Док.ДатаС);
Лист.Cells(НомСтр, 10).Value = «‘» + ВернутьЗначениеРеквизита(Док.НомерДокумента);
Лист.Cells(НомСтр, 11).Value = ВернутьЗначениеРеквизита(Док.Сумма);
Лист.Cells(НомСтр, 12).Value = ВернутьЗначениеРеквизита(Док.СуммаПоОтчету);
Лист.Cells(НомСтр, 13).Value = ВернутьЗначениеРеквизита(Док.НДС);
Лист.Cells(НомСтр, 14).Value = ВернутьЗначениеРеквизита(Док.Количество);
Лист.Cells(НомСтр, 15).Value = ВернутьЗначениеРеквизита(Док.НаименованиеАванса);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
//*******************************************
Процедура Сформировать()
Если ПустоеЗначение(НачДата) = 1 Тогда
Предупреждение(«Необходимо указать дату остатков!», 60);
Возврат;
КонецЕсли;
Если ПустоеЗначение(ФайлДляЗагрузки) = 1 Тогда
Предупреждение(«Необходимо указать файл для выгрузки остатков!», 60);
Возврат;
КонецЕсли;
ЗапуститьПриложениеЭксель(ФайлДляЗагрузки);
СоздатьЗакладки();
Лист = Эксель.Worksheets(1);
ВыгрузитьПеремещения();
ВыгрузитьВыписки();
ВыгрузитьРКО();
ВыгрузитьАО();
Книга.Save();
Эксель.DisplayAlerts = 1;
Эксель.Quit();
КонецПроцедуры
ТабСпр = СоздатьОбъект(«ТаблицаЗначений»);
Листы = СоздатьОбъект(«СписокЗначений»);
Листы.ДобавитьЗначение(«ПеремещениеТМЦ»);
Листы.ДобавитьЗначение(«ВыпискаКонтрагенты»);
Листы.ДобавитьЗначение(«ВыпискаПодотчет»);
Листы.ДобавитьЗначение(«ВыпискаПрочее»);
Листы.ДобавитьЗначение(«РасходныйОрдер»);
Листы.ДобавитьЗначение(«АвансовыйОтчет»);
СпСпрВыгр = СоздатьОбъект(«СписокЗначений»);
СпСпрРегл = СоздатьОбъект(«СписокЗначений»);
СпСпрРегл.ДобавитьЗначение(«СтатьиЗатратНаПроизводство»);
СпСпрРегл.ДобавитьЗначение(«ВидыНоменклатуры»);
СпСпрРегл.ДобавитьЗначение(«ПрочиеДоходыИРасходы»);
СпСпрРегл.ДобавитьЗначение(«ДвиженияДенежныхСредств»);
СпНеРегСчетов = СоздатьОбъект(«СписокЗначений»);
СпНеРегСчетов.ДобавитьЗначение(СчетПоКоду(«01.1»));
СпНеРегСчетов.ДобавитьЗначение(СчетПоКоду(«02.1»));
На чтение 9 мин Просмотров 26.4к. Опубликовано 09.11.2017
MS Excel давно стал стандартом для работы с электронными таблицами. В статье рассматриваются способы программной выгрузки и загрузки из 1С в файлы Excel.
Существует несколько способов программной работы с файлами Excel из 1С. Каждый из них имеет свои преимущества и недостатки.
Содержание
- Обмен через табличный документ
- Обмен через OLE
- Использование COMSafeArray
- Обмен через ADO
- Выгрузка без программирования
Обмен через табличный документ
Данный способ простой. Его суть заключается в том, что объект ТабличныйДокумент имеет методы:
- Записать(<ИмяФайла>, <ТипФайлаТаблицы>) для выгрузки данных в файл;
- Прочитать(<ИмяФайла>, <СпособЧтенияЗначений>) для загрузки данных из файла.
Внимание!
Метод Записать() доступен как на клиенте, так и на сервере. Метод Прочитать() доступен только на стороне сервера. Необходимо помнить об этом
при планировании клиент-серверного взаимодействия.
Рассмотрим пример сохранения табличного документа в файл. Необходимо любым способом создать и заполнить объект ТабличныйДокумент, а выгрузка в файл осуществляется всего лишь одной строкой:
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Здесь ТабДок — сформированный табличный документ, ПутьКФайлу — имя файла для выгрузки, ТипФайлаТабличногоДокумента.XLSX — формат создаваемого файла. Поддерживаются следующие форматы Excel:
- XLS95 — формат Excel 95;
- XLS97 — формат Excel 97;
- XLSX — формат Excel 2007.
Загрузка из файла осуществляется также достаточно просто:
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Здесь ПутьКФайлу — путь к загружаемому файлу Excel. СпособЧтенияЗначенийТабличногоДокумента.Значение определяет, каким образом нужно интерпретировать данные, считываемые из исходного документа. Доступны варианты:
- Значение;
- Текст.
Обмен через OLE
Обмен через технологию OLE automation, пожалуй, самый распространенный вариант программной работы с файлами Excel. Он позволяет использовать весь функционал, предоставляемый Excel, но отличается медленной скоростью работы по сравнению с другими способами. Для обмена через OLE требуется установка MS Excel:
- На компьютере конечного пользователя, если обмен происходит на стороне клиента;
- На компьютере сервера 1С:Предприятие, если обмен происходит на стороне сервера.
Пример выгрузки:
// Создание COM-объекта
Эксель = Новый COMОбъект(«Excel.Application»);
// Отключение вывода предупреждений и вопросов
Эксель.DisplayAlerts = Ложь;
// Создание новой книги
Книга = Эксель.WorkBooks.Add();
// Позиционирование на первом листе
Лист = Книга.Worksheets(1);// Запись значения в ячейку
Лист.Cells(НомерСтроки, НомерКолонки).Value = ЗначениеЯчейки;// Сохранение файла
Книга.SaveAs(ИмяФайла);// Закрытие Эксель и освобождение памяти
Эксель.Quit();
Эксель = 0;
Примеры чтения:
// —— ВАРИАНТ 1 ——
// Создание COM-объекта
Эксель = Новый COMОбъект(«Excel.Application»);
// Открытие книги
Книга = Эксель.Workbooks.Open(ПутьКФайлу);
// Позиционирование на нужном листе
Лист = Книга.Worksheets(1);// Чтение значения ячейки, обычно здесь располагается цикл обхода ячеек
ЗначениеЯчейки = Лист.Cells(НомерСтроки, НомерКолонки).Value;// Закрытие книги
Книга.Close(0);// Закрытие Эксель и освобождение памяти
Эксель.Quit();
Эксель = 0;// —— ВАРИАНТ 2 ——
// Открытие книги
Книга = ПолучитьCOMОбъект(ПутьКФайлу);
// Позиционирование на нужном листе
Лист = Книга.Worksheets(1);// Чтение значения ячейки, обычно здесь располагается цикл обхода ячеек
ЗначениеЯчейки = Лист.Cells(НомерСтроки, НомерКолонки).Value;// Закрытие книги
Книга.Application.Quit();
Для обхода всех заполненных строк листа Excel можно использовать следующие приемы:
// —— ВАРИАНТ 1 ——
КоличествоСтрок = Лист.Cells(1, 1).SpecialCells(11).Row;
Для НомерСтроки = 1 По КоличествоСтрок Цикл
ЗначениеЯчейки = Лист.Cells(НомерСтроки, НомерКолонки).Value;
КонецЦикла;// —— ВАРИАНТ 2 ——
НомерСтроки = 0;
Пока Истина Цикл
НомерСтроки = НомерСтроки + 1;
ЗначениеЯчейки = Лист.Cells(НомерСтроки, НомерКолонки).Value;
Если НЕ ЗначениеЗаполнено(ЗначениеЯчейки) Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Вместо последовательного обхода всех строк листа можно выгрузить все данные в массив и работать с ним. Такой подход будет быстрее при чтении большого объема данных:
ВсегоКолонок = Лист.Cells(1, 1).SpecialCells(11).Column;
ВсегоСтрок = Лист.Cells(1, 1).SpecialCells(11).Row;Область = Лист.Range(Лист.Cells(1, 1), Лист.Cells(ВсегоСтрок, ВсегоКолонок));
Данные = Область.Value.Выгрузить();
В таблице ниже приведены наиболее востребованные свойства и методы для работы с Excel через OLE:
Действие | Код | Комментарий |
Работа с приложением | ||
Установка видимости окна приложения | Эксель.Visible = Ложь; | |
Установка режима вывода предупреждений (выводить/не выводить) | Эксель.DisplayAlerts = Ложь; | |
Закрытие приложения | Эксель.Quit(); | |
Работа с книгой | ||
Создание новой книги | Книга = Эксель.WorkBooks.Add(); | |
Открытие существующей книги | Книга = Эксель.WorkBooks.Open(ИмяФайла); | |
Сохранение книги | Книга.SaveAs(ИмяФайла); | |
Закрытие книги | Книга.Close(0); | |
Работа с листом | ||
Установка текущего листа | Лист = Книга.WorkSheets(НомерЛиста); | |
Установка имени | Лист.Name = Имя; | |
Установка защиты | Лист.Protect(); | |
Снятие защиты | Лист.UnProtect(); | |
Установка ориентации страницы | Лист.PageSetup.Orientation = 2; | 1 — книжная, 2 — альбомная |
Установка левой границы | Лист.PageSetup.LeftMargin = Эксель.CentimetersToPoints(Сантиметры); | |
Установка верхней границы | Лист.PageSetup.TopMargin = Эксель.CentimetersToPoints(Сантиметры); | |
Установка правой границы | Лист.PageSetup.RightMargin = Эксель.CentimetersToPoints(Сантиметры); | |
Установка нижней границы | Лист.PageSetup.BottomMargin = Эксель.CentimetersToPoints(Сантиметры); | |
Работа со строками, колонками, ячейками | ||
Установка ширины колонки | Лист.Columns(НомерКолонки).ColumnWidth = Ширина; | |
Удаление строки | Лист.Rows(НомерСтроки).Delete(); | |
Удаление колонки | Лист.Columns(НомерКолонки).Delete(); | |
Удаление ячейки | Лист.Cells(НомерСтроки, НомерКолонки).Delete(); | |
Установка значения | Лист.Cells(НомерСтроки, НомерКолонки).Value = Значение; | |
Объединение ячеек | Лист.Range(Лист.Cells(НомерСтроки, НомерКолонки), Лист.Cells(НомерСтроки1, НомерКолонки1)).Merge(); | |
Установка шрифта | Лист.Cells(НомерСтроки, НомерКолонки).Font.Name = ИмяШрифта; | |
Установка размера шрифта | Лист.Cells(НомерСтроки, НомерКолонки).Font.Size = РазмерШрифта; | |
Установка жирного шрифта | Лист.Cells(НомерСтроки, НомерКолонки).Font.Bold = 1; | 1 — жирный шрифт, 0 — нормальный |
Установка курсива | Лист.Cells(НомерСтроки, НомерКолонки).Font.Italic = 1; | 1 — курсив, 0 — нормальный |
Установка подчеркнутого шрифта | Лист.Cells(НомерСтроки, НомерКолонки).Font.Underline = 2; | 2 — подчеркнутый, 1 — нет |
Для того, чтобы узнать какое свойство нужно менять или какой метод вызвать можно воспользоваться макросами Excel. Если записать макрос с требуемыми действиями, то после можно посмотреть программный код на VBA записанного макроса.
Использование COMSafeArray
При выгрузке больших объемов данных из 1С в Excel для ускорения можно использовать объект COMSafeArray. Согласно определению из синтакс-помощника, COMSafeArray — объектная оболочка над многомерным массивом SafeArray из COM. Позволяет создавать и использовать SafeArray для обмена данными между COM-объектами. Проще говоря, это массив значений, который можно использовать для обмена между приложениями по технологии OLE.
// Создание COMSafeArray
МассивКом = Новый COMSafeArray(«VT_Variant», ВсегоКолонок, ВсегоСтрок);
// Заполнение COMSafeArray
Для Стр = 0 По ВсегоСтрок — 1 Цикл
Для Кол = 0 По ВсегоКолонок — 1 Цикл
МассивКом.SetValue(Кол, Стр, Значение);
КонецЦикла;
КонецЦикла;
// Присвоение области листа Excel значений из COMSafeArray
Лист.Range(Лист.Cells(1, 1), Лист.Cells(ВсегоСтрок, ВсегоКолонок)).Value = МассивКом;
Обмен через ADO
Файл Excel при обмене через ADO представляет собой базу данных, к которой можно обращаться при помощи SQL-запросов. Установка MS Excel не требуется, но обязательно наличие драйвера ODBC, при помощи которого будет осуществляться доступ. Используемый драйвер ODBC определяется при указании строки соединения к файлу. Обычно требуемый драйвер уже установлен на компьютере.
Обмен через ADO заметно быстрее обмена через OLE, но при выгрузке нет возможности использовать функционал Excel для оформления ячеек, разметки страниц, задания формул и т.д.
Пример выгрузки:
// Создание COM-объекта для соединения
Соединение = Новый COMОбъект(«ADODB.Connection»);// Установка строки соединения
Соединение.ConnectionString = «
|Provider=Microsoft.ACE.OLEDB.12.0;
|Data Source=»+ИмяФайла+«;
|Extended Properties=»»Excel 12.0 XML;HDR=YES»»;»;
Соединение.Open(); // Открытие соединения// Создание COM-объекта для команды
Команда = Новый COMОбъект(«ADODB.Command»);
Команда.ActiveConnection = Соединение;// Присвоение текста команды для создания таблицы
Команда.CommandText = «CREATE TABLE [Лист1] (Колонка1 char(255), Колонка2 date, Колонка3 int, Колонка4 float)»;
Команда.Execute(); // Выполнение команды// Присвоение текста команды для добавления строки таблицы
Команда.CommandText = «INSERT INTO [Лист1] (Колонка1, Колонка2, Колонка3, Колонка4) values (‘абвгдеё’, ‘8/11/2017’, ‘12345’, ‘12345,6789’)»;
Команда.Execute(); // Выполнение команды// Удаление команды и закрытие соединения
Команда = Неопределено;
Соединение.Close();
Соединение = Неопределено;
Для создания нового листа и формирования его структуры можно воспользоваться объектами ADOX.Catalog и ADOX.Table. В этом случае код примет вид:
// Создание COM-объекта для работы с книгой
Книга = Новый COMОбъект(«ADOX.Catalog»);
Книга.ActiveConnection = Соединение;// Создание COM-объекта для работы со структурой данных на листе
Таблица = Новый COMОбъект(«ADOX.Table»);
Таблица.Name = «Лист1»;
Таблица.Columns.Append(«Колонка1», 202);
Таблица.Columns.Append(«Колонка2», 7);
Таблица.Columns.Append(«Колонка3», 5);
Таблица.Columns.Append(«Колонка4», 5);// Создание в книге листа с описанной структурой
Книга.Tables.Append(Таблица);
Таблица = Неопределено;
Книга = Неопределено;
В приведенном примере в методе
Таблица.Columns.Append(«Колонка1», 202);
во втором параметре указывается тип колонки. Параметр необязательный, вот некоторые значения типа колонки:
- 5 — adDouble;
- 6 — adCurrency;
- 7 — adDate;
- 11 — adBoolean;
- 202 — adVarWChar;
- 203 — adLongVarWChar.
Пример чтения:
// Создание COM-объекта для соединения
Соединение = Новый COMОбъект(«ADODB.Connection»);// Установка строки соединения
Соединение.ConnectionString = «
|Provider=Microsoft.ACE.OLEDB.12.0;
|Data Source=»+ИмяФайла+«;
|Extended Properties=»»Excel 12.0 XML;HDR=YES»»;»;
Соединение.Open(); // Открытие соединения// Создание COM-объекта для получения выборки
Выборка = Новый COMОбъект(«ADODB.Recordset»);
ТекстЗапроса = «SELECT * FROM [Лист1$]»;// Выполнение запроса
Выборка.Open(ТекстЗапроса, Соединение);// Обход результата выборки
Пока НЕ Выборка.EOF() Цикл
ЗначениеКолонки1 = Выборка.Fields.Item(«Колонка1»).Value; // Обращение по имени колонки
ЗначениеКолонки2 = Выборка.Fields.Item(0).Value; // Обращение по индексу колонки
Выборка.MoveNext();
КонецЦикла;Выборка.Close();
Выборка = Неопределено;
Соединение.Close();
Соединение = Неопределено;
В строке соединения параметр HDR определяет как будет восприниматься первая строка на листе. Возможны варианты:
- YES — первая строка воспринимается как названия колонок. К значениям можно обращаться по имени и по индексу колонки.
- NO — первая строка воспринимается как данные. К значениям можно обращаться только по индексу колонки.
В приведенных примерах рассмотрено лишь несколько объектов ADO. Объектная модель ADO состоит из следующих объектов:
- Connection;
- Command;
- Recordset;
- Record;
- Fields;
- Stream;
- Errors;
- Parameters;
- Properties.
Выгрузка без программирования
Для сохранения данных из 1С в Excel не всегда целесообразно прибегать к программированию. Если в режиме Предприятия пользователь может отобразить требуемые для выгрузки данные, то, их возможно сохранить в Excel без программирования.
Для сохранения табличного документа (например, результата отчета) можно вызвать команду Сохранить или Сохранить как… главного меню.
В открывшемся окне требуется выбрать каталог, имя и формат сохраняемого файла.
Для сохранения данных динамических списков (например, списка номенклатуры) необходимо:
- Вывести данные в табличный документ при помощи команды Еще ⇒ Вывести список…;
- Сохранить табличный документ в требуемый формат.
Содержание
- Работа с файлами Excel
- Обмен через табличный документ
- Обмен через OLE
- Использование COMSafeArray
- Обмен через ADO
- Выгрузка без программирования
Работа с файлами Excel
MS Excel давно стал стандартом для работы с электронными таблицами. В статье рассматриваются способы программной выгрузки и загрузки из 1С в файлы Excel.
Существует несколько способов программной работы с файлами Excel из 1С. Каждый из них имеет свои преимущества и недостатки.
Обмен через табличный документ
Данный способ простой. Его суть заключается в том, что объект ТабличныйДокумент имеет методы:
- Записать ( ИмяФайла >, ТипФайлаТаблицы >) для выгрузки данных в файл;
- Прочитать ( ИмяФайла >, СпособЧтенияЗначений >) для загрузки данных из файла.
Внимание!
Метод Записать () доступен как на клиенте, так и на сервере. Метод Прочитать () доступен только на стороне сервера. Необходимо помнить об этом
при планировании клиент-серверного взаимодействия.
Рассмотрим пример сохранения табличного документа в файл. Необходимо любым способом создать и заполнить объект ТабличныйДокумент, а выгрузка в файл осуществляется всего лишь одной строкой:
ТабДок . Записать ( ПутьКФайлу , ТипФайлаТабличногоДокумента . XLSX );
Здесь ТабДок — сформированный табличный документ, ПутьКФайлу — имя файла для выгрузки, ТипФайлаТабличногоДокумента.XLSX — формат создаваемого файла. Поддерживаются следующие форматы Excel:
- XLS95 — формат Excel 95;
- XLS97 — формат Excel 97;
- XLSX — формат Excel 2007.
Загрузка из файла осуществляется также достаточно просто:
ТабДок = Новый ТабличныйДокумент ;
ТабДок . Прочитать ( ПутьКФайлу , СпособЧтенияЗначенийТабличногоДокумента.Значение );
Здесь ПутьКФайлу — путь к загружаемому файлу Excel. СпособЧтенияЗначенийТабличногоДокумента.Значение определяет, каким образом нужно интерпретировать данные, считываемые из исходного документа. Доступны варианты:
Обмен через OLE
Обмен через технологию OLE automation, пожалуй, самый распространенный вариант программной работы с файлами Excel. Он позволяет использовать весь функционал, предоставляемый Excel, но отличается медленной скоростью работы по сравнению с другими способами. Для обмена через OLE требуется установка MS Excel:
- На компьютере конечного пользователя, если обмен происходит на стороне клиента;
- На компьютере сервера 1С:Предприятие, если обмен происходит на стороне сервера.
Пример выгрузки:
// Создание COM-объекта
Эксель = Новый COMОбъект ( «Excel.Application» );
// Отключение вывода предупреждений и вопросов
Эксель . DisplayAlerts = Ложь;
// Создание новой книги
Книга = Эксель . WorkBooks . Add ();
// Позиционирование на первом листе
Лист = Книга . Worksheets ( 1 );
// Запись значения в ячейку
Лист . Cells ( НомерСтроки , НомерКолонки ). Value = ЗначениеЯчейки ;
// Сохранение файла
Книга . SaveAs ( ИмяФайла );
// Закрытие Эксель и освобождение памяти
Эксель . Quit ();
Эксель = 0 ;
Примеры чтения:
// Создание COM-объекта
Эксель = Новый COMОбъект ( «Excel.Application» );
// Открытие книги
Книга = Эксель . Workbooks . Open ( ПутьКФайлу );
// Позиционирование на нужном листе
Лист = Книга . Worksheets ( 1 );
// Чтение значения ячейки, обычно здесь располагается цикл обхода ячеек
ЗначениеЯчейки = Лист . Cells ( НомерСтроки , НомерКолонки ). Value ;
// Закрытие книги
Книга . Close ( 0 );
// Закрытие Эксель и освобождение памяти
Эксель . Quit ();
Эксель = 0 ;
// Открытие книги
Книга = ПолучитьCOMОбъект ( ПутьКФайлу );
// Позиционирование на нужном листе
Лист = Книга . Worksheets ( 1 );
// Чтение значения ячейки, обычно здесь располагается цикл обхода ячеек
ЗначениеЯчейки = Лист . Cells ( НомерСтроки , НомерКолонки ). Value ;
// Закрытие книги
Книга . Application . Qui t ();
Для обхода всех заполненных строк листа Excel можно использовать следующие приемы:
// —— ВАРИАНТ 1 ——
КоличествоСтрок = Лист . Cells ( 1 , 1 ). SpecialCells ( 11 ). Row ;
Для НомерСтроки = 1 По КоличествоСтрок Цикл
ЗначениеЯчейки = Лист . Cells ( НомерСтроки , НомерКолонки ). Value ;
КонецЦикла;
// —— ВАРИАНТ 2 ——
НомерСтроки = 0 ;
Пока Истина Цикл
НомерСтроки = НомерСтроки + 1 ;
ЗначениеЯчейки = Лист . Cells ( НомерСтроки , НомерКолонки ). Value ;
Если НЕ ЗначениеЗаполнено ( ЗначениеЯчейки ) Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Вместо последовательного обхода всех строк листа можно выгрузить все данные в массив и работать с ним. Такой подход будет быстрее при чтении большого объема данных:
ВсегоКолонок = Лист . Cells ( 1 , 1 ). SpecialCells ( 11 ). Column ;
ВсегоСтрок = Лист . Cells ( 1 , 1 ). SpecialCells ( 11 ). Row ;
Область = Лист . Range ( Лист . Cells ( 1 , 1 ), Лист . Cells ( ВсегоСтрок , ВсегоКолонок ));
Данные = Область . Value . Выгрузить ();
В таблице ниже приведены наиболее востребованные свойства и методы для работы с Excel через OLE:
Действие | Код | Комментарий |
Работа с приложением | ||
Установка видимости окна приложения | Эксель . Visible = Ложь; | |
Установка режима вывода предупреждений (выводить/не выводить) | Эксель . DisplayAlerts = Ложь; | |
Закрытие приложения | Эксель . Quit (); | |
Работа с книгой | ||
Создание новой книги | Книга = Эксель . WorkBooks . Add (); | |
Открытие существующей книги | Книга = Эксель . WorkBooks . Open ( ИмяФайла ); | |
Сохранение книги | Книга . SaveAs ( ИмяФайла ); | |
Закрытие книги | Книга . Close ( 0 ); | |
Работа с листом | ||
Установка текущего листа | Лист = Книга . WorkSheets ( НомерЛиста ); | |
Установка имени | Лист . Name = Имя ; | |
Установка защиты | Лист . Protect (); | |
Снятие защиты | Лист . UnProtect (); | |
Установка ориентации страницы | Лист . PageSetup . Orientation = 2 ; | 1 — книжная, 2 — альбомная |
Установка левой границы | Лист . PageSetup . LeftMargin = Эксель . CentimetersToPoints ( Сантиметры ); | |
Установка верхней границы | Лист . PageSetup . TopMargin = Эксель . CentimetersToPoints ( Сантиметры ); | |
Установка правой границы | Лист . PageSetup . RightMargin = Эксель . CentimetersToPoints ( Сантиметры ); | |
Установка нижней границы | Лист . PageSetup . BottomMargin = Эксель . CentimetersToPoints ( Сантиметры ); | |
Работа со строками, колонками, ячейками | ||
Установка ширины колонки | Лист . Columns ( НомерКолонки ). ColumnWidth = Ширина ; | |
Удаление строки | Лист . Rows ( НомерСтроки ). Delete (); | |
Удаление колонки | Лист . Columns ( НомерКолонки ). Delete (); | |
Удаление ячейки | Лист . Cells ( НомерСтроки , НомерКолонки ). Delete (); | |
Установка значения | Лист . Cells ( НомерСтроки , НомерКолонки ). Value = Значение ; | |
Объединение ячеек | Лист . Range ( Лист . Cells ( НомерСтроки , НомерКолонки ), Лист . Cells ( НомерСтроки1 , НомерКолонки1 )). Merge (); | |
Установка шрифта | Лист . Cells ( НомерСтроки , НомерКолонки ). Font . Name = ИмяШрифта ; | |
Установка размера шрифта | Лист . Cells ( НомерСтроки , НомерКолонки ). Font . Size = РазмерШрифта ; | |
Установка жирного шрифта | Лист . Cells ( НомерСтроки , НомерКолонки ). Font . Bold = 1 ; | 1 — жирный шрифт, 0 — нормальный |
Установка курсива | Лист . Cells ( НомерСтроки , НомерКолонки ). Font . Italic = 1 ; | 1 — курсив, 0 — нормальный |
Установка подчеркнутого шрифта | Лист . Cells ( НомерСтроки , НомерКолонки ). Font . Underline = 2 ; | 2 — подчеркнутый, 1 — нет |
Для того, чтобы узнать какое свойство нужно менять или какой метод вызвать можно воспользоваться макросами Excel. Если записать макрос с требуемыми действиями, то после можно посмотреть программный код на VBA записанного макроса.
Использование COMSafeArray
При выгрузке больших объемов данных из 1С в Excel для ускорения можно использовать объект COMSafeArray. Согласно определению из синтакс-помощника, COMSafeArray — объектная оболочка над многомерным массивом SafeArray из COM. Позволяет создавать и использовать SafeArray для обмена данными между COM-объектами. Проще говоря, это массив значений, который можно использовать для обмена между приложениями по технологии OLE.
// Создание COMSafeArray
МассивКом = Новый COMSafeArray ( «VT_Variant» , ВсегоКолонок , ВсегоСтрок );
// Заполнение COMSafeArray
Для Стр = 0 По ВсегоСтрок — 1 Цикл
Для Кол = 0 По ВсегоКолонок — 1 Цикл
МассивКом . SetValue ( Кол , Стр , Значение );
КонецЦикла;
КонецЦикла;
// Присвоение области листа Excel значений из COMSafeArray
Лист . Range ( Лист . Cells ( 1 , 1 ), Лист . Cells ( ВсегоСтрок , ВсегоКолонок )). Value = МассивКом ;
Обмен через ADO
Файл Excel при обмене через ADO представляет собой базу данных, к которой можно обращаться при помощи SQL-запросов. Установка MS Excel не требуется, но обязательно наличие драйвера ODBC, при помощи которого будет осуществляться доступ. Используемый драйвер ODBC определяется при указании строки соединения к файлу. Обычно требуемый драйвер уже установлен на компьютере.
Обмен через ADO заметно быстрее обмена через OLE, но при выгрузке нет возможности использовать функционал Excel для оформления ячеек, разметки страниц, задания формул и т.д.
Пример выгрузки:
// Создание COM-объекта для соединения
Соединение = Новый COMОбъект ( «ADODB.Connection» );
// Установка строки соединения
Соединение . ConnectionString = «
|Provider=Microsoft.ACE.OLEDB.12.0;
|Data Source=» + ИмяФайла + «;
|Extended Properties=»»Excel 12.0 XML;HDR=YES»»;» ;
Соединение . Open (); // Открытие соединения
// Создание COM-объекта для команды
Команда = Новый COMОбъект ( «ADODB.Command» );
Команда . ActiveConnection = Соединение ;
// Присвоение текста команды для создания таблицы
Команда . CommandText = «CREATE TABLE [Лист1] (Колонка1 char(255), Колонка2 date, Колонка3 int, Колонка4 float)» ;
Команда . Execute (); // Выполнение команды
// Присвоение текста команды для добавления строки таблицы
Команда . CommandText = «INSERT INTO [Лист1] (Колонка1, Колонка2, Колонка3, Колонка4) values (‘абвгдеё’, ‘8/11/2017’, ‘12345’, ‘12345,6789’)» ;
Команда.Execute(); // Выполнение команды
// Удаление команды и закрытие соединения
Команда = Неопределено;
Соединение . Close ();
Соединение = Неопределено ;
Для создания нового листа и формирования его структуры можно воспользоваться объектами ADOX.Catalog и ADOX.Table. В этом случае код примет вид:
// Создание COM-объекта для работы с книгой
Книга = Новый COMОбъект ( «ADOX.Catalog» );
Книга . ActiveConnection = Соединение ;
// Создание COM-объекта для работы со структурой данных на листе
Таблица = Новый COMОбъект ( «ADOX.Table» );
Таблица . Name = «Лист1» ;
Таблица . Columns . Append ( «Колонка1» , 202 );
Таблица . Columns . Append ( «Колонка2» , 7 );
Таблица . Columns . Append ( «Колонка3» , 5 );
Таблица . Columns . Append ( «Колонка4» , 5 );
// Создание в книге листа с описанной структурой
Книга . Tables . Append ( Таблица );
Таблица = Неопределено;
Книга = Неопределено;
В приведенном примере в методе
Таблица . Columns . Append ( «Колонка1» , 202 );
во втором параметре указывается тип колонки. Параметр необязательный, вот некоторые значения типа колонки:
- 5 — adDouble;
- 6 — adCurrency;
- 7 — adDate;
- 11 — adBoolean;
- 202 — adVarWChar;
- 203 — adLongVarWChar.
Пример чтения:
// Создание COM-объекта для соединения
Соединение = Новый COMОбъект ( «ADODB.Connection» );
// Установка строки соединения
Соединение . ConnectionString = «
|Provider=Microsoft.ACE.OLEDB.12.0;
|Data Source=» + ИмяФайла + «;
|Extended Properties=»»Excel 12.0 XML;HDR=YES»»;» ;
Соединение . Open (); // Открытие соединения
// Создание COM-объекта для получения выборки
Выборка = Новый COMОбъект ( «ADODB.Recordset» );
ТекстЗапроса = «SELECT * FROM [Лист1$]» ;
// Выполнение запроса
Выборка . Open ( ТекстЗапроса , Соединение );
// Обход результата выборки
Пока НЕ Выборка . EOF () Цикл
ЗначениеКолонки1 = Выборка . Fields . Item ( «Колонка1» ). Value ; // Обращение по имени колонки
ЗначениеКолонки2 = Выборка . Fields . Item ( 0 ). Value ; // Обращение по индексу колонки
Выборка . MoveNext ();
КонецЦикла;
Выборка . Close ();
Выборка = Неопределено;
Соединение . Close ();
Соединение = Неопределено;
В строке соединения параметр HDR определяет как будет восприниматься первая строка на листе. Возможны варианты:
- YES — первая строка воспринимается как названия колонок. К значениям можно обращаться по имени и по индексу колонки.
- NO — первая строка воспринимается как данные. К значениям можно обращаться только по индексу колонки.
В приведенных примерах рассмотрено лишь несколько объектов ADO. Объектная модель ADO состоит из следующих объектов:
Выгрузка без программирования
Для сохранения данных из 1С в Excel не всегда целесообразно прибегать к программированию. Если в режиме Предприятия пользователь может отобразить требуемые для выгрузки данные, то, их возможно сохранить в Excel без программирования.
Для сохранения табличного документа (например, результата отчета) можно вызвать команду Сохранить или Сохранить как… главного меню.
В открывшемся окне требуется выбрать каталог, имя и формат сохраняемого файла.
Для сохранения данных динамических списков (например, списка номенклатуры) необходимо:
- Вывести данные в табличный документ при помощи команды Еще ⇒ Вывести список…;
- Сохранить табличный документ в требуемый формат.
Источник
Работа с excel из 1С
- Создание объекта приложение Excel
- Программное открытие файла Excel, либо его создание при отсутствии
- Обращение к листу открытого файла Excel
- Обойти все листы и скрыть их по условию
- Добавить лист в самый конец(по умолчанию он добавляется в самое начало)
- Очистить лист
- Получить указанную область листа.
- Скопировать область из одной книги в другу.
- Функция по переводу Адреса стиля ссылок Excel из A1 в R1C1 на языке 1С.
Многие программисты сталкиваются с необходимостью загрузки в 1С из Excel или выгрузки в этот формат. Это связано с тем, что большое количество бухгалтеров, а также менеджеров используют этот формат для хранения и обработки данных.
В этой статье приведу несколько листингов которые облегчат понимание этой связки и помогут в написании своего кода. Последующие листинги опираются на предыдущие, поэтому если в листинге, например, используется переменная «ПриложениеЭксель», но не инициализируется, значит это было в одном из предыдущих листингов.
1. Создание объекта приложение Excel
Попытка
ПриложениеЭксель = Новый COMОбъект("Excel.Application")
Исключение
Предупреждение("ОШИБКА создания приложения Excel, возможно программа не установлена!");
КонецПопытки;
2. Программное открытие файла Excel, либо его создание при отсутсвии
ПутьКФайлу = “C:obmenzagruzka.xls”;
ФайлЭксель = Новый Файл(ПутьКФайлу);
Если ФайлЭксель.Существует() Тогда
Результат = ПриложениеЭксель.WorkBooks.Open(ПутьКФайлу);
Иначе
РабочаяКнига=ПриложениеЭксель.Workbooks.Add();
РабочаяКнига=ПриложениеЭксель.ActiveWorkbook;
ПриложениеЭксель.ActiveWorkbook.SaveAs(ПутьКФайлу,-4143);
Результат = ПриложениеЭксель.WorkBooks.Open(ПутьКФайлу);
КонецЕсли;
3. Обращение к листу открытого файла Excel
ЛистЭксель = ПриложениеЭксель.WorkBooks.Open(ПутьКФайлу).WorkSheets.Item(ИмяЛиста);
4. Обойти все листы и скрыть их по условию
КоличествоЛистов = ПриложениеЭксель.ActiveWorkbook.Worksheets.Count;
КоллекцияЛистов = ПриложениеЭксель.ActiveWorkbook.Worksheets;Для ТекНомерЛиста = 1 По КоличествоЛистов Цикл
ТекЛист = КоллекцияЛистов(ТекНомерЛиста);
Если ТекЛист.Name = «Лист1» Тогда
ТекЛист.Visible = False;
КонецЕсли;
КонецЦикла;
5. Добавить лист в самый конец(по умолчанию он добавляется в самое начало)
НомерПоследнегоЛиста = ФайлЭксель.WorkSheets.Count;
ДобавленныйЛист = ФайлЭксель.WorkSheets.Add(,ФайлЭксель.WorkSheets(НомерПоследнегоЛиста));
ДобавленныйЛист.Name = ИмяЛиста;
6. Очистить лист
ДобавленныйЛист.Cells.Clear();
7. Получить указанную область листа. Здесь используются переменные НомСтрВерх, НомСтрНиз, НомКолВерх, НомКолНиз – они обозначают координаты самой левой верхней ячейки и самой правой нижней ячейки областей
ОбластьОграниченнаяСтроками = ЭксельФайл.WorkSheets.Item(ИмяЛиста).Rows(""+НомСтрВерх+":"+НомСтрНиз);ЯчейкаВерхняяЛевая = ЭксельФайл.WorkSheets.Item(ИмяЛиста).Cells(НомСтрВерх, НомКолВерх);
ЯчейкаНижняяПравая = ЭксельФайл.WorkSheets.Item(ИмяЛиста).Cells(НомСтрНиз, НомКолНиз);
ОбластьОграниченнаяЯчейками = ЭксельФайл.WorkSheets.Item(ИмяЛиста).Range(ЯчейкаВерхняяПравая,ЯчейкаНижняяЛевая);
8. Скопировать область из одной книги в другу. О константах Excel(используемых числах) читайте в разделе «В заключении» данной статьи.
НоваяКнига = ПриложениеЭксель.WorkBooks.Open(ПутьКНовомуФайлу);
ЛистПриемник = НоваяКнига.WorkSheets.Item(ИмяЛистаПриемника);
ОбластьОграниченнаяЯчейками.Copy(); //записали в буфер
ЛистПриемник.Range(ЛистПриемник.Cells(ТекСтрока, ТекСтолбец), ЛистПриемник.Cells(ТекСтрока+КоличСтрок-1, ТекСтолбец+КоличСтолбцов-1)).PasteSpecial();
ЛистПриемник.Range(ЛистПриемник.Cells(ТекСтрока, ТекСтолбец), ЛистПриемник.Cells(ТекСтрока+КоличСтрок-1, ТекСтолбец+КоличСтолбцов-1)).PasteSpecial(8);// цифра 8 означает сохранить ширину столбцов как в источнике.
9. Функция по переводу Адреса стиля ссылок Excel из A1 в R1C1 на языке 1С.
Чтобы конвертировать стиль ссылок Excel с буквенными колонками в числовые можно из кода ниже сделать функцию с параметром АдресA1
ДлинаАдресаА1 = СтрДлина(АдресА1);
Для с=1 По ДлинаАдресаА1 Цикл
ТекСимвол = Сред(АдресА1,с,1);
Если Найти("0123456789", ТекСимвол) > 0 Тогда //начался номер строки
БуквИндексКолонки = Лев(АдресА1, с-1);
ДлинаИндекса = СтрДлина(БуквИндексКолонки);
НомерКолонкиЧислом = 0;
Для с = 1 По ДлинаИндекса Цикл
ТекСимв = Сред(БуквИндексКолонки, с, 1);
ИндексБуквы = Найти(ВРег("abcdefghijklmnopqrstuvwxyz"), ВРег(ТекСимв));
НомерКолонкиЧислом = НомерКолонкиЧислом * 26 + ИндексБуквы;
КонецЦикла;
НомерСтроки = Прав(АдресА1, ДлинаАдресаА1 - с + 1);
НомерСтрокиЧислом = Число(НомерСтроки);
Прервать;
КонецЕсли;
КонецЦикла;
АдресR1C1 = "R" + НомерСтрокиЧислом + "C" + НомерКолонкиЧислом;
В заключении
В некоторых примерах параметрами в методы Excel передаются числа. Это происходит из-за того, что 1С не знает о константах Excel, например «xlCellTypeLastCell». Но к счастью эти константы имеют числовые значения. Чтобы узнать их откройте справку excel. Если справка не установлена, то можно посмотреть значение в режиме отладки Excel.
Недостаточно прав для комментирования
Для работы с Excel файлами в системе 1C существуют определенные технологии. Организовать взаимодействие системы 1C с внешней программой MS Excel можно через COM-объект «Excel.Application». Также есть возможность наладить взаимодействие с Excel из 1C используя технологию ADO.
Данный пример демонстрирует работу с использованием «Excel.Application». Для работоспособности данного примера на компьютере обязательно должно быть установлено программное обеспечение MS Excel.
Прочитать из существующего Excel Файла
Процедура ПрочитатьСуществующийExcelФайл(ПутьКФайлу)Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.DisplayAlerts = 0;
Excel.Visible = 0;
Исключение
Сообщить(ОписаниеОшибки() + " Программа Exсel не установлена");
Возврат;
КонецПопытки; Книга
= Excel.Workbooks.Open(ПутьКФайлу);
КоличествоЛистов = Книга.Sheets.Count;//Перебор листов
Для НомерЛиста = 1 По КоличествоЛистов Цикл Лист
= Книга.Sheets(НомерЛиста);
КоличествоСтрок = Лист.Cells(1, 1).SpecialCells(11).Row;
КоличествоКолонок = Лист.Cells(1, 1).SpecialCells(11).Column;//Перебор строк
Для НомерСтроки = 1 По КоличествоСтрок Цикл//Перебор колонок
Для НомерКолонки = 1 По КоличествоКолонок Цикл
ЗначениеЯчейки = Лист.Cells(НомерСтроки, НомерКолонки).Value;
//Выполнение действий с полученным значением
//...
//...
КонецЦикла;КонецЦикла;КонецЦикла; Excel
.Workbooks.Close();
Excel.Application.Quit();КонецПроцедуры
Записать в существующий Excel Файл
Процедура ЗаписатьСуществующийExcellФайл(ПутьКФайлу)Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.DisplayAlerts = 0;
Excel.Visible = 0;
Исключение
Сообщить(ОписаниеОшибки() + " Программа Exсel не установлена");
Возврат;
КонецПопытки; Книга
= Excel.Workbooks.Open(ПутьКФайлу); Лист
= Книга.Sheets(1);
//Установить значение в ячейку
Лист.Cells(1, 1).Value = "Тестовое значение";
Книга.Save(); Excel
.Workbooks.Close();
Excel.Application.Quit();КонецПроцедуры
Создать новый Excel Файл
Процедура СоздатьНовыйExcellФайл(ПутьКФайлу)Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.DisplayAlerts = 0;
Excel.Visible = 0;
Исключение
Сообщить(ОписаниеОшибки() + " Программа Exсel не установлена");
Возврат;
КонецПопытки; //Автоматически будут созданы три листа
Книга = Excel.WorkBooks.Add();
//Получить первый лист
Лист = Книга.Sheets(1);
//Установить значение в ячейку
Лист.Cells(1, 1).Value = "Тестовое значение";Попытка
Книга.SaveAs(ПутьКФайлу);
Исключение
Сообщить(ОписаниеОшибки() + " не удалось сохранить файл");
КонецПопытки; Excel
.Workbooks.Close();
Excel.Application.Quit();КонецПроцедуры