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

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


    Для вычисления мат.функций можно воспользоваться VBScript. Доступны следущие:
    Abs - абсолютное значение
    Atn - арктангенс
    Cos - косинус
    Exp - экспонента (число е в степени)
    Fix - отбрасывает дробную часть числа
    Int - целая часть числа (в 1с уже есть)
    Log - натуральный логарифм (тоже есть)
    Rnd - случайное число
    Sgn - знак числа
    Sin - синус
    Sqr - квадратный корень
    Tan - тангенс
    Hex - перевод из 10-тичной в 16-ричную
    Oct - в 8-ричную 
    Пример вызова:
    // синус
    function sin(value,sc=0)
      try 
      if sc=0 then
      sc=createObject("MSScriptControl.ScriptControl");
      endif;
      sc.language="VBscript";
      except
      return getEmptyValue();
      endtry;
      return sc.eval("sin("+value+")");

    endFunction

    Возведение в степень ( value1^value2) можно реализовать так:
    sc.eval(""+value1+"^"+value2);


    Получить список принтеров:
    Процедура
     Сформировать()
         wshNetwork=createObject("WScript.Network");
         oPrinters=wshNetwork.EnumPrinterConnections();
         i=0;
         while i<oPrinters.count()-1 do
              message("Порт "+oPrinters.item(i)+" = "+oPrinters.item(i+1));
              i=i+2;
         enddo;
    КонецПроцедуры



    Получить имя принтера "по умолчанию":

    // Получить имя "принтера по умолчанию":
    Процедура Сформировать()
         scrptCtrl=createobject("MSScriptControl.ScriptControl");
         scrptCtrl.language="vbscript";
         scrptCtrl.addcode("
         |Function GetDefaultPrinter()
         |GetDefaultPrinter=vbNullString
         |Set objWMIService=GetObject(""winmgmts:"" _
         |& ""{impersonationLevel=impersonate}!\\.\root\cimv2"")
         |Set colInstalledPrinters=objWMIService.ExecQuery _
         |(""Select * from Win32_Printer"")
         |For Each objPrinter in colInstalledPrinters
         |If objPrinter.Attributes and 4 Then
         |GetDefaultPrinter=objPrinter.Name
         |Exit For
         |End If
         |Next
         |End Function");
         Сообщить(scrptCtrl.run("GetDefaultPrinter"));
    КонецПроцедуры

    Проблема: "Емкость диска 40Гб свободно 24Гб выдает -17,14Гб."
    ИМХО это ошибка в движке. Не получить нормальное значение простым способом. Какие-то у них корявки внутри с преобразованием UINT в long и обратно. При возврате из функции теряется один разряд - самый старший. Так что восстановить нормальное значение не получится. Единственное, для чего пригодна эта функция - проследить, что на диске есть еще как минимум 4 Гб. свободного места.


    Для корректного определения свободного места на диске можно воспользоваться VBScript:
    fso=createObject("scripting.fileSystemObject");
    message(fso.getDrive(диск).freeSpace);

    Процедура глМаксимизироватьОкно() Экспорт
        // вызывать в конце процедуры "ПриОткрытии" из модуля формы
        WSHShell = СоздатьОбъект("WScript.Shell");
        WSHShell.SendKeys("%");
        WSHShell.SendKeys("{LEFT}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{ENTER}");
    КонецПроцедуры



    Замечание:
    Если у вас этот код не работает, значит не установлен <Windows Scripting Host> или установлена старая версия.
    "Что вам нужно для начала: Первое, что надо сделать - убедиться, что Windows Scripting Host у вас есть.
    В состав W2K он входит изначально.
    Если вы используете Windows 98 или Internet Information Server 4.0,
    или если вы устанавливали Option Pack для Windows NT 4 и для Windows 95, он у вас точно есть.
    В случае Windows 95 все усложняется, и Windows Scripting Host придется скачивать с сайта Microsoft (msdn.microsoft.com/scripting).
    Напишите в командной строке "wscript".
    Если появилось диалоговое окно с надписью, отличной от "File not found", все в порядке."

    //******************************************************************************
    // Получим представление цвета из реестра
    Функция глПолучитьСистемныйЦвет( псИдентификаторЦвета ) Экспорт
    // ИСПОЛЬЗОВАНИЕ:
    // м_СерыйЦвет = глПолучитьСистемныйЦвет( "Window" );
    //РасшАтрибут.ЦветФона = м_СерыйЦвет;
    //Если ПустоеЗначение(ЗначениеАтрибута) = 1 Тогда
    // РасшАтрибут.ЦветФона = 255; // красный......
    //КонецЕсли;

    // идентификаторы цветов:
    // ActiveBorder - Рамка вокруг активного окна.
    //ButtonHilight, ButtonLight - Выделение трехмерных элементов.
    //AppWorkSpace - Фон окна приложения MDI (приложение, использующее многооконный интерфейс).
    //Background - Рабочий стол.
    //ButtonAlternateFace - Кнопка.
    //ButtonShadow - Тень, "отбрасываемая" кнопкой.
    //ButtonText - Текст надписи на поверхности кнопки.
    //TitleText - Текст заголовка окна, кнопки изменения размера, кнопки полосы просмотра.
    //GrayText - Текст серого цвета.
    //Hilight - Фон выбранного элемента в органе управления.
    //HilightText - Текст для выбранного органа управления.
    //InactiveBorder - Рамка вокруг неактивного окна.
    //InactiveTitle - Заголовок неактивного окна.
    //InactiveTitleText - Текст заголовка для неактивного окна.
    //InfoWindow - Фон элемента подсказка.
    //InfoText - Текст элемента подсказка.
    //Menu - Фон меню.
    //MenuText - Текст меню.
    //Scrollbar - Полоса просмотра.
    //Window - Фон окна.
    //WindowFrame - Рамка окна.
    //WindowText - Текст в окне.
    //ButtonFace,MenuBar,MenuHilight

    // НЕ НАШЕЛ КЛЮЧ РЕЕСТРА
    //BTNHIGHLIGHT - Выбранная кнопка.
    //3DDKSHADOW - Темная тень для трехмерных элементов.
    //3DFACE, BTNFACE - Поверхности трехмерных элементов.
    //3DHILIGHT, 3DHIGHLOIGHT, Выделение трехмерных элементов.
    //3DLIGHT - Свет для трехмерных элементов.
    //COLOR3DSHADOW,BTNHIGHLIGHT - Тень для трехмерных элементов.
    //ACTIVEBORDER - Рамка вокруг активного окна.
    //ACTIVECAPTION - Заголовок активного окна.


    ЗначВозврата = -1;
    СтрокаЦвета = "";
    Попытка
    СтрокаЦвета = глWScript_Shell.RegRead("HKEY_CURRENT_USER\Control Panel\Colors\"+псИдентификаторЦвета);
    Исключение
    Сообщить(ОписаниеОшибки()+"[200612011227]");
    Возврат ЗначВозврата;
    КонецПопытки;
    // Маска цвета будет такой: "212 208 200" (RGB), надо только разложить
    СтрокаЦвета = СтрЗаменить(СтрокаЦвета," ",",");
    СписЦветов = глСтрокаВСписок(СтрокаЦвета);
    Если СписЦветов.РазмерСписка() <> 3 Тогда
    Возврат ЗначВозврата;
    КонецЕсли;
    _Красный = Число(СписЦветов.ПолучитьЗначение(1));
    _Зеленый = Число(СписЦветов.ПолучитьЗначение(2));
    _Синий = Число(СписЦветов.ПолучитьЗначение(3));
    ЗначВозврата = Макс(0,_Синий)*65536+Макс(0,_Зеленый)*256+Макс(0,_Красный);

    Возврат ЗначВозврата;
    КонецФункции // глПолучитьСистемныйЦвет()

    Copyright MyCorp © 2025