Почему кнопка в командной панели табличной части недоступна до записи документа и как это исправить?

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

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

Выясняем причину: особенности кнопок с типом «Подменю»

Проанализируем механику работы командных панелей в платформе 1С:Предприятие. Поведение кнопки напрямую зависит от ее типа и содержимого:

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

Решение 1. Обновление подменю сразу после записи документа

Рассмотрим минимальный сценарий: нам нужно, чтобы кнопка активировалась сразу после нажатия кнопки «Записать», без необходимости закрывать форму и открывать ее заново.

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


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

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

Решение 2. Активация кнопки при вводе данных до записи документа

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

  1. Перевод алгоритма на работу с данными в памяти. Проанализируем код процедуры, заполняющей подменю. Если в ней используются запросы через конструкцию ГДЕ ДокументТабличнаяЧасть.Ссылка = &Ссылка, заменим их на перебор строк оперативной коллекции ЭтотОбъект.Товары (или соответствующей табличной части документа). В оперативной памяти строки доступны сразу после добавления пользователем.
  2. Удаление ограничений на новый документ. Уберем из кода генерации подменю жесткие проверки на ЭтоНовый(), если для выполнения вложенных действий наличие ссылки в базе не является строго обязательным.
  3. Подключение обработчиков табличного поля. Чтобы состав подменю актуализировался динамически, вызовем процедуру заполнения в событиях табличного поля, отвечающих за изменение данных: ПриОкончанииРедактирования, ПослеУдаления или ПриИзменении.

Посмотрим на пример организации вызовов в модуле формы документа:


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

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

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

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

Если доступность команд внутри подменю зависит от того, какая конкретно строка сейчас выбрана пользователем, используем событие ПриАктивизацииСтроки табличного поля:


Процедура ТоварыПриАктивизацииСтроки(Элемент)
    
    // Обновляем доступность действий подменю для текущей строки
    СформироватьПодменюТабличнойЧасти();

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

Решение 3. Обработка действий, требующих обязательной ссылки

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


Процедура ДействиеПодменюВыполнить()
    
    // Проверяем, записан ли документ
    Если Модифицированность ИЛИ ЭтоНовый() Тогда
        Предупреждение("Для выполнения данной операции документ необходимо записать!");
        Возврат;
    КонецЕсли;
    
    // Логика обработки команды
    ВыполнитьДействие();

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

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

Дополнительные свойства командной панели и кнопок

Если после настройки программного заполнения кнопка все равно остается неактивной, проанализируем следующие свойства элементов интерфейса:

  1. Свойство кнопки «ИзменяетДанные». Если у кнопки включен флаг ИзменяетДанные = Истина, платформа автоматически блокирует ее, если форма открыта только для просмотра или у текущего пользователя недостаточно прав на редактирование данного объекта.
  2. Свойство «ИсточникДействий». Если у командной панели в свойстве ИсточникДействий указано табличное поле, стандартные кнопки будут жестко привязаны к текущему состоянию фокуса и строк этого поля. Для нестандартных динамических меню предпочтительнее создавать отдельные пользовательские кнопки, не завязанные на автоматическое управление источником действий.
← На главную