Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
-21 / 29 / 2
Регистрация: 17.03.2018
Сообщений: 778

ViewModel: RelayCommand и метод

12.02.2020, 17:11. Показов 2069. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем,
Элд Хасп,

Я закрывал окно в Сode Behind таким образом. Теперь использую ViewModel.

C#
1
2
3
4
5
 private void Close_Button_Click(object sender, RoutedEventArgs e)
        {
            this.Close(false);
 
        }
Сейчас у меня есть
C#
1
2
3
4
5
6
7
8
9
RelayCommand(WindowClose);
 
 
private void WindowClose()
 
{
                  // как в данном случае закрыть окно?
 
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.02.2020, 17:11
Ответы с готовыми решениями:

Как из ViewModel UserControl'a изменить свойство в ViewModel главного окна?
Недавно начал попытки создавать приложение WPF с применением MVVM, и у меня возник вопрос, который не даёт мне продвигаться в разработке...

Mvvm ViewModel в ViewModel
Есть одно окошко там много вкладок, в каждой вкладке есть подвкладки и там много разных таблиц и кнопок. ViewModel будет просто огромной,...

RelayCommand
Добрый день, покажите пожалуйста пример relaycommand на примере моего приложения. <Window x:Class="View.MainWindow" ...

18
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
12.02.2020, 17:23
ViewModel:
C#
1
2
3
4
5
6
public event EventHandler CloseWindowRequested;
 
private void RaiseCloseWindowRequested()
{
  CloseWindowRequested?.Invoke(this, EventArgs.Empty);
}
*.xaml
XML
1
2
3
4
5
6
<Window>
  ...
  <Interaction.Triggers>
    <EventTrigger SourceObject="{Binding DataContext}" EventName="CloseWindowRequested">
      <local:CloseWindowTriggerAction />
      ...
TriggerAction:
C#
1
2
3
4
5
6
7
public class CloseWindowTriggerAction : TriggerAction<Window>
{
  protected override void Invoke(object parameter)
  {
    AssociatedObject.Close();
  }
}
3
-21 / 29 / 2
Регистрация: 17.03.2018
Сообщений: 778
12.02.2020, 17:33  [ТС]
Ё моё! вот это замутки. Проще оставить как есть. И я не вижу чтобы использовалась Command.
0
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
12.02.2020, 17:40
Команда и не используется. Используется связка - (event во ViewModel)->(Trigger)->(TriggerAction)
1) Во ViewModel вызываем event
2) Trigger, подписавшись на этот event, отлавливает его и вызывает наш кастомный TriggerAction
3) TriggerAction выполняет нужные действия с View
1
-21 / 29 / 2
Регистрация: 17.03.2018
Сообщений: 778
12.02.2020, 17:58  [ТС]
Цитата Сообщение от novikov.ea Посмотреть сообщение
Команда и не используется. Используется связка - (event во ViewModel)->(Trigger)->(TriggerAction)
Но мы опять же используем code behind, весь смысл моего вопроса чтобы "свалить" оттуда используя Command.
0
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
12.02.2020, 18:00
Где используется code behind? Я не написал ни одной строчки кода в *.xaml.cs
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
12.02.2020, 19:01
Цитата Сообщение от Bulky Посмотреть сообщение
Проще оставить как есть.
Не только проще, но и правильнее.

Добавлено через 47 секунд
Цитата Сообщение от Bulky Посмотреть сообщение
Но мы опять же используем code behind, весь смысл моего вопроса чтобы "свалить" оттуда
Не бойтесь использовать code behind там, где ему место.
Манипулирование элементами интерфейса — самое место для code behind.
1
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
12.02.2020, 19:17
Цитата Сообщение от kolorotur Посмотреть сообщение
Не только проще, но и правильнее
Если задача состоит только в том, чтобы закрыть одно единственное окно в программе, то это будет действительно проще. Но если же некоторый функционал, связанный с взаимодействием с интерфейсом, нужно использовать во множестве мест, то следует использовать Trigger'ы и Behavior'ы, дабы не заниматься дублированием кода.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16147 / 11268 / 2890
Регистрация: 21.04.2018
Сообщений: 33,131
Записей в блоге: 2
12.02.2020, 19:30
Цитата Сообщение от Bulky Посмотреть сообщение
Привет всем,
И вам привет.

Само по себе закрытие окна это метод View или уровня выше - App.
Поэтому, если надо закрыть окно не производя ни каких действий с данными, то как написал kolorotur, вполне допустимо и даже лучше задать это в Click кнопки.

Если же закрытие окна - это реакция View на изменение данных, то тогда уже, конечно, вариант с CB не подойдёт.
Решений множество в зависимости от деталей реализации.

В варианте novikov.ea, в VM вызывается событие. На это событие подписывается или View, или App и уже они закрывают окно, если посчитают нужным.
Что нельзя делать, однозначно, это закрывать окно из VM. Оно должно только уведомить (вызвать событие) о именении своего состояния.
Кроме варианта со специальным событием RaiseCloseWindowRequested можно добавить в VM свойство и отслеживать его состояние через событие PropertyChanged. Отслеживать можно как с помощью EventTrigger (вариант от novikov.ea), так и реализовав подписку в CB Окна или App.
1
-21 / 29 / 2
Регистрация: 17.03.2018
Сообщений: 778
12.02.2020, 19:42  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Само по себе закрытие окна это метод View или уровня выше - App.
Поэтому, если надо закрыть окно не производя ни каких действий с данными, то как написал kolorotur, вполне допустимо и даже лучше задать это в Click кнопки.
то есть использовать Click, как я показал в первом посте?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16147 / 11268 / 2890
Регистрация: 21.04.2018
Сообщений: 33,131
Записей в блоге: 2
12.02.2020, 20:07
Цитата Сообщение от Bulky Посмотреть сообщение
то есть использовать Click, как я показал в первом посте?
Если вам нужна кнопка просто закрывающая окно и больше ничего не делающая, то - ДА.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16147 / 11268 / 2890
Регистрация: 21.04.2018
Сообщений: 33,131
Записей в блоге: 2
12.02.2020, 20:22
Цитата Сообщение от Bulky Посмотреть сообщение
то есть использовать Click, как я показал в первом посте?
Пример из моего приложения
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<Window x:Class="VkAudioWpfApp.SecondAuthorizationCodeWind"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:VkAudioWpfApp"
        mc:Ignorable="d" SizeToContent="Height"
        Title="SmsCodeWind" Width="100">
    <StackPanel>
        <TextBlock Text="Код" TextAlignment="Center"/>
        <TextBox x:Name="tBoxCode"/>
        <Button x:Name="btnSend" Content="Отправить" Click="Send_Click"/>
    </StackPanel>
</Window>
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System.Windows;
 
namespace VkAudioWpfApp
{
    /// <summary>Логика взаимодействия для SmsCodeWind.xaml</summary>
    public partial class SecondAuthorizationCodeWind : Window
    {
        public SecondAuthorizationCodeWind() => InitializeComponent();
 
        public string Code { get; private set; }
 
        private void Send_Click(object sender, RoutedEventArgs e)
        {
            Code = tBoxCode.Text;
            DialogResult = true;
            Close();
        }
    }
}
1
-21 / 29 / 2
Регистрация: 17.03.2018
Сообщений: 778
13.02.2020, 09:26  [ТС]
Элд Хасп,

В соседнем классе нужно исполнить методы в соответствии со свойствами loaded/unloaded главного окна.

Естественно есть вариант в Сode Behind это сделать через соответствующие события. Создать экземпляр класса, потом через него добраться к методам в классе.

Есть варианты сделать это "по фэншую" и без лишних наворотов? Например прикрутить Command к свойствам главного окна. Синтаксис? В XAML?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16147 / 11268 / 2890
Регистрация: 21.04.2018
Сообщений: 33,131
Записей в блоге: 2
13.02.2020, 09:45
Цитата Сообщение от Bulky Посмотреть сообщение
Есть варианты сделать это "по фэншую" и без лишних наворотов?
По loaded/unloaded главного окна или приложения?
Создание экземпляров Model, ViewModel, View, их настройка, задание связей между ними - это функции App.
App - не является частью View. По сути, это должен быть даже отдельный проект, просто из-за малого количества кода в App, подобный фанатизм, не имеет смысла.

Так же, если настройки и сложных связей нет, часто это делают в конструкторах Model, ViewModel, View.
Вот пример App из того же приложения:
XML
1
2
3
4
5
6
7
8
<Application x:Class="VkAudioWpfApp.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:VkAudioWpfApp">
    <Application.Resources>
         
    </Application.Resources>
</Application>
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
using System.Windows;
 
namespace VkAudioWpfApp
{
    /// <summary>
    /// Логика взаимодействия для App.xaml
    /// </summary>
    public partial class App : Application
    {
        /// <summary>Значение ID приложения</summary>
        /// <remarks>ID приложения можно получить по адресу https://vknet.github.io/vk/authorize/ </remarks>
        private static readonly ulong appID = 1234567;
 
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            /// <remarks>Создаётся экземпляр ViewModel. В конструктор передаются нужные
            /// данны: ApplicationID и делегат метода ввода дополнительного кода.
            /// Создаётся экземпляр основного окна, ему передаётся в контекст данных ViewModel,
            /// после чего основное окна показывается.</remarks>
            new MainWindow() { DataContext = new VkAudioVM(appID, InputString) }
            .Show();
        }
 
        /// <summary>Метод получения данных вызываемый из любого потока</summary>
        /// <returns>Возвращает string с введёнными даными</returns>
        private string InputString()
            => Dispatcher.Invoke(InputStringShowDialog);
 
        /// <summary>Вызывает диалоговое окно для ввода данных. 
        /// Метод может вызываться только из основного UI потока</summary>
        /// <returns>Возвращает string с введёнными даными</returns>
        private string InputStringShowDialog()
        {
            ///<remarks>Создаётся экземпляр окна для ввода дополнительного кода</remarks>
            SecondAuthorizationCodeWind smsCodeWind = new SecondAuthorizationCodeWind();
            ///<remarks>Окно ввода дополнительного кода показывается в модельном диалоге</remarks>
            smsCodeWind.ShowDialog();
 
            ///<remarks>Если выход из модального диалога корректен, то возврат введёного кода.
            ///Иначе - пустой строки</remarks>
            if (smsCodeWind.DialogResult == true)
                return smsCodeWind.Code;
            return "";
        }
    }
}
А конструктор ViewModel самостоятельно создаёт экземпляр Model
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        /// <summary>Конструктор по умолчанию</summary>
        public VkAudioVM()
        {
            /// Инициализация команд методами
            AuthorizeCommand = new RelayCommand(AuthorizeMethodAsync, AuthorizeCanMethod);
            GetAudiosCommand = new RelayCommand(GetAudiosMethod, GetAudiosCanMethod);
        }
        /// <summary>Конструктор с передачей ID</summary>
        /// <param name="applicationID">ID приложения полученный от VK</param>
        /// <param name="inputSmsCode">Делегат для получения строки с кодом входа</param>
        public VkAudioVM(ulong applicationID, Func<string> inputSmsCode)
            : this()
            => model = new MediaPlayerIMP(applicationID, inputSmsCode);

Если же моделей может быть несколько разных типов или между ними есть сложные связи то это тоже делает App.
Вот пример из поста Пример создания приложения "Работа с комнатами в студенческих общежитиях" [WPF, SQLite, Элд Хасп]

В App есть конструктор принимающий Модель
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
using StDorModel;
using StDorModelLibrary.Interfaces;
using StDorViewLibrary;
using StDorViewModel;
using System;
using System.Windows;
 
namespace StudentDormitories
{
    /// <summary>
    /// Логика взаимодействия для App.xaml
    /// </summary>
    public partial class App : Application
    {
        /// <summary>Модель</summary>
        private readonly IStDorModel model;
        /// <summary>ViewModel</summary>
        private readonly MainViewModel viewModel;
        /// <summary>Главное окно</summary>
        private readonly Window mainWindow;
 
        /// <summary>Конструктор по умолчанию</summary>
        public App()
            :this(new StDorModelXML())
        {}
 
        public App(IStDorModel model)
        {
            this.model = model ?? throw new ArgumentNullException(nameof(model));
            viewModel = new MainViewModel(Dispatcher, model);
            viewModel.ExceptionEvent += ShowException;
 
            mainWindow = new Window()
            {
                Width = 1000,
                Height = 800,
                Content = new MainUС(),
                DataContext = viewModel
            };
 
        }
 
        /// <summary>Обработчик события старта приложения</summary>
        /// <param name="sender">Не используется</param>
        /// <param name="e">Не используется</param>
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            mainWindow.Show();
            LoadModelAsync((string)Resources["DefaultSourceXML"]);
        }
 
        /// <summary>Асинхронный метод загрузки Модели</summary>
        /// <param name="source">Строка источника загрузки</param>
        private async void LoadModelAsync(string source)
        {
            try
            {
                await model.LoadAsync(source);
                viewModel.SetDormitories();
            }
            catch (Exception ex)
            {
                ShowException(this, nameof(LoadModelAsync), ex);
            }
        }
 
        /// <summary>Метод вывода сообщения об исключении</summary>
        /// <param name="sender">Источник исключения</param>
        /// <param name="nameMetod">Метод в котором возникло исключение</param>
        /// <param name="exc">Параметры исключения</param>
        private void ShowException(object sender, string nameMetod, Exception exc)
            => MessageBox.Show($"{sender}.{nameMetod}\r\n{exc}\r\n{exc.Message}");
    }
}
А создание и запуск App происходит из другого проекта типа "Консольное приложение", в котором создана Модель для работы с БД
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
using StudentDormitories;
using System;
using System.CodeDom.Compiler;
using System.Diagnostics;
 
namespace SQLiteModel
{
    class Program
    {
        /// <summary>
        /// Application Entry Point.
        /// </summary>
        [STAThread()]
        [DebuggerNonUserCode()]
        [GeneratedCode("PresentationBuildTasks", "4.0.0.0")]
        static void Main(string[] args)
        {
 
            ModelSQLite model = new ModelSQLite("DefaultConnection");
 
            App app = new App(model);
 
            app.InitializeComponent();
            app.Run();
        }
    }
}
1
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
13.02.2020, 09:51
Цитата Сообщение от Элд Хасп Посмотреть сообщение
вполне допустимо и даже лучше задать это в Click кнопки
А в это время какой-нить асинхронный код выполняет запись в базу данных Вы же сами недавно топили за то, чтобы было всё как надо

Я за novikov.ea .
Миниатюры
ViewModel: RelayCommand и метод  
1
-21 / 29 / 2
Регистрация: 17.03.2018
Сообщений: 778
13.02.2020, 09:59  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
По loaded/unloaded главного окна или приложения?
Честно говоря не увидел в коде выше ничего полезного. Наверное вы не поняли вопроса.


Вся речь о MainWindow главное окно, других окон нет. Есть способ пропустить Loaded/Unloaded в соседний класс "по-фэншую". Фэншуй на картинке выше. Например я знаю как это делается с button. Цепляется Command в XAML. А здесь?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16147 / 11268 / 2890
Регистрация: 21.04.2018
Сообщений: 33,131
Записей в блоге: 2
13.02.2020, 10:06
Цитата Сообщение от skilllab Посмотреть сообщение
А в это время какой-нить асинхронный код выполняет запись в базу данных Вы же сами недавно топили за то, чтобы было всё как надо
Я же сразу написал "Если закрытие окна это единственная функция кнопки".

Если же перед закрытием надо произвести некоторые действия с данными, то тоже может быть несколько вариантов.

1) По кнопке должны быть произведены некоторые действия с данными. И закрытие окна это, по сути, не функция кнопки, а следствие вызванных изменений в данных. Тогда, конечно, это метод VM и и одно из решений предложил novikov.ea.

2) Закрытие по кнопке - это именно закрытие окна. Но после закрытия основного окна надо закрыть само приложение, а перед этим как-то модифицировать данные (сохранить, дождаться прекращения процессов и т.д.). Закрытие ПРИЛОЖЕНИЯ - это уже функция App. А App не является частью View (я только в предыдущем посте об этом написал). App "знает" всё обо всех и может для этого напрямую обратиться и в ViewModel и в Model иди ещё куда ему потребно.

Добавлено через 4 минуты
Цитата Сообщение от Bulky Посмотреть сообщение
Вся речь о MainWindow главное окно, других окон нет. Есть способ пропустить Loaded/Unloaded в соседний класс "по-фэншую". Фэншуй на картинке выше. Например я знаю как это делается с button. Цепляется Command в XAML. А здесь?
Можете в loaded/unloaded вызвать метод или команду ViewModel.
Можете в XAML подсоединить методы или команды ViewModel к соответствующим событиям Окна как показал novikov.ea.

Но, скорее всего, у вас это не loaded/unloaded ОКНА, а открытие/закрытия ПРИЛОЖЕНИЯ.
Поэтому, лично я бы, лучше все это организовал в App.
0
-21 / 29 / 2
Регистрация: 17.03.2018
Сообщений: 778
13.02.2020, 10:10  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Можете в loaded/unloaded вызвать метод или команду ViewModel.

имеете ввиду так?

C#
1
((ViewModel)DataContext).Assign();

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но, скорее всего, у вас это не loaded/unloaded ОКНА, а открытие/закрытия ПРИЛОЖЕНИЯ.
Поэтому, лично я бы, лучше все это организовал в App.
MainWindow.xaml properties:

XML
1
Loaded="Window_Loaded" Unloaded="Window_Unloaded"
и два события появились в Code Behind.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16147 / 11268 / 2890
Регистрация: 21.04.2018
Сообщений: 33,131
Записей в блоге: 2
13.02.2020, 14:29
Цитата Сообщение от Bulky Посмотреть сообщение
MainWindow.xaml properties:
Это я понял, что вы обрабатываете события окна.
Но по смыслу что это?
События окна или приложения?

Допустим, если бы у вас было несколько экземпляров MainWindow, то обрабатывать надо было бы события каждого экземпляра окна? Или только события при запуске (перед открытием первого окна) и завершении приложения (после закрытия последнего окна)?

Добавлено через 2 минуты
Цитата Сообщение от Bulky Посмотреть сообщение
имеете ввиду так?
C#
1
((ViewModel)DataContext).Assign();
Да, если надо обработать какие-то данные в CB View.
Из View идёт обращение к VM. Без разницы через привязки в XAML или явные вызовы методов в CB.
В самой View может обрабатывать только состояния UI элементов, но никак не данных.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.02.2020, 14:29
Помогаю со студенческими работами здесь

RelayCommand
Здравствуйте. У меня стоит задача сделать так, чтобы после нажатия кнопки менялось свойство Visability у нескольких сеток Grid. Так как в...

RelayCommand.cs не найден
Пишу на wpf приложение, установил MVVM lights. В using указаны: using GalaSoft.MvvmLight; using GalaSoft.MvvmLight.Command; ...

Спам CanExecute в RelayCommand
Добрый день, я думал что CanExecute выполняется по клику или еще какому-то действую над объектом, оказывается они спамом n мс выполняются....

RelayCommand и асинхронный код
Здравствуйте. Есть некая кнопка, к которой привязана команда &lt;Button x:Name=&quot;SendMessageButton&quot; Command=&quot;{Binding...

RelayCommand как передать переменную
Всем привет, пишу MVVM приложение :) По умолчанию во всех туториалах и так на форумах читал, что комманды делаются через класс...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru