Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658

Работа с формами и потоками

08.01.2021, 16:56. Показов 4227. Ответов 37
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Насколько я понимаю приложения Windows.Forms есть какой-то поток, в котором постоянно находятся активные формы и поддерживаются.

Чтобы создать новую форму придется использовать ТОЛЬКО этот поток? Или возможно будет в других потоках?

Просто при попытке создать форму в созданном завершающемся потоке она закрывается по его завершении. Если усыпить Thread.Sleep форма зависает.

Каким образом можно создать второй такой поток? Или все формы нужно распологать глобальной переменной статик в корне первой формы... Я не понимаю... Может кто объяснить?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.01.2021, 16:56
Ответы с готовыми решениями:

Работа с потоками.
При нажатии на кнопку начинает работать поток, который выводит в ТБ символы, соответствующие названию кнопки 100 раз с задержкой в 200...

Работа с потоками
Вообщем у меня такая ситуация. Хочу при загрузке формы запустить функцию в новом потоке. В этой функции у меня добавляются элементы,...

Работа с потоками
Программа: парсер, по нажатию на кнопку, она начинает свою работу (конечно же в отдельном потоке). Получив данные с сайта, нам нужно эти...

37
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
08.01.2021, 17:52
Для начала почитайте букварь https://docs.microsoft.com/ru-... -threading
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
08.01.2021, 23:12
Цитата Сообщение от koc94ok Посмотреть сообщение
есть какой-то поток, в котором постоянно находятся активные формы
Главный или UI поток.

Цитата Сообщение от koc94ok Посмотреть сообщение
Чтобы создать новую форму придется использовать ТОЛЬКО этот поток? Или возможно будет в других потоках?
Можно создавать и в других потоках, но лучше этого не делать. Исключение - формы отображаемые при запуске приложения или отображающие прогресс операции.

Цитата Сообщение от koc94ok Посмотреть сообщение
Каким образом можно создать второй такой поток?
Нужно запустить цикл обработки сообщений Windows c помощью Application.Run.

Цитата Сообщение от koc94ok Посмотреть сообщение
Или все формы нужно распологать глобальной переменной статик в корне первой формы.
Это точно не поможет.

Цитата Сообщение от koc94ok Посмотреть сообщение
Я не понимаю.
Для чего понадобилось создавть форму в новом потоке? Есть подозрение что можно без этого обойтись.
0
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
09.01.2021, 21:49  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Для чего понадобилось создавть форму в новом потоке? Есть подозрение что можно без этого обойтись.
Просто количество форм неопределено изначально, создаются и запоняются они динамически, а данные для их создания находятся далеко за пределами основного потока из-за чего напрашивается такое решение.
Попытаюсь в главном потоке создать список с сотней форм, и далее ссылаться на них, но боюсь получится еще хуже.
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Нужно запустить цикл обработки сообщений Windows c помощью Application.Run.
Сделал как вы советовали, работают формы пару минут (как-то со сбоями).
Через 2 минуты выскакивает ошибка на строку
C#
1
2
3
4
        public static void Main2(object state)
        {
            Application.Run((Form)state);
        }
Кликните здесь для просмотра всего текста
System.InvalidOperationException: "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления '' не из того потока, в котором он был создан."


Данные в формах из сторонних потоков меняю так:
C#
1
2
3
4
5
6
7
            FORM.Invoke((MethodInvoker)(delegate () 
            {
                
                FORM.ClientSize = new Size(742, 540);
                FORM.StartPosition = FormStartPosition.Manual;
                FORM.Location = new Point(POSX, POSY);
            }));
0
Эксперт .NET
 Аватар для Rius
13165 / 7725 / 1679
Регистрация: 25.05.2015
Сообщений: 23,535
Записей в блоге: 14
09.01.2021, 21:57
Лучший ответ Сообщение было отмечено koc94ok как решение

Решение

koc94ok, почитайте тему Форма появляется и зависает с колесиком загрузки навечно подвешивая платформу

Раз вам такое надо, что-то у вас с архитектурой не задалось..
1
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
09.01.2021, 21:58  [ТС]
Создаю формы вот так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    public class FORM : Form
    {
        public static void Main2(object state)
        {
            Application.Run((Form)state);
        }
 
        public static FORM Create()
        {
            FORM form = new FORM()
            {
                FormBorderStyle = FormBorderStyle.None,
                TransparencyKey = Color.DimGray,
                BackColor = Color.DimGray,
                ShowInTaskbar = false
            };
                Thread thread = new Thread(Main2);
                thread.SetApartmentState(ApartmentState.STA);
                thread.Start(form);
           
            Thread.Sleep(1000);
            return form;
        }
    }
0
Эксперт .NET
 Аватар для Rius
13165 / 7725 / 1679
Регистрация: 25.05.2015
Сообщений: 23,535
Записей в блоге: 14
09.01.2021, 22:12
См. указанную тему. Там всё есть.
1
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
09.01.2021, 22:51  [ТС]
Rius,
Я уже слишком запутался в том что имеется у меня и проще создать "архитектуру" заново.

Смотрите:
У меня есть от 1 до 10 потоков WORKER, которые работают с данными.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void WORKER()
{
    while(true)
    {
          //собираем данные
          //как только данные собраны:
          if(не существует экземпляра класса с подобными данными)
          {
                закидываем эти данные в экземпляр класса , для дальнейшего удобства работы.
[B]                здесь же создаем еще один поток, который будет заниматься FORMWORKER
[/B]          }
          else
          {
                закидываем эти данные в экземпляр класса , для дальнейшего удобства работы.
          }
    }
}
Данный поток продолжает пулить данные в экземпляр класса чтобы поток для вывода в форму занимался их отображением.
Если данный поток завершится то соответствующий ему обработчик данных форм также можно утилизовать.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void FORMWORKER(id)
{
    //Создаем форму 
    GlobalData[i].FORM = FORM.Create();
    while(пока существует условие выполнения основного потока WORKER)
    {
            //меняем форму, создаем контролы итд итп.
            GlobalData[i].FORM.Invoke((MethodInvoker)(delegate () 
            {              
                GlobalData[i].FORM.ClientSize = new Size(742, 540);
                GlobalData[i].FORM.StartPosition = FormStartPosition.Manual;
                GlobalData[i].FORM.Location = new Point(POSX, POSY);
            }));
    }
}
Если поток всего один и форма всего одна все работает как часы. Но стоит запустить пару тройку и начинаются проблемы.
Вот так выглядит создание форм:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    public class FORM : Form
    {
        public static void Main2(object state)
        {
            Application.Run((Form)state);
        }
 
        public static FORM Create()
        {
            FORM form = new FORM()
            {
                FormBorderStyle = FormBorderStyle.None,
                TransparencyKey = Color.DimGray,
                BackColor = Color.DimGray,
                ShowInTaskbar = false
            };
                Thread thread = new Thread(Main2);
                thread.SetApartmentState(ApartmentState.STA);
                thread.Start(form);
           
            Thread.Sleep(1000);
            return form;
        }
    }
Формы хранятся в экземпляре класса, чтобы удобно было обмениваться данными.

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

Добавлено через 28 минут
Rius, Вот как сейчас обстоят дела.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Threading;
 
namespace WindowsFormsApp6
{
    class DataWorker
    {
        public int UNIQ_ID { get; set; }
        public WORKERFORM f = null;
        public int x { get; set; }
        public int y { get; set; }
 
        public static void DATATOFORM(object UNIQ_ID)
        {
            DataWorker DW = GlobalData.ALLDATA.Find(x => x.UNIQ_ID == (int)UNIQ_ID);
            DW.f = WORKERFORM.Create();
            Label l = new Label() { Text = "x" };
            DW.f.Invoke((MethodInvoker)(delegate ()
            {
                DW.f.Controls.Add(l);
            }));
            while (GlobalData.ALLDATA.Exists(x => x.UNIQ_ID == (int)UNIQ_ID))
            {
                l.Text = (DW.x + DW.y).ToString();
            }
            DW.f.Close();
        }
    }
    static class GlobalData
    {
        public static List<DataWorker> ALLDATA = new List<DataWorker>();
    }
    public partial class Form1 : Form
    {
        int UNIQ_ID = 0;
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Button1_Click(object sender, EventArgs e)
        {
            Thread wrk = new Thread(new ParameterizedThreadStart(WORKER.work));
            wrk.Start(UNIQ_ID);
        }
    }
    class WORKER
    {
        public static void work(object UNIQ_ID)
        {
            int x = 0;
            int y = 0;
            while(true)
            {
                x++;
                y++;
                if(!GlobalData.ALLDATA.Exists(z=>z.UNIQ_ID==(int)UNIQ_ID))
                {
                    GlobalData.ALLDATA.Add(new DataWorker()
                    {
                        x = x,
                        y = y,
                        UNIQ_ID = (int)UNIQ_ID
                    });
                    Thread wrk = new Thread(new ParameterizedThreadStart(DataWorker.DATATOFORM));
                    wrk.Start(UNIQ_ID);
                }
                else
                {
                    GlobalData.ALLDATA.Find(z => z.UNIQ_ID == (int)UNIQ_ID).x = x;
                    GlobalData.ALLDATA.Find(z => z.UNIQ_ID == (int)UNIQ_ID).y = y;
                }
                Thread.Sleep(1000);
            }
        }
    }
    public class WORKERFORM : Form
    {
       public static void Main2(object state)
        {
            Application.Run((Form)state);
        }
        public static WORKERFORM Create()
        {
            WORKERFORM form = new WORKERFORM();
            Thread thread = new Thread(Main2);
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start(form);
            Thread.Sleep(1000);
            return form;
        }
    }
}
0
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
09.01.2021, 22:58  [ТС]
Файлы
Вложения
Тип файла: rar WindowsFormsApp6.rar (165.6 Кб, 9 просмотров)
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
09.01.2021, 23:24
Цитата Сообщение от koc94ok Посмотреть сообщение
Создаю формы вот так:
Вы создаете форму в олном потоке, а "запускаете" её в другом. Надо все делать в одном потоке.

Цитата Сообщение от koc94ok Посмотреть сообщение
Просто количество форм неопределено изначально, создаются и запоняются они динамически
Ок, но отсюда никак не вытекает необходмость создания форм в разных потоках.

Цитата Сообщение от koc94ok Посмотреть сообщение
данные для их создания находятся далеко за пределами основного потока
В смысле "далеко за пределами основного потока"?

Добавлено через 2 минуты
koc94ok, код увидел уже после ответа. Какую задачу вы пытаетесь решить?
0
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
10.01.2021, 01:48  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
koc94ok, код увидел уже после ответа. Какую задачу вы пытаетесь решить?
Просто индикация данных, генерируемых в потоках, в динамически созданных формах.

В данный момент пробую пристроить решение из темы пользователя Rius.

Добавлено через 2 часа 16 минут
Rius, Увы, но все тоже самое.
Одна форма работает как часы, стоит добавить вторую и получаем:
C#
1
System.InvalidOperationException: "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления '' не из того потока, в котором он был создан."
C#
1
2
3
4
5
        private void ThreadedMethod()
        {
            _window = _createWindow();
            Application.Run(_window);
        }
0
Эксперт .NET
 Аватар для Rius
13165 / 7725 / 1679
Регистрация: 25.05.2015
Сообщений: 23,535
Записей в блоге: 14
10.01.2021, 07:46
См. архив
Вложения
Тип файла: zip WindowsFormsApp1.zip (7.3 Кб, 11 просмотров)
1
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
10.01.2021, 11:59  [ТС]
Rius, Спасибо, сейчас буду разбирать Ваш пример. Сразу вопрос в лоб:
C#
1
2
3
            _thread = new Thread(ThreadedMethod);
            _thread.SetApartmentState(ApartmentState.STA);
            _thread.Start();
Каким образом тут возможно дождаться окончательной загрузки дескрипторов формы, а не выставлять ручную задержку, например в секунду?
0
Эксперт .NET
 Аватар для Rius
13165 / 7725 / 1679
Регистрация: 25.05.2015
Сообщений: 23,535
Записей в блоге: 14
10.01.2021, 12:01
Вот именно здесь - никак, потому что форма создаётся позже, уже в работающем потоке.
1
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
10.01.2021, 14:03  [ТС]
Rius, Переписал код, пока все работает... тьфу тьфу тьфу...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        public void ChangeText(int TLPTABINDEX,int LABELXPOS,int LABELYPOS,string VALUE, string TIP=null)
        {
            this.Controls.OfType<TableLayoutPanel>().ToList().Find(c => c.TabIndex == TLPTABINDEX).GetControlFromPosition(LABELXPOS, LABELYPOS).Text = VALUE;
            if(!String.IsNullOrEmpty(TIP))
            {
                toolTip1.SetToolTip(this.Controls.OfType<TableLayoutPanel>().ToList().Find(c => c.TabIndex == TLPTABINDEX).GetControlFromPosition(LABELXPOS, LABELYPOS), TIP);
            }
        }
        public void ChangeTLPPOS(int TLPTABINDEX)
        {
            if (this.Controls.OfType<TableLayoutPanel>().ToList().Find(c => c.TabIndex == TLPTABINDEX).Location.X != GlobalData._COORD[TLPTABINDEX].X ||
                this.Controls.OfType<TableLayoutPanel>().ToList().Find(c => c.TabIndex == TLPTABINDEX).Location.Y != GlobalData._COORD[TLPTABINDEX].Y)
                this.Controls.OfType<TableLayoutPanel>().ToList().Find(c => c.TabIndex == TLPTABINDEX).Location = new Point(GlobalData._COORD[TLPTABINDEX].X, GlobalData._COORD[TLPTABINDEX].Y);
        }
Моя форма состоит из TableLayoutPanel панелей (30 штук) и в каждой по 20 лейблов, я идентифицирую панели по TABINDEX, а лейблы по колонке/строке. Это возможно как-то оптимизировать (методы выше) чтобы каждый раз не выполнять поиск элементов?
И наверное уже совсем оффтоп вопрос: я создал подсказки TOOLTIP,но они показываются только если форма в "Фокусе", можно ли как-то сделать чтобы они показывались без фокуса формы?
0
Эксперт .NET
 Аватар для Rius
13165 / 7725 / 1679
Регистрация: 25.05.2015
Сообщений: 23,535
Записей в блоге: 14
10.01.2021, 14:07
Чтобы не искать каждый раз - найти один раз и сохранить ссылки в поля/переменные.

А лучше сделать кастомные контролы, если они все одинаковы.

Почему не DataGridView?

Добавлено через 1 минуту
Цитата Сообщение от koc94ok Посмотреть сообщение
я создал подсказки TOOLTIP,но они показываются только если форма в "Фокусе", можно ли как-то сделать чтобы они показывались без фокуса формы?
Они показываются при наведении мыши на контрол в активной форме. Зачем их показывать без этого?
0
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
10.01.2021, 14:12  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Почему не DataGridView?
Первый раз когда смотрел этот элемент в студии подумал что это таблица с предопределенными колонками, а мне нужна пустая сетка и запись в неё лейблов по координатам и изменение текста максимально удобное. Или я не прав?
Цитата Сообщение от Rius Посмотреть сообщение
Они показываются при наведении мыши на контрол в активной форме. Зачем их показывать без этого?
Да при наведении мыши, но у меня на экране несколько форм, и чтобы посмотреть информацию я просто навожу мышью, а так приходится еще и кликать чтобы активировать форму.
0
Эксперт .NET
 Аватар для Rius
13165 / 7725 / 1679
Регистрация: 25.05.2015
Сообщений: 23,535
Записей в блоге: 14
10.01.2021, 14:16
Не по координатам, а по столбцам/строкам возможно.
А то вы сделали 600 контролов, а потом почему-то жалуетесь, что UI тормозит...

Можно активировать форму при наведении мыши.
И вот это попробуйте: ToolTip.ShowAlways Property
1
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
10.01.2021, 15:33  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Не по координатам, а по столбцам/строкам возможно.
А то вы сделали 600 контролов, а потом почему-то жалуетесь, что UI тормозит...
Как получить аналогичный элемент от датагрида? Там добавляются только столбцы в конструкторе, а строки забиваются данными, нельзя например изменить сразу 4-ю строку, потому что её нет.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
            this.tableLayoutPanel9.AutoSize = true;
            this.tableLayoutPanel9.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
            this.tableLayoutPanel9.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
            this.tableLayoutPanel9.ColumnCount = 4;
            this.tableLayoutPanel9.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
            this.tableLayoutPanel9.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
            this.tableLayoutPanel9.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
            this.tableLayoutPanel9.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
            this.tableLayoutPanel9.Controls.Add(this.label129, 3, 3);
            this.tableLayoutPanel9.Controls.Add(this.label130, 3, 2);
            this.tableLayoutPanel9.Controls.Add(this.label131, 3, 1);
            this.tableLayoutPanel9.Controls.Add(this.label132, 3, 0);
            this.tableLayoutPanel9.Controls.Add(this.label133, 2, 3);
            this.tableLayoutPanel9.Controls.Add(this.label134, 2, 2);
            this.tableLayoutPanel9.Controls.Add(this.label135, 2, 1);
            this.tableLayoutPanel9.Controls.Add(this.label136, 2, 0);
            this.tableLayoutPanel9.Controls.Add(this.label137, 1, 3);
            this.tableLayoutPanel9.Controls.Add(this.label138, 1, 2);
            this.tableLayoutPanel9.Controls.Add(this.label139, 1, 1);
            this.tableLayoutPanel9.Controls.Add(this.label140, 1, 0);
            this.tableLayoutPanel9.Controls.Add(this.label141, 0, 3);
            this.tableLayoutPanel9.Controls.Add(this.label142, 0, 2);
            this.tableLayoutPanel9.Controls.Add(this.label143, 0, 1);
            this.tableLayoutPanel9.Controls.Add(this.label144, 0, 0);
            this.tableLayoutPanel9.Location = new System.Drawing.Point(499, 390);
            this.tableLayoutPanel9.Name = "tableLayoutPanel9";
            this.tableLayoutPanel9.RowCount = 4;
            this.tableLayoutPanel9.RowStyles.Add(new System.Windows.Forms.RowStyle());
            this.tableLayoutPanel9.RowStyles.Add(new System.Windows.Forms.RowStyle());
            this.tableLayoutPanel9.RowStyles.Add(new System.Windows.Forms.RowStyle());
            this.tableLayoutPanel9.RowStyles.Add(new System.Windows.Forms.RowStyle());
            this.tableLayoutPanel9.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
            this.tableLayoutPanel9.Size = new System.Drawing.Size(60, 52);
            this.tableLayoutPanel9.TabIndex = 8;
Можете сделать аналогичный элемент для DataGrid?
0
Эксперт .NET
 Аватар для Rius
13165 / 7725 / 1679
Регистрация: 25.05.2015
Сообщений: 23,535
Записей в блоге: 14
10.01.2021, 15:37
Сколько нужно столбцов и сколько строк?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.01.2021, 15:37
Помогаю со студенческими работами здесь

работа с потоками
Возможно ли приостановить все потоки на заданное время из процедуры не из которых они были созданы и запущены?

Работа с потоками
Объясните мне мои ошибки и как их поправить(грузит ЦП и делает невозможным работу с GUI программы - лагает ужасно) Есть некий класс, в...

Работа с потоками
Добрые люди дайте готовый кусочек кода по работе с потоками Требования такие Запустив энное количество потоков мне надо дождаться их...

Работа с потоками в Qt
Здравствуйте форумчане! Имеется задание: &quot;Создать многопоточное приложение, в котором каждый новый поток рисует треугольник в...

Работа с потоками
Имеется l:string, в котором хранится 2 байта в двоичной системе счисления. т.е. length(l) = 16 как пример l = '00100001 11101011'для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru