Как в 1С проверить, открывается существующий элемент или создается новый?

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

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

Разберем подробно все варианты проверки для каждого типа форм и выясним тонкости их применения.

Определение нового элемента в управляемых формах (клиент-сервер)

В управляемом интерфейсе форма работает с данными через специальный тип ДанныеФормыСтруктура (основной реквизит Объект), поэтому прямой вызов методов прикладного объекта на клиенте недоступен. Рассмотрим основные способы проверки в управляемых формах.

  1. Проверка через параметры формы (рекомендуемый способ)

    Первоначальную настройку видимости элементов интерфейса оптимально выполнять на этапе инициализации формы в серверном обработчике ПриСозданииНаСервере. Это исключает визуальное мигание элементов при первой отрисовке окна на клиенте. Если форма открывается для существующего элемента, в структуру Параметры.Ключ передается ссылка на объект.

    Посмотрим на пример кода:

    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        
        ЭтоНовыйЭлемент = Параметры.Ключ.Пустая();
        
        // Управляем видимостью элементов формы
        Элементы.ГруппаДополнительныеРеквизиты.Видимость = Не ЭтоНовыйЭлемент;
        
    КонецПроцедуры
    
  2. Проверка через ссылку основного реквизита формы

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

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

    Проанализируем редкую, но важную ситуацию: если объекту перед открытием формы программно была назначена ссылка через метод УстановитьСсылкуНового(), проверка ЗначениеЗаполнено(Объект.Ссылка) вернет Истина, хотя сам элемент в базу еще не записан. Чтобы гарантированно определить статус объекта на сервере, воспользуемся преобразованием данных формы в объект:

    
    &НаСервере
    Функция ПроверитьЭтоНовыйОбъект()
        
        ПрикладнойОбъект = РеквизитФормыВЗначение("Объект");
        Возврат ПрикладнойОбъект.ЭтоНовый();
        
    КонецФункции
    

Важный момент: если после первого интерактивного сохранения нового элемента видимость полей должна измениться (например, открыться доступ к подчиненным табличным частям), необходимо вызвать процедуру обновления интерфейса в обработчиках ПослеЗаписиНаСервере или ПослеЗаписи.

Определение нового элемента в обычных формах (толстый клиент)

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

  1. Использование метода ЭтоНовый() в событиях формы

    В модуле обычной формы вызов метода ЭтоНовый() доступен через контекст ЭтотОбъект либо напрямую. Настройку элементов интерфейса обычно размещают в обработчиках ПередОткрытием или ПриОткрытии.

    Разберем пример кода:

    
    Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
        
        Если ЭтоНовый() Тогда
            ЭлементыФормы.ПолеИсторияИзменений.Видимость = Ложь;
        Иначе
            ЭлементыФормы.ПолеИсторияИзменений.Видимость = Истина;
        КонецЕсли;
        
    КонецПроцедуры
    

Альтернативные проверки и контроль прав доступа

Если скрытие или блокировка элементов связаны не только с фактом создания объекта, но и с бизнес-логикой конфигурации, рассмотрим дополнительные механизмы платформы 1С:

  1. Проверка наличия объекта в базе запросом: в фоновых заданиях или при серверных вычислениях, когда на руках есть только ссылка, проверить факт ее существования в базе можно быстрым запросом к соответствующей таблице или попыткой вызова Ссылка.ПолучитьОбъект().
  2. Проверка прав пользователя: если поле должно быть скрыто для пользователей без прав на редактирование, используем функцию ПравоДоступа("ИнтерактивноеДобавление", Метаданные.Справочники.Номенклатура).
  3. Свойства ТолькоПросмотр и Доступность: вместо полного скрытия полей через свойство Видимость часто удобнее переводить форму или отдельные элементы в режим ТолькоПросмотр = Истина, сохраняя удобство восприятия информации пользователем.
← На главную