Как изменить значение константы в 1С и передать его в другие модули: разбираем ошибки и правильные подходы

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

Техническая ошибка: почему не получается изменить значение

Проанализируем фрагмент кода, который часто вызывает затруднения у новичков. Рассмотрим типичную попытку изменения константы:


Переменная1 = Константы.ИспользоватьПризнакРассмотрено.Получить();
Переменная1 = Ложь;

В данном случае мы сталкиваемся с базовым непониманием работы объектов в 1С. Метод Получить() возвращает значение, хранящееся в базе данных (в данном случае тип Булево). Присваивая переменной Переменная1 значение Ложь, мы просто меняем содержимое этой локальной переменной в оперативной памяти, но никак не воздействуем на базу данных.

Попытка написать Константы.ИспользоватьПризнакРассмотрено.Получить() = Ложь также ошибочна, так как левая часть выражения — это результат функции, а не объект, которому можно что-то присвоить. Система справедливо выдает ошибку "Неопознанный оператор".

Как правильно программно изменить константу

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

Способ 1. Использование метода Установить()

Это самый быстрый и простой способ записи значения в базу данных. Метод доступен на сервере и в толстом клиенте.


// Сразу записывает новое значение в базу данных
Константы.ИспользоватьПризнакРассмотрено.Установить(Ложь);

Способ 2. Использование Менеджера Значения

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


Настройка = Константы.ИспользоватьПризнакРассмотрено.СоздатьМенеджерЗначения();
Настройка.Значение = Ложь;
Настройка.Записать();

Почему использовать константы для флагов пользователя — плохая идея

Теперь выясним причину, по которой опытные разработчики называют подобный подход "говнокодом". Нужно понимать природу объекта Константа. Константа — это общая настройка для всей информационной базы.

Проанализируем последствия использования константы для отслеживания нажатия кнопки пользователем:

  1. Глобальность изменений. Если в системе работают 100 пользователей, и один из них нажмет кнопку, изменив константу в Ложь, это значение мгновенно изменится для всех остальных 99 человек. Это приведет к хаосу в логике программы.
  2. Блокировки базы данных. Запись константы — это транзакционная операция в СУБД. Если пользователи будут массово нажимать на кнопки, вызывая перезапись константы, возникнут ожидания на блокировках, что существенно снизит производительность системы.
  3. Избыточность. Константа предназначена для долгосрочного хранения настроек (например, "Вести учет по складам"), а не для хранения временного состояния интерфейса.

Альтернативные способы передачи данных между модулями

Разберем, как реализовать задачу "отследить нажатие кнопки и передать это в другой модуль" правильно, в зависимости от контекста задачи.

1. Использование параметров сеанса

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


// Установка значения на сервере
ПараметрыСеанса.ТекущийПользовательНажалКнопку = Истина;

// Проверка в другом модуле
Если ПараметрыСеанса.ТекущийПользовательНажалКнопку Тогда
    // Выполняем действия
КонецЕсли;

2. Механизм оповещений (для взаимодействия между формами)

Если "Модуль 2" — это другая открытая форма, то лучшим решением будет использование системы оповещений. Рассмотрим этот механизм подробнее.

В форме, где происходит нажатие (Форма 1):


&НаКлиенте
Процедура Команда1(Команда)
    // Выполняем действия
    Оповестить("Событие_НажатаКоманда1", Новый Структура("Значение", Ложь), ЭтаФорма);
КонецПроцедуры

В форме, которая должна отреагировать (Форма 2), создаем обработчик:


&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    Если ИмяСобытия = "Событие_НажатаКоманда1" Тогда
        ПризнакРассмотрено = Параметр.Значение;
        // Модуль 2 теперь знает об изменениях
    КонецЕсли;
КонецПроцедуры

3. Глобальные переменные модуля управляемого приложения

Если данные нужны только на стороне клиента (в интерфейсе), можно объявить переменную в Модуле управляемого приложения с ключевым словом Экспорт. Она будет доступна во всех клиентских модулях текущего сеанса.


// В Модуле управляемого приложения
Перем ГлобальныйПризнакНажатия Экспорт;

4. Временное хранилище

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

Резюме

Мы выяснили, что для записи константы необходимо использовать метод Установить() или МенеджерЗначения. Однако использовать константы для отслеживания действий конкретного пользователя в интерфейсе категорически нельзя. Для этих целей в 1С предусмотрены Параметры сеанса (серверная глобальность для пользователя) или Оповещения (взаимодействие между экранными формами).

← На главную