Почему кнопка «Заполнить» становится недоступной на обычных формах 1С и как это исправить

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

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

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

Выясняем причину: связь свойства «ИзменяетДанные» и режима «Только просмотр»

Главная причина, по которой кнопка в командной панели визуально блокируется при значении Доступность = Истина, кроется во встроенной системе защиты данных платформы «1С:Предприятие». Разберем этот механизм по шагам:

  1. У любого интерактивного элемента управления (включая кнопки командной панели) существует свойство ИзменяетДанные (ChangesData).
  2. Кнопки, которые генерируются стандартным механизмом БСП или типовых конфигураций через общий модуль УниверсальныеМеханимы.СформироватьПодменюЗаполненияТЧПоДеревуКнопок, по умолчанию создаются с признаком ИзменяетДанные = Истина. Это логично, ведь назначение кнопки — заполнить табличную часть, то есть изменить данные объекта.
  3. Если у самой формы, у табличной части (источника действий командной панели) или у связанного реквизита установлено свойство ТолькоПросмотр = Истина, платформа автоматически делает недоступными все элементы управления, которые могут изменить эти данные (у которых флаг ИзменяетДанные установлен в значение Истина).
  4. При этом программное свойство Доступность самой кнопки по-прежнему остается равным Истина. Платформа перекрывает его доступность на уровне отображения интерфейса, защищая данные от изменения в режиме просмотра.

Рассмотрим эту логику на примере документа «Установка цен номенклатуры». В типовом решении табличная часть «Товары» заблокирована для редактирования до тех пор, пока пользователь не выберет «Тип цен» в шапке документа. Как только тип цен выбран, срабатывает процедура изменения доступности, которая снимает режим ТолькоПросмотр с табличного поля. В этот же момент кнопки заполнения ТЧ автоматически становятся активными.

Влияние статуса записи документа на доступность кнопок

Вторая распространенная причина — попытка вызвать обработку заполнения табличной части в совершенно новом, еще не записанном в базу данных документе.

Для внешних обработок заполнения табличных частей в справочнике «Дополнительные отчеты и обработки» (или «Внешние обработки» в старых конфигурациях) существует настройка использования. Если для конкретной обработки установлен признак «Использовать только для записанных объектов», то для нового документа со ссылкой ДокументСсылка.ПустаяСсылка() кнопка либо вообще не сформируется, либо будет принудительно заблокирована платформой до момента первой записи документа.

Некорректная регистрация обработчика действия

Третья техническая деталь — правильное объявление действия в коде формы. При инициализации кнопок подменю заполнения мы передаем объект типа Действие, указывая имя процедуры-обработчика в качестве параметра:


мКнопкиЗаполненияТЧ = УниверсальныеМеханизмы.ПолучитьДеревоКнопокЗаполненияТабличныхЧастей(
    Ссылка,
    Новый Действие("НажатиеНаДополнительнуюКнопкуЗаполненияТЧ")
);

Если в модуле формы документа физически отсутствует процедура НажатиеНаДополнительнуюКнопкуЗаполненияТЧ, или если она объявлена без ключевого слова Экспорт, или имеет неверное количество параметров (должен быть ровно один параметр — Кнопка), платформа визуально сделает кнопку недоступной, так как для нее не определен корректный обработчик события нажатия.

Разбираем правильную реализацию на примере кода

Для того чтобы подменю заполнения создавалось корректно и кнопки оставались доступными, нам необходимо правильно связать командную панель, табличную часть и обработчики событий формы. Рассмотрим рабочий шаблон интеграции механизма заполнения в модуль обычной формы документа.

Сначала объявим переменную для хранения дерева кнопок в самом верху модуля формы:

Перем мКнопкиЗаполненияТЧ;

Затем подготовим процедуру инициализации кнопок подменю. Мы связываем табличную часть (например, Товары) с кнопкой подменю в командной панели этой табличной части:


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

Теперь обязательно добавим экспортируемую процедуру, которая будет обрабатывать нажатие на динамические кнопки:


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

Вызов инициализации кнопок необходимо поместить в процедуру ПередОткрытием формы документа:


Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
    
    // Настройка кнопок заполнения ТЧ при открытии формы
    УстановитьКнопкиПодменюЗаполненияТЧ();
    
КонецПроцедуры

Пошаговый чек-лист для исправления проблемы «серой» кнопки

Если вы внедрили код, но кнопка «Заполнить» все равно остается прозрачной и не нажимается, выполните следующие шаги по локализации проблемы:

  1. Проверка режима ТолькоПросмотр: Поставьте точку останова в процедуре ПриОткрытии и проверьте значение свойства ЭлементыФормы.Товары.ТолькоПросмотр. Если оно установлено в значение Истина, выясните, какой алгоритм блокирует табличную часть, и временно отключите его для проверки.
  2. Анализ свойства ИзменяетДанные: Если вам критически важно, чтобы кнопка «Заполнить» работала даже тогда, когда сама табличная часть или документ закрыты для редактирования (например, для информационного заполнения или сервисного расчета), вам потребуется программно отключить контроль изменения данных для этой кнопки. Для этого после формирования подменю найдите созданную кнопку в коллекции и установите ей свойство: ИмяКнопки.ИзменяетДанные = Ложь;
  3. Проверка записи объекта: Попробуйте записать новый документ и посмотрите, станет ли активной кнопка после записи. Если да — значит, в настройках внешней обработки в справочнике установлена блокировка для новых (незаписанных) объектов. Перейдите в настройки обработки в режиме Предприятия и разрешите ее использование для незаписанных документов.
  4. Валидация сигнатуры обработчика: Убедитесь, что процедура НажатиеНаДополнительнуюКнопкуЗаполненияТЧ действительно объявлена в модуле именно той формы, на которой находится табличная часть, и у нее присутствует ключевое слово Экспорт.

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

← На главную