Суббота, 26.07.2025, 22:18

Главная
Примочки к 1С
Ссылки на 1С ресурсы
  • Специалист
  • Клуб професионалов 1С
  • Статистика
    Главная » FAQ » OLE [ Добавить вопрос ]


    Таблица.Записать(путь+"отчет.xls","XLS");
    ЗагрузитьВнешнююКомпоненту(
    "V7Plus.dll");
    Почта=СоздатьОбъект("AddIn.V7Mail");
    Почта.Подключиться();
    Почта.НовоеСообщение();
    Почта.ДобавитьАдрес("general@nalog.ru");
    Почта.ДобавитьФайл(путь+"отчет.xls");
    Почта.Послать();
    Почта.Отключиться();

    Процедура ПереброскаВПочтовика()
         myOlApp = CreateObject("Outlook.Application");
         myItem = myOlApp.CreateItem(0); //olMailItem=0
         //Адрес
         myRecipient = myItem.Recipients.Add("axm2000@mail.ru");
         myRecipient.Type=1;
         //Тема
         myItem.Subject = "Счет № "+НомерДок+" от "+ДатаДок;
         //Тело
         myItem.Body ="Счет находится в прикрепленном файле"
         //Аттачменты
         myAttachments = myItem.Attachments();
         myAttachments.Add( "C:\\1cFiletmp.xls", 1, 1, "Счет № "+НомерДок+" от "+ДатаДок);
         ФС.УдалитьФайл("C:\\1cFiletmp.xls");
         //myItem.Display();
         myItem.Send();
    КонецПроцедуры

    Предварительно напиши часть кода для печати счета в файл (догадайся какой). Все. Если есть соединение то отправит сразу, нет поместит в исходящие.
    Это для MS Outlook. Outlook Express механизма ОЛЕ не поддерживает. Никакой внешней библиотеки не надо, по крайне мере для MS Outlook.


    Как при отправке письма через Outlook указать обратный адрес:

    OLE_Outlook=СоздатьОбъект("Outlook.Application");
    Mail = OLE_Outlook.CreateItem(0);
    .....
    Mail.ReplyRecipientNames="kto-to@gte-to.tam" //обратный адрес

    обЭксел = СоздатьОбъект("Excel.Application"); //создаем объект
    НашФайл = обЭксел.Workbooks.Open(СокрЛП(ИмяФайла)); //Открываем файл
    НашЛист = НашФайл.Sheets(1); //Устанавливаем нужный лист
    Знач1 = НашЛист.Cells(1,1); // Считываем значение, здесь: из первой ячейки первой строки
    //Если нужно считать несколько значений то организуем цикл
    Для 
    i = 1 По Знач1 Цикл
         Знач = НашЛист.Cells(i,1).Value;
    КонецЦикла;
    ОбЭксел.WorkBooks.close();
    ОбЭксел.Quit();

    db=CreateObject("ADODB.Connection");
    rs=CreateObject("ADODB.Recordset");
    db.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\temp\temp.xls;Extended Properties=""Excel 8.0;""";
    db.Open();
    rs.ActiveConnection = db;
    rs.CursorType = 3;
    rs.LockType = 2;
    rs.Source = "Select * from [Лист1$]";
    rs.Open();
    Пока
     rs.Eof()=0 Цикл
         Сообщить(rs.Fields(0).Value);
         //обрабатываем Recordset
         rs.MoveNext();
    КонецЦикла;
    rs.Close();
    db.Close();

    Как при работе с Excel через OLE обойти предупреждения
    Excel требует подтверждений пользователя, например, при удалении листа из рабочей книги. При этом процесс обработки останавливается. Как сделать чтобы он не задавал таких вопросов?

    Эксель = СоздатьОбъект("Excel.Application");
    .....
    Эксель.DisplayAlerts = 0;
    ..... а здесь делаешь че-нить пакостное
    Эксель.DisplayAlerts = 1;

    Формат числа при выгрузке в Excel
    При выгрузке данных в Excel числа типа 9237642437 отображаются 9,23764Е+11. Есть такая фича у Excel: если перед числом (или другим значением) поставить апостроф ('), эксель это понимает как то, что ему подсовывают текст, а апостроф отображаться не будет, т.е. напиши так: '9237642437

    Для того, чтобы открыть файл *.mxl в Excel
    Необходимо внести в реестр следующую информацию:
    REGEDIT4

    [HKEY_CURRENT_USER\Software\Microsoft\Office\10.0\Excel\Converters]
    "Moxel"="1С:Предприятие (*.mxl),...\\bin\\mxl2xl.dll, *.mxl"
    где:
    <...> это пусть к каталогу 1С-Предприятия
    <10.0> это номер версии Экселя - XP. Для 2000 это будет 9.0, 97 - 8.0, 95 - 7.0

    Как определить, когда закончились данные на листе при загрузке данных из Excel
    SpecialCells(11) - "последняя" ячейка
    Например, если нужен номер строки последней ячейки, то LastRow=ExcelApp.Cells(1,1).SpecialCells(11).Row;

    Обработка ошибочных значений
    При обработке через OLE ячеек, содержащих ошибочные значения (#ДЕЛ/0!;#ЗНАЧ!;#ЧИСЛО! и т.п.) 1С зависает при обращении к свойству Value - не помогает даже конструкция Попытка-Исключение. Обойти эту неприятность можно очень просто - проверять перед обращением к Value свойство Text:

    СписокОшибокЁкселя=СоздатьОбъект("СписокЗначений");
    СписокОшибокЁкселя.ДобавитьЗначение("#ПУСТО!");
    СписокОшибокЁкселя.ДобавитьЗначение("#ДЕЛ/0!");
    СписокОшибокЁкселя.ДобавитьЗначение("#ЗНАЧ!");
    СписокОшибокЁкселя.ДобавитьЗначение("#ССЫЛКА!");
    СписокОшибокЁкселя.ДобавитьЗначение("#ИМЯ?");
    СписокОшибокЁкселя.ДобавитьЗначение("#ЧИСЛО!");
    СписокОшибокЁкселя.ДобавитьЗначение("#Н/Д");
    //Для англ. версии
    СписокОшибокЁкселя.ДобавитьЗначение("#NULL!");
    СписокОшибокЁкселя.ДобавитьЗначение("#DIV/0!");
    СписокОшибокЁкселя.ДобавитьЗначение("#VALUE!");
    СписокОшибокЁкселя.ДобавитьЗначение("#REF!");
    СписокОшибокЁкселя.ДобавитьЗначение("#NAME?");
    СписокОшибокЁкселя.ДобавитьЗначение("#NUM!");
    СписокОшибокЁкселя.ДобавитьЗначение("#N/A");    
    //...
    ТекстЯчейки=Ячейка.Text;
    Если СписокОшибокЁкселя.НайтиЗначение(ТекстЯчейки)=0 Тогда
         Сообщить(Ячейка.Value);                
    Иначе
         Сообщить(ТекстЯчейки);                
    КонецЕсли;

    Процедура ACCESS()
         dbe=CreateObject("DAO.DBEngine.36");
         wksp=dbe.Workspaces(0);
         db=0;
         // в ковычках имя фаила с расширением MDB
         Если ФС.СуществуетФайл(КаталогПользователя()+"sr.mdb")=0 Тогда
              // создание файла базы данных с русским порядком сортировки
              db=wksp.CreateDataBase(КаталогПользователя()+"mars_sr.mdb",";LANGID=0x0419;CP=1251;COUNTRY=0");
              // DDL - запрос на создание таблицы
              // описание языка DDL (подмножество SQL) смотрите в хелпе по MS Access
              // не пытайтесь делать это с другими форматами - DDL через DAO поддерживается только для MDB
              //Создадим еще таблицу
              db.Execute("CREATE TABLE   BANKS
              |(REC_IND INTEGER,
              |BANKCODE INTEGER,
              |BANKNAME  TEXT  ,
              |ModifiedFlg BIT,
              |ChangeSeqFlg BIT);"
              );
              // индекс на нужные поля
              db.Execute("CREATE INDEX REC_IND ON BANKS (REC_IND);");
         Иначе
              // просто открываем базу данных в разделенном режиме
              db=wksp.OpenDataBase(КаталогПользователя()+"sr.mdb");
              // и очищаем имеющиеся данные
              db.Execute("DELETE * FROM BANKS;");
        КонецЕсли;
        // rs-это как раз сама таблица, куда мы будем добавлять записи
        rs=db.OpenRecordset("BANKS");
        // добавление записи
        rs.AddNew();
        // присвоение значений полям
        rs.REC_IND            =     "1";
        rs.BANKCODE       =     "34";
        rs.BANKNAME       =    "Инвест";
        rs.ModifiedFlg        =     "1";
        // запомним запись
        rs.Update();
        // и так далее ...
        db.Close();  // закрытие базы данных
    КонецПроцедуры

    Акцесс = СоздатьОбъект("ADODB.CONNECTION");
    Попытка
         СтрокаПодключения="Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\mybase.mdb;Uid=Admin;Pwd=";
         Акцесс.Open(СтрокаПодключения);
    Исключение
         Сообщить("Все плохо:"+ОписаниеОшибки());
         Возврат;
    КонецПопытки;
    Команда = СоздатьОбъект("ADODB.Command");
    Команда.ActiveConnection=Акцесс;
    ТекстСелект = "SELECT * FROM tblCustoms";
    НаборЗаписей = СоздатьОбъект("ADODB.RecordSet");
    Команда.CommandText=ТекстСелект;
    Попытка
         НаборЗаписей=Команда.Execute;
    Исключение
         Сообщить("Обломись:"+ОписаниеОшибки());
    КонецПопытки;
    Попытка
         НаборЗаписей.MoveFirst();
    Исключение
     //нет записей в рекордсете
         НаборЗаписей.Close();
         Возврат;
    КонецПопытки;
    Пока
     НаборЗаписей.EOF()=0 Цикл
         ИНН = НаборЗаписей.Fields("INN").Value;
         //ну и т.д.
         НаборЗаписей.MoveNext();
    КонецЦикла;
    НаборЗаписей.Close();


    Для тех, у кого в базе Акцесс создана рабочая группа (есть файлик mdw), строка подключения будет такая:
    СтрокаПодключения="Driver= Microsoft Access Driver (*.mdb)};systemDB=C:\wg.mdw;Dbq=C:\mybase.mdb;Uid=Admin;Pwd=";

    Copyright MyCorp © 2025