Экспорт из 1С 8.1 в Эксель

Собрание знаний.
Аватар пользователя
Сообщений: 8
Зарегистрирован: 05 мар 2011, 05:12
СообщениеДобавлено: 14 апр 2011, 13:40
Выгрузка в Эксельный файл в среде 1С 8.1 на примере выгрузки реквизитов справочника «Сотрудники организаций»

При работе над этой небольшой задачкой выяснились некоторые тонкости, которыми хочется поделиться. Здесь будет описана вся схема. И местами будут пояснения, что и почему.

На форме обработки разумеется должен быть указан ИмяКаталога и ИмяФайла, куда мы будем сохранять выдаваемые на гора данные. Итак , начнем:
Работу с открытием Приложения Эскель, открытия Книги, Листа, будем делать через Попытки, чтобы исключить ситуации, когда указанный файл уже существует.

Также предположим, что я хочу создать файл Эксель с именем Содрудники и Листами по названиям Организаций.

Код: выделить все
Процедура Сформировать(Кнопка)
     ПолноеИмяФайла = ИмяКаталога+СокрЛП(ИмяФайла);

        // Открываем приложение Эксель:
   Попытка
      Эксель = Новый COMОбъект("Excel.Application");
   Исключение
                Сообщить(ОписаниеОшибки() + " Программа Exсel не установлена на данном компьютере!");
   КонецПопытки;

        // Ищем имеющийся файл с указанным именем, в противном случае создаем новый:
   Попытка
      Книга = Эксель.Workbooks.Open(ПолноеИмяФайла);
   Исключение
      Книга  = Эксель.Workbooks.Add();
   КонецПопытки;   


          Лист = Книга.Worksheets(1)); // указываем номер листа, например  1
          // Либо добавляем новый, если нас не устраивают Лист1,Лист2 и Лист3, созданные автоматически при создании книги. Наверное лучше всегда добавлять СвойЛист, чтобы не запортить уже имеющуюся информацию на вышеуказанных листах.
          //   Лист = Книга.Worksheets.Add();
          //    Лист.Name = СокрЛП(ВыбОрганизация.Наименование); - это если я выгружаю информацию отдельно по каждой организации в базе.

   …
          // Здесь мы собственно делаем запрос к базе и «выуживаем» из нее нужные нам данные, которые потом мы должны «затолкать» в Эксельный файл.
   …

          // Далее мы сначала создаем Шапку таблицы в Эксель с наименованиями колонок:
          // Таблицу, включая шапку, мы начинаем  заполнять с ячейки B2, поэтому в формулах для номеров строк и колонок появляются «+2» и «+3»

   Для Каждого ТекКолонка из ТаблицаРезультатаЗапроса.Колонки Цикл
          НомерКолонки =ТаблицаРезультатаЗапроса.Колонки.Индекс(ТекКолонка)+2;
          Ячейка = Лист.Cells(2,[b]НомерКолонки);
          ПоместитьЗначение(Ячейка,ТекКолонка.Имя, 9, 0, 2, 1, 1, 1);
   КонецЦикла;
          // ПоместитьЗначение(,,,,,,,) – процедура, задача которой записать подаваемое ей значение в нужном формате в указанную ячейку.

          // А вот теперь мы «созрели» для заполнение данными из Таблицы ТаблицаРезультатаЗапроса  ячеек Листа нашей Книги Эксель:

         Для Каждого ТекСтрока из ТаблицаРезультатаЗапроса Цикл
               ИндексСтроки = ТаблицаРезультатаЗапроса.Индекс(ТекСтрока);
               НомерСтроки = ИндексСтроки+3;
               Для Каждого ТекКолонка из ТаблицаРезультатаЗапроса.Колонки Цикл
                    ИндексКолонки = ТаблицаРезультатаЗапроса.Колонки.Индекс(ТекКолонка);
                    НомерКолонки = ИндексКолонки+2;
                    Ячейка = Лист.Cells(НомерСтроки,НомерКолонки);
                    ПомещаемоеЗначение = ТекСтрока.Получить(ТаблицаРезультатаЗапроса.Колонки.Индекс(ТекКолонка));

                   // Дальше напрашивается следующее:
                   // ПоместитьЗначение(Ячейка,ПомещаемоеЗначение, 9, 0, 2, 1, 1, 1);
                   // НО, есть нюансы, заставляющие делать не так. Я об этом напишу ниже.
                   // Некоторые из значений, находящихся в  ТаблицаРезультатаЗапроса, имеют тип значения , не являющегося строкой, поэтому попытки использовать такое «простое» решение, как сразу без предварительной обработки поместить значения в ячейки, наталкиваются на такой результат:  Произошла исключительная ситуация (0x800a03ec) : Ячейка.Value = Значение;   Просто Эксель не может «принять» в свою ячейку такое Значение, как например СсылкуНаЭлементСправочника. Нужно «подавать» в эту ячейку другое: СсылкаНаЭлементСправочника.Наименование. Тогда ошибка исчезнет. В моем случае я хочу заполнить ячейки файла Эксель разными данными, в том числе ФИО Сотрудника(Физлица),  его Кодом, Наименованием организации, в которой он работает и некоторыми датами.
                   // Поэтому делаем так:

                   Если (ИндексКолонки = 0) или (ИндексКолонки = 2) Тогда
                     ПомещаемоеЗначение = ПомещаемоеЗначение.Наименование;
                   ИначеЕсли (ТипЗнч(ПомещаемоеЗначение) = Тип("Дата")) и                (ПомещаемоеЗначение = Дата(1,1,1)) Тогда
                     ПомещаемоеЗначение = "";
                   КонецЕсли;
                 // Здесь ИндексамКолонок «0» и «2» соответствуют как раз Физлица и Организации
                 // Кроме того для Пустых Дат заполняем ПомещаемоеЗначение  пустой строкой.

                 Попытка
                   ПоместитьЗначение(Ячейка,ПомещаемоеЗначение, 9, 0, 2, 1, 1, 1);
                 Исключение
                   Сообщить("Попали в исключение:"+ОписаниеОшибки());
                 КонецПопытки;
                 // Здесь сделано через Попытку, чтобы наша выгрузка не закончиласт неудачей при попытке передачи в ячейку Эксель «неугодного» ему значения. Если этого не сделать, то выгрузка не произойдет и при этом в ДиспетчереЗадач в Процессах повиснет Процесс «Excel». Чего допускать нежелательно.

                 // Ну а здесь собственно мы «сворачиваем удочки». Закрываем всё, что нужно закрыть:
            Попытка
            Книга.SaveAs(ПолноеИмяФайла);
            Исключение
            Сообщить("Файл не был записан. " + Символы.ПС + "Описание ошибки: "+ ОписаниеОшибки())
            КонецПопытки;
      
            Книга.Close(0);
            Эксель.Application.Quit();

              КонецЦикла;

         КонецЦикла;

КонецПроцедуры;


// Ну и теперь осталось еще выложить процедуру ПоместитьЗначение(,,,,,,,)

Процедура ПоместитьЗначение(Ячейка,Значение, шрифтРазм = 9, шрифтЖирн = 0, гориз = 2, вертик = 1, перенос = 1, линия = 0);

Ячейка.Value = Значение;
Ячейка.Font.Size = шрифтРазм;
Ячейка.Font.Bold = шрифтЖирн;
Ячейка.HorizontalAlignment = гориз;
Ячейка.VerticalAlignment = вертик;
Ячейка.WrapText = перенос;
Ячейка.Borders.Linestyle = линия;

КонецПроцедуры;

// Ну вот и всё, наша задача выполнена. Game Over!
Цитата

Вернуться в Статьи, исследования, мысли...

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Яндекс.Метрика
cron