Как программно установить значение элемента формы при открытии и отключить его автоматическое сохранение в 1С?

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

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

Разберем последовательность событий при открытии управляемой формы

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

  1. ПриСозданииНаСервере — здесь мы обычно инициализируем значения.
  2. Восстановление настроек — система берет значения, которые пользователь выбирал в прошлый раз (если включено сохранение данных формы).
  3. ПриЗагрузкеДанныхИзНастроекНаСервере — событие, возникающее после восстановления настроек, позволяющее программно их скорректировать.
  4. ПриОткрытии (на клиенте) — форма становится доступна пользователю.

Выясним причину проблемы: если мы просто установим значение в ПриСозданииНаСервере, платформа на шаге «Восстановление настроек» может перезаписать нашу переменную тем значением, которое было сохранено в прошлый раз. Именно поэтому кассир видит «старую» кассу, даже если мы прописали алгоритм выбора новой.

Способ 1: Использование процедуры ПриСозданииНаСервере

Это базовый метод. Если для реквизита (например, КассаККМ) в свойствах формы не стоит галочка «Сохранять данные», то достаточно установить значение здесь. Посмотрим на пример реализации, когда мы определяем кассу по умолчанию:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверка на автоматическое тестирование (хороший тон разработки)
    Если Параметры.Свойство("АвтоТест") Тогда
        Возврат;
    КонецЕсли;

    // Устанавливаем кассу, если она еще не заполнена
    Если Не ЗначениеЗаполнено(КассаККМ) Тогда
        // Здесь может быть вызов функции, определяющей кассу текущего пользователя
        КассаККМ = Справочники.КассыККМ.НайтиПоНаименованию("Касса №1");
    КонецЕсли;

КонецПроцедуры

Однако, как мы выяснили, этот метод может не сработать из-за автоматического восстановления настроек. Рассмотрим, как с этим бороться.

Способ 2: Корректировка настроек в ПриЗагрузкеДанныхИзНастроекНаСервере

Чтобы программно «перебить» сохраненные настройки пользователя, нам необходимо использовать процедуру ПриЗагрузкеДанныхИзНастроекНаСервере. Рассмотрим этот метод как наиболее надежный для жесткой фиксации значения при каждом входе в программу.


&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
    
    // Получаем текущую кассу, привязанную к пользователю
    НужнаяКасса = ПолучитьКассуТекущегоПользователя(); 
    
    // Принудительно устанавливаем значение в реквизит формы
    КассаККМ = НужнаяКасса;
    
    // Также можно обновить саму структуру настроек, чтобы система не использовала старые данные
    Настройки.Вставить("КассаККМ", НужнаяКасса);

КонецПроцедуры

Проанализируем ситуацию: используя этот метод, мы гарантируем, что даже если 1С восстановила «вчерашнюю» кассу из кэша настроек, наш код выполнится следом и подставит актуальное значение для текущего сеанса.

Способ 3: Оптимизация через Параметры сеанса

Если нам нужно часто обращаться к данным текущего кассира или его рабочего места, правильным архитектурным решением будет использование Параметров сеанса. Это позволит избежать лишних запросов к базе данных при каждом открытии формы журнала.

Предположим, у нас есть параметр сеанса ТекущееРабочееМестоКассира. Тогда код в форме будет выглядеть максимально лаконично:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Прямое обращение к параметру сеанса
    КассаККМ = ПараметрыСеанса.ТекущееРабочееМестоКассира.ОсновнаяКасса;

КонецПроцедуры

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

Способ 4: Программная установка отбора в Динамическом списке

Часто установка значения в поле КассаККМ — это лишь половина дела. Нам нужно, чтобы список документов в журнале (Динамический список) также сразу отфильтровался по этой кассе. Разберем, как установить отбор программно.

Даже если в реквизитах формы вы не видите объект типа ДинамическийСписок с именем «Список», он всегда присутствует в основе журналов документов. Мы можем обратиться к его элементам отбора:


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

КонецПроцедуры

Способ 5: Использование расширений (если нельзя менять конфигурацию)

Если в вашей ситуации «форму переопределять нельзя» (например, конфигурация стоит на поддержке), используйте механизм расширений. Создайте расширение и добавьте в него форму нужного журнала. Затем создайте обработчик события &После("ПриСозданииНаСервере").


&После("ПриСозданииНаСервере")
Процедура Расш_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Вызываем логику определения кассы
    ЭтаФорма.КассаККМ = Справочники.КассыККМ.НайтиПоКоду("00001");
    
КонецПроцедуры

Использование расширений — это современный и безопасный способ внесения правок, который не мешает дальнейшему обновлению типовой конфигурации от 1С.

Дополнительные рекомендации

Для повышения удобства работы пользователя и минимизации ошибок стоит обратить внимание на следующие настройки элементов формы:

Таким образом, мы рассмотрели комплексный подход к реализации предопределенного выбора на форме. Комбинируя программную установку значения в ПриСозданииНаСервере с контролем в ПриЗагрузкеДанныхИзНастроекНаСервере, вы добьетесь стабильной работы интерфейса, который будет всегда предлагать пользователю актуальные данные и предотвращать случайные ошибки ввода.

← На главную