Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/120: Рейтинг темы: голосов - 120, средняя оценка - 4.55
95 / 62 / 22
Регистрация: 11.03.2013
Сообщений: 608
Записей в блоге: 7
.NET 4.x

Как сделать обновление программы

06.09.2017, 15:35. Показов 25515. Ответов 19

Студворк — интернет-сервис помощи студентам
Доброго времени суток господа.
Если ошибся темой, прошу перенести.
Если не актуально, прошу снести.

Сегодня пришлось сделать обновление по нажатию кнопки.
Ничего на ум не пришло как сделать это при помощи проверки файла версии.

Сам долго искал такой вариант, но в интернете ни на что путное не наткнулся.

Внизу код на условиях. Работоспособность проверил.
Конечно есть минусы всего этого.
Например если версия в файле ниже.
То что ничего кроме основной программы не сможете скачать.

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

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
  private void button1_Click(object sender, EventArgs e)
        {
           
            string pathVer = @"\\192.168.12.193\upd\version.txt";                       //создадим переменную string с указанием пути файла версии, для удобства
            string vers = File.ReadAllText(pathVer);                                    //создадим ещё переменную в которой будем хранить номер версии
           
           /*Объявляем условие. Если версия продукта Application.ProductVersion (Меняется в AssemblyInfo.cs) равна Версии в файле*/
           
           if (Application.ProductVersion.ToString() == vers.Text.ToString())   
            {
                string ravno = "Версии программ одинаковые. Обновление не требуется."; //Эту переменную можно не создавать. Её можно поместить в всплывающее сообщение ниже MessageBox
                if (File.Exists(pathVer))                                               //Создаём ещё одно условие на проверку файла. Проверяем. Если файл с версией сущестует
                {
                    /* Выполяем это условие. Показываем всплывающее окошко о том что обновление не требется */
                    MessageBox.Show("Ваша версиия программы " + Application.ProductVersion + ".\n\rВерсия загруженая на сервере " + vers.Text + "\n\r\n\r" + ravno, "Обновление", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else // Если не сущестует 
                {
                    /* Выполяем это условие. Показываем всплывающее окошко о том что не можем проверить версию, так как нет доступа к файлу */
                    MessageBox.Show("Сервер обновлений временно не работает\n\rПопробуйте зайти позже\n\r\n\rНевозможно проверить версию программы", "Предупреждение", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
 
                else //А тут мы возвращаемся к условию в самом начале. Если файл версии и версия продукта не равны
                {
                    string neravno = "Требуется обновление. Обновить ПО?"; //Эту переменную можно не создавать. Её можно поместить в всплывающее сообщение ниже MessageBox
                    //Создадим событие в MessageBox. Отловим какую кнопку нажмём
                    DialogResult result = MessageBox.Show("Ваша версиия программы " + Application.ProductVersion + ".\n\rВерсия загруженая на сервере " + vers.Text + "\n\r\n\r" + neravno, "Обновление", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (result == DialogResult.Yes) //Если нажали ДА. Выполняем следующее условие
                    {
                     // Качаем программу
                    WebClient webClient = new WebClient();
                    string aprod = File.ReadAllText(pathVer);  // Переменная с версией файла
                    webClient.DownloadFile(@"\\192.168.12.193\upd\название_программы.exe", "v." + aprod  + "(" + DateTime.Now.Day + "." + DateTime.Now.Month + "." + DateTime.Now.Year + ")" + @"AP.exe"); 
                    //Качаем файл с указанного места и называем его в формате v.(6.9.2017)AP.exe название может быть любое
                    
                    Process pc = new Process(); // Запустим командную строку
                    //pc.StartInfo.Verb = "runas"; запускать от имени администратора по необходимости
                    pc.StartInfo.FileName = "cmd";
                    pc.StartInfo.Arguments = "/c @ECHO OFF && ping -n 5 127.0.0.1 && start " + "v." + aprod + "(" + DateTime.Now.Day + "." + DateTime.Now.Month + "." + DateTime.Now.Year + ")" + @"AP.exe && del v." + Application.ProductVersion + "(" + DateTime.Now.Day + "." + DateTime.Now.Month + "." + DateTime.Now.Year + ")" + @"AP.exe";
                    //что делает командная строка?
                    //Она немного ждёт пока закроется основная программа, затем она запускает новую программу, и удаляет старую
                    pc.Start();
                    Application.Exit();//Выходим из проиложения
                }
                    if (result == DialogResult.No)
                    {
                        return; //Если нажали НЕТ. Возвращаемся.
                    }
                  }
 
                }
            }
Весь код расписал. Возможно метод не новый, но как смог. Без регистраций и СМС
3
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.09.2017, 15:35
Ответы с готовыми решениями:

Как сделать проверку на обновление программы?
Я делаю лаунчер для программы и мне потребовалась функция, чтоб при включении программы происходила проверка : существует ли вообще...

Как сделать обновление программы
Ребят у меня такой вопрос как сделать , есть программа такая простенькая , как сделать так что бы она по нажатию кнопки обновлялась, как бы...

Нужно сделать обновление для программы
Нужно сделать обновление программы на Delphi 7. -Обновляться должна через FTP -Обновляется только в том случае если есть новая...

19
0 / 0 / 0
Регистрация: 25.08.2018
Сообщений: 7
25.08.2018, 14:30
Может есть другой вариант закрыть основную программу, затем запустить новую и удалить старую?
Вылазит ошибка от cmd что файла не существует.
0
95 / 62 / 22
Регистрация: 11.03.2013
Сообщений: 608
Записей в блоге: 7
25.08.2018, 15:50  [ТС]
Цитата Сообщение от Dodoad Посмотреть сообщение
Может есть другой вариант закрыть основную программу, затем запустить новую и удалить старую?
Вылазит ошибка от cmd что файла не существует.
Всё верно. DateTime.Now я брал как за пример.
Лучше использовать либо свою систему версий, либо Application version
C#
1
2
string version = Assembly.GetExecutingAssembly().GetName().Version.ToString()
// вернёт версию
0
0 / 0 / 0
Регистрация: 25.08.2018
Сообщений: 7
25.08.2018, 16:03
Всё равно не пойму как и что исправить, можешь помочь?
0
25.08.2018, 18:19

Не по теме:

Вам могли бы помочь, если бы вы что-то сделали сами и показали.
Сделать за вас это не помочь, а именно сделать за вас.

0
0 / 0 / 0
Регистрация: 25.08.2018
Сообщений: 7
25.08.2018, 18:25
C#
1
2
3
4
5
6
7
8
9
10
 webClient.DownloadFile("http://сайт/AP.exe", "v." + aprod + "(" + DateTime.Now.Day + "." + DateTime.Now.Month + "." + DateTime.Now.Year + ")" + @"AP.exe");
                    //Качаем файл с указанного места и называем его в формате v.(6.9.2017)AP.exe название может быть любое
 
                    Process pc = new Process(); // Запустим командную строку
                    pc.StartInfo.Verb = "runas"; //запускать от имени администратора по необходимости
                    pc.StartInfo.FileName = "cmd";
                    pc.StartInfo.Arguments = "/c @ECHO OFF && ping -n 5 127.0.0.1 && start " + "v." + aprod + "(" + DateTime.Now.Day + "." + DateTime.Now.Month + "." + DateTime.Now.Year + ")" + @"AP.exe && del v." + Application.ProductVersion + "(" + DateTime.Now.Day + "." + DateTime.Now.Month + "." + DateTime.Now.Year + ")" + @"AP.exe";
                    //что делает командная строка?
                    //Она немного ждёт пока закроется основная программа, затем она запускает новую программу, и удаляет старую
                    pc.Start();
Файл скачивает, но не открывает новый и не удаляет старый, пишет что не может найти новый файл.
0
Эксперт .NET
 Аватар для Rius
13205 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,575
Записей в блоге: 14
25.08.2018, 18:27
Ну это - не ваше, а из кода ТС'а. Простая копипаста готового непроработанного кода.
0
0 / 0 / 0
Регистрация: 25.08.2018
Сообщений: 7
25.08.2018, 18:28
Мне и не нужно ничего менять, мне главное чтобы это работало...
0
Эксперт .NET
 Аватар для Rius
13205 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,575
Записей в блоге: 14
25.08.2018, 18:46
А оно и не заработает.
  • Пути составлены конкатенацией, вместо готовых методов фреймворка, правильно расставляющих разделители пути;
  • Дата по частям добавляется, вместо более краткого и аккуратного форматирования строки;
  • Задержка выполнения кода в cmd через ping. Не говорю уж о пинге, но сам метод ожидания - вообще ненадёжный;
  • Запуск программы по неполному пути не работает.
Это код новичка, не разобравшегося в теме. Тяп-ляп и готово.

Чтобы заработало то,что выше, его нужно менять. И нужно понимать, как. А не взять готовое и молиться.

Добавлено через 3 минуты
Хотите готовенькое? - Поизучайте что-то более полноценное, типа https://github.com/ravibpatel/AutoUpdater.NET

Добавлено через 5 минут
А если вдруг случится невероятное и вы захотите сделать самостоятельно - понаблюдайте за тем, как работают распространённые системы обновлений. В операционных системах или лаунчерах крупных игр.
1
95 / 62 / 22
Регистрация: 11.03.2013
Сообщений: 608
Записей в блоге: 7
25.08.2018, 21:32  [ТС]
Цитата Сообщение от Dodoad Посмотреть сообщение
Всё равно не пойму как и что исправить, можешь помочь?
Без проблем. В примере не было учтено, что скачивать будет только по сети. Для того чтобы считать с интернета, всё будет по другому.
Если нужно по сети это делать, то вот код
Кликните здесь для просмотра всего текста
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
 string pathVer = "https://russia.ru/version.txt";                       //создадим переменную string с указанием пути файла версии, для удобства
            string vers = File.ReadAllText(pathVer);                                    //создадим ещё переменную в которой будем хранить номер версии
 
            /*Объявляем условие. Если версия продукта Application.ProductVersion (Меняется в AssemblyInfo.cs) равна Версии в файле*/
 
            if (Application.ProductVersion.ToString() == vers.ToString())
            {
                string ravno = "Версии программ одинаковые. Обновление не требуется.";  //Эту переменную можно не создавать. Её можно поместить в всплывающее сообщение ниже MessageBox
                if (File.Exists(pathVer))                                               //Создаём ещё одно условие на проверку файла. Проверяем. Если файл с версией сущестует
                {
                    /* Выполяем это условие. Показываем всплывающее окошко о том что обновление не требется */
                    MessageBox.Show("Ваша версиия программы " + Application.ProductVersion + ".\n\rВерсия загруженая на сервере " + vers.ToString() + "\n\r\n\r" + ravno, "Обновление", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else // Если не сущестует 
                {
                    /* Выполяем это условие. Показываем всплывающее окошко о том что не можем проверить версию, так как нет доступа к файлу */
                    MessageBox.Show("Сервер обновлений временно не работает\n\rПопробуйте зайти позже\n\r\n\rНевозможно проверить версию программы", "Предупреждение", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
 
            else //А тут мы возвращаемся к условию в самом начале. Если файл версии и версия продукта не равны
            {
                string neravno = "Требуется обновление. Обновить ПО?"; //Эту переменную можно не создавать. Её можно поместить в всплывающее сообщение ниже MessageBox
                                                                       //Создадим событие в MessageBox. Отловим какую кнопку нажмём
                DialogResult result = MessageBox.Show("Ваша версиия программы " + Application.ProductVersion + ".\n\rВерсия загруженая на сервере " + vers.ToString() + "\n\r\n\r" + neravno, "Обновление", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (result == DialogResult.Yes) //Если нажали ДА. Выполняем следующее условие
                {
                    // Качаем программу
                    WebClient webClient = new WebClient();
                    string aprod = File.ReadAllText(pathVer);  // Переменная с версией файла
                    webClient.DownloadFile(@"https://russia.ru/Prog.exe", "v." + aprod + @"AP.exe");
                    //Качаем файл с указанного места и называем его в формате v.(6.9.2017)AP.exe название может быть любое
 
                    Process pc = new Process(); // Запустим командную строку
                    //pc.StartInfo.Verb = "runas"; запускать от имени администратора по необходимости
                    pc.StartInfo.FileName = "cmd";
                    pc.StartInfo.Arguments = "/c @ECHO OFF && ping -n 5 127.0.0.1 && start " + "v." + aprod + @"AP.exe && del v." + Application.ProductVersion + @"AP.exe";
                    //что делает командная строка?
                    //Она немного ждёт пока закроется основная программа, затем она запускает новую программу, и удаляет старую
                    pc.Start();
                    Application.Exit();//Выходим из проиложения
                }
                if (result == DialogResult.No)
                {
                    return; //Если нажали НЕТ. Возвращаемся.
                }
            }


Мне такой вариант подходил, так как программа была внутрисетевая.
Тебе как я понял, нужен работоспособный вариант для интернета.

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


Вот пример
Вложения
Тип файла: 7z UpdateHand.7z (134.9 Кб, 319 просмотров)
2
95 / 62 / 22
Регистрация: 11.03.2013
Сообщений: 608
Записей в блоге: 7
25.08.2018, 21:39  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Пути составлены конкатенацией, вместо готовых методов фреймворка, правильно расставляющих разделители пути;
Дата по частям добавляется, вместо более краткого и аккуратного форматирования строки;
Задержка выполнения кода в cmd через ping. Не говорю уж о пинге, но сам метод ожидания - вообще ненадёжный;
Запуск программы по неполному пути не работает.
Это код новичка, не разобравшегося в теме. Тяп-ляп и готово.
Было написано на тяп ляп, согласен, так как обновления были каждый день, сделал и не думал. Но потом конечно же приходилось всё переделывать.
А раз тему не обновлял, то конечно же помогу.
Кончено всё можно сделать по другому. Но это как по мне самый простой вариант на 44 строчки кода
Знаете как сделать меньше и проще, поделитесь. А как сделать красивей и продуманей, то это не в этой теме, я же в начале темы написал
Цитата Сообщение от anomal6 Посмотреть сообщение
для простого обновления, лично мне хватает. Вдруг кому то пригодится.
0
 Аватар для PoPsa85
814 / 561 / 240
Регистрация: 01.07.2018
Сообщений: 1,818
25.08.2018, 21:43
anomal6, Программа может переименовать сама себя. без всяких Process pc = new Process();
0
Эксперт .NET
 Аватар для Rius
13205 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,575
Записей в блоге: 14
25.08.2018, 21:44
Цитата Сообщение от anomal6 Посмотреть сообщение
Но потом конечно же приходилось всё переделывать.
Это старый вариант? Почему новый не выложите?

Цитата Сообщение от anomal6 Посмотреть сообщение
Кончено всё можно сделать по другому.
Можно и нужно. Взять готовый обновлятор с гитхаба, например.
Цитата Сообщение от anomal6 Посмотреть сообщение
Но это как по мне самый простой вариант на 44 строчки кода
Можно вообще без кода обновления:
  • Приложение на сетевом диске, запускается напрямую по сети;
  • Web-приложение, запускается в браузере.
Цитата Сообщение от anomal6 Посмотреть сообщение
Знаете как сделать меньше и проще, поделитесь.
В обновлении есть нюансы, которые нельзя упрощать. У вас они и так уже не учтены и работает всё кое-как, не дыши на него. Ещё хуже делать незачем.
0
95 / 62 / 22
Регистрация: 11.03.2013
Сообщений: 608
Записей в блоге: 7
25.08.2018, 21:55  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Это старый вариант? Почему новый не выложите?
Приложил выше, по лучше вариант, который без запинок работает
Цитата Сообщение от PoPsa85 Посмотреть сообщение
Программа может переименовать сама себя. без всяких Process pc = new Process();
Да я знаю об этом))) вот только тогда не знал, что выполнять процессы можно и после закрытия программы я про Form.Closed

Цитата Сообщение от Rius Посмотреть сообщение
Можно и нужно. Взять готовый обновлятор с гитхаба, например.
Видимо я плохо искал, а то что я находил, мне вообще не подходило, для "тупого" обновления.
Тупое обновление, потому что решает пользователь - нажал кнопку проверка=> сравнил=>Обновил.

Цитата Сообщение от Rius Посмотреть сообщение
Можно вообще без кода обновления
Да согласен с Вами, лучше вообще использовать ClickOnce.
0
 Аватар для PoPsa85
814 / 561 / 240
Регистрация: 01.07.2018
Сообщений: 1,818
25.08.2018, 21:56
Цитата Сообщение от Rius Посмотреть сообщение
Приложение на сетевом диске, запускается напрямую по сети;
Тут и ClickOnce неплохо справляется с обновлениями.
0
Эксперт .NET
 Аватар для Rius
13205 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,575
Записей в блоге: 14
25.08.2018, 22:09
PoPsa85, пусть справляется, Dodoad лучше бы туда направить.
anomal6, без запинок?
Почему файл версии читается 3 раза?
Почему его наличие по адресу проверяется после его загрузки с этого адреса?
Зачем для строки вызывать метод ToString()?
Куда скачивается программа и откуда она потом запускается?
0
95 / 62 / 22
Регистрация: 11.03.2013
Сообщений: 608
Записей в блоге: 7
25.08.2018, 22:24  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
anomal6, без запинок?
Почему файл версии читается 3 раза?
Почему его наличие по адресу проверяется после его загрузки с этого адреса?
Зачем для строки вызывать метод ToString()?
Куда скачивается программа и откуда она потом запускается?
Без запинок, я имел ввиду что не тормозит при обновлении.
Читается 3 раза - это моя глупость.
Если нет по адресу, будет Экзепшн
Зачем для строки вызывать метод ToString() - изначально писал не как string значение.
Если Вы увидели, то проверка идет даже не версий, а просто текста, изначально писал для int, но потом решил не утруждать этими точками, удалять их и считывать, хоть и понимал что это глупо, перед тем как писать, читал статьи умельцев как всё правильно организовать, но как я уже писал, нужно было "тупое" обновление.
Поэтому и осталось ToString. Код не чистый, согласен.
Но с поставленой задачей справляется.

Куда скачивается программа и откуда она потом запускается? Я как понимаю Вы про относительный путь? О дааа.
Скачивается и запускается она от исполнительного файла.
0
Эксперт .NET
 Аватар для Rius
13205 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,575
Записей в блоге: 14
25.08.2018, 22:29
От исполнительного?
Типичная ошибка.
0
0 / 0 / 0
Регистрация: 25.08.2018
Сообщений: 7
25.08.2018, 23:04
Когда в MessageBox пишу
C#
1
Path.GetFileName(System.Reflection.Assembly.GetEntryAssembly().Location)
, выводит "название.exe"
Мне нужно удалять файл название которого будет определяться программой, но это не работает , что не так?
C#
1
pc.StartInfo.Arguments = "/c @ECHO OFF && ping -n 1 127.0.0.1 && del Path.GetFileName(System.Reflection.Assembly.GetEntryAssembly().Location)";
Добавлено через 2 минуты
Пробовал так
C#
1
File.Delete(Path.GetFileName(System.Reflection.Assembly.GetEntryAssembly().Location));
Но пишет "отказано в доступе" хоть и запускаю от имени администратора.

Добавлено через 10 секунд
Ещё пробовал так
C#
1
File.Delete(Path.GetFileName(System.Reflection.Assembly.GetEntryAssembly().Location));
Но пишет "отказано в доступе" хоть и запускаю от имени администратора.
0
95 / 62 / 22
Регистрация: 11.03.2013
Сообщений: 608
Записей в блоге: 7
26.08.2018, 10:17  [ТС]
Цитата Сообщение от Dodoad Посмотреть сообщение
Мне нужно удалять файл название которого будет определяться программой, но это не работает , что не так?
C#
1
pc.StartInfo.Arguments = "/c @ECHO OFF && ping -n 1 127.0.0.1 && del Path.GetFileName(System.Reflection.Assembly.GetEntryAssembly().Location)";
Немного не правильно, вы функцию вызываете в CMD, а командная строка не знает её.
Писать надо так
C#
1
pc.StartInfo.Arguments = "/c @ECHO OFF && ping -n 1 127.0.0.1 && del " + Path.GetFileName(System.Reflection.Assembly.GetEntryAssembly().Location);
Добавлено через 2 минуты
Цитата Сообщение от Dodoad Посмотреть сообщение
Но пишет "отказано в доступе" хоть и запускаю от имени администратора.
Почитайте тему которую оставил пользователь Rius, там всё детально расписано про относительные пути
https://www.cyberforum.ru/blog... g5377.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.08.2018, 10:17
Помогаю со студенческими работами здесь

Delphi 7 Нужно сделать обновление программы через Ftp сервер
Народ нужна помощь! Пишу в delphi 7 прогу 3 день (знаний ниуя) возникла проблема: Нужно сделать обновление программы через Ftp сервер....

Как запретить обновление программы metatrader5 ?
Добрый день! Друзья, кто знает, подскажите пожалуйста. Есть установленная программа на windows-server-2016 - это терминал mt5....

Как настроить обновление опубликованной программы?
Всем привет, создал программу в Visual Studio, перед публикацией пытаюсь настроить возможность последующего обновления в "Проект"...

Как сделать обновление БД
не могу сделать кнопку обновление. При добавление записи, запись отображается в datagredview. Но при закрытии формы добавленные записи не...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru