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

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


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

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



В сегодняшнем выпуске рассылки — подборка тем форума.



Приятного чтения! Прощаемся с вами до следующего выпуска.


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


  • Программирование :: Общий
  • Здравствуйте.

    Я задавал много, где на форумах этот вопрос, но пока решения не получилось. Может быть здесь найдётся решение.

    Задача:
    У меня есть двоичный (бинарный) файл. То есть каждый байт файл это значение RGB.
    R = 1-й байт
    G = 1-й байт
    B = 1-й байт
    На следующей стадии цикла будет
    R = 2-й байт
    G = 2-й байт
    B = 2-й байт
    и так далее

    Я пробовал заполнить объект QImage с помощью метода "setPixel" и выводить через метод "drawImage", так как этот метод позволяет выводить по частям.
    Но увы для использования метода "setPixel" нужен двойной цикл, а значений очень много и из-за этого всё тормозит.

    OpenGL использовать нельзя.

    Может есть механизм без циклов заполнить объект QImage или какой-то другой механизм заполнения есть?

    Мне нужно, что бы ни при заполнении, ни при выводе циклов не было,  при том вывод должен уметь выводить по частям.
  • Привет.

    Вот уже более 10 лет программирую в Windows. Думал - ну ничего не упускаю, книги читаю. И тут разбираясь в примере по фильтрам ISA
    от Microsoft наткнулся  на вызов функции RegisterWaitForSingleObject и обомлел. Почему ни в одной книге я не вычитал про неё? Может завести
    тему "WIN API обмен опытом" где нибудь в "Техно"?
  • Программирование :: .NET технология от и до
  • Как в c# открыть окно свойств конкретного процесса. Ну как в "правая кнопка по .exe-> свойства"?
  • Есть следующий код. В listview добавляются процессы. Данный метод вызывается каждые 3 секунды с помощью таймера. Как сделать так, что бы после обновления фокус оставался на выделенном элементе, если он ещё есть и положение скролла сохранялось? Все подобные темы пересмотрел но так и не получилось решить проблему.
    Код: (csharp)
     private void UpdateProcessList()
            {
                listView1.Items.Clear();
                foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
                {
                    try
                    {
                        int index = listView1.Items.Add(p.ProcessName).Index;
                        listView1.Items[index].SubItems.Add(p.Id.ToString());
                        listView1.Items[index].SubItems.Add(p.StartTime.ToShortTimeString());
                        long temp = p.WorkingSet64 / 1024;
                        listView1.Items[index].SubItems.Add(temp.ToString()+" КБ");
                    }
                    catch { }
                }
            }
  • Очевидный способ собрать решение, написанное на нескольких языках программирования .NET - это код на каждом языке оформить отдельной сборкой (assembly) в виде dll, а затем подключить их к исполняемому exe файлу основной программы. Этот способ предлагается Visual Studio - к другим она не приспособлена. Не всегда удобно создавать решение из множества файлов, и средства самого .NET позволяют справиться с этой задачей. Главная сложность состоит в том, чтобы и сохранить удобную среду разработки Visual Studio, и получить желаемое решение.

    Инфраструктура



    Для начала создадим инфраструктуру.

    1) Создаём пустой solution: в системном меню выбираем File/New Project. В открывшем диалоге выбираем Other Project Types/Visual Studio Solutions\Blank Solution. Задаём имя, допустим, mulilang. Создаём solution.

    2) Добавляем в solution пустой проект C#: правой кнопкой мыши кликаем на Solution и в контекстном меню выбираем Add/New Project. В открывшемся диалоге выбираем Visual C#/Windows/Empty Project. Задаём имя, допустим, csl. Создаём проект.

    3) Изменяем тип проекта csl на нестандартный. Для этого:

    3.1) Правой кнопкой мыши кликаем на проект csl и в контекстном меню выбираем Unload Project. Затем опять правкой кнопкой мыши кликаем на проект csl и в контекстном меню выбираем Edit.

    3.2) В открывшемся XML-файле проекта находим элемент Project/PropertyGroup/OutputType. Стандартным редактором свойств туда можно установить только три значения: "Exe" (Console Application), генерирующий файл типа exe, запускающийся в чёрном окне консоли, "Winexe" (Windows Application), генерирующий файл типа exe, запускающийся без окна консоли, и "Library" (Class Library), генерирующий файл типа dll, пригодный к подключению к другим проектам типа exe и dll.

    Есть недокументированное значение: "Module", генерирующее файл типа netmodule. Этот файл подобен библиотеке dll и может подключаться к другим exe и dll. Разница заключается в том, что любой exe и dll представляет собой законченную сборку (assembly), а netmodule - только составную часть какой-то сборки. Т.е. при помощи модулей в .NET можно создавать многофайловые сборки. Например, такие, части которых написаны на разных языках программирования.

    И вот нам нужно в XML-узле Project/PropertyGroup/OutputType записать значение Module, заставящее комплиятор C# сгенерировать файл модуля.

    3.3) Поменяв значение, сохраняем файл проекта. Обязательно закрываем окно редактора. Правой кнопкой мыши кликаем на проект csl и в контекстном меню выбираем Reload Project.

    Теперь, если открыть свойства проекта, мы увидим там на вкладке Application в выпадающем списке Output Type какое-то одно из стандартных значений, что неправильно, но на самом деле, если не трогать этот выпадающий список, там сохранится значение Module. Остальные свойства проекта можно менять свободно и даже конвертировать solution в новые версии Visual Studio - значение не испортится.

    4) Наполним проект содержанием. Правой кнопкой мыши кликаем на проект csl и выбираем в контекстном меню пункт Add/New Item. В открывшемся диалоге выбираем Class. Зададим имя, допустим, CSL. Добавляем класс в проект. Оформим его как точку входа в приложение: добавим метод Main и какой-нибудь вывод на экран.

    Код: (csharp)
    using System;

    namespace csl
    {
        class CSL
        {
            static void Main(string[] argc)
            {
                Console.WriteLine("Hello world.");
                Console.ReadKey();
            }
        }
    }

    5) Делам Build для solution и убеждаемся, что всё нормально. Ищем на диске наш solution, открываем папку multilang/csl/bin/<Имя конфигурации> (Debug или Release) и смотрим, что там появился файл csl.netmodule. Этот файл не является исполняемым.

    6) Чтобы наша программа заработала, нужно полученный модуль подключить к какому-нибудь exe. При использовании редактора связей .NET al (который вызывают компиляторы C#, VB и других языков .NET) можно построить только такие exe и dll, у которых модули остаются внешними. Т.е. для запуска программы рядом с exe-файлом должны находится файлы netmodule. Это нам не интересно. А вот редактор связей C++ link умеет собирать такие exe, внутрь которых встраиваются netmodule. Этим мы и воспользуемся.

    7) Добавим в solution пустой проект C++: правой кнопкой мыши кликаем на multilang и в контекстном меню выбираем Add/New Project. В открывшемся диалоге выбираем Visual C++/General/Empty Project. Задаём имя, допустим, app. Создаём проект.

    7.1) Этот проект будет у нас главным для запуска, поэтому правой кнопкой мыши кликаем на app и в контекстном меню выбираем Set as StartUp Project.

    8 ) Поскольку нас интересует только редактор связей, никакого полезного содержания в проекте app у нас не будет. Но чтобы процесс сборки вообще запускался, мы добавим один пустой файл C++. Кликаем правой кнопкой мыши на проект app, в контекстном меню выбираем пункт Add/New Item. В открывшемся диалоге выбираем C++ File. Зададим имя, допустим, stub. Добавляем файл в проект.

    9) Сборка проектов C++ отличается от сборок проектов других языков местом расположения файлов результата. Они будут попадать в папку multilang/<Имя конфигурации> - т.е. находятся на уровне solution, а не отдельного проекта.

    Чтобы наш модуль попадал именно туда, нужно изменить свойства проекта csl. Кликаем правой кнопкой мыши на проект csl и выбираем в контекстном меню пункт Properties. Находим на вкладке Build элемент Output path. Если текущая конфигурация Debug, там написано "bin\Debug\". Меняем на "..\Debug\". Сверху в выпадающем списке Configuration выбираем следующую конфигурацию Release и в ней тоже меняем значение на "..\Release\". Возвращаем исходную конфигурацию, сохраняем и закрываем окно свойств проекта csl.

    10) Связываем проекты зависимостью: кликаем правой кнопкой мыши на проекте app и в контекстном меню выбираем Project Dependencies. В открывшемся диалоге ставим галочку на проекте csl и закрываем окно.

    11) Настраиваем редактор связей: кликаем правой кнопкой мыши на проекте app и в котекстном меню выбираем Properties. В открывшемся окне сверху в выпадающем списке Configuration выбираем All configurations.

    11.1) В дереве выбираем элемент Configuration Properties/Linker/Input. В поле Additional Dependencies записываем значение (с кавычками) "$(OutDir)\csl.netmodule".

    11.2) В дереве выбираем элемент Configuration Properties/Linker/System. В поле SubSystem выбираем значение Console. (Это для нашего случая, но в остальных случаях какое-то конкретное значение этой настройки нужно указывать обязательно.)

    11.3) В дереве выбираем элемент Configuration Properties/Linker/Advanced. В поле Entry Point записываем значение "csl.CSL.Main" - полное имя метода Main точки входа в программу (см. код выше).

    Закрываем окно свойств.

    12) Надо проверить результат. Нажимаем зелёную стрелку запуска или кнопку F5. Всё должно собраться, программа должна запуститься, и в окне консоли появится надпись "Hello world.". Нажатием любой клавиши можем завершить работу нашей программы. При желании можно скопировать файл multilang/<Имя конфигурации>/app.exe в другое место, где нет файлов netmodule, и убедиться, что и там наша программа успешно запускается.

    Взаимодействие модулей



    Итак, мы получили инфраструктуру для многоязыковых сборок. Основная её идея заключается в том, что отдельные блоки кода оформляются не в виде Class library, а в виде Module при помощи описанной выше подмены свойств проектов.

    Полученные файлы netmodule с их полными путями необходимо добавить в Linker/Input/Additional Dependencies через пробел.

    Другой вопрос, как организовать сборку модулей, ссылающихся друг на друга, поскольку воспользоваться стандартным механизмом ссылок (References) в свойствах проекта мы не можем - для ссылок нужны законченные сборки (dll, exe), а не модули.

    К примеру, создадим модуль на языке VB.NET, который мы хотим вызывать из нашей программы на C#.

    1) Добавим в solution пустой проект VB.NET и меняем его тип, как это описано выше в пунктах 2-3 предыдущего раздела. Назовём проект, допустим, vbl.

    2) Отредактируем пути выходных файлов проекта vbl и привяжем его к проекту app, как это описано в пунктах 9-10 предыдущего раздела (с той лишь разницей, что вкладке Build в свойствах проекта C# соответствует вкладка Compile в свойствах проекта VB.NET). Также укажем файл "$(OutDir)\vbl.netmodule" в качестве входного для редактора связей проекта app (см. пункт 11.1 предыдущего раздела). Не следует забывать делать изменения свойств для All configurations, иначе возникнет разница между Debug и Release сборками.

    3) Добавим класс Hello в проект vbl (аналогично пункту 4 предыдущего раздела) и в нём статический метод Hello для вывода какой-нибудь надписи на экран:
    Код: (vbnet)
    Public Class Hello

        Public Shared Sub Hello()
            Console.WriteLine("Hello VB.NET")
        End Sub

    End Class

    4) Соберём solution и убедимся, что всё хорошо собирается.

    5) Теперь перед нами стоит задача вызвать vbl.Hello.Hello из метода csl.Program.Main. Для этого нужно связать проекты модулей, и это придётся сделать вручную.

    5.1) Выгружаем проект csl и открываем его XML-файл редактором (см. пункт 3.1 предыдущего раздела). Находим в XML-файле секции Project/ItemGroup. Добавляем собственную секцию в элемент Project:
    Код: (xml)
    <ItemGroup>
    <AddModules Include="$(OutDir)\vbl.netmodule" />
    </ItemGroup>
    Редактор может показывать, что такой элемент некорректен для текущей схемы XML - не обращаем на это внимание. Сохраняем изменения и загружаем проект csl обратно (см. пункт 3.3 предыдущего раздела). Если модуль vbl.netmodule был успешно собран и находится в папке с прочими выходными файлами, он будет показан в дереве проекта csl пустой иконкой. Если файла модуля нет, то иконка будет преупреждающей жёлтой с вопросительным знаком.

    5.2) Для предотвращения ошибок нужно задать правильный порядок сборки проектов в solution. Он устанавливается автоматически по зависимостям между проектами. Но поскольку в нашем случае зависимость нестандартная, Visual Studio не сможет определить порядок, и его следует указать вручную. Кликаем правой кнопкой мыши на multilang и выбираем в контекстном меню Project Build Order. В открывшемся окне на вкладке Dependencies выбираем проект csl в выпадающем списке Projects и в перечне ставим галочку на проекте vbl, тем самым вручную устанавливая зависимость.

    5.3) Добавляем взаимодействие модулей. В проекте csl вставляем в нашу программу вызов нового модуля:
    Код: (csharp)
            static void Main(string[] argc)
            {
                vbl.Hello.Hello();
                Console.WriteLine("Hello C#.NET");
                Console.ReadKey();
            }
    Редактор покажет, что пространство имён vbl и класс Hello ему неизвестны, не распознает всю строчку и не будет показывать подсказки при наборе кода. Тем не менее код правильный. Такова цена за использование недокументированных возможностей.

    6) Собираем solution и запускаем программу - убеждаемся, что всё работает.
    [console]
    Hello VB.NET
    Hello C#.NET
    [/console]


    P.S. С самым интересным - добавлением C++ - всё не так гладко, об этом позже.
  • Программирование :: .NET технология от и до :: ADO.Net
  • При выделении пустой ячейки DataGridView типа DateTime хотелось бы рядом c выделенной ячейкой показывать календарь (MonthCalendar mc):
    Код:
    private void dgv1_CellClick(object sender, DataGridViewCellEventArgs e)
    {
      if (e.ColumnIndex == 2 && dgv1.CurrentCell.Value.ToString() == "")
      {
     // mc.Location = dgv1.CurrentCell.
        mc.Visible = true;
        mc.Show();
      }
      else
      {
        mc.Visible = false;
      }
    Мне не удалось найти метод (свойство), которое бы давало возможность определить крайне правую верхную точку выделенной ячейки, чтобы ее координаты можно было использовать для размещения календаря. Подскажите, пожалуйста, как это можно сделать. Проект прилагаю.

  • Программирование :: C/C++
  • Приветствую вас, коллеги.

    Я хочу сделать SDI приложение с CListCtrl в качестве рабочего элемента, но без Doc-View архитектуры.

    По умолчанию, CChildView наследуется от CWnd. Если унаследовать его от CListCtrl и переделать вызов функции Create(), то список почему-то не появляется вообще. CListView прикручивать нецелесообразно, т.к. doc-view не используется.

    Первое, что приходит в голову — это инкапсулировать CListCtrl и создавать его вручную. Но тогда контейнер не получает его сообщения и я не могу ничего обработать.

    Отсюда вопрос — как быть? Как перенаправить оконные сообщения от инкапсулированного CListCtrl в контейнер CChildView?
    Или же как унаследоваться от CListCtrl, чтобы оно все-таки заработало?
  • Есть довольно длинные многострочные тексты (десятки килобайт + недо-html гипертекстовая разметка), отображаемые QTextBrowser в read-only. Основное назначение - последовательно читать эти самые тексты, прокручивая мышью, преимущественно.

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

    Отсюда проблема: при изменении ширины контрола сбивается позиция текста, показываемого в окне. А хочется, чтобы как в notepad++, место, с которого текст отображается в виджете, при масштабировании оставалось неизменным.
    Пока простого решения не нашёл - может, кто сталкивался?
  • Программирование :: C/C++ :: ANSI С/С++
  • Поскольку в C++ однопроходный компилятор, и для увязки единиц компиляции используются заголовочные файлы, содержащие объявление всех нижеиспользуемых абстрактных типов данных и функций, в C++ есть некоторые специфические приёмы программирования.

    Одним из них является PImpl (pointer to implementation) - способ и скрыть от пользователя особенности реализации того или иного класса, и, что гораздо важнее, хоть как-то упорядочить декларационные зависимости между элементами, не перегружая заголовочный файл и пространство имён всякими "потрохами" классов.

    Идея предельно простая:

    В заголовочном файле, допустим, header.h, пишем
    Код: (cpp)
    #ifndef HEADER_H
    #define HEADER_H

    class C
    {
    private:
        class Implementation;
        Implementation *implementation;
    public:
        C();
        void f();
        ~C();
    };

    #endif
    здесь только продекларировано существование класса Implementation, и поскольку нет обращений к его членам, а есть только указатель (размер которого в памяти не зависит от типа), компилятор это успешно переваривает.

    В файле реализации, допустим, code.cpp, пишем
    Код: (cpp)
    #include<iostream>
    #include "header.h"

    using namespace std;

    class C::Implementation
    {
    public:
        void f()
        {
            wcout << L"Hello world" << endl;
        }
    };

    C::C() :
        implementation(NULL)
    {
        this->implementation = new C::Implementation();
    }

    void C::f()
    {
        this->implementation->f();
    }

    C::~C()
    {
        delete this->implementation
    }
    Разумеется, преимущества, связанные с полной инкапсуляцией реализации класса от пользователя, оборачиваются недостатком обязательного создания объекта в куче и рисками утечек памяти при некорректном завершении жизни объекта, а также дополнительными вызовами обёрточных функций. Ну и ко всему прочему приходится писать дополнительный обёрточный код, который всегда увеличивает трудозатраты на внесение изменений (по сравнению с Java и C#).

    В вызывающем коде класс C выглядит и используется обычным образом
    Код: (cpp)
    #include "header.h"

    int main()
    {
        C c;
        c.f(); // Hello world.
        return 0;
    }


    Положение становится скверным, когда класс является параметризируемым - шаблоном (template) в терминах C++. Код такого класса не компилируется до подстановки параметров, и для разных параметров компилятор генерирует разные реализации параметризированного класса. По этой причине весь код реализации шаблона обязан находиться в заголовочном файле, чтобы компилятор в момент определения всех параметров мог сгенерировать новый класс по шаблону (для старых стандартов до C++11).
    Код: (cpp)
    #ifndef HEADER_H
    #define HEADER_H

    #include <iostream>
    #include <string>

    using namespace std;

    template<typename T>
    class C
    {
    public:
        void Process(T &item)
        {
            wcout << item << endl;
        }
    };

    #endif

    На первый взгляд это с PImpl несовместимо. Однако в C++ есть ещё и специализации шаблонов: заранее определённые программистом версии параметризированного класса с конкретными значениями параметров.

    Код: (cpp)
    template<>
    class C<wstring>
    {
    public:
        void Process(wstring &item)
        {
            wcout << item << endl;
        }
    };

    Поэтому в том частном случае, когда набор значений параметров шаблонов заранее известен, можно добиться комбинации шаблонов и PImpl.

    Заголовочный файл header.h
    Код: (cpp)
    #ifndef HEADER_H
    #define HEADER_H

    #include <cstdlib>

    template<typename T>
    class Class
    {

    private:

    class Implementation;

    Implementation *implementation;

    public:

    Class();
    void Process(T &item);
    ~Class();

    };

    #endif
    Здесь мы определяем шаблон класса C, но реализация его методов будет специализированной под конкретные типы, и поэтому может быть вынесена из заголовочного файла. Для всех типов, не входящих в перечень специализаций, будет возникать ошибка компиляции. Внутри определяем класс Implementation, чтобы на не него распространялось действие параметра T, поскольку Implementation - тоже элемент специализации. Определение снаружи потребует template-выражения.

    Файл реализации code.cpp
    Код: (cpp)
    #include <iostream>
    #include <string>
    #include "header.h"

    using namespace std;

    template<typename T>
    class Class<T>::Implementation
    {

    public:

    void Process(T &item)
    {
    wcout << item << endl;
    }

    };

    #define SPECIALIZATION(T)                                                       \
                                                                                    \
    Class<T>::Class() :                                                         \
    implementation(NULL)                                                    \
    {                                                                           \
    this->implementation = new Class<T>::Implementation();                  \
    }                                                                           \
                                                                                    \
    void Class<T>::Process(T &item)                                             \
    {                                                                           \
    this->implementation->Process(item);                                    \
    }                                                                           \
                                                                                    \
    Class<T>::~Class()                                                          \
    {                                                                           \
    delete this->implementation;                                            \
    }                                                                           \

    SPECIALIZATION(wstring)
    SPECIALIZATION(int)
    SPECIALIZATION(double)

    #undef SPECIALIZATION
    Здесь мы вынуждены реализовать все варианты каждого метода класса C, чтобы получились специализации для каждого типа. Чтобы не заниматься copy-paste вручную, разумно использовать макрос. А класс Implementation мы можем оформить в виде шаблона, вызываемого из каждой специализации - для каждой специализации будет автоматически создан собственный вариант.

    Код вызывающей программы по-прежнему прост и обыкновенен:
    Код: (cpp)
    #include <iostream>
    #include <string>
    #include "header.h"

    using namespace std;

    int main()
    {
    {
    wstring x(L"Hello world");
    Class<wstring> object;
    object.Process(x);
    }
    {
    double x = 3.14159;
    Class<double> object;
    object.Process(x);
    }
    /* Тут будет ошибка - нет специализации для float.
    {
    float x = 3.14159;
    Class<float> object;
    object.Process(x);
    }
    */
    wcin.get();
    return 0;
    }
  • Программирование :: C/C++ :: WinAPI & Visual C++
  • это не вопросы, а наблюдения, но если кто прокомментирует - ещё лучше )



    1) редактор форм не позволяет задать двум кнопкам одинаковый ID. Зато, если создавать кнопки вручную через Create, то это позволяется. Прекрасно получаются две кнопки с одним ID, от них приходит сообщение WM_COMMAND с одинаковым значением LOWORD(wParam)



    2) временный указатель на заданный в редакторе контрол, как известно, можно получить через GetDlgItem(). И хендлы в полученных CWnd действительно не вечные - проверено однажды )
     Однако, полученный таким образом  CWnd* не удаётся кастить к дочернему классу!
    Код:
    	CSliderCtrl* pSl=dynamic_cast<CSliderCtrl*>(GetDlgItem(IDC_SLIDER1));
    //pSl==0
    Вот это уже не совсем понятно.

    Если же через визард или вручную связать член-переменную класса, то есть при этом кроме объявления в классе самого объекта
    Код:
    CSliderCtrl m_Slider1;

    добавляется вызов DDX_Control

    Код:
    void MYDIALOG::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_SLIDER1, m_Slider1);
    }

    , то после этого каст начинает работать
  • Программирование :: Perl
  • Для освежения понимания «our» запускаю следующий тестовый скрипт:
    Код: (perl)
    #!/usr/bin/perl -W

    use 5.010;
    use strict;
    use warnings;

    package X;
    our $b = 123;

    package Y;
    our $b = 456;

    package Z;
    say '$X::b = ', defined($X::b) ? $X::b : 'undef';
    say '$Y::b = ', defined($Y::b) ? $Y::b : 'undef';
    say '$Z::b = ', defined($Z::b) ? $Z::b : 'undef';
    say '$b = ', defined($b) ? $b : 'undef';

    [console]
    $X::b = 123
    $Y::b = 456
    $Z::b = undef
    $b = 456
    [/console]

    Странная переменная «$b»: в пространстве имен Z ее нет. Кто-нибудь понимает, что тут происходит?
  • Программирование :: Python
  • Начинаю изучать Python. Дайте, пожалуйста, ссылки на консольные утилиты на Питоне, которые делали бы какие-либо полезные действия (определение параметров ПК, сниферы, конверторы, разбор текстов и др.). Хотел бы не только читать книга по Python, но и попробовать разобраться с исходными кодами полезных утилит.
  • Программирование :: Программирование 1С
  • Назрел вопрос смены конфигурации, а я с новыми конфами(функционал) не очень знакома. хотелось бы услышать идеи и предложения, что стоит рассмотреть в первую очередь, возможно я о каких то не задумывалась даже.

    предпочтительно 8.2 управляемые. задачи:
    1. продажи, возвраты, корректировочные
    2. оплаты, многовалютный учёт. может реализация быть в одной валюте а оплата в другой, может одна реализация быть оплачена тремя разными валютами. авансы. жёсткая привязка оплат к реализации(по необходимости, т.е. в настройках хотелось бы указывать надо ли это)
    3. скидки, ценообразование, скидки сезонные, на группы номенклатуры, по списку контрагентов, для групп контрагентов, по условию на сумму, акции(купил два - получил третье, купил на сумму - получил полотенце)
    4. учёт по организациям, складам и магазинам. это три справочника. у каждого магазина несколько складов. в каждом магазине несколько организаций.
    5. учёт баллов(при продаже товара, за него начисляется контрагенту какой то объём баллов)
    6. учёт бонусов(в конце месяца начисляются по результатам баллов. может быть двух вариантов: после оплаты или по документам продажи). контрагент может выразить желание оплатить часть фактуры или полностью бонусами, бонусы в этом случае вероятно можно было бы считать скидкой.
    7. себестоимость с партионного учета(прибыло/убыло/редко-редко когда ещё и перевозка-доп расходы)
    8. Взаимозачёт(один контрагент может перекинуть на другого контрагента часть бонусов)
    9. незамороченный переход на иерархию элементов справочника контрагентов. контрагенты у нас идут в две иерархии. в одной иерархии контрагенты рассчитываются в одном порядке, в другой иерархии порядок расчета отличается(нет бонусов!)
    10. подсистема планирования и бюджетирования, желательно облегченная, ибо всё равно её прийдётся дописывать и переписывать, пусть лучше там будет чтото облегченное  :spy:

    в эту конфу будет включен ещё некоторый функционал из разряда "то чего на белом свете вообще не может быть". хотя почему не может? в основном это связано будет с РИБ. в узле есть набор магазинов, организаций и складов, по которым туда идёт информация о справочниках и документах. Для каждого узла у каждого пользователя свой набор прав и ролей, пароль. Но тут как бы мы и сами готовы дописать.

    Почему возникла задача:
    впринципе всё это у нас реализовано, но не всё. нет партионного учёта, привязки оплат к продажам и соответственно авансов и себестоимости. авансы и привязку оплат я допустим напишу.. но партионный учёт если добавлять потом ещё, то есть смысл просто перейти на более новую типовую конфигурацию и дальше уже её дорабатывать, соответственно надо, чтобы она охватила по максимуму функционал.

    компания сетевая.
    база управленческая.
    чем меньше таблиц - тем лучше, потому как дописывать будем в любом случае. предпочтительно на БСП(я так хочу нормальную настройку интерфейсов и прав!!)
  • Здравствуйте ! Я не программист но очень хочу научиться программированию 1с предприятие для разных фирм.. Приобрел книгу Михайлова - "1с как дважды два", пока что вроде понятно. Не могли бы Вы подсказать мне как открывать программу чтобы писать в ней коды а дальше я сам постараюсь разобраться с помощью литературы и Вашего форума. Если я что то написал не так прошу не судить строго.. Заранее благодарен Вам.
  • Программирование :: Программирование 1С :: 1С 7.x
  • Народ, помогите чайнику! Скоро пар пущу...
    Есть форма, в ней элемент диалога - список значений с пометками.
    Формирую список, выбираю значение для дальнейшей обработки, а результат пустой.
    Вот текст:

    Код: (e1cv8)
    Процедура ВыборРаб();
    СпрРаб = СоздатьОбъект("Справочник.ФизЛица");
    Режим = 1;
    СпрРаб.ВыбратьЭлементы(Режим);
    Пока СпрРаб.ПолучитьЭлемент()=1 Цикл
    Если СпрРаб.ЭтоГруппа()=0 Тогда
    СписРаб.ДобавитьЗначение(СпрРаб);
    Сообщить(СпрРаб);
    Иначе Продолжить;
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры

    Процедура Сформировать()
    Для Сч = 1 По СписРаб.РазмерСписка() Цикл
    Если СписРаб.Пометка(Сч) = 0 Тогда
    Продолжить;
    КонецЕсли;
    ВыбрРаб = СписРаб.ПолучитьЗначение(Сч);
    Если ПустоеЗначение(ВыбрРаб)=1 Тогда
    Сообщить("строка № "+Сч+" пустая");
    Продолжить;
    КонецЕсли;
    Сообщить(Сч+", "+ВыбрРаб);
    КонецЦикла;
    КонецПроцедуры

    Вот итог:
    строка № 1 пустая

    На период внимания не обращайте.
    Понимаю, что я тупила, но где конкретно???
    Скрин на всякий.
  • 1C Предприятие 7.7 (7.70.027), Бухгалтерский учёт, редакция 4.5

    Доброго времени суток. Только начинаю программировать в 7.7
    Пытаюсь подправить отчёт "ОС все реквизиты". В диалоге формы указывается дата и формируется отчёт с указанием ОС на эту дату. Встал вопрос, формировать отчёт не на дату, а за период + указывать в отчёте только движимые ОС. С "только движимые" проблем вроде нет, примерно знаю как сделать, а вот с периодом как то застопорился.

    Код: (e1cv8)
    Ит.ВыбратьСубконто(ВидыСубконто.ОсновныеСредства);
    Пока Ит.ПолучитьСубконто(ВидыСубконто.ОсновныеСредства) = 1 Цикл
    Т.НоваяСтрока();
    Т.Подразделение = Ит.Субконто().Подразделение.Получить.(Дата1)

    "Дата1" вводится в форме. Я подредактировал форму и сделал, чтобы можно было указать две даты "С "ДатаНач" по "ДатаКон"". Думал передать эти два значения в Подразделение.Получить, но пишет ошибку - "много параметров передаётся".   :dontknow:
  • Программирование :: Программирование 1С :: 1С 8.x
  • SQL 2008 R2
    1С 8.1.15.14
    Самописка - 25Гб
    комплексная 130 Гб
    скриншот характеристик сервера во вложении

    ну медленно проводились документы, но жить можно было. при 3 активных операторах реализация в 500строк за 3,5 минуты в комплексной проводилась. мы нагоняем учёт, перепроводим документы за прошлые месяцы. и стали замечать что на перепроведение тратится всё больше времени. раньше месяц перепроводился впринципе за выходные, а тут начали март перепроводить - за ночь 2 дня всего обрабатывает. думали что объёмы увеличились, но оно как бы не настолько. на том же серваке лежит ещё одна база, самописка, таблиц - копейки. один мощный справочник(порядка миллиона элементов в иерархии). стала замечать, что при добавлении хотя бы одного условия в запрос по этому справочнику, время запроса увеличивается в десяток раз, если с консоли выборку гнать, а если тот же самый запрос написать в обработке, то выполняется он...в общем я не дождалась.

    вопрос: чего можно попробовать сделать? какие регламенты могли бы помочь? переиндексация скулем идёт каждую ночь.
    выгрузить - загрузить конечно вариант, но журнал регистрации терять не хотелось бы - частые случаи когда надо оператора ловить на месте преступления.
    свёртку тоже не рассматриваю.
  • Операционные системы :: Windows
  • Доброго времени суток всем.
    Есть следующая проблема. Необходимо максимально приблизить Windows к системе реального времени, т.е. сделать винде "обрезание", чтобы получить приемлемое время реакции на события (хотя бы 0,5мс).
    Исходные данные:
    Windows XP Professional SP3.
    В системе больше не будет НИЧЕГО, т.е. система будет развернута специально под единую сейчас создаваемую прикладную задачу. Ни сети, ни антивируса, ни....
    Необходимые ресурсы: Графический интерфейс (Qt), работа с дисками, USB и работа со специализированной инструментальной платой. Ну и *уева куча математики. которая не требует никаких ресурсов, кроме проца.
    Вроде бы первые шаги понятны. Поотключать ненужные аппаратные ресурсы, поотключать ненужные службы. А еще? да и определить ненужность устройств и служб для меня непросто.
    Просьба помочь или конкретными советами по обрезанию винды, или ссылками на подобную информацию. Очень желательно русскоязычную.
  • Направления программирования :: Drivers
  • Здравствуйте Уважаемы Знатоки!!!
    Попала мне в руки PCIe-плата работающая с высокочастотными сигналами и соответственно с большими объемами данных, ну и конечно к ней шел мануал, где сказано: необходимо выделить два буфера по 64 МB.
    Так вот написал драйвер прикрутил ДМА и получилось, как полагается, выделяется 32 МB на буфер, код настройки ДМА и буфера привожу ниже:
    Код:
    #define MAX_DMA_LENGTH	0x2000000	    // 0x2000000 - 32 MB
    //#define MAX_DMA_LENGTH 0x4000000     // 0x4000000 - 64 MB
    //...
    NTSTATUS MDMAIDmaAdapterAllocate(PMDMAI_DEVICE_EXTENSION pdx)
    {
        ULONG               NumMapRegisters;
        DEVICE_DESCRIPTION  DeviceDescription;

        KdPrint((DRIVERNAME " - Allocating DMA Adapter object...\n"));

        // Verify object not already created
    if (pdx->DMAAdapter)
        {
            KdPrint(("ERROR - DMA Adapter object already exist, unable to allocate\n"));
            return STATUS_OBJECT_NAME_EXISTS;
        }

        // Clear device description
        RtlZeroMemory(&DeviceDescription, sizeof(DEVICE_DESCRIPTION));

        // Set device DMA properties
        DeviceDescription.Version = DEVICE_DESCRIPTION_VERSION;      //перавя версия, нулевая исползуется только при IgnoreCounter = FALSE
        DeviceDescription.Master = TRUE;
        DeviceDescription.ScatterGather = FALSE;
        DeviceDescription.DemandMode = TRUE;
        DeviceDescription.AutoInitialize = FALSE;
        DeviceDescription.Dma32BitAddresses = TRUE;
        DeviceDescription.IgnoreCount = FALSE;//TRUE;
        DeviceDescription.Reserved1 = FALSE;
        DeviceDescription.Dma64BitAddresses = FALSE;
        //devDescr.DoNotUse2 = 0; //=devDescr.BusNumber - NotUsed in WDM
        DeviceDescription.DmaChannel = 0; //только для Slave устройств
        DeviceDescription.InterfaceType = PCIBus;
        DeviceDescription.DmaWidth = Width32Bits; // PCI default width
        DeviceDescription.DmaSpeed = Compatible;//не для мастера? (только если value only if the machine's ACPI BIOS supports it)... ничего не понял
        //devDescr.MaximumLength = ROUND_TO_PAGES(XXXXX/2);   
        DeviceDescription.MaximumLength =  PAGE_SIZE;    //в любом случае они просили округлить до PAGE_SIZE, да на здоровье!
        //devDescr.DmaPort = 0;   //говорят, что это устаревший параметр. но нужен для совместимости... для Legacy...
        // OS will assign map register count
        NumMapRegisters = 0;

        // Allocate a DMA adapter object
    pdx->DMAAdapter = IoGetDmaAdapter(pdx->PhysicalDeviceObject, &DeviceDescription, &NumMapRegisters);

    if (!pdx->DMAAdapter)
    {
    KdPrint(("ERROR - DMA Adapter allocation failed\n"));
    return STATUS_INSUFFICIENT_RESOURCES;
    }

    KdPrint((" MAX_DMA_LENGTH: %d, ROUND_TO_PAGES(MAX_DMA_LENGTH): %d \n", MAX_DMA_LENGTH, ROUND_TO_PAGES(MAX_DMA_LENGTH)));
    //выделяем нужную память ДМА под каждый буфер...
    m_DmaBuffer1  = pdx->DMAAdapter->DmaOperations->AllocateCommonBuffer(
        pdx->DMAAdapter, ROUND_TO_PAGES(MAX_DMA_LENGTH), &DmaPhysAddr1, FALSE);

    m_DmaBuffer2  = pdx->DMAAdapter->DmaOperations->AllocateCommonBuffer(
        pdx->DMAAdapter, ROUND_TO_PAGES(MAX_DMA_LENGTH), &DmaPhysAddr2, FALSE);


    if ((!m_DmaBuffer1)||(!m_DmaBuffer2))

    pdx->DMAAdapter = NULL;
    KdPrint((" Failed to allocate DMA buffer\n"));
    return STATUS_INSUFFICIENT_RESOURCES;
    }

    DmaBufferMemory1 = IoAllocateMdl(m_DmaBuffer1, ROUND_TO_PAGES(MAX_DMA_LENGTH), FALSE, FALSE, NULL);//ROUND_TO_PAGES(MAX_DMA_LENGTH)
    DmaBufferMemory2 = IoAllocateMdl(m_DmaBuffer2, ROUND_TO_PAGES(MAX_DMA_LENGTH), FALSE, FALSE, NULL);

    if ((DmaBufferMemory1 != NULL)||(DmaBufferMemory2 != NULL))
    { //MmBuildMdlForNonPagedPool заполняет массив номеров физических страниц и обновляет некоторые поля заголовка MDL.
    KdPrint((DRIVERNAME " -  SHOW SIZE DMS 1:  %d \n", DmaBufferMemory1->Size));
    MmBuildMdlForNonPagedPool(DmaBufferMemory1);
    KdPrint((DRIVERNAME " -  SHOW SIZE DMS 2:  %d \n", DmaBufferMemory2->Size));
    MmBuildMdlForNonPagedPool(DmaBufferMemory2);
    }
    else
    {
    KdPrint((" Failed to allocate MDL buffer \n"));
    return STATUS_INSUFFICIENT_RESOURCES;
    }
    //Получаем начальные адреса буферов ДМА...
    uDmaPhysAddr1 = DmaPhysAddr1.LowPart;
    KdPrint((DRIVERNAME " -  SHOW DMA 1 ADDRESS IN START %Xh\n", uDmaPhysAddr1));
    uDmaPhysAddr2 = DmaPhysAddr2.LowPart;
    KdPrint((DRIVERNAME " -  SHOW DMA 2 ADDRESS IN START %Xh\n", uDmaPhysAddr2));

    if ((uDmaPhysAddr1 == 0)||(uDmaPhysAddr2 == 0))
    {
    KdPrint((" Failed to allocate uDmaPhysAddr \n"));
    MDMAIDmaAdapterFree(pdx);
    return STATUS_INSUFFICIENT_RESOURCES;
    }

    KdPrint((DRIVERNAME " - DMA Adapter init... OK!!! \n"));

        return STATUS_SUCCESS;
    }
    функция IoAllocateMdl не выделяет память для MDL.
     наверняка есть механизмы обхода такой ситуации?!
    Как можно расширить буфер до 64 МВ???
    чуть не забыл ОС ХР 32 бит...
    Прошу Вашей помощи!
    Огромное спасибо!
  • Здравствуйте уважаемые форумчане. Сделал устройство на FPGA ALTERA , которое представляет собой com порт ( 16550 ) подключенный к PCI шине. Необходимо написать драйвер под win XP.
    Под PCI устройства делал драйверы в NUMEGA, а вот с такой конструкцией PCI->com port никак не могу разобраться какую архитектуру драйвера создавать. Устройств PCI->com port  в магазинах полно, а пример написания драйвера нигде не нашел. Подскажите плз. куда копать.
  • Направления программирования :: Сети
  • Доброго времени суток.

    Есть вопрос по сокетам в unix.

    Задача: Хотелось бы узнать размер первого сообщения\пакета в очереди, не считывая его.

    Замечательный Help подсказывает что функция recvfrom с параметром MSG_PEEK возвращает "number of bytes received", что вроде и требуется. Но методом простой проверки можно убедиться, что возвращает данная функция количество байт считанных в буфер, т.е. если буфер был выделен меньше чем размер пришедшего пакета, то вернет она ровно "размер буфера", а не сколько реально в пакете байт лежит. Конечно есть вариант выделить буфер максимально возможного размера пакета, считывать в него и не жалеть память. Но как-то это не красиво. К сожалению функции которая просто возвращала размер первого пакета в очереди не нашел, подскажите пожалуйста оную или какие еще могут быть варианты решения.
  • Направления программирования :: Web :: Клиентские скрипты
  • Доброго времени суток, ситуация такая есть сайт на joomla который пока стоит у меня на локальной машине. Проблема в следующем: при подгрузке скриптов mootools загружается последним (я так думаю из-за размера), и все зависимые от него скрипты вылетают. Что интересно в Opera все работает правильно скрипты выполняются именно в том порядке в котором они подгружаются в head-е, но стоит открыть сайт в лисе или хроме и все ломается, вопрос собственно в  том можно ли с этим что-то сделать, или может это из-за того что сайт на локальной машине? Заранее говорю проблема точно в порядке исполнения скриптов, на выяснение этого я потратил не мало времени и уверен в результате.
  • Практические разделы :: Программы
  • Интересная бага попалась. Вернусь домой, опишу детальнее. Пока, чтобы не потерять тут привожу логи. Взаимосмязанные вещи выделил цветом.

    [console]
    ---request begin---
    GET /large-file.tar.bz2 HTTP/1.0
    Referer: http://example.com/
    Range: bytes=3359124103-
    User-Agent: Wget/1.12 (linux-gnu)
    Accept: */*
    Host: example.com
    Connection: Keep-Alive

    ---request end---
    HTTP request sent, awaiting response...
    ---response begin---
    HTTP/1.1 416 Requested Range Not Satisfiable
    Server: nginx/1.4.1
    Date: Thu, 23 May 2013 13:50:45 GMT
    Content-Type: text/html
    Content-Length: 212
    Connection: close
    Content-Range: bytes */3359124103

    ---response end---
    416 Requested Range Not Satisfiable

        The file is already fully retrieved; nothing to do.
    [/console]

    Кратко суть такова: файл уже имеется, но с ключом -c wget делает попытку его докачать, на что получает ответ 416 — это все нормально, но далее wget начинает сканировать файл как html в поисках ссылок (ключ -r), но это не html и размер в 3.2 ГБ не дает шанса wget на 32-бит машине (по strace видно, что он использует mmap).

    Я думаю, что wget приписывает файлу MIME из Content-Type ответа 416, хотя Content-Type относится к тексту ошибки.

    Кроме как написать разработчикам других идей нет?
  • Учимся программировать :: Начинающим
  • Народ, чем отличаются Fiber (CreateFiberEx) от thread? :dontknow:

В избранное