Имя: Пароль:
1C
 
Работа из 1с7.7 с екселем
0 деморализующий
 
08.12.05
10:35
Здрасти,как при работе с  книгой ексель поменять тип ячейки?спасибо
1 аморал
 
08.12.05
10:36
т.е. задать тип данных в ячейке?
2 Salvador Limones
 
08.12.05
10:38
(0) Какой нафиг тип?
3 аморал
 
08.12.05
10:40
нужно явно из 1с через ком объект указать что здесь будет Дата
4 аморал
 
08.12.05
10:40
в конкретной ячейке,
5 аморал
 
08.12.05
11:04
как в визуал бейсике тип данных ячейки  задать?
6 Лошадка в пальто
 
08.12.05
11:06
где-то так:
Перем ВыббФ, ВыббК;
Перем Форм; // переменная для определения форматирования
Перем ВыбКат,ВыбФ;
Перем Нач[8],Кон[8],СпВыр[8];
Перем СпРазделителей;
Перем СистемныйРазделитель;
//  конвертер из MXL в XLS!!
//*****************************************
Функция АдресСправа(Р,К)
  Возврат "R"+Строка(Р)+"C"+Строка(К+1);
КонецФункции //АдресСправа
//*****************************************
Функция АдресСнизу(Р,К)
  Возврат "R"+Строка(Р+1)+"C"+Строка(К);
КонецФункции //АдресСнизу

//***************************************************
Функция ЭтоЦифра(сим)  Экспорт
   Циф=?(строка(Число(сим))=сим,1,0);
   Возврат Циф;
КонецФункции //ЭтоЦифра      
//*****************************************
Функция ТипЗн(Зн)
Форм="";    
// по значению в 1С, возможно форматированному - восстановить его нормальное осмысленное значение
Если СтрЧислоВхождений(Зн,".")=2 Тогда
//возможно, это дата чч.мм.гггг или чч.мм.гг
Знн=СокрЛП(Зн);
Если ПустоеЗначение(Дата(Знн))=0 Тогда Форм=?(СтрДлина(Знн)=10,"ДД.ММ.ГГГГ","ДД.ММ.ГГ"); Возврат Дата(Знн) КонецЕсли;
КонецЕсли;
//еще бы хорошо было правильно трактовать даты с косой чертой и с тире
Если СтрЧислоВхождений(Зн,"/")=2 Тогда
//возможно, это дата чч/мм/гггг или чч/мм/гг
Знн=СокрЛП(СтрЗаменить(Зн,"/","."));
Если ПустоеЗначение(Дата(Знн))=0 Тогда Форм=?(СтрДлина(Знн)=10,"ДД.ММ.ГГГГ","ДД.ММ.ГГ"); Возврат Дата(Знн) КонецЕсли;
КонецЕсли;

Если СтрЧислоВхождений(Зн,"-")=2 Тогда
//возможно, это дата чч-мм-гггг или чч-мм-гг
Знн=СокрЛП(СтрЗаменить(Зн,"-","."));
Если ПустоеЗначение(Дата(Знн))=0 Тогда Форм=?(СтрДлина(Знн)=10,"ДД.ММ.ГГГГ","ДД.ММ.ГГ"); Возврат Дата(Знн) КонецЕсли;
КонецЕсли;

Знн=СокрЛП(Зн);  

Если Знн=""  Тогда Форм=""; Возврат ""; КонецЕсли;  // подавление нулевых значений пробелом становится пустым значением
Если Знн="-" Тогда Форм=""; Возврат ""; КонецЕсли; // подавление нулевых значений знаком - становится пустым значением
Для сч=1 по СтрДлина(Знн) Цикл
Сим=Сред(Знн,сч,1);
Если (ЭтоЦифра(Сим)=0) и (СпРазделителей.НайтиЗначение(Сим)=0) и (Сим<>"-") Тогда
   Форм="";
   Возврат Зн; // это уже не число и не дата, а не пойми что    
КонецЕсли;
КонецЦикла;    

КолРазд=0;
Для счРазд=1 по СпРазделителей.РазмерСписка() Цикл
ЗнРазд=СпРазделителей.ПолучитьЗначение(СчРазд);
Если Найти(Знн,ЗнРазд)>0 Тогда
   КолРазд=КолРазд+1;
КонецЕсли;
КонецЦикла;    

//если нашли все больше двух разделителей - то это тоже не число а не пойми что
Если КолРазд>2 Тогда Форм=""; Возврат Зн; КонецЕсли;
РР1=""; РР2="";    
Для счРазд=1 по СпРазделителей.размерСписка() Цикл
ЗнРазд=СпРазделителей.ПолучитьЗначение(СчРазд);
Если Найти(Знн,ЗнРазд)>0 Тогда
   Если РР1="" Тогда РР1=ЗнРазд Иначе РР2=ЗнРазд КонецЕсли;
КонецЕсли;
КонецЦикла;    

Если (РР1="") и (РР2="") Тогда
  Форм="";
  Знн=СокрЛП(Зн);
  Для сч=1 по СтрДлина(Знн) Цикл
   Форм=Форм+"0"
  КонецЦикла;
  Возврат СокрЛП(Зн)  // это просто число без никаких излишеств форматирования, уберем возможные пробелы
ИначеЕсли РР2="" Тогда
  // это какие-то цифры с разделителями одного вида
  СпВхождений=СоздатьОбъект("СписокЗначений");
  Для сч=-СтрДлина(Знн) по -1 Цикл
   Сим=Сред(Знн,-Сч,1);
   Если Сим=РР1 Тогда СпВхождений.ДобавитьЗначение(-сч) КонецЕсли;
  КонецЦикла;    
  Десятичный=0;
  Поз=СпВхождений.ПолучитьЗначение(1);
  Если (Поз=СтрДлина(Знн)-3) и (Спвхождений.РазмерСписка()=1) Тогда
    Если (РР1=".") или (РР1=",") Тогда
     Знн=Лев(Знн,Поз-1)+"*"+Прав(Знн,СтрДлина(Знн)-Поз);
     Десятичный=1;
    КонецЕсли;    
  ИначеЕсли (Спвхождений.РазмерСписка()=1) Тогда
    Знн=Лев(Знн,Поз-1)+"*"+Прав(Знн,СтрДлина(Знн)-Поз);
    Десятичный=1;
  КонецЕсли;    
 
  Для сч=2 По Спвхождений.РазмерСписка() Цикл
     Зн1=СпВхождений.ПолучитьЗначение(сч-1);
     Зн2=СпВхождений.ПолучитьЗначение(сч);
     Если (Зн2+4<>Зн1) Тогда
         Форм=""; Возврат  Зн; // это ненормальное расположение разделителей
     КонецЕсли;
  КонецЦикла;    
  Знн=СтрЗаменить(Знн,РР1,"");
  Если Найти(Знн,"*")<>0 Тогда
   Тч=Макс(СтрДлина(Знн)-Найти(Знн,"*"),1);
  Иначе
   Тч=0;
  КонецЕсли;
 
  Знн=СтрЗаменить(Знн,"*",".");
  Форм=?(Десятичный=1,"0","# ##0");
  Форм=?(Тч>0,Форм+",",Форм);
  Для сч=1 по Тч цикл Форм=Форм+"0" КонецЦикла;
  Возврат Знн// и еще как-то просигналить что с разделителями
Иначе
 // присутствуют разделители обоих видов - один из них возможно десятичный, а второй - триадный
 Если (СтрЧислоВхождений(Знн,РР1)>1) и (СтрЧислоВхождений(Знн,РР2)>1) Тогда
    // разделители вперемешку
    Форм=""; Возврат Зн;
 КонецЕсли;    
 СпВхождений =СоздатьОбъект("СписокЗначений");
 СпВхождений1=СоздатьОбъект("СписокЗначений");
 
 Для Сч=-стрДлина(Знн) по -1 Цикл
    Сим=Сред(Знн,-Сч,1);
    Если Сим=РР1 Тогда СпВхождений.ДобавитьЗначение(-сч) КонецЕсли;
    Если Сим=РР2 Тогда СпВхождений1.ДобавитьЗначение(-сч) КонецЕсли;
 КонецЦикла;    
 
 Поз1=СпВхождений.ПолучитьЗначение(1);
 Поз2=СпВхождений1.ПолучитьЗначение(1);
 
 Если Поз1<Поз2 Тогда
    //2-й это десятичный 1-й триадный
    Если СпВхождений1.РазмерСписка()>1 Тогда Форм=""; Возврат Зн; КонецЕсли;
    Если Поз1<>Поз2-4 Тогда Форм=""; Возврат Зн; КонецЕсли; // ненормальное отделение первой триады
    Для сч=2 по СпВхождений1.РазмерСписка() цикл
         Зн1=СпВхождений1.ПолучитьЗначение(сч-1);
         Зн2=СпВхождений1.ПолучитьЗначение(сч);
         Если (Зн2+4<>Зн1) Тогда
            Форм=""; Возврат  Зн; // это ненормальное расположение разделителей
         КонецЕсли;
    КонецЦикла;
      Знн=СтрЗаменить(Знн,РР1,"");
      Знн=СтрЗаменить(Знн,РР2,".");
      Тч=Макс(1,СтрДлина(Знн)-Найти(Знн,"."));
      Форм="# ##0";
      Форм=?(Тч>0,Форм+",",Форм);
    Для сч=1 по Тч цикл Форм=Форм+"0" КонецЦикла;
      Возврат Знн; // и просигналить про разделитель
 Иначе
   //1-й десятичный 2-й триадный
   Если СпВхождений.РазмерСписка()>1 Тогда Форм=""; Возврат Зн; КонецЕсли;
   Если Поз2<>Поз1-4 Тогда Форм=""; Возврат Зн; КонецЕсли; // ненормальное отделение первой триады
    Для сч=2 по СпВхождений.РазмерСписка() цикл
         Зн1=СпВхождений.ПолучитьЗначение(сч-1);
         Зн2=СпВхождений.ПолучитьЗначение(сч);
         Если (Зн2+4<>Зн1) Тогда
            Форм=""; Возврат  Зн; // это ненормальное расположение разделителей
         КонецЕсли;
    КонецЦикла;    
    Знн=СтрЗаменить(Знн,РР2,"");
      Знн=СтрЗаменить(Знн,РР1,".");
     
      Тч=Макс(1,СтрДлина(Знн)-Найти(Знн,"."));
      Форм="# ##0";
      Форм=?(Тч>0,Форм+".",Форм);
    Для сч=1 по Тч цикл Форм=Форм+"0" КонецЦикла;
      Возврат Знн; // и просигналить про разделитель
КонецЕсли;
КонецЕсли;
КонецФункции //ТипЗн()

//***************************************************
Функция БукваПоНомеру(ном)
   КодА=КодСимв("A");
   КодБуквы=КодА+Ном-1;
   Буква=Симв(КодБуквы);
   возврат Буква;
КонецФункции //БукваПоНомеру(ном)

//*********************************************************
Функция НазваниеСтолбца(Ном)
   // возвращает название столбца в Excel
Если Ном=0 Тогда Ном=26 КонецЕсли;
Если Ном<=26 Тогда
   Назв=БукваПоНомеру(Ном)
Иначе
   Ост=Ном-Цел((Ном-1)/26)*26;
   Част=Цел((Ном-1)/26);
   Назв=НазваниеСтолбца(Част)+НазваниеСтолбца(Ост)
КонецЕсли;    
  Возврат Назв  
КонецФункции //НазваниеСтолбца(Ном)

//*******************************************
Процедура ЗаписатьЕксель(Таблица,ВыбКат,ВыбФ,ИмяЛиста="Лист1");
 ОкноЕхс=СоздатьОбъект("Excel.Application");
 НовыеРабочиеКниги=ОкноЕхс.Workbooks;
 
 Если Прав(ВыбКат,1)<>"\" Тогда ВыбКат=ВыбКат+"\"; КонецЕсли;
 ИмяФФ  =ВыбКат+ВыбФ;
 ОкноЕхс.Visible=0;
 ОкноЕхс.DisplayAlerts=0;
 Попытка // если уже открыт файл с таким именем, то просто неназойливо сохраним его и закроем :-)
           // "не стой под стрелой!!!"
   ОкноЕхс.Windows(ВыбФ).Close(1);  // или  Close(-1) - тогда просто молча закроем, не сохраняя
 Исключение КонецПопытки;
 ОкноЕхс.DisplayAlerts=1;
 
 Таблица.Записать(ИмяФФ,1);
 Попытка РабочаяКнига=ОкноЕхс.Workbooks.Open(ИмяФФ);
 Исключение Предупреждение("Файл не найден "+РазделительСтрок+ИмяФФ); Возврат; КонецПопытки;
 
 ОкноЕхс.DisplayAlerts=0;
 ОкноЕхс.Workbooks(ВыбФ).SaveAs(ИмяФФ,-4143); //без лишних вопросов сохраним в нормальном формате Excel
 ОкноЕхс.DisplayAlerts=1;
 ОкноЕхс.Windows(ВыбФ).Visible=0; //спрячем окошко от потусторонних вмешательств
 ОкноЕхс.Windows(ВыбФ).DisplayWorkbookTabs = 1; //режим "показывать ярлычки листов"
 ОкноЕхс.Windows(ВыбФ).TabRatio = 0.2;          //подвинем линеечку с ярлычками, дабы пользователи не пужались!
 
 Попытка ОкноЕхс.Workbooks(ВыбФ).Sheets(1).Name = ИмяЛиста //установим переданное имя листа
 Исключение ОкноЕхс.Workbooks(ВыбФ).Sheets(1).Name = "Лист1"
 КонецПопытки;
 
 Рядов=Таблица.ВысотаТаблицы();
 Колонок=Таблица.ШиринаТаблицы();
 ТЗ=СоздатьОбъект("ТаблицаЗначений");  
 ТЗ.КоличествоКолонок(Колонок);
 ТЗ.КоличествоСтрок(Рядов);
 Для сч=1 по Рядов Цикл
     Состояние("Форматирование строк   ~ "+Строка(сч));
     Высота=Таблица.Область("R"+Строка(Сч)+"C"+строка(Колонок+1)).ВысотаСтроки();
   Если Высота=0 Тогда
       ОкноЕхс.Windows(ВыбФ).Activate();
       Ячейка=ОкноЕхс.Cells(Сч,Колонок+1);
       Ячейка.Rows.AutoFit();
   КонецЕсли;
 КонецЦикла;    

 //установка объединений ячеек, объединенных в MXL
СпУчтенных=СоздатьОбъект("СписокЗначений");
СпДиапазонов=СоздатьОбъект("СписокЗначений");

// поиск нестандартных для Excel выравниваний по выделенным столбцам
Для счГ=1 по 8 Цикл
 Нач[счГ]=""; Кон[счГ]="";
 СпВыр[счГ]=СоздатьОбъект("СписокЗначений");
КонецЦикла;    
ГорСт="";

СпСоотвГор=СоздатьОбъект("СписокЗначений");
// релизо-независимый обход недокументированной особенности - горизонтальные положения при установке
// и при чтении - различаются!!!
ТТест=СоздатьОбъект("Таблица");
ТТест.ИсходнаяТаблица("Тест");
ОблТест=ТТест.Область("R1C1");
Для сч=1 по 8 Цикл
   ОблТест.ГоризонтальноеПоложение(сч);
   Зн=ОблТест.ГоризонтальноеПоложение();
   СпСоотвГор.ДобавитьЗначение(Зн);
КонецЦикла;    

Для счРядов=1 по Рядов Цикл
   Состояние("Форматирование выравниваний по выделениям ~ "+Строка(счРядов));
   Начч=""; Конн="";
   Для счКолонок=1 по Колонок Цикл
    Адр="R"+Строка(СчРядов)+"C"+Строка(СчКолонок);
    Обл=Таблица.Область(Адр);
    ТЗ.УстановитьЗначение(СчРядов,СчКолонок,Обл.Текст);
   
    Гор=Обл.ГоризонтальноеПоложение();  
    Гор=СпСоотвГор.НайтиЗначение(Гор);
    Если (Гор<>ГорСт) Тогда
     // сменилось горизонтальное положение
      Если (ГорСт=5) или (ГорСт=6) или (ГорСт=8) Тогда
       //закончился кусочек нестандартного выравнивания
         Начч=Нач[ГорСт];
         Если Начч="" Тогда Начч=1 КонецЕсли;
         Конн=СчКолонок-1;
         Если Конн<>0 Тогда
           Диап=НазваниеСтолбца(Начч)+Строка(СчРядов)+":"+НазваниеСтолбца(Конн)+Строка(СчРядов);
           СпВыр[ГорСт].ДобавитьЗначение(СчРядов,Диап);
           Нач[ГорСт]=""; Кон[ГорСт]="";
         КонецЕсли;    
      КонецЕсли;
      Если (Гор=5) или (Гор=6) или (Гор=8) Тогда
       //начался кусочек нестандартного выравнивания
         Нач[Гор]=СчКолонок;
         Кон[Гор]=СчКолонок;
      КонецЕсли;
    Иначе
     // горизонтальное положение осталось прежним
     // если оно нестандартное - то обрабатываем спец. образом
       Если (Гор=5) или (Гор=6) или (Гор=8) Тогда
         Кон[Гор]=СчКолонок;
         Если (СчКолонок=Колонок)  Тогда
          Начч=Нач[Гор];
          Если Начч="" Тогда Начч=1 КонецЕсли;
          Конн=СчКолонок;
          Диап=НазваниеСтолбца(Начч)+Строка(СчРядов)+":"+НазваниеСтолбца(Конн)+Строка(СчРядов);
          СпВыр[Гор].ДобавитьЗначение(СчРядов,Диап);
          Нач[Гор]=""; Кон[Гор]="";
         КонецЕсли;
        КонецЕсли;
      КонецЕсли;
   ГорСт=Гор;
  КонецЦикла;
КонецЦикла;    
 // в результате получили в списках-элементах массива диапазоны выравниваний по выделенным столбцам
 
Для счКолонок=1 по Колонок Цикл
   Для счРядов=1 по Рядов Цикл
    ПроцВыполнения=Окр((СчРядов+Рядов*(СчКолонок-1))/(Колонок*Рядов)*100,2,0);
    Состояние("Расчет объединений       ~ готовность "+Строка(ПроцВыполнения)+" %");
    Адр="R"+Строка(СчРядов)+"C"+Строка(СчКолонок);
   
     Текст1=ТЗ.ПолучитьЗначение(СчРядов,СчКолонок);
    Попытка
     Текст2=ТЗ.ПолучитьЗначение(СчРядов+1,СчКолонок);
    Исключение Текст2=Текст1 КонецПопытки;
    Попытка
     Текст3=ТЗ.ПолучитьЗначение(СчРядов,СчКолонок+1);
    Исключение Текст3=Текст1 КонецПопытки;
    Если (Текст1<>Текст2) и (Текст1<>Текст3)  Тогда
       Продолжить
    КонецЕсли;
    Если СпУчтенных.НайтиЗначение(Адр)<>0 Тогда Продолжить КонецЕсли;
   
    // поиск объединения вправо
    Старт=СчКолонок;
   
      Обл=Таблица.Область(Адр);
      СтТекст=Обл.Текст;
      Обл.Текст=СтТекст+" ";
        Нашли=0;
      Пока Нашли=0 Цикл
          Облл=Таблица.Область(АдресСправа(СчРядов,Старт));
          Попытка ТекстСт=ТЗ.ПолучитьЗначение(СчРядов,Старт+1);
          Исключение Нашли=1;ТекстСт=ТЗ.ПолучитьЗначение(СчРядов,Старт); КонецПопытки;    
          ТекстНов=Облл.Текст;
          Если ТекстСт<>ТекстНов Тогда //эта ячейка - объединенная с выбранной
           Старт=Старт+1;
          Иначе
             Нашли=1; // нашли конец объединения
          КонецЕсли;
      КонецЦикла;
      Старт=мин(Старт,Колонок);
      КонецСправа=Старт;  
   
    //поиск объединения вниз
    Старт=СчРядов;
    Нашли=0;
        Пока Нашли=0 Цикл
          Адрр=АдресСнизу(Старт,СчКолонок);
          Облл=Таблица.Область(Адрр);
          Попытка ТекстСт=ТЗ.ПолучитьЗначение(Старт+1,СчКолонок);
          Исключение Нашли=1; ТекстСт=ТЗ.ПолучитьЗначение(Старт,СчКолонок);КонецПопытки;    
          ТекстНов=Облл.Текст;
          Если ТекстСт<>ТекстНов Тогда //эта ячейка - объединенная с выбранной
           Старт=Старт+1;
          Иначе
             Нашли=1; // нашли конец объединения
          КонецЕсли;
      КонецЦикла;  
     Старт=мин(Старт,Рядов);
     КонецСнизу=Старт;
     Обл.Текст=СтТекст;
   
    Если (КонецСправа<>СчКолонок) или (КонецСнизу<>СчРядов) Тогда
      //это было объединение ячеек
      Диапп="R"+Строка(СчРядов)+"C"+Строка(СчКолонок)+":R"+Строка(КонецСнизу)+"C"+Строка(КонецСправа);
      Диап=НазваниеСтолбца(СчКолонок)+Строка(СчРядов)+":"+НазваниеСтолбца(КонецСправа)+Строка(КонецСнизу);
      СпДиапазонов.ДобавитьЗначение(Диапп,Диап);
   
      Если КонецСнизу=счРядов Тогда
       Обл=Таблица.Область("R"+Строка(СчРядов)+"C"+Строка(СчКолонок));
       Гор=Обл.ГоризонтальноеПоложение();  
       Гор=СпСоотвГор.НайтиЗначение(Гор);
         СпВыр[Гор].ДобавитьЗначение(СчРядов,Диап);  
      КонецЕсли;
     
      Для сччКолонок=СчКолонок по КонецСправа Цикл
       Для сччРядов=СчРядов по КонецСнизу Цикл
           Если (СччКолонок=СчКолонок) и (сччРядов=СчРядов) Тогда Продолжить КонецЕсли;
           СпУчтенных.ДобавитьЗначение("R"+Строка(сччРядов)+"C"+Строка(СччКолонок));
       КонецЦикла;        
      КонецЦикла;    
    КонецЕсли;
  КонецЦикла;
КонецЦикла;    

Левое=СпСоотвГор.ПолучитьЗначение(1); //левое горизонтальное положение

// установка форматированных значений ячеек
Для счКолонок=1 по Колонок Цикл
Для счРядов=1 по Рядов Цикл
   ПроцВыполнения=Окр((СчРядов+Рядов*(СчКолонок-1))/(Колонок*Рядов)*100,2,0);
   Состояние("Форматирование значений в ячейках    ~ готовность "+Строка(ПроцВыполнения)+" %");
   Адр="R"+Строка(СчРядов)+"C"+Строка(СчКолонок);
   Если СпУчтенных.НайтиЗначение(Адр)>0 Тогда Продолжить КонецЕсли;
   // из уважения к стандартным отчетам 1С :-)
   // иначе коды счетов с субсчетами преобразуются в числа с разделителями :-(
   Ячейка1С=Таблица.Область(Адр);
   Зн1С=СтрЗаменить(ТЗ.ПолучитьЗначение(СчРядов,СчКолонок),РазделительСтрок,Симв(10));
   Зн1С=СтрЗаменить(Зн1С,Симв(13),Симв(10));
   Если (Ячейка1С.ГоризонтальноеПоложение()=Левое) и (СтрДлина(Зн1С)<=255) Тогда Продолжить КонецЕсли;
   Форм="";
   Зн=ТипЗн(Зн1С); // определили формат и нормальное значение
   Если (Зн=Зн1С) и (СтрДлина(Зн)<=255) Тогда Продолжить КонецЕсли;
    ОкноЕхс.Windows(ВыбФ).Activate();
    Ячейка=ОкноЕхс.Cells(СчРядов,СчКолонок);
    Попытка Ячейка.NumberFormat=Форм;  
    Исключение КонецПопытки;
    Ячейка.Value=Зн;
КонецЦикла;    
КонецЦикла;    

// Установка объединений в Excel
ВсегоОбъединений=0;
Для сч=1 по 8 Цикл
ВсегоОбъединений=ВсегоОбъединений+СпВыр[Сч].РазмерСписка();
КонецЦикла;    
ВсегоОбъединений=Макс(ВсегоОбъединений,1);
Установлено=0;
Для ВидВыр=1 по 8 Цикл
 //Если ВидВыр=7 Тогда // это по центру выделения, 1С с этим вроде бы справляется нормально
 // Продолжить  
 //КонецЕсли;

 Для Сч=1 по СпВыр[ВидВыр].РазмерСписка() Цикл
    Установлено=Установлено+1;
      ПроцВыполнения=Окр(Установлено/ВсегоОбъединений*100,2,0);
   Состояние("Формирование выравниваний по выделенным столбцам    ~ готовность "+Строка(ПроцВыполнения)+" %");
     Диапп="";
   Зн=СпВыр[ВидВыр].ПолучитьЗначение(сч,Диапп);
   
   Выс1с=Таблица.Область("R"+Строка(Зн)+"C1").ВысотаСтроки();
   ОкноЕхс.Windows(ВыбФ).Activate();
   ОкноЕхс.Range(Диапп).Select();
   ВысЕксельСт=Число(ОкноЕхс.Selection.RowHeight());
   ОкноЕхс.Selection.MergeCells=0;
   ОкноЕхс.Selection.EntireColumn.Hidden=0;
   ОкноЕхс.Selection.HorizontalAlignment=7;
   
   Если Выс1с=0 Тогда
     ОкноЕхс.Selection.Rows.AutoFit();
     ВысЕксель=ОкноЕхс.Selection.RowHeight();
   Иначе
     ВысЕксель=Выс1с;
   КонецЕсли;
   ВысЕксель=Макс(ВысЕксельСт,ВысЕксель);
   ОкноЕхс.DisplayAlerts=0;
   ОкноЕхс.Selection.MergeCells=1;        
   ОкноЕхс.DisplayAlerts=1;
   Если видВыр%4=1 Тогда //установить по левому краю
    ОкноЕхс.Selection.HorizontalAlignment=1
   ИначеЕсли видВыр%4=2 Тогда // установить по правому краю
    ОкноЕхс.Selection.HorizontalAlignment=-4152
   ИначеЕсли видВыр%4=0 Тогда //установить по ширине    
    ОкноЕхс.Selection.HorizontalAlignment=-4130
   КонецЕсли;
   ОкноЕхс.Selection.RowHeight=ВысЕксель; //вернуть рассчитанную высоту!!!
   
 КонецЦикла;
КонецЦикла;
ВсегоДиапазонов=СпДиапазонов.РазмерСписка();
Для сч=1 по ВсегоДиапазонов Цикл
ПроцВыполнения=Окр(Сч/ВсегоДиапазонов*100,2,0);
Состояние("Формирование выравниваний по выделенным столбцам    ~ готовность "+Строка(ПроцВыполнения)+" %");
Диапп="";
Диап=СпДиапазонов.ПолучитьЗначение(сч,Диапп);
ОкноЕхс.Windows(ВыбФ).Activate();
ОкноЕхс.Range(Диапп).Select();
DIAP=ОкноЕхс.Selection;
ОкноЕхс.DisplayAlerts=0;
DIAP.MergeCells=1;      
ОкноЕхс.DisplayAlerts=1;
DIAP.EntireColumn.Hidden=0;
DIAP.EntireRow.Hidden=0;
КонецЦикла;    

Состояние("Удаление управляющих объектов 1C....");
Удалено=0;
Кол=ОкноЕхс.Workbooks(ВыбФ).ActiveSheet.Shapes.Count();

Если Кол<>0 Тогда
Для сч=-кол по  -1 Цикл
 
  ОкноЕхс.Workbooks(ВыбФ).ActiveSheet.Shapes(-сч).Select();
  Если Найти(ОкноЕхс.Selection.Name,"Текст")<>1 Тогда Продолжить КонецЕсли;    
  //иначе печально вылетает на картинках с ошибкой "In batsh start nesteed error" !!!
  //после прерывания обработки по Esc 1C висит намертво с зависшей строкой состояния
  Назв=ВРег(СокрЛП(ОкноЕхс.Selection.Characters.Text()));
  Если (Назв="НАСТРОЙКА") или (Назв="ОБНОВИТЬ") или (Назв="В EXCEL")  Тогда
     ОкноЕхс.Selection.Delete();
     Удалено=Удалено+1;  
  КонецЕсли;
  Если Удалено=3 Тогда Прервать; КонецЕсли;
КонецЦикла;
КонецЕсли;

Состояние("Запись файла ....");
ОкноЕхс.Workbooks(ВыбФ).Save();
ОкноЕхс.ReferenceStyle=1;
ОкноЕхс.Visible=1;
ОкноЕхс.Windows(ВыбФ).Visible=1;
КонецПроцедуры
//*****************************************
Процедура ПриОткрытии()
 Парам=Форма.Параметр;
 
 Если (ТипЗначенияСтр(Парам)="СписокЗначений") или (ТипЗначенияСтр(Парам)="ValueList") Тогда
     Т=парам.ПолучитьЗначение(1); //таблица из контекста
   ВыбКат=парам.ПолучитьЗначение(2);
   ВыбФ =парам.ПолучитьЗначение(3);
   Лист=парам.ПолучитьЗначение(1);
     
   Если (0=ФС.СуществуетФайл(СокрЛП(ВыбКат)+"*.*")) или (СокрЛП(ВыбКат)="") или (СокрЛП(ВыбФ)="") Тогда   // выбрали неверный каталог
       ВыбФ="";
     ВыбКат=ФС.ТекКаталог();
       ФС.УстТекКаталог(ВыбКат);
       Зн=ФС.ВыбратьФайл(1,ВыбФ,ВыбКат,"Сохранить файл как...","Файлы Excel(*.XLS)|*.XLS","XLS",10);
     Если ВыбФ="" Тогда СтатусВозврата(0); Возврат;  КонецЕсли;    
     КонецЕсли;
     
     ЗаписатьЕксель(Т,ВыбКат,ВыбФ,Лист);    
     СтатусВозврата(0);
   Возврат;
 КонецЕсли;    
//открытие без параметров!!
Таблица.ИсходнаяТаблица("Пример");
Таблица.Вывести();
Таблица.Показать();
КонецПроцедуры //ПриОткрытии
//*****************************************
Процедура Протестировать()
   выббФ="";
   Зн=ФС.выбратьФайл(0,ВыббФ,ВыббК,,"Файлы MXL (*.MXL) |*.MXL","MXL",10);    
   Если ВыббФ="" Тогда Возврат КонецЕсли;
   Если Прав(ВыббК,1)<>"\" Тогда ВыббК=ВыббК+"\"    КонецЕсли;
   ТестовыйФайл=ВыббК+ВыббФ;
   Зн=Таблица.ТолькоПросмотр();
   Таблица.Очистить();
   Таблица.Открыть(СокрЛП(ТестовыйФайл));
КонецПроцедуры //Протестировать

//***************************************************
//
//   Глобальные функции и процедуры
//
//***************************************************
Процедура глЗаписатьВЕксель(Табл,Кат="",Файл="",Лист="Лист1") Экспорт
 //эту функцию нужно вынести из модуля обработки в глобальный модуль
 //Описание параметров -
 // 1) Таблица, которую нужно сохранить
 // 2) каталог 3) файл - при невыбранных - заставляет выбрать
 // 4) Название листа рабочей книги - ну уж очень не нравится мне "Sheet1"!!!
 Если (ТипЗначенияСтр(Табл)<>"Таблица") и (ТипЗначенияСтр(Табл)<>"Table") Тогда Возврат КонецЕсли;
 СпТаблица=СоздатьОбъект("СписокЗначений");
 СпТаблица.ДобавитьЗначение(Табл);
 
 Кат=СокрЛП(Кат); Файл=СокрЛП(Файл);
 Если СОкрЛП(Кат)<>"" Тогда
  Если Прав(Кат,1)<>"\" Тогда Кат=Кат+"\" КонецЕсли;
  Если ФС.СуществуетФайл(Кат+Файл)=1 Тогда
  Если Вопрос("Файл  "+Кат+Файл+"  существует. Перезаписать?","Да+Нет")="Нет" Тогда
     Возврат;
  КонецЕсли;  
 КонецЕсли;
 
 Если ФС.СуществуетФайл(Кат+"*.*")=0 Тогда
   Кат="";
 КонецЕсли;
 КонецЕсли;
 СпТаблица.ДобавитьЗначение(Кат);
 СпТаблица.ДобавитьЗначение(Файл);
 СпТаблица.ДобавитьЗначение(Лист);
 Попытка
 ОткрытьФорму("Обработка.ГлКонвертацияВЕксель#",СпТаблица);
 Исключение
     Т=СпТаблица.ПолучитьЗначение(1); //таблица из контекста
   ВыбКат=СпТаблица.ПолучитьЗначение(2);
   ВыбФ =СпТаблица.ПолучитьЗначение(3);
   Лист=СпТаблица.ПолучитьЗначение(4);
   Если (0=ФС.СуществуетФайл(СокрЛП(ВыбКат)+"*.*")) или (СокрЛП(ВыбКат)="") или (СокрЛП(ВыбФ)="") Тогда   // выбрали неверный каталог
       ВыбФ="";
     Зн=ФС.ВыбратьФайл(1,ВыбФ,ВыбКат,"Сохранить файл как...","Файлы Excel|*.xls","xls",10);
       Если ВыбФ="" Тогда СтатусВозврата(0); Возврат;  КонецЕсли;    
     КонецЕсли;
     ЗаписатьЕксель(Т,ВыбКат,ВыбФ,Лист);    
 КонецПопытки;
КонецПроцедуры//глЗаписатьВЕксель()
//*****************************************
Процедура ОбработкаЯчейкиТаблицы(Расшифровка)
Если СокрЛП(Строка(Расшифровка))="КонвертироватьExcel" Тогда
   ГлЗаписатьВЕксель(Таблица);
   Возврат;
КонецЕсли;

// в случае использования в конфигурации
// в глобальном модуле в процедуре
// ОбработкаЯчейкиТаблицы(Расшифровка, СтандартнаяОбработка, Таблица)
// прописываем в самом начале строки из этой процедуры, и тогда их можно убрать отсюда
//
КонецПроцедуры //ОбработкаЯчейкиТАблицы    

//***************************************************
//***************************************************
//***************************************************

СпРазделителей=СоздатьОбъект("СписокЗначений");//стандартные разделители разрядов
СпРазделителей.ДобавитьЗначение(" ");
СпРазделителей.ДобавитьЗначение(".");
СпРазделителей.ДобавитьЗначение(",");
СпРазделителей.ДобавитьЗначение("'");

Скрипт = CreateObject("WScript.Shell");
СистемныйРазделитель = Скрипт.RegRead("HKEY_CURRENT_USER\Control Panel\International\sDecimal");
7 аморал
 
08.12.05
11:10
спасибо!!!!
Ячейка.NumberFormat=Форм;  ?