Имя: Пароль:
1C
1С v8
Выгрузка справочника в Excell
0 inmortal203
 
17.10.14
12:43
Добрый день! Не перестает "радовать" меня моя работа... Пытаюсь выгрузить в эксель справочник. Но файл создается, ошибок никаких... но вот только он пустой в итоге! Хотя данные записываются по алгоритму верно. Что в этой части кода не так?    

        ИмяФайла = ЭтотОбъект.ФайлЭкспорта;
    
    Попытка
        Эксель = Новый COMОбъект("Excel.Application");
        Эксель.DisplayAlerts = False;
    Исключение
        Сообщить(ОписаниеОшибки());
        Эксель.Application.Quit();
        Возврат;
    КонецПопытки;
    
    // если указали имя несуществующего файла...
    Если НайтиФайлы(ИмяФайла).Количество() = 0 Тогда
        ТабДокумент = Новый ТабличныйДокумент;
        ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS);
    Иначе
        УдалитьФайлы(ИмяФайла);
        ТабДокумент = Новый ТабличныйДокумент;
        ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS);
    КонецЕсли;
    
    Книга = Эксель.WorkBooks.Open(ИмяФайла);
    
    Лист = Книга.WorkSheets(ТекущийЛист);
    Лист.Name = "Спр1";
    Состояние("Выгружается справочник "+"Спр1");
    ЗаписатьСправочникНаЛист("Спр1",Лист);
    
    Попытка
        Книга.SaveAs(ИмяФайла);
    Исключение
        Сообщить(ОписаниеОшибки()+" Файл не сохранен!");
    КонецПопытки;    
    Эксель.ActiveWorkbook.Close();
    Эксель.Application.Quit();
1 pessok
 
17.10.14
12:48
зачем такой гемор? заполняй просто табличный документ и сохраняй сразу готовый в эксель.
+ никто не знает что у тебя в  ЗаписатьСправочникНаЛист("Спр1",Лист);
2 inmortal203
 
17.10.14
12:50
(1) гемор в том, что в книге эксель должно быть около 12 справочников на разных листах. просто цикл я выкинул. дело не в этом, не сохраняется и первый лист.
3 silent person
 
17.10.14
12:51
ТекущийЛист где-то определяется ?
4 silent person
 
17.10.14
12:52
а вот это:
Если НайтиФайлы(ИмяФайла).Количество() = 0 Тогда
        ТабДокумент = Новый ТабличныйДокумент;
        ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS);
    Иначе
        УдалитьФайлы(ИмяФайла);
        ТабДокумент = Новый ТабличныйДокумент;
        ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS);
    КонецЕсли;

тоже было в цикле ? O_o
5 Рэйв
 
17.10.14
12:53
(0)Сдается мне собака порылась у тебя в скромно укрытом ЗаписатьСправочникНаЛист("Спр1",Лист);
6 inmortal203
 
17.10.14
12:58
понимаю опасения в зелености прогера) вот тогда полностью текст:
        МассивСпавочников = Новый Массив;
        МассивСпавочников.Добавить("хххх");
        -----------------------------------

    ИмяФайла = ЭтотОбъект.ФайлЭкспорта;
    
    // пытаемся открыть эксель
    Попытка
        Эксель = Новый COMОбъект("Excel.Application");
        Эксель.DisplayAlerts = False;
    Исключение
        Сообщить(ОписаниеОшибки());
        Эксель.Application.Quit();
        Возврат;
    КонецПопытки;
    
    // если указали имя несуществующего файла...
    Если НайтиФайлы(ИмяФайла).Количество() = 0 Тогда
        ТабДокумент = Новый ТабличныйДокумент;
        ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS);
    Иначе
        УдалитьФайлы(ИмяФайла);
        ТабДокумент = Новый ТабличныйДокумент;
        ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS);
    КонецЕсли;
    
    Книга = Эксель.WorkBooks.Open(ИмяФайла);
    
    ТекущийЛист = 1;
    //Для Каждого ТекущийСправочник из МассивСпавочников Цикл
    Если ТекущийЛист = 1 Тогда
        Лист = Книга.WorkSheets(ТекущийЛист);
    КонецЕсли;
    Лист.Name = ТекущийСправочник;
    Состояние("Выгружается справочник "+ТекущийСправочник);
    ЗаписатьСправочникНаЛист(ТекущийСправочник ,Лист);
    ТекущийЛист = ТекущийЛист + 1;
    Лист = Книга.Sheets.Add();
    //КонецЦикла;
    
    Попытка
        Книга.SaveAs(ИмяФайла);
    Исключение
        Сообщить(ОписаниеОшибки()+" Файл не сохранен!");
    КонецПопытки;    
    Эксель.ActiveWorkbook.Close();
    Эксель.Application.Quit();

а вот и процедура которая заполняет

    Условия = "ГДЕ НЕ Спр.ЭтоГруппа И НЕ Спр.ПометкаУдаления";
    ЕстьГруппы = Метаданные.Справочники[Справочник].Реквизиты.Найти("ЭтоГруппа") <> Неопределено;
    ЕстьОрганизация = Метаданные.Справочники[Справочник].Реквизиты.Найти("Организация") <> Неопределено;
    Условия = ?(ЕстьГруппы,Условия,СтрЗаменить(Условия,"НЕ Спр.ЭтоГруппа И","")) + ?(ЕстьОрганизация," И Спр.Организация = &Организация ","");
    Запрос = Новый Запрос;
    Если ЕстьОрганизация Тогда
        Запрос.УстановитьПараметр("Организация",Справочники.Организации.НайтиПоКоду("000000001"));
    КонецЕсли;
    Запрос.Текст = "ВЫБРАТЬ * ИЗ Справочник."+Справочник+" Как Спр "+Условия+"  Упорядочить ПО Наименование";
    
    Данные = Запрос.Выполнить().Выгрузить();
    
    СтруктураКолонок = Новый Структура;
    Колонка=1;
    // заполнение шапки таблицы
    Для Каждого ТекКолонка из Данные.Колонки Цикл
        ИмяКолонки = ТекКолонка.Имя;
        Если мСписокИсключаемыхКолонок.Найти(ИмяКолонки) = Неопределено Тогда
            Лист.Cells(1, Колонка).NumberFormat = "@";
            Лист.Cells(1,Колонка).Value = ИмяКолонки;
            СтруктураКолонок.Вставить(ИмяКолонки,Колонка);
            Колонка=Колонка+1;
        КонецЕсли;
    КонецЦикла; // заполнить шапку таблицы
    
    ТекСтрокаЛиста = 2;
    // переносим саму таблицу в эксель
    Для Каждого Строка из Данные Цикл
        Кол = 1;
        Для Каждого ТекКолонка из Данные.Колонки Цикл
            ИмяКолонки = ТекКолонка.Имя;
            Если мСписокИсключаемыхКолонок.Найти(ИмяКолонки) = Неопределено Тогда
                Лист.Cells(ТекСтрокаЛиста, Кол).NumberFormat = "@";
                Лист.Cells(ТекСтрокаЛиста,Кол).Value = Строка(Строка[ИмяКолонки]);
                Кол = Кол + 1;
            КонецЕсли;
        КонецЦикла;
        ТекСтрокаЛиста = ТекСтрокаЛиста + 1;
    КонецЦикла; // заполняем данные таблицы


проверено отладчиком, Данные - заполнено.
7 inmortal203
 
17.10.14
12:59
внутрь цикла однозначно заходим
(с) Отладчик

Если мСписокИсключаемыхКолонок.Найти(ИмяКолонки) = Неопределено Тогда
                Лист.Cells(ТекСтрокаЛиста, Кол).NumberFormat = "@";
                Лист.Cells(ТекСтрокаЛиста,Кол).Value = Строка(Строка[ИмяКолонки]);
                Кол = Кол + 1;
            КонецЕсли;
8 Рэйв
 
17.10.14
13:05
(6)Нехорошо зарезервированными словами имновать переменные:-)

Попробуй в
Для Каждого Строка из Данные Цикл

вместо Строка чтото другое. Может из-за этого глючит.
А вообще вставь в цикл
Сообщить(Лист.Cells(ТекСтрокаЛиста,Кол).Value);

Чтобы точно знать что в ексель чтото попало.
9 silent person
 
17.10.14
13:13
у меня 2010 Excel не захотел открывать файл созданный вот так
ТабДокумент = Новый ТабличныйДокумент;
    //    ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS);

создал пустой файл руками в Excel-е. Справочник выгрузился.
10 silent person
 
17.10.14
13:14
+9
всмысле вот так
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS);

это я уже у себя закомментировал, чтобы мой файл не затирался
11 inmortal203
 
17.10.14
13:21
(8) хорошая идея) сейчас попробую.. иногда о таком даже не задумываешься...
12 inmortal203
 
17.10.14
13:49
не знаю что делать, но все это не помогает... уже и формат поменял, и вручную создавал и xls и xlsx...
13 silent person
 
17.10.14
14:17
на локальном компьютере вот эта обработка сработала нормально, все выгрузилось.

&НаСервереБезКонтекста
Процедура ЗаписатьСправочникНаЛист(Справочник ,Лист)
    Условия = "ГДЕ НЕ Спр.ЭтоГруппа И НЕ Спр.ПометкаУдаления";
    ЕстьГруппы = Метаданные.Справочники[Справочник].Реквизиты.Найти("ЭтоГруппа") <> Неопределено;
    ЕстьОрганизация = Метаданные.Справочники[Справочник].Реквизиты.Найти("Организация") <> Неопределено;
    Условия = ?(ЕстьГруппы,Условия,СтрЗаменить(Условия,"НЕ Спр.ЭтоГруппа И","")) + ?(ЕстьОрганизация," И Спр.Организация = &Организация ","");
    Запрос = Новый Запрос;
    Если ЕстьОрганизация Тогда
        Запрос.УстановитьПараметр("Организация",Справочники.Организации.НайтиПоКоду("000000001"));
    КонецЕсли;
    Запрос.Текст = "ВЫБРАТЬ * ИЗ Справочник."+Справочник+" Как Спр "+Условия+"  Упорядочить ПО Наименование";
    
    Данные = Запрос.Выполнить().Выгрузить();
    
    СтруктураКолонок = Новый Структура;
    Колонка=1;
    // заполнение шапки таблицы

    Для Каждого ТекКолонка из Данные.Колонки Цикл
        ИмяКолонки = ТекКолонка.Имя;
        //Если мСписокИсключаемыхКолонок.Найти(ИмяКолонки) = Неопределено Тогда
            Лист.Cells(1, Колонка).NumberFormat = "@";
            Лист.Cells(1,Колонка).Value = ИмяКолонки;
            СтруктураКолонок.Вставить(ИмяКолонки,Колонка);
            Колонка=Колонка+1;
        //КонецЕсли;
    КонецЦикла; // заполнить шапку таблицы

    
    ТекСтрокаЛиста = 2;
    // переносим саму таблицу в эксель

    Для Каждого Строка из Данные Цикл
        Кол = 1;
        Для Каждого ТекКолонка из Данные.Колонки Цикл
            ИмяКолонки = ТекКолонка.Имя;
            //Если мСписокИсключаемыхКолонок.Найти(ИмяКолонки) = Неопределено Тогда
                Лист.Cells(ТекСтрокаЛиста, Кол).NumberFormat = "@";
                Лист.Cells(ТекСтрокаЛиста,Кол).Value = Строка(Строка[ИмяКолонки]);
                Кол = Кол + 1;
            //КонецЕсли;
        КонецЦикла;
        ТекСтрокаЛиста = ТекСтрокаЛиста + 1;
    КонецЦикла; // заполняем данные таблицы

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


&НаСервереБезКонтекста
Процедура Команда1НаСервере()
    // Вставить содержимое обработчика.
     // МассивСпавочников = Новый Массив;
      //  МассивСпавочников.Добавить("хххх");
       // -----------------------------------

    ИмяФайла = "D:\test.xls";
    
    // пытаемся открыть эксель

    Попытка
        Эксель = Новый COMОбъект("Excel.Application");
        Эксель.DisplayAlerts = False;
    Исключение
        Сообщить(ОписаниеОшибки());
        Эксель.Application.Quit();
        Возврат;
    КонецПопытки;
    
    // если указали имя несуществующего файла...

    //Если НайтиФайлы(ИмяФайла).Количество() = 0 Тогда
    //    ТабДокумент = Новый ТабличныйДокумент;
    //    ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS);
    //Иначе
    //    УдалитьФайлы(ИмяФайла);
    //    ТабДокумент = Новый ТабличныйДокумент;
    //    ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS);
    //КонецЕсли;
    
    Книга = Эксель.WorkBooks.Open(ИмяФайла);
    
    ТекущийЛист = 1;
    //Для Каждого ТекущийСправочник из МассивСпавочников Цикл

    Если ТекущийЛист = 1 Тогда
        Лист = Книга.WorkSheets(ТекущийЛист);
    КонецЕсли;
    ТекущийСправочник = "Сотрудники";
    Лист.Name = ТекущийСправочник;
   // Состояние("Выгружается справочник "+ТекущийСправочник);
    ЗаписатьСправочникНаЛист(ТекущийСправочник ,Лист);
    ТекущийЛист = ТекущийЛист + 1;
    Лист = Книга.Sheets.Add();
    //КонецЦикла;

    
    Попытка
        Книга.SaveAs(ИмяФайла);
    Исключение
        Сообщить(ОписаниеОшибки()+" Файл не сохранен!");
    КонецПопытки;    
    Эксель.ActiveWorkbook.Close();
    Эксель.Application.Quit();
КонецПроцедуры

&НаКлиенте
Процедура Команда1(Команда)
    Команда1НаСервере();
КонецПроцедуры