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

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


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

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


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




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

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

Мы уже познакомились с понятием атомарности. Любую последовательность действий можно разбить на атомарные действия (которые по определению неделимы). Последовательность действий обычно имеет какой-то результат, ради которого она и выполняется (иначе ее можно было бы и не выполнять с тем же успехом). Эта последовательность в вычислительной системе представляется некоей исполняемой единицей (процессом, потоком и т.п.). Случай, когда эта последовательность единственная (однозадачная среда), тривиален и не представляет интереса.

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

Предположим, у нас есть две последовательности действий, назовем их A и B. Разложим их на атомарные операции:


A = (A1, A2, ..., An)

B = (B1, B2, ..., Bm)


Как эти последовательности могут быть выполнены при наличии одного вычислителя?

Самый простой случай - выполняется полностью последовательность A, затем последовательность B. Такой вариант может возникнуть, например, при кооперативной многозадачности, когда A не желает возвращать управление до самого окончания работы:


A1, A2, ..., An, B1, B2, ..., Bm


Другой вариант, тоже несложный, - атомарные операции обеих последовательностей выполняются поочередно:


A1, B1, A2, B2, ...


Число вариантов чередования операций Ai и Bj достаточно велико (любители математики могут оценить его самостоятельно). Как мы убедились в прошлой статье, некоторые из таких вариантов при определенных условиях могут приводить к некорректным результатам.


Детерминированность набора последовательностей действий


Как в общем случае определить, будет ли результат псевдопараллельного выполнения последовательностей корректным?

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

В примере с вольтметром из предыдущей главы мы получили недетерминированный набор последовательностей, в чем и убедились. В подобных случаях говорят, что имеет место "гонка" или "состязание" между двумя процессами (потоками). Правда, в отличие от реальных состязаний, в этих гонках победивших нет - все участники в проигрыше.

К сожалению, такая систематизация пока что не приносит нам значительного облегчения. То, что мы придумали название для болезни, увы, не дает нам средств для ее излечения. Хотелось бы как минимум иметь возможность отличить детерминированный набор от недетерминированного. А получить средства для превращения недетерминированного набора в детерминированный было бы и вовсе замечательно.

Некоторую помощь в первой задаче может оказать применение условий Бернстайна.

...



Полностью статью можно прочесть на нашем сайте, в разделе «Начинающим::Теория».

  • Программирование :: Общий
  • Имеется вот такая задача: определить направление (по ЧС или против ЧС), в котором были введены вершины полигона. Собственно, нужено чётко различить знак, а само понятие направления тут довольно условно. Вводится полигон так: мышью щёлкаем по окну, вводя последовательно точки-вершины. Я по своим догадкам попытался решить так (но, видимо, неправильно): беру первую вершину в качестве начала всех радиус-векторов, затем считаю сумму векторных произведений для всех смежных пар векторов по очереди. Каждый вектор суммы имеет знак в зависимости от направления вращения первого вектора ко второму, а чтобы не учитывалась длина исходных векторов, вектор-результат для каждой пары делится на произведение их модулей - как-будто полигон состоит из единичных векторов (хотя, не полностью уверен, что правильно так поступать). Все значения векторных произведений суммирую, получается итоговый "момент", по его знаку различаю направление ввода полигона

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

    вот код:
    Код:
    //определить, по часовой стрелке направление или нет 
    bool CGrafics::Poligon_GetDirIsClock(CPoint* points,int count)const
    {
    if(!points || count<3)return true;

    //считаем первую точку началом радиус-вектора

    const LONG& x0=points[0].x;
    const LONG& y0=points[0].y;

    //остальные вершины представляют собой концы радиус-вектора
    // для всех по очереди считаем векторное произведение
    // и суммируем со знаком
    double vecSumm=0;

    LONG x1=points[1].x;
    LONG y1=points[1].y;

    for(int i=2;i<count; i++)
    {
    LONG x2=points[i].x;
    LONG y2=points[i].y;

    if(x1==x0 && y1==y0 || x2==x0 && y2==y0)
    {
    //одна из точек совпала с начальной точкой
    }
    else
    {
    //модуль вектора поворота надо будет разделить на произведения
    //модулей векторов, чтобы не учитывалась длина векторов
    LONG module1=sqrtl((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0));
    LONG module2=sqrtl((x2-x0)*(x2-x0)+(y2-y0)*(y2-y0));

    if(module1 && module2)
    {
    vecSumm+=(x1*y2-y1*x2)*1.0/(module1*module2);
    }
    }

    x1=x2;
    y1=y2;
    }

    //знак суммы покажет направление вращения
    return vecSumm>0;
    }


    Подскажите, кто знает, по какому алгоритму определить направление ввода полигона
  • Доброго времени суток.
    Есть задача: для кривой, заданной в виде массива коотдинат по оси У (координата по оси Х — номер элемента в массиве), построить две кривые, равноудаленные от неё (см. рис. во вложении).
    Не знает ли кто-нибудь алгоритма решения или что можно почитать по данной теме?
  • Программирование :: .NET технология от и до
  • Из wpf формы стартует BackgroundWorker:
    Код:
     
    backgroundWorker.RunWorkerAsync();

    private void backgroupWorker_DoWork(object sender, DoWorkEventArgs e)
            {
                //Scalper.StopWork = backgroundWorker.CancellationPending;
                Scalper.Run();
                if (backgroundWorker.CancellationPending)
                {               
                    e.Cancel = true;               
                    return;
                }
            }

    который выполняет метод:
    Код:
    private void Run()
            {
               
                for (int i = 0; i < 300; i++)
                {
                    if (!stopWork)
                    {                   
                        SummInfo.TransactionCount++;                   
                    }
                    else
                    {
                        return;
                    }
                }


     public int TransactionCount
            {
                get
                {
                    return transactionCount;
                }
                set
                {
                    if (value != transactionCount)
                    {     
                        // метод формы wpf
                        base.NotifyObservers(this, Observer.ListenersCollection.SummarizeInfoDisplayer);
                    }
                    transactionCount=value;

                }
            }

    public void Notify(object anObject, Observer.ListenersCollection listener)
            {
    List<SummarizeInformationRow> SummInfoTable = GetSummarizeInfoTable((SummarizeInformation)anObject);
                        if (Dispatcher.Thread != Thread.CurrentThread)
                        {                       
                         
                               Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal,
                                    new Action(
                                        delegate()
                                        {
                                            lvSummarizeInfo.ItemsSource = SummInfoTable;
                                        }
                                ));                     
                        }
    }



    при останове потока методом backgroundWorker.CancelAsync() возникает неприятность:
    Код:
    private void btnStopRobot_Click(object sender, RoutedEventArgs e)
            {
                backgroundWorker.CancelAsync();
                Scalper.StopWork = backgroundWorker.CancellationPending;
                           
                lbStatusInfo.Items.Add("Остановлен");
                btnStartRobot.IsEnabled = true;

                btnPauseRobot.IsEnabled = false;
                btnStopRobot.IsEnabled = false;


                //while (backgroundWorker.IsBusy) // IsBusy не становится false
                {               
                }

                Scalper = null;
               
                lbStatusInfo.Items.Clear();
                FillSummarizeInfoControl();

               
                lvSummarizeInfo.Items.Clear(); // возникает ошибка
                // Операция недопустима, когда ItemsSource используется.
                // Вместо этого получите доступ и измените элементы с помощью ItemsControl.ItemsSource.
            }

    Подскажите, плиз, что блокирует поток?
  • И снова столкнулся с этой проблемой. Пробовал переводить классами Encoding - ничего хорошего не выходит. Спасает только одно -
    Цитировать
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engi­nes\Xbase
    DataCodePage:OEM заменить на ANSI

    Ну у себя потестил - все норм, но все же не хочется так радикально. Кто сталкивался, кто как решал?
  • Добрый день.

    Передаю файл по частям WCF сервису. При попытке передать за один раз более 8ми КБ вылетает с ошибкой not found.

    Поис подсказал 3 настройки:
    1. настройка привязки сервиса – параметры maxReceivedMessageSize, maxBufferSize и т.д;

    2. указать в web.config значение атрибута maxRequestLength элемента <httpRuntime>;

    3. в файле %windir%\System32\inetsrv\config\applicationHost.c onfig максимальный размер входящего запроса посредством секции <requestFiltering> и элемента <requestLimit>.

    К сожалению все эти манипуляции ни к чему не привели.

    Может есть еще какая хитрая настройка?
  • Программирование :: .NET технология от и до :: WinForms
  • Как указать стандартным контролам например таким как Label использовать при отрисовке сглаживание AntiAliasGridFit, что то
    не нашел пока способа ....

    Приходится наследовать:
    Код:
        public сlass AntiALiasLabel : Label
        {
            public AntiALiasLabel()
            {
                InitializeComponent();
            }

            protected override void OnPaint(PaintEventArgs e)
            {
                e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
                base.OnPaint(e);
            }
        }

    может быть есть иной способ?
  • Программирование :: .NET технология от и до :: ASP.NET
  • Ребят, помогите понять что происходит...
    я наверное совсем дурак, но никак не могу понять почему не сохраняется состояние текстбокса...  :confused:

    есть страница, на странице  находится gridview, к gridview добавляю поле TemplateFiled, в него помещаю текстбокс, задаю значение по умолчанию = 1(postBack=false, EnableViewState = true), запускаю и меняю значение в текстбоксе, страница перезагружается и в текстбоксе опять 1. Ставлю точно такой же текстбокс вне таблицы(просто на страницу) и там при изменении значения страница перезагружается. но значение остаётся введённое(изменённое).

    вопрос наверное простой, но никак не могу догнать... :-&
    помогите разобраться... пожалуйста.... :-&
  • Программирование :: С/С++
  • Условие задачи такое:
    Вывести на экран таблицу значений функции Y(x) и ее разложения в ряд S(x) с точностью eps=0.001. x - меняется от a = -0.5 до b = 0.5, шаг h = (b-a)/10. В прикреплённом файле находятся функции S(x) и Y(x). Вывести число итераций, необходимое для достижения заданной точности. Вычисление S(x) и Y(x) оформить в виде функций.

    Код:
    #include <windows.h>
    #include <math.h>
    #include <iostream.h>
    #include <iomanip.h>
    #include <conio.h>

    // Прототип функции S(x)
    void S(void);
    // Прототип функции Y(x)
    double Y(double x);

    int main(void)
    {

        S();
        
        getch();
        return 0;
    }
    // Функции Y(x)
    double Y(double x)
    {
    double y;
        y = (3.14*pow(x,3))/2;
        return y;
    }
    // Функции S(x)
    void S(void)
    {
        double a = -0.5, b = 0.5, s = 0.0, p, eps = 0.001, x, h;
        int k = 1;
        // Фиксируем начальное значение
        x = a;
        // Шаг
        h = (b-a)/10;

        do
        {
            do
            {
                  p = (pow(-1, k+1)/k+(pow(-1, k)*6)/(pow(k, 3)*3.14*3.14))*sin(k*3.14*x);
                  s += p;
                  k++;
            }
            while (s <= eps);
            cout << setw(15) << x << setw(15) << Y(x) << setw(15) << s;
            x += h;
        }
        while (x <= b);
        cout << setw(15) << k;
    }

    Проблема в том что программа запускается и встаёт, как я понимаю условие  s <= eps выполняется всегда и она не может выйти из этого цикла и из-за этого ни какие результаты не выводятся, правда я не понимаю почему оно всегда выполняется.

    Поясните пожалуйста или вообще ошибка может в другом.
  • Я написал вот такой код:
    Код:
    #include <windows.h>
    #include <iostream.h>
    #include <string.h>
    #include <conio.h>

    int main(void)
    {
    char *str1 = "Введите количество сотрудников: ";
    char *str2 = "Введите Ф.И.О. сотрудника: ";
    char *str3 = "Введите номер отдела: ";
    char *str4 = "Введите должность сотрудника: ";
    char *str5 = "Введите дату с которого сотрудник начал работу в формате дд.мм.гггг: ";
    char *str6 = "Введите номер отдела что бы увидеть информацию о сотрудниках данного отдела: ";

    struct sotrudniki
    {
           char fio[40];
           char nomerotdela[2];
           char dolshnost[20];
           char data[14];
    } msotrudniki[100];

    // Количество сотрудников
    int n;
    // Переменные для итерации цикла
    int i, j;

    // Переменная для указания номера отдела
    int numotdel;

    sotrudniki temp;

        CharToOem(str1, str1);
        CharToOem(str2, str2);
        CharToOem(str3, str3);
        CharToOem(str4, str4);
        CharToOem(str5, str5);
        CharToOem(str6, str6);
       
        cout << str1;
        cin >> n;
       
        // Заполняем структуру
        for (i = 0; i < n; i++)
        {
            cout << str2;
            cin >> msotrudniki[i].fio;
           
            cout << str3;
            cin >> msotrudniki[i].nomerotdela;
           
            cout << str4;
            cin >> msotrudniki[i].dolshnost;
           
            cout << str5;
            cin >> msotrudniki[i].data;
        }

        // Сортировка
        for (i = 0; i < n; i++)
        {
            for (j = i + 1; j < n; j++)
            {
    if (atoi(msotrudniki[i].data) > atoi(msotrudniki[j].data))
    {
               temp = msotrudniki[j];
               msotrudniki[j] = msotrudniki[i];
               msotrudniki[i] = temp;
                }
            }
        }
       
        cout << str6;
        cin >> numotdel;
       
        // Вывод
        for (i = 0; i < n; i++)
        {
            if (atoi(msotrudniki[i].nomerotdela) == numotdel)
               cout << msotrudniki[i].fio << " " << msotrudniki[i].dolshnost << " " <<  msotrudniki[i].data << endl;
        }
       
        getch();
        return 0;
    }

    И если я ввожу следующие:
    Введите количество сотрудников: 3
    Введите Ф.И.О. сотрудника: ivan
    Введите номер отдела: 1
    Введите должность сотрудника: admin
    Введите дату с которого сотрудник начал работу в формате дд.мм.гггг: 10.12.1981
    Введите Ф.И.О. сотрудника: dima
    Введите номер отдела: 1
    Введите должность сотрудника: admin
    Введите дату с которого сотрудник начал работу в формате дд.мм.гггг: 10.11.1981
    Введите Ф.И.О. сотрудника: ola
    Введите номер отдела: 1
    Введите должность сотрудника: admin
    Введите дату с которого сотрудник начал работу в формате дд.мм.гггг: 10.11.1982
    Введите номер отдела что бы увидеть информацию о сотрудниках данного отдела: 1

    И должны выводится в порядке уменьшения рабочего стажа, то есть так:
    dima admin 10.11.1981
    ivan admin 10.12.1981
    ola admin 10.11.1982

    А выводится так:
    ivan admin 10.12.1981
    dima admin 10.11.1981
    ola admin 10.11.1982

    Как поправить код, подскажите пожалуйста.
  • Программирование :: С/С++ :: ANSI С/С++
  • Мне требуется конвертировать борландовский AnsiString (аналог Dephi String) и std::string между собой. Понятное дело, внедряться в классы я не могу.

    Операторы "+" и "+=" перегрузить удалось и они работают. Преобразование типов сделал на функциях, но хотелось бы сократить запись.
    Фактически преобразование делается через внутренний указатель const char *:

    Код: (c++)
    AnsiString s1 = "111111";
    std::string s2 = s1.c_str();

    std::string s3 = "22222222";
    AnsiString s4 = s3.c_str();

    Конструктор копирования вне класса невозможен. А возможен ли оператор "=" вне класса?


    Добавлено через 7 минут и 32 секунды:
    Пробую:

    Код: (c++)
    AnsiString operator= (const AnsiString &bcbStr, const std::string &stdStr);
    std::string operator= (const std::string &stdStr, const AnsiString &bcbStr);

    [console]
    E2239 'operator =(const AnsiString &,const _STL::string &)' must be a member function
    E2239 'operator =(const _STL::string &,const AnsiString &)' must be a member function
    [/console]
  • Пытаюсь въехать в шаблоны и немного недопонимаю...

    Код: (c++,,14)
    #include <map>

    using namespace std;

    template <class A, class B, class C> class X
    {
      // ...
    };

    template <class A, class B, class C> class Y
    {
    public:
      typedef X<A, B, C> X;
      typedef map<int, X*> XCollection;

    };

    Ошибка в отмеченной строке.

    Штудирую Страуструпа и не могу найти ответ. Ну, или могз перегрузился. Объясните, пожалуйста, мою ошибку.



    Добавлено через 2 минуты и 17 секунд:
    Ёпрст...
    Все фишка была только в том, что я не подгрузил map (в приведенном примере он есть, а у меня - нет). Однако, сообщения gcc не интуитивно понятны.

    Добавлено через 3 минуты и 35 секунд:
    Тогда другой вопрос: в выше приведенном примере есть X<A,B,C> и Y::X. Это идентичные типы или разные? Не будет ли у меня проблем с этим?

    Например:

    Код: (c++)
    class Xaaa : public X<int, int, int>
    {
      // ...
    };

    class Yaaa : public Y<int, int, int>
    {
      // ...
    };

    Здесь Xaaa и Yaaa::X идентичны или это разные классы?
  • Программирование :: Delphi
  • мне нужно изменять скорость и четность у открытого, другой программой, com порта.
    Делаю перехват функций CreateFileW и SetCommState,CreateFileW чтобы узнать хендл порта, через SetCommState собираюсь менять DCB.Buadrate, пока хочу просто зафиксировать момент установки параметров.

    Dll перехвата взята из примера с перехватом Messagebox'ов, и она работает с Messagebox и CreateFileW, а с SetCommState в  result:= SetCommState(pPort,DCB), результат false.
    Подскажите, пожалуйста, где тут ошибка и как ее исправить?
    Код:
    //----------------------------------------------------------------------------------
    type
     OldCode = packed record
      One: dword;
      two: word;
     end;


    far_jmp = packed record
      PuhsOp: byte;
      PushArg: pointer;
      RetOp: byte;
     end;

    var
     hhPort:HWND;

     Jmp_CreateFileW, Jmp_SetCommState: far_jmp;
     Old_CreateFileW, Old_SetCommState: OldCode;

     CreateFileW_Adr, SetCommState_Adr: pointer;

    //-----------------------------------------------------------------------------
    function New_CreateFileW(  lpFileName:LPCWSTR;
                             dwDesiredAccess:DWORD;
                                 dwShareMode:DWORD;
                        lpSecurityAttributes:PSecurityAttributes;
                       dwCreationDisposition:DWORD;
                        dwFlagsAndAttributes:DWORD;
                               hTemplateFile:HWND):HWND;stdcall
    var
     Written: dword;
    begin
      WriteProcessMemory(INVALID_HANDLE_VALUE, CreateFileW_Adr,
                         @Old_CreateFileW, SizeOf(OldCode), Written);
       
      Result := CreateFileW(lpFileName,dwDesiredAccess, dwShareMode,lpSecurityAttributes,
                                                                   dwCreationDisposition,
                                                                    dwFlagsAndAttributes,
                                                                          hTemplateFile);
     
      if   lpFileName='COM1' then
       begin
          MessageBox(0, 'COM1', '', 0);
          hhPort:=Result;
       end;
       
      WriteProcessMemory(INVALID_HANDLE_VALUE, CreateFileW_Adr,
                         @Jmp_CreateFileW, SizeOf(far_jmp), Written);
    //-------------------------------------------------------------------------
    function New_SetCommState(pPort:HWND; DCB:_DCB):LongBool; stdcall;
    var
     Written: dword;
     wDCB:_DCB;
    begin
     WriteProcessMemory(INVALID_HANDLE_VALUE, SetCommState_Adr,
                         @Old_SetCommState, SizeOf(OldCode), Written);

    {здесь,pPort =hhPort, DCB.baudrate выдает непонятное число ,а GEtCommState(pPort,wDCB) в wDCB.baudrate установленную скорость 19200
    }
      result:= SetCommState(pPort,DCB);

    //? здесь result=false

       WriteProcessMemory(INVALID_HANDLE_VALUE, SetCommState_Adr,
                         @Jmp_SetCommState, SizeOf(far_jmp), Written);

    end;
    //----------------------------------------------------------------------
    Procedure SetHook();
    var
     hkernel32: dword;
     Bytes: dword;

    begin
       hkernel32 := GetModuleHandle('kernel32.dll');

      CreateFileW_Adr  := GetProcAddress(hkernel32, 'CreateFileW');
      SetCommState_Adr  := GetProcAddress(hkernel32, 'SetCommState');

      ReadProcessMemory(INVALID_HANDLE_VALUE, CreateFileW_Adr, @Old_CreateFileW, SizeOf(OldCode), Bytes);
      ReadProcessMemory(INVALID_HANDLE_VALUE, SetCommState_Adr, @Old_SetCommState, SizeOf(OldCode), Bytes);

      Jmp_CreateFileW.PuhsOp  := $68;
      Jmp_CreateFileW.PushArg := @New_CreateFileW ;
      Jmp_CreateFileW.RetOp   := $C3;

      Jmp_SetCommState.PuhsOp  := $68;
      Jmp_SetCommState.PushArg := @New_SetCommState;
      Jmp_SetCommState.RetOp   := $C3;

      WriteProcessMemory(INVALID_HANDLE_VALUE, CreateFileW_Adr, @Jmp_CreateFileW, SizeOf(far_jmp), Bytes);
      WriteProcessMemory(INVALID_HANDLE_VALUE, SetCommState_Adr, @Jmp_SetCommState, SizeOf(far_jmp), Bytes);
    end;

  • Программирование :: Java
  • Здравствуйте. Кто-нибудь в курсе, почему код:
    Код:
    File f1 = new File("D:");
    File f2 = new File("D:\\");

    System.out.println(
    f1 + " " + f2 + " " +
    f1.equals(f2));

    System.out.println(
    f1.listFiles()[0] + " " + f2.listFiles()[0] + " " +
    f1.listFiles()[0].equals(f2.listFiles()[0]));

    даёт в результате:

    D: D:\ false
    D:\Distribs D:\Distribs true


    И какой из вариантов нужно использовать при работе с корнем диска?
  • В учебнике (http://articles.org.ru/docum/java/gl17/gl17.php) сказано, цитирую:
    Цитировать
    Главный подпроцесс может завершиться, а программа будет продолжать работу, пока не закончит работу последний подпроцесс.

    Мой код:
    Код:
    package main;

    class Thread1 extends Thread {
        @Override
        public void run() {
            System.out.println("Thread1 started.");
            try {
                sleep(100);
            }
            catch(Exception e) {}
            System.out.println("Thread1 stoped.");
        }
    }

    public class Main {
        public static void main(String[] args) {
            new Thread1().start();
            System.exit(0);
        }
    }
    На деле выходит, что Thread1 закрывается до его завершения: на консоль печатается только "Thread1 started.". Как все-таки сделать, чтоб виртуальная машина ждала полного выполнения подпроцесса?
  • Добрый вечер!
    Можно ли создать экземпляр класса, зная его имя?
    Пусть есть строка "Class1" (строка может бить любой, не обязательно "Class1"). Можно ли создать обьект класса Class1?

    P.S. Вродь когда-то встречал, а сейчас найти не могу.
  • Программирование :: Программирование 1С
  • Подскажите с чего начать в 1с работаю сис админом упала 1с как снег на голову не знаю с какой стороны начинать
  • Здравствуйте :)
    Есть некое предприятие по предоставлению услуг. На нем стоит свое ПО. Предприятие хочет полностью перейти на 1с. Все бы ничего, можно к 1с подключить кассовые аппараты, принтеры. А вот что делать с турникетами??? Надо, чтоб работу турникетов было видно в режиме реального времени.

    Если мало информации, пишите, предоставлю больше. Я просто не представляю, как это сделать :insane:
  • Программирование :: Программирование 1С :: 1С 7.x
  • Доброго всем времени суток!

    Так и не смог найти ответ на вопрос на форуме.
    Вопрос состоит в следующем:
    Позаказное индивидуальное мебельное производство, т.е. все проекты разные. Разработка проектов ведется в К3. Задача: автоматизировать передачу данных из К3 в 1С. Стандартный модуль загрузки заказов из К3 формирует Множественное задание на производство, которое нам не подходит. Попробовали переделать модуль на формирование Задания на производство, после импорта материалы СРАЗУ списываются. Получилось только создание техкарты, с материалами нет проблем, а вот как в нее программно добавить производственные операции?

    Хотелось бы вот этот код изменить типа:
    Если КодНоменклатуры=«такой-то» тогда добавить материал иначе добавить операцию

    ДокТехКарта=СоздатьОбъект("Документ.ТехнологическаяКарта");
    Для к=НомерЗаписи по БД_Материалы.КоличествоЗаписей() Цикл
    КодНоменклатуры=СокрЛП(БД_Материалы.MATID);
    НаимНоменклатуры=СокрЛП(БД_Материалы.MATNAME);
    Номенклатура=ПолучитьНоменклатуру(КодНоменклатуры,НаимНоменклатуры,"Материалы");
    КодЕд=СокрЛП(БД_Материалы.UNITID); НаимЕд=СокрЛП(БД_Материалы.UNITNAME);
    ДокТехКарта.НоваяСтрока();
    ДокТехКарта.Номенклатура=Номенклатура;
    ДокТехКарта.Количество=БД_Материалы.COUNT;
    ДокТехКарта.Единица=ПолучитьЕдиницу(Номенклатура,КодЕд,Наимед);
    БД_Материалы.Следующая();
    КонецЦикла;
    тз=СоздатьОбъект("ТаблицаЗначений");
    ДокЗадание.ВыгрузитьТабличнуюЧасть(тз);

    Может кто-то сталкивался с таким вопросом, подскажите, пожалуйста, как можно это реализовать?
  • Такая проблема: нужно программно сделать сортировку данных Справочника по коду:

    Процедура ПриОткрытии()
    Сортировать("Код",0);
    КонецПроцедуры

    Выдает ошибку: Процедура не обнаружена (Сортировать) :-/

    Помогите, пожалуйста...
  • Программирование :: Программирование 1С :: 1С 8.x
  • Добрый день, всем!
    У меня проблема глобального масштаба.
    Необходимо из конфигурации Управление строительной организации 1.2.27.3 из документа РасчетСтраховыхВзносов выгрузить данные в версию 1.2.32.2. Делаю обработкой ВыгрузкаИЗагрузкаДанныхXML. Данные выгружаются, но при загрузке выдает ошибку (извините точно не помню формулировку) что-то вроде "Данные не могут быть прочитаны из файла [путь к фалу] [26,14]", в коде посмотрел ошибка возникает при попытке "ПрочитатьXML". Ошибка после чтения второго параметра . Сделал правило обмена в конфигурации "Конвертация данных", которые применяю при выгрузке данных стандартной обработкой. При выгрузке выдает ошибку неверно указан параметр №2.
    Что не так ?
  • Не получается ничего придумать. Может, кто что подкажет.
    Макет состоит из нескольких строк с авто высотой, переносом. В результате ТабДок на печать может быть любого размера. А мне надо ограничить его по высоте, т.е., например, выводить только часть, что по высоте составляет пол страницы А4, остальное обрезать нафик. При этом не могу установить конкретную высоту строк, т.к. какая-то может быть пустой, какая-то довольно длинной...
    Спасибо отозвавшимся.
  • Всем привет, много информации нашел, но путевого очень мало, подскажите, пожалуйста, где можно побольше прочитать о достоинстве этого языка, а именно он используется у меня в программе 1С, еще может быть кто знает какую-то информацию по сравнению этого я языка с другими? Пишу работу, очень нужна ваша помощь
  • Операционные системы :: Windows
  • Может кто знает как сделать любой из этих утилит "общий доступ" на подключение.

    У меня есть vpn-соединение, через которое компьютеры сети ходят во внешнюю сеть. Это соединение  настроено для общего доступа. К сожалению, XP не позволяет иметь несколько "общедоступных" подключений.

    Но иногда "основной" сервер доступа vpn  падает, и есть необходимость подключаться к другому.
    Пока я только меняю адрес сервера vpn.

    Хочется, либо управлять адресом сервера, либо "общим доступом". Но хелп какой-то куцый (что не сильно похоже на винду :) )

    [console]C:\>rasdial /?
    Вызов:
            rasdial элемент [пользователь [пароль|*]] [/DOMAIN:домен]
                    [/PHONE:номерТелефона] [/CALLBACK:ответныйНомер]
                    [/PHONEBOOK:файлАдреснойКниги] [/PREFIXSUFFIX]

            rasdial [элемент] /DISCONNECT

            rasdial
    [/console]

    [console]
    rasphone /?
    ---------------------------
    Командная строка удаленного доступа к сети
    ---------------------------
    rasphone [-f файл] [[-e | -d | -h | -r] элемент]
    rasphone [-f файл] -a [элемент]
    rasphone [-f файл] -lx связь
    rasphone
    -a   Вывод диалогового окна создания элемента
    -e   Вывод диалогового окна изменения элемента
    -d   Вывод диалогового окна связи с помощью элемента
    -h   Завершение связи без подтверждения
    -r   Удаление элемента без подтверждения
    -lx   Выполнение команды 'x' для ярлыков
          удаленного доступа
    x   Любая из команд a, e, d, h или r
    элемент   Имя элемента телефонной книги
           для выполнения операции
    файл   Полный путь к файлу телефонной книги
    связь   Полный путь к файлу ярлыков удаленного доступа

    'элемент' без команд выбирает элемент в диалоговом окне телефонной книги
    [/console]
  • Операционные системы :: Unix и другие :: Linux
  • Имеется следующая ситауция: есть ноут, на котором установлена рабочая Мандрива и уже мёртвая Виста. Мандрива должна остаться, винда тоже иногда требуется. Варианты следующие:

    1) поставить семёрку и новую Мандриву как две разные системы (как - пока не знаю)
    2) поставить семёрку и на виртуальной машине - Мандриву (это можно разобраться)
    3) Мандриву не трогать, Висту зачистить, но поставить эмулятор <а я не знаю, что там есть>, чтобы можно было виндовые программы тоже запускать

    сильно склоняюсь к третьему варианту, ибо цейтнот. Ну и попробовать новенькое тоже интересно.
    Подскажите, какой эмулятор бывает и как с ним бороться ?

    Добавлено через 10 минут и 10 секунд:
    вот я нашёл тут в контекстном меню экзешника пункт запуска с помощью Wine, но, так понимаю, ещё что-то требуется поставить
  • Направления программирования :: Drivers
  • Помогите плиз!
    Перечитал кучу постов, так и не нашел для себя решение!
    У меня установлено: Visual Studio 6.0, Driver Studio 3.1, Windows DDK 2600.
    В DDK Build Settings указал путь на директорию DDK, в VS 6.0 в Set Active Configuration установил Win32 WDM Checked.
    Компилирую библиотеку VdwLibs.dsw при помощи Build with BUILD.EXE.
    Выдается:
    Building Library - c:\progra~1\compuware\driverstudio\driverworks\lib\i386\vdw_wdm.lib for i386
    lib() : error LNK1181: cannot open input file 'objchk\i386\dwcontrl.obj'
    BUILD: Done

        110 files compiled -   856 LPS
        1 library built - 1 Error
    Errors in the build process.  Cannot copy the library
    Tool returned code: 0

    Что делать?
    Заранее благодарен!!!
  • Учимся программировать :: Начинающим
  • Добрый день! вопрос такой:
    Надо сделать такие выборки:

    1.   Вывести список лицевых счетов тех абонентов, у которых нет долга.
    2.   Вывести список лицевых счетов абонентов, у которых за последний период израсходовано более 100м3 горячей и 200м3 холодной воды.
    3.   Вывести список ФИО тех абонентов, у которых нет телефонов и не указано в каких городах они живут.
    4.   Вывести список ФИО тех абонентов,  которые проживают в собственных домах (нет номеров квартир).
    5.   Вывести абонентов мужского пола (использовать идентификатор пола равный 21), не имеющих телефонов

    семантика:

    Таблица CLIENT – данные об абонентах.
    ∙   N_CLIENT – лицевой счет
    ∙   C_FIRST_NAME – имя
    ∙   C_SECOND_NAME – отчество
    ∙   C_LAST_NAME – фамилия
    ∙   N_SEX – идентификатор пола
    ∙   N_CITY – идентификатор города или поселка
    ∙   N_STREET – идентификатор улицы
    ∙   C_HOUSE – номер дома и номер корпуса
    ∙    N_FLAT – номер квартиры
    ∙   N_PHONE – номер телефона

    Таблица SEX – справочник пола
    ∙   N_SEX – идентификатор пола
    ∙   C_SEX – название пола

    Таблица STREET – справочник улиц
    ∙   N_STREET – идентификатор улицы
    ∙   C_STREET – название улицы

    Таблица CITY – справочник городов и поселков
    ∙   N_CITY – идентификатор города или поселка
    ∙   C_CITY – название города или поселка

    Таблица PAYMENT – оплата абонента
    ∙   N_CLIENT – лицевой счет абонента
    ∙   D_PAY – дата оплаты
    ∙   N_SUM – сумма оплаты
    ∙   N_SIGN – признак(1 – оплата учтена при начислении, 0 – оплата не учтена)

    Таблица COMPUTATION – начисления абонентов
    ∙   N_COMPUTATION – идентификатор начисления
    ∙   N_CLIENT – лицевой счет абонента
    ∙   D_COMPUTATION – дата начисления
    ∙   N_INFO_HOT – текущие показания счетчика горячей воды
    ∙   N_INFO_COLD – текущие показания счетчика холодной воды
    ∙   N_DIFFERENCE_HOT – разница текущих и предыдущих показаний счетчика горячей воды
    ∙   N_DIFFERENCE_COLD – разница текущих и предыдущих показаний счетчика холодной воды
    ∙   N_TARIFF – идентификатор тарифов на горячую и холодную воду
    ∙   N_SUM_HOT – начисление за горячую воду за текущий период
    ∙   N_SUM_HOT – начисление за холодную воду за текущий период
    ∙   N_DEBT – долг на начало периода
    ∙   N_PAY – оплата за предыдущий период
    ∙   N_TOTAL – итоговая сумма на конец месяца

    Таблица TARIFF – тарифы на горячую и холодную воду
    ∙   N_TARIFF – идентификатор тарифов по холодной и горячей воде
    ∙   D_TARIFF – дата смены тарифов на новые
    ∙   N_TARIFF_HOT – тариф на горячую воду (в руб.)
    ∙   N_TARIFF_COLD – тариф на холодную воду (в руб.)

    Пишу вот это:
    1. Select  N_CLIENT
    FROM payment
    WHERE  N_SUM is NULL
    2. Select  N_CLIENT, N_INFO_HOT, N_INFO_COLD
    FROM computation
    WHERE  N_INFO_HOT>100 and N_INFO_COLD>200
    3. Select  C_LAST_NAME, C_FIRST_NAME, C_SECOND_NAME
    FROM client
    WHERE  N_CITY AND N_PHONE is NULL
    4. Select  C_LAST_NAME, C_FIRST_NAME, C_SECOND_NAME
    FROM client
    WHERE  N_FLAT is NULL
    5. Select  C_LAST_NAME, C_FIRST_NAME, C_SECOND_NAME, N_PHONE
    FROM client
    WHERE  N_SEX = 21 AND N_PHONE IS NULL

    Подскажите, правильно ли я мыслю?
  • Компилятор VS 6.0 кидает ошибку в структуре.
    struct List
    {
    List * last;
    Event * data;
    List * next;
    };

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


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


В избранное