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

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

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

Постановка задачи и анализ ситуации

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

Рассмотрим пошагово, как реализовать эту логику через механизм параметров.

Шаг 1. Передача параметра из вызывающей формы

Для начала проанализируем, как происходит вызов формы выбора. Вместо стандартного нажатия, которое система обрабатывает автоматически, нам нужно перехватить событие НачалоВыбора у соответствующего поля ввода в документе. Мы создадим структуру параметров и передадим в нее наше условие.

Разберем пример кода в модуле формы документа:


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

Здесь важно использовать метод ОткрытьФорму, передавая в него структуру. Обратите внимание, что мы передаем не весь объект или структуру ДанныеФормыСтруктура, а конкретное булево значение, чтобы упростить обработку на стороне сервера.

Шаг 2. Обработка параметров в форме выбора

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

Проанализируем следующий код:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем наличие нашего пользовательского параметра в структуре "Параметры"
    Если Параметры.Свойство("ЗаблокироватьСоздание") Тогда
        
        Если Параметры.ЗаблокироватьСоздание Тогда
            
            // Способ 1: Использование стандартного свойства ТолькоПросмотр
            // Это отключит возможность создания, изменения и копирования записей
            ЭтаФорма.ТолькоПросмотр = Истина;
            
            // Способ 2: Точечное скрытие кнопок в командной панели
            // Если кнопка "Создать" входит в стандартный набор команд динамического списка
            Элементы.Список.СоставКоманд.Создать.Видимость = Ложь;
            Элементы.Список.СоставКоманд.Скопировать.Видимость = Ложь;
            
            // Если кнопка добавлена вручную в командную панель формы
            Если Элементы.Найти("ФормаСоздать") <> Неопределено Тогда
                Элементы.ФормаСоздать.Видимость = Ложь;
            КонецЕсли;
            
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

Важный нюанс: использование свойства ТолькоПросмотр = Истина для всей формы — это самый надежный и быстрый способ. Платформа автоматически скроет все редактирующие команды из командных панелей и контекстных меню, связанных с основным динамическим списком. Для интерактивной проверки и отладки свойств элементов открытых окон подойдёт обработка для редактирования свойств форм в режиме предприятия.

Шаг 3. Использование механизма «Связи параметров выбора»

Существует более «декларативный» способ решения задачи без написания кода в событии НачалоВыбора. Рассмотрим его как альтернативу. В метаданных реквизита документа (в палитре свойств) есть поле Связи параметров выбора.

  1. Откройте свойства реквизита ТЧ документа, в котором выбирается единица измерения.
  2. Найдите пункт Связи параметров выбора.
  3. Добавьте новую связь: выберите реквизит текущей строки (например, ту самую колонку «Режим») и укажите имя параметра, которое будет передано в форму (например, Отбор.РежимРаботы).

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

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

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

Рекомендации по реализации в ERP

Поскольку 1С:ERP активно использует расширения, рекомендуется не изменять типовые формы напрямую. Посмотрим, как это сделать правильно:

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


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

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

← На главную