Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Клуб профессиональных программистов :: Выпуск #118


Клуб профессиональных программистов «Весельчак У»
Информационная рассылка сайта и форума.  Выпуск 118.  21 августа 2011 г.

Здравствуйте, уважаемые читатели!

Сегодня предлагаем вам фрагмент статьи «Настройка мультипасинга СХД Hitachi AMS2100 в Solaris».

Также предлагаем подборку тем нашего форума.




Пополнение «Книжной полки разработчика систем со встроенными микропроцессорами»:





Приятного чтения!




Сегодня я хочу рассказать о том, как настраивать мультипасинг (multipath) в Solaris.


Дано: сервер с ОС Solaris, две оптические FC (FibreChannel) Qlogic 25xx карточки и СХД (Система Хранения Данных) Hitachi AMS2100.


Опустим конфигурирование самой СХД и перейдем к конфигурированию ОС.

После того, как мы установили оптические карточки в сервер и загрузили ОС, нас подстерегает неприятность. Операционная система не в состоянии распознать СХД и определить, что к ней подключены оптические кабели.

На устройствах c3 и c4 нет отметок что это диски.


...


В состоянии оптических карт видим, что ничего не подключено, хотя кабели мы подключили.


...


В информации о дисках нет ничего, кроме информации о внутренних дисках сервера.


...


При этом есть корректная информация об оптических портах.


...


Выход из этой ситуации достаточно простой. Необходимо всего лишь переинициализировать наши порты.



В статье много листингов и распечаток дынных терминала и здесь их, к сожалению, привести в должном качестве не удалось. Целиком статью можно прочесть на нашем сайте.

  • Программирование :: Общий
  • Из стороннего приложения через SAPConnector вызывается Bapi в Сапе.
    В bapi выполняется в т.ч.печать чего-то там.
    При вызове из стороннего приложения сформированное задание зависает в спуле Сапа, в спуле пишет "ФронтПК недоступен".
    При вызове той же bapi из среды Сапа, а также вывод зависшего задания на печать из спула проходят.
    Саперы, в т.ч.базисники ничего не могут сказать.
    Кто знает, подскажите.
  • Интервал между фреймами в modbus RTU должен быть "длинной" не менее 3.5 единичной посылки. При скорости 115000 и 11 битах в единичной посылки интервал составит: 3.5 * 11 / 115000 = 0.335 мс. Вопрос: как его сфoрмировать при передаче  (подсчитать при приеме) при программировании под windows (обычные таймеры имеют разрешение 1 мс)?
  • Программирование :: .NET технология от и до
  • Очень странно, но программа проверки орфографии с помощью Word работает в Windows 7 без проблем, а в Windows XP дает ошибку. Очень бы хотелось узнать, с помощью каких средств или по каким методикам можно узнать причину этой ошибки. Прикрепляю проект, который работает в Windows 7, но не работает в XP (причем, везде office word 2007 и VS2008 в одинаковой комплектации)
  • Есть задача хранить непересекающиеся диапазоны целых чисел. Причем могут добавляться новые значения.
    Простой пример:
    * Есть существующий диапазон: [3, 8], [11, 15], [19, 20]
    * Добавляется новый диапазон [5, 16] - он должен объединить два первых в один.

    Вопрос - есть ли какой-то существующий базовый механизм для работы с такими коллекциями?
    SortedList не подходит по причине необходимости работы с предыдущими и последующими записями.
    Возможно, будет решением использование LINQ, но я с ним почти не работал.

    .NET Framework 3.0
  • Программирование :: С/С++
  • Собственно сабж. Окошко в котором две кнопки: "Открыть" и "Выход", ну выход мне понятно, а как создать кнопку открыть, что бы по клику на нее я мог выбрать файл на каком-либо диске?
  • можно ли (если да, то как) узнать, что при вызове след. функции или при входе в след. блок произойдет переполнение стека?
    //кроме как суммировать sizeof всех переменных (и адресов возврата, что записываются в сек перед вызовом ф-ции)
    или как нибудь перехватить это исключением?
  • Собственно вопрос в том, почему не отлавливаются исключения без параметра? Хотя во многих книжках встречал примеры исключений без параметра (правда щас уже не вспомню в каких).

    Код: (cpp)
    // Случай номер один:
    try {
        throw; // генерируем исключение
    }
    // говорим - ловить любые исключения
    catch(...) {
        // сюда почему - то не попадаем, вместо этого программа вываливается с Unhandled Exception
    }

    // Случай номер два:
    try {
        throw 0; // генерируем исключение с ПАРАМЕТРОМ!
    }
    // говорим - ловить любые исключения
    catch(...) {
        // срабатывает как надо
    }

    Компилятор:
    Код:
    Using built-in specs.
    COLLECT_GCC=g++
    COLLECT_LTO_WRAPPER=/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/lto-wrapper
    Target: x86_64-linux-gnu
    Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.5.2-8ubuntu4' --with-bugurl=file:///usr/share/doc/gcc-4.5/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.5 --enable-shared --enable-multiarch --with-multiarch-defaults=x86_64-linux-gnu --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib/x86_64-linux-gnu --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.5 --libdir=/usr/lib/x86_64-linux-gnu --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-plugin --enable-gold --enable-ld=default --with-plugin-ld=ld.gold --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
    Thread model: posix
    gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)
  • Есть переменная, тип int. Два потока пишут в эту переменную, а третий считывает значение этой переменной. Запись синхронизирована мьютексом, чтение не синхронизировано. Собственно вопрос в том, безопасно ли считывать значение этой переменной? Что будет, если потоки начнут одновременно читать и писать в эту переменную?
  • то, что задефайненные идентификаторы (возможно с параметрами) заменяются (раскрываются) соответствующей последовательностью лексем - понятно, вопрос: когда? и в каком порядке?

    например в строках с директивой #define макросы не раскрываются
    Код: (cpp)
    #define a q
    #define b a
    #undef a
    после такого кода он будет заменять b на a a не на q
    а например в #if раскрываются

    после раскрытия макроса в строке он снова ищет идентификаторы, которые можно раскрыть
    напр. после кода выше, только без undef'a, он будет b заменять на q

    но тогда непонятно, почему следующий код не заставляет препроцессор зациклиться?
    Код: (cpp)
    #define b a
    #define a b

    int main()
    {
    int a;
    #undef a
    #undef b
    a;
    }
  • Предыстория:
    Решил переходить со своего старенького любимого VC6.0 на VC2010.
    Для личных нужд потребовалась программка по копированию файлов.
    Поставил на ноутбук (Win7pro-лицензионка) Visual Studio 2010.
    Написал. Запустил. Работает.
    В ней всего-то ДВЕ РАБОЧИЕ функции:
    CreateDirecrory();
    CopyFile();
    Перенес на стационарный комп(Win7ultima-лицензионка)
    Запустил... и получил сообщение:

    "Запуск программы невозможен, так как на компьютере отсутствует
    MSVCR100.dll. Попробуйте переустановить программу."


    Загрузил ТОТ ЖЕ САМЫЙ текст под VC6.0 на ноуте(под XP), скомпилил, перенес на Стационарный комп(Win7), запустил - РАБОТАЕТ.

    Вот тут мне крышу и снесло!
    Это что получается? Установщик VC 2010 накидал мне в операционку своих НОВЫХ DLL-ок, они при запуске программ автоматом подгружаются и проги - работают! А если я знакомому эту прогу дам попользоваться, то она у него работать НЕ будет? Он ведь не пользуется VC 2010!!!
    Потом я подостыл и попытался думать.

    А теперь вопрос:
    Как мне встроить эту DLL в свою программу. Ну, наподобие как в VC6.0 - "статические библиотеки", а не подгружаемые динамически в память при вызове.
    Или мне нужно к моей малюсенькой программке писать установочный модуль по встраиванию DLL2010 в операционку Win7???

    Заранее спасибо за ответы.
  • Прошу помощи с данной проблемой. Много всего прочел но никак не могу собрать это все в кучу - в голове каша. Итак, отступив от полемики изложу суть:  нужно создать приложение, которое получает список файлов с указанного диска (папки), список должен содержать 4-ре колонки: Имя_файла, Путь_к_файлу, Размер_файла, Дата_создания/модификации.
    Буду благодарен за любую инфо!
  • Программирование :: С/С++ :: WinAPI & Visual C++
  • Хотелось бы услышать советы насчёт вот такого вопроса

    Мне через некоторое время предстоит делать программу удалённого администрирования (простенький вариант TeamView или RAdmin) , и хочу заранее разузнать в общем виде, возможно ли на Qt кроссплатформенно организовать основных "китов"

    1) работа с MySQL
    2 управление мышью из программы без участия реальной мыши
    3) то же самое для клавы

    Если что-то из этого не реализуется кроссплатформенно, то мне придётся выбрать MFC+WinAPI (разработка всё равно сейчас предполагается чисто под винду)
  • В коде функция ReadDirectoryChangesW() возвращает ноль:
    Код:
    #define pathDir                "Z:\\"

    DWORD WINAPI ThreadFunc(LPVOID lpParam)
    {
        HANDLE hDir = CreateFile(_T(pathDir),                        // pointer to the file name
                                FILE_LIST_DIRECTORY,                // access (read/write) mode
                                FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,  // share mode
                                NULL,                               // security descriptor
                                OPEN_EXISTING,                      // how to create
                                FILE_FLAG_BACKUP_SEMANTICS,         // file attributes    (FILE_FLAG_OVERLAPPED)
                                NULL);                              // file with attributes to copy
                                
      
        const DWORD dwNotificationFlags = FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_FILE_NAME;
        FILE_NOTIFY_INFORMATION Buffer[1024];
        DWORD BytesReturned;
        VOID *pBuf = (BYTE*)&Buffer;    

        while (ReadDirectoryChangesW(hDir,                     // handle to directory
                                     &Buffer,                  // read results buffer
                                     sizeof(Buffer),           // length of buffer
                                     TRUE,                     // monitoring option
                                     dwNotificationFlags,
                                     &BytesReturned,           // bytes returned
                                     NULL,                     // overlapped buffer
                                     NULL))                       // completion routine
                                    
        {
            FILE_NOTIFY_INFORMATION* pInfo = (FILE_NOTIFY_INFORMATION*) pBuf;
            SelectAction(pInfo);

        }
        dwError = GetLastError();    
        CloseHandle(hDir);
        return 0;
    }
    GetLastError() выдает, что код ошибки
    ERROR_INVALID_FUNCTION  Incorrect function.

    На MSDN ReadDirectoryChangesW Function есть такое:
    Цитата
    Return Value
    If the function fails, the return value is zero. To get extended error information, call GetLastError.

    If the network redirector or the target file system does not support this operation, the function fails with ERROR_INVALID_FUNCTION.
    В посте Нужен алгоритм пишут:
    Цитата
    "Я проверял только на сетевом диске с NTFS. Там ReadDirectoryChangesW работал."

    Как заставить работать ReadDirectoryChangesW()?

    VS 2008
  • Программирование :: С/С++ :: Borland C/C++
  • Кто-нибудь знает как в Builder6, в базах данных реализуется быстрый поиск (набираю "А" появляются все записи на эту букву, и т. д.)? Что-то я не нашла в Builder6 подобного элемента..
  • Программирование :: Delphi
  • Если использовать вот такой вариант:
    Код: (delphi)
    const pathImage    = 'D:\Image.jpg';
    var OnLoad: boolean = true;

    procedure TForm2.FormCanResize(Sender: TObject; var NewWidth,
      NewHeight: Integer; var Resize: Boolean);
    var
      ScaleForm: Double;
    begin

      if OnLoad then
      begin
        if Assigned(Image1.Picture) then
        begin
          NewWidth := Image1.Picture.Width;
          NewHeight := Image1.Picture.Height;
        end;
        OnLoad := false;
        Exit;
      end;

      ScaleForm := NewWidth / NewHeight;
      if ScaleForm > Scale then
      begin
        NewHeight := Trunc(NewWidth / Scale);
      end
      else
      begin
        NewWidth := Trunc(Scale * NewHeight);
      end;


    end;

    procedure TForm2.FormCreate(Sender: TObject);
    begin
      if (FileExists(pathImage)) then
        Image1.Picture.LoadFromFile(pathImage);

      Scale := Image1.Picture.Width / Image1.Picture.Height;
    end;
    Свойства TImage;
    (http://s53.radikal.ru/i140/1108/16/0c1b09f0d685.jpg)

    То при запуске программы вид:
    (http://s44.radikal.ru/i106/1108/32/38c29359e143.jpg)

    Если попробовать прижать мышью заголовок формы и оттащить окно (можно еще так: мышку поместить в угол формы, собираясь изменить размер и при прикосновении произойдет аналогичное), то сразу станет так:
    (http://i050.radikal.ru/1108/bf/d09c5f28eed7.jpg)
    вот это как раз то, что и хотелось бы получить - именно такой вид. Некий рефреш происходит?
    Но каким образом сделать с самого начала подобное растяжение по всему пространству в форме?

    Delphi XE
  • (http://i025.radikal.ru/1108/f5/782466696414.jpg)
    Почему про нажатие клавиши не приходит сообщения? Т.е. с Message.lParam большим нуля.
    Код: (delphi)
    procedure TForm1.Wndproc(var Message: TMessage);
    var
        strLog: AnsiString;
    begin
      case Message.Msg of
        WM_KEYDOWN, WM_SYSKEYDOWN, WM_SYSKEYUP, WM_KEYUP:
        begin
          strLog := 'wParam: ' + IntToStr(Message.wParam) + ' lParam: ' + IntToStr(Message.lParam);
        end;
      else
        inherited;
      end;
    end;

    Delphi XE
  • Делая двойной щелчок в клиентской зоне я проверял какие приходят Message.Msg и получалось что одно WM_LBUTTONDOWN и два WM_LBUTTONUP. Почему?
    Код:
    implementation

    {$R *.dfm}

    var countClick :Word;
        Description: Word;

    procedure TForm1.Wndproc(var Message: TMessage);
    begin

      case Message.Msg of

        WM_LBUTTONDOWN, WM_LBUTTONUP:
        begin
          countClick := countClick + 1;

          Description := Message.Msg;

        end;

      else
        inherited;
      end;

    end;
  • Есть простейшая программа - форма, на ней TImage  и таймер. запускаю ее и начинаю на клаве набивать символы, хаотично, иногда цифры, Enter, Alt+Shift, пробел, вобщем, кнопки на основном участке клавиатуры.
    В какой-то момент в программа останавливается на breakpoint'е:
    (http://s40.radikal.ru/i089/1108/65/780672d1da1d.jpg)

    8 - это виртуальный код клавиши BackSpace. Но я её не жму! Откуда он взялся?

    (http://s1.ipicture.ru/uploads/20110809/ymCSWTSA.jpg)

    Вот как лог выглядит:
    Цитата
    .................etc ........................
    wParam: 68 lParam: 2097153
    wParam: 70 lParam: 2162689
    wParam: 68 lParam: -1071644671
    wParam: 83 lParam: -1071710207
    wParam: 70 lParam: -1071579135
    wParam: 13 lParam: 1073741825
    wParam: 13 lParam: -2145648639
    wParam: 83 lParam: 2031617
    wParam: 70 lParam: 2162689
    wParam: 8 lParam: 1
    wParam: 8 lParam: -1073741823
    wParam: 8 lParam: 1
    wParam: 8 lParam: -1073741823
    wParam: 83 lParam: 1073741825
    wParam: 83 lParam: -1073741823
    wParam: 70 lParam: 1073741825
    wParam: 70 lParam: -1073741823
    wParam: 83 lParam: -2145452031
    ................etc .........................

    Код: (delphi)
    procedure TMainForm.Wndproc(var Message: TMessage);
    var
        strLog: AnsiString;
    begin

      case Message.Msg of
        WM_KEYDOWN, WM_SYSKEYDOWN, WM_SYSKEYUP, WM_KEYUP:

        begin
          strLog := 'wParam: ' + IntToStr(Message.wParam) + ' lParam: ' + IntToStr(Message.lParam);
        end;

      else
        inherited;
      end;

    end;

    Как отследить откуда прилетел месидж?

    Delphi XE
  • Программирование :: Программирование 1С
  • Всем Добрый День.
     
    Столкнулся с проблемой в 1С 8.1.. Требуется получить объект формы Активного окна. В 8.2 можно без проблем получить его методом АктивноеОкно() но в 8.1 такого чудометода нету... Есть ли способ получить список всех открытых окон или активного? Существует вариант с Документы.ДОКУМЕНТ.ПолучитьФорму("НУЖНАЯФОРМА", ЭтаФорма, [КлючУникальности]) и затем по этому ключу получать форму. Но контора не соглашается разрешать редактировать любой из их родных методов... Подскажите как мне быть... Если пригодится то имеется точное имя этой формы и ссылка типа "Форма" на экземпляр Главного Окна. Может быть как то можно завязаться имея только эту информцию об окне. Пока что вариант с копированием метода не рассматривается...
     
    Спасибо Заранее..
  • Всем добрый день!
    Я новичок в программировании, так что прошу камни не кидать!
    Вопрос заключается в следующем: 1с бухгалтерия 8.2, необходимо изменить форму документа "Платежное поручение исходящее", Операция - Перечисление денежных средств подоотчетному лицу.
    В конфигураторе отображается только форма для операции - Оплата поставщику.
    Никак не найду куда нужно тыкнуть)))
    Просьба, кто знает, помочь и написать предельно понятно!!
    Огромное спасибо! 
  • Программирование :: Программирование 1С :: 1С 7.x
  • Здравствуйте уважаемые форумчане! в панорамировании пока новичок, возникла такая ситуация - есть рабочее место с 1с предприятие 7.7 Штрих-М кассир, все настроено все работает нормально, но нужно что бы кассир мог делать "СТОРНО" для товара до определенной цены (например товар с ценной до 100 руб. можно отменить - сторно)
    Подскажите пожалуйста какие нибудь идеи.
    модуль сторно могу выложить
    Код:
    Процедура Сторно()
            Если НовыйЧек=1 Тогда
                НовыйЧек();
            КонецЕсли;
           
            Если НачинатьСНуля=1 Тогда
                НачалоСНуля();
            КонецЕсли;
           
            Если ЧекОткрыт=0 Тогда
                Возврат;
            КонецЕсли;
           
            Если ВидЧека>3 Тогда
                Сигнал();
                Возврат;
            КонецЕсли;
            ВнешняяКомпонента.MaxKeyNum=-1;
            ВнешняяКомпонента.MinKeyNum=-1;
           
            Если Чек.КоличествоСтрок()>0 Тогда
                Если Чек.Флаг=2 Тогда
                    ВнешняяКомпонента.MaxKeyNum=255;
                    ВнешняяКомпонента.MinKeyNum=1;
                    Возврат;
                КонецЕсли;
                Цифры=?(ДесТ=2,"0.00","0.");
                ПоложениеТочки=ДесТ;
                НажатаТочка=0;
                Кол=1;
                НажатПромИтог=0;
                ТекТовар=0;
                К=1;
               
                Если ПустоеЗначение(Чек.Товар)=0 Тогда
                    ТекТовар=?(Чек.Товар.Вид()="Товары",Чек.Товар,Чек.Товар.Владелец);
                   
                    Если Чек.Товар.Вид()="Единицы" Тогда
                        К=?(Чек.Товар.Коэффициент=0,1,Чек.Товар.Коэффициент);
                    КонецЕсли;
                КонецЕсли;
               
                Если ПроверкаПрав("Сторно")=0 Тогда
                    СтрокаДляТовараКК(3,0,ТекТовар,Чек.Количество*К,Чек.Цена/К,Чек.Сумма,,Чек.НомерСтроки,2006,Чек.СуммаСкидки);
                    ВнешняяКомпонента.MaxKeyNum=255;
                    ВнешняяКомпонента.MinKeyNum=1;
                    Возврат;
                КонецЕсли;
               
                Если (ИтогЧека("СуммаСоСкидкой")-СуммаСкидкиНаЧек-Чек.СуммаСоСкидкой<0) И (СкидкаНаЧек=0) И (ЕстьВозвратыВЧекеПродажи=0) Тогда
                    ЗвуковойСигнал();
                    ВывестиПредупреждение("Полученная сумма будет меньше нуля!","Сторно невозможно!");
                    ВнешняяКомпонента.MaxKeyNum=255;
                    ВнешняяКомпонента.MinKeyNum=1;
                    Возврат;
                КонецЕсли;
               
                Если ВидЧека<>3 Тогда
                    Если ПечататьКаждуюСтроку>0 Тогда
                        Если ПечатьРегистрации(Чек.Номер,Чек.Товар,Чек.Количество,Чек.Цена,Чек.Секция,Чек.Продавец,1)=0 Тогда
                            ВнешняяКомпонента.MaxKeyNum=255;
                            ВнешняяКомпонента.MinKeyNum=1;
                            Возврат;
                        КонецЕсли;
                       
                        Если Чек.СуммаСкидки<>0 Тогда
                            СтрокаДляПечати="";
                           
                            Если ПустоеЗначение(Чек.АвтоматическаяСкидка)=0 Тогда
                                СтрокаДляПечати=СокрЛП­(Чек.АвтоматическаяСкидка.ТекстДляЧека);
                            КонецЕсли;
                           
                            Если ПустоеЗначение(Чек.ФиксированнаяСкидка)=0 Тогда
                                СтрокаДляПечати=СокрЛП­(Чек.ФиксированнаяСкидка.ТекстДляЧека);
                            КонецЕсли;
                           
                            Если ПечатьСкидки(Чек.СуммаСкидки,Чек.Скидка,Чек.СуммаСоСкидкой,СтрокаДляПечати)=0 Тогда
                                ВнешняяКомпонента.MaxKeyNum=255;
                                ВнешняяКомпонента.MinKeyNum=1;
                                Возврат;
                            КонецЕсли;
                        КонецЕсли;
                    КонецЕсли;
                    Транз=СоздатьОбъект("Справочник.ВремТранзакции");
                    Знак=?(ВидЧека=1,-1,1);
                   
                    Если Чек.Флаг=3 Тогда
                        Знак=1;
                    КонецЕсли;
                    Транз.Новый();
                    Транз.Код=Формат(Число(Чек.ТранзакцияРегистрации)+7,"Ч(0)7");
                    Транз.Наименование=?(ПустоеЗначение(Чек.Товар)=0,"Сторно","Секция");
                    Транз.НомерККМ=Константа.НомерПОС;
                    Транз.ДатаТранз=ТекущаяДата();
                    Транз.ВремяТранз=ТекущееВремя();
                    Транз.ТипТранзакции=?(ПустоеЗначение(Чек.Товар)=0,12,2);
                    Транз.НомерЧека=НомерЧека;
                    Транз.Секция=Чек.Секция;
                    Транз.КодКассира=ТекущийПользователь.Код;
                    Транз.КодТовара=?(ПустоеЗначение(Чек.Товар)=0,ТекТовар.Код,0);
                    Транз.Цена=Чек.Цена/К;
                    Транз.Количество=Знак*Чек.Количество*К;
                    Транз.Сумма=Окр(Знак*Чек.СуммаСоСкидкой,ДесТ);
                    Попытка   Транз.Записать();
                    Исключение     ЗвуковойСигнал();
                        ВывестиПредупреждение("Ошибка работы с базой данных:"+РазделительСтрок+ОписаниеОшибки()+"!","Ошибка базы!");
                        ВнешняяКомпонента.MaxKeyNum=255;
                        ВнешняяКомпонента.MinKeyNum=1;
                        Возврат;
                    КонецПопытки;
                    Чек.Флаг=2;
                    СтрокаДляТовараКК(0,0,ТекТовар,Чек.Количество*К,Чек.Цена/К,Чек.Сумма,,Чек.НомерСтроки,2006,Чек.СуммаСкидки);
                    ПозЧ=РасчСкидкиНаПоз.НайтиЗначение(Чек.НомерСтроки);
                   
                    Если ПозЧ>0 Тогда
                        РасчСкидкиНаПоз.УдалитьЗначение(ПозЧ);
                    КонецЕсли;
                   
                    Если СкидкаНаЧек<>0 Тогда
                        Если ПересчетСкидкиНаЧек()=0 Тогда
                            ВнешняяКомпонента.MaxKeyNum=255;
                            ВнешняяКомпонента.MinKeyNum=1;
                            Возврат;
                        КонецЕсли;
                    КонецЕсли;
                Иначе   Чек.УдалитьСтроку();
                КонецЕсли;
            КонецЕсли;
           
            Если (Константа.РазрешитьАвтоматическиеСкидки>0) И (ВидЧека=1) Тогда
                РассчитатьАвтоматическуюСкидкуНаЧек();
            КонецЕсли;
           
            Если (Константа.РазрешитьНакопительныеСкидки>0)     И (ПустоеЗначение(ВыбраннаяДисконтнаяКарта)=0) Тогда
                Если (ПолучитьСкидкуПоДисконтнойКарте(ВыбраннаяДисконтнаяКарта)<>ДисконтнаяСкидкаНаЧек) ИЛИ (Константа.КонтрольСкидок>0) Тогда
                    Скидка(0,1,,1,,ВыбраннаяДисконтнаяКарта,1);
                    Скидка(0,0,,1,,ВыбраннаяДисконтнаяКарта,1);
                КонецЕсли;
            КонецЕсли;
           
            Если (ПустоеЗначение(ФиксированнаяСкидкаНаЧек)=0) И (Константа.КонтрольСкидок>0) Тогда
               
                Если ФиксированнаяСкидкаНаЧек.ВидСкидки=Перечисление.ВидыСкидок.Процентная Тогда
                    Скидка(?(ФиксированнаяСкидкаНаЧек.ТипСкидки=Перечисление.ТипыСкидок.Скидка,0,2),1,,1,ФиксированнаяСкидкаНаЧек);
                    Скидка(?(ФиксированнаяСкидкаНаЧек.ТипСкидки=Перечисление.ТипыСкидок.Скидка,0,2),,,1,ФиксированнаяСкидкаНаЧек);
                КонецЕсли;
            КонецЕсли;
            ПересчетСкидкиНаЧек();
           
            Если ВидЧека=1 Тогда
                Операция="Продажа";
            ИначеЕсли ВидЧека=2 Тогда
                Если ФлагВозврата=1 Тогда
                    Операция="Возврат";
                Иначе   Операция="Аннул.";
                КонецЕсли;
            ИначеЕсли ВидЧека=3 Тогда
                Если ФлагВозврата=1 Тогда
                    Операция="Возврат по №";
                Иначе   Операция="Аннул. по №";
                КонецЕсли;
            КонецЕсли;
           
            Если Константа.РаботаСДисплеем>0 Тогда
               
                Если Константа.РазделятьТриады=0 Тогда
                    ФорматСумм="Ч."+ДесТ;
                Иначе   ФорматСумм="Ч."+ДесТ+".'";
                КонецЕсли;
               
                Если Константа.ВыводитьПромИтогНаДисплей>0 Тогда
                    ВывестиСтрокуНаДисплей("Сторно "+ФормС(Чек.СуммаСоСкидкой,ФорматСумм),1);
                    ВывестиСтрокуНаДисплей("Пром.итог "+ФормС(ИтогЧека("СуммаСоСкидкой")-СуммаСкидкиНаЧек,ФорматСумм),2);
                Иначе   ВывестиСтрокуНаДисплей("Сторно",1);
                    ВывестиСтрокуНаДисплей(ФормС(Чек.СуммаСоСкидкой,ФорматСумм),2);
                КонецЕсли;
            КонецЕсли;
            ОбновитьНомераСтрок();
            ВнешняяКомпонента.MaxKeyNum=255;
            ВнешняяКомпонента.MinKeyNum=1;
        КонецПроцедуры
  • Программирование :: Программирование 1С :: 1С 8.x
  • Добрый день.

    Ну вообщем задача заключается в следующем: получить в оборотке по счету 3721 по каждому сотруднику детализацию сумм по номерам авансовых отчетов (т.е. чтобы оплаты закрывались на авансовые отчеты).
    Для этого был создан забалансовый счет с аналитикой Физическое лицо и ВнутренийНомерАО
    Ну соответственно пока делаю для авансового отчета
    Создала подписку на событие, чтобы при проведении документа формировалась дополнительная проводка.
    А как запрограммировать процесс создания проводки не знаю

    Период - Источник.Дата
    Регистратор - Источник.Ссылка
    Счет Дт - СчетСсылкаАО (забалансовый счет)
    СубконтоДт1 - Источник.ФизЛицо
    СубконтонДт2 - Источник.НомерАвансовогоОтчета (доп. справочник, который был создан)
    СчетКт - Счет.ПустаяСсылка
    Сумма - Источник.СуммаДокумента

    Даже с чего начать не знаю, помогите недопрогеру))))
  • Господа помогите новичку плиз. В отчете при нажатии кнопки вызывается необходимая форма, но данные после прошлой работы не очищаются. Подскажите пожалуйста, как сделать, чтобы  они очищались? Какие команды?
  • Операционные системы :: Windows
  • Нашел инструкцию:
    Как настроить сеть в VMware (большинство версий, в частности 5 и 6) (декабрь 2008 г.)
    но насколько она подходит для VMware Player 3.1.4?
    То, что там на шаге 3 и 4 - таких картинок у меня нет.
    У кого есть иные алгоритмы настройки?
    Хотелось бы видеть компы локальной сети из Guest-Windows.
  • Направления программирования :: Drivers
  • ObOpenObjectByName() возвращает код ошибки 0хс0000024 :

    Код:
    RtlInitUnicodeString(&obj_name, L"\\Device\\Tcp");

    InitializeObjectAttributes(&objAttr, &obj_name, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);

    status = ObOpenObjectByName(&objAttr, NULL, KernelMode, NULL, NULL, NULL, &hObject);
    if (!NT_SUCCESS(status))
    {
    DbgPrint("[Driver entry]: ObOpenObjectByName error!\n %x",status);
    }

    Поможет кто-нибудь понять в чём дело?
  • Вечер добрый.

    Нужна ваша помощь в попытке написания фильтр-драйвера к мыши. Попытался перерыть что можно, но в итоге многое отправляется на moufilt.c из DDK, а до wdf я еще не добрался. Хоть бы просто NT написать. Попробую описать задачу и вопросы вставшие. Может хоть чем-то сможете помочь.

    Задача. Написать драйвер - работающий в режиме ядра, который может отсылать "наверх к системе" сгенерированные IRP пакеты (данные приходят из usermode - приложения).

    Как я понял, мне нужен фильтр которые должен аттачится к девайсу.
     - Как достать имя нужного девайса в системе? (Для IoAttachDevice нужно имя. А где взять имя именно мыши?)

    Мне не нужно обрабатывать получаемые пакеты
     - Нужно ли что-то перекрыть чтобы отослать собственно созданный пакет?

    Далее, нужно перекрыть IRP_MR_WRITE, получать данные от программы, создавать пакет, и как-то его посылать вверх системе.
     - Создать IRP, вроде понятно.
     - Структура IRP пакета вроде тоже ясна.
     - А вот как послать, и куда послать ... совсем не ясно.

    Я понимаю что тут, на 99% где-то есть провалы, вот только не могу их понять.
    Например: По идее я должен послать IRP пакет выше к системе. Но как система его обработает, и связано ли это с тем драйвером мыши? (например, нужно ли писать фильтр, или есть какой-то другой способ? Например просто отдельно стоящий драйвер).
    Что нужно перекрывать? Есть такие функции как MouFilter_IsrHook, MouFilter_ServiceCallback, InternalDeviceControl.
    Можно ли на них забить большой больщой болт?

    (Пробовал прочесть Комиссарову (но так "это и так ясно", "это уже понятно") и Солдатова (но там тоже не ок для новичков в драйверном деле. Подвернулись хорошие статьи http://www.codeproject.com/KB/system/driverdev4asp.aspx, но тут под ntddk. Осваиваю что могу.

    Вот. Если куда-то сможете направить поток мыслей - огромное спасибо.
    Олег.
     
    ЗЫ. драйвер писать надо, т.к. mouse_event, и SendInput очень часто стали блокироваться... так что выхода нет.


    Добавлено через 22 минуты и 16 секунд:
    Забыл дописать.
     - Где тот конец, когда PMOUSE_INPUT_DATA, превращается в реальное перемещение мыши в системе?
  • Направления программирования :: Сети
  • Доброго времени суток!

    Дано:
    1. Virtual PC
    2. 2 Виртуальные машины: На первой установлени Server 2008, На второй Server 2008 (Ядро)
        В параметрах "сеть" первой и второй ВМ указываю Внутренняя сеть.
    3. В первой создаю домен contoso.com с DHCP, прописываю IP и задаю диапазон IP.

    Надо: подключить Вторую ВМ к домену.

    Вторая ВМ не получает автоматически IP, не подключается к домену.

    В чем может быть причина ?

    Изучаю по книге "Развертывание и настройка Windows Server 2008" стр. XXXI

    Большое СПАСИБО!
  • Направления программирования :: Web :: Серверные скрипты
  • непонятная ситуация

    запускаю скрипт из консоли, в котором
    стоит проверка на удачную операцию

    if (apc_store('what_listen', $what_listen) === false) echo "error";

    И... понятно, что получаю ошибку...
    Недолгий анализ показал, что
    apc.enable_cli = off

    Раз такое дело... то
    запускаем
    php -d apc.enable_cli=1 script.php

    Ошибки нет...
    Тогда в apc.ini устанавливаю флаг в 1
    apc.enable_cli=1

    И теперь уже спокойненько..

    php script.php
    Можно предположить что в кеш что-то нужное положили. Скрипт выполнился без ошибок

    запускаю проверочный скрипт, но уже с желанием вытащить из кеша...
    php test.php
    Код:
     $what_listen = apc_fetch('what_listen');
    if ($what_listen === false) {
    echo "error";
    } else {
    echo $what_listen;
    }
    Результат - error.
    В данном случае apc.enable_cli уже не причем.

    Немного переделываю скрипт
    Код:
    if (apc_exists('what_listen')) {
        $what_listen = apc_fetch('what_listen');
    if ($what_listen === false) {
    echo "error";
    } else {
    echo $what_listen;
    }
    } else { echo "what_listen not exist";
    }

    Ключа-то нет....

    Начинаю уходить в чтение доков.
    Цитата
    apc.enable_cli integer
        Mostly for testing and debugging. Setting this enables APC for the CLI version of PHP. Under normal circumstances, it is not ideal to create, populate and destroy the APC cache on every CLI request, but for various test scenarios it is useful to be able to enable APC for the CLI version of PHP easily.
    И что? Никто не запрещает...

    А мне надо... чтоб кеш был доступен и в других приложениях.

    зы
    если я запускаю эти скрипты уже из браузера, то КЕШ становится доступен для всех остальных скриптов, которые проходят через web сервер.
  • Практические разделы :: Базы данных
  • Имеем некую абстрактную СУБД, работающую по стандарту SQL-92 (на самом деле нужно для 1С, но в рамках этой задачи аналогия правомерна).

    Исходные данные:
    Таблица Номенклатура (goods):
    Наименование (description)
    Бренд (id_brand)
    Пол (sex)

    Таблица Реализаторы (sellers)
    Реализатор (id_seller) NOT NULL
    Бренд (id_brand)
    Пол (sex)

    На выходе нужно получить таблицу Реализаторы номенклатуры:
    Наименование (description)
    Бренд (id_brand)
    Пол (sex)
    Реализатор (id_seller)

    сформированную по следующим правилам:
    1. Если в таблице реализаторы есть полное соответствие параметров (бренд, пол) - берем это значение
    2. Иначе если есть соответствие только бренда и значение sellers.sex IS NULL - берем это значение
    3. Иначе подставляем значение по умолчанию (sellers.id_brand IS NULL & sellers.sex IS NULL)

    Вот пример:
    (http://forum.shelek.ru/index.php?action=dlattach;attach=6116;image)

    Результат нужно получить запросом (или набором запросов с временными таблицами) без использования функций

    Добавлено через 11 минут и 48 секунд:
    Доп.условие (не обязательно): желательно сделать запрос, который нужно минимально редактировать когда количество полей для связи увеличится (например 3 а не 2 - добавим еще Цвет).
    При этом считаем что есть четкая логика приоритетов по порядку полей: Бренд, Пол, Цвет.
    Приоритет 1: Бренд, Пол, Цвет
    Приоритет 2: Бренд, Пол, NULL
    Приоритет 3: Бренд, NULL, NULL
    Приоритет 4: NULL, NULL, NULL
    Значения NULL возможны только справа подряд, т.е. варианты Бренд, NULL, Цвет или NULL, Пол, NULL недопустимы (контролируется триггерами)

  • Практические разделы :: Безопасность PC
  • Много слышал радостных рассказов линуксоидов, как они не знаю, что такое антивирус.

    А вот такой вопрос: если установить на компе линукс (какой именно - не знаю, не разбираюсь), на нём настроить файервол, поставить виртуалку и в ней поставить хрюшку. Нужно ли в XP пользоваться антивирусом ? Ведь, по сути, это остаётся винда, хоть и виртуальная, и голая винда так же точно что-то подцепить может. В чём же заключается защита ?

А теперь прощаемся с Вами до следующего выпуска.


С уважением, команда Клуба.


В избранное