При доработке типовых конфигураций на обычных формах (например, «Управление торговлей 10.3» или «Управление производственным предприятием») разработчики часто сталкиваются с ситуацией, когда добавленная в командную панель табличной части кнопка остается неактивной (серой). При этом отладчик рапортует, что свойство кнопки Доступность установлено в значение Истина, однако нажать ее нельзя до тех пор, пока документ не будет записан, закрыт и открыт заново. Разберем, почему так происходит и как сделать кнопку рабочей сразу при начале ввода данных в табличную часть.
Проанализируем механику работы командных панелей в платформе 1С:Предприятие. Поведение кнопки напрямую зависит от ее типа и содержимого:
Кнопки отсутствуют дочерние элементы либо у всех вложенных элементов свойство Видимость или Доступность равно Ложь. Даже если у самого родительского подменю указано Доступность = Истина, интерфейсно кнопка останется заблокированной.Если ЭтоНовый() Тогда Возврат; КонецЕсли; или проверяют Ссылка.Пустая(). Из-за этого генерация списка команд попросту прерывается, пока документ физически не записан в базу.Рассмотрим минимальный сценарий: нам нужно, чтобы кнопка активировалась сразу после нажатия кнопки «Записать», без необходимости закрывать форму и открывать ее заново.
Для этого найдем или назначим обработчик события формы ПослеЗаписи. В этот момент транзакция записи уже завершена, признак ЭтоНовый() равен Ложь, а объект получил постоянную ссылку в базе данных. Вызовем процедуру формирования подменю:
Процедура ПослеЗаписи(Отказ)
// Обновляем состав динамического подменю командной панели
СформироватьПодменюТабличнойЧасти();
КонецПроцедуры
Такой подход решает проблему повторного открытия формы, однако кнопка все еще останется недоступной в момент начального заполнения строк до первой записи документа.
Разберем основной вариант, когда пользователю требуется доступ к функциям кнопки сразу же, как только в табличную часть добавляются строки. Для реализации этой задачи выполним несколько шагов:
ГДЕ ДокументТабличнаяЧасть.Ссылка = &Ссылка, заменим их на перебор строк оперативной коллекции ЭтотОбъект.Товары (или соответствующей табличной части документа). В оперативной памяти строки доступны сразу после добавления пользователем.ЭтоНовый(), если для выполнения вложенных действий наличие ссылки в базе не является строго обязательным.ПриОкончанииРедактирования, ПослеУдаления или ПриИзменении.Посмотрим на пример организации вызовов в модуле формы документа:
Процедура ТоварыПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
Если Не ОтменаРедактирования Тогда
// Переформировываем состав подменю при добавлении или изменении строки
СформироватьПодменюТабличнойЧасти();
КонецЕсли;
КонецПроцедуры
Процедура ТоварыПослеУдаления(Элемент)
// Актуализируем состав команд, если строки были удалены
СформироватьПодменюТабличнойЧасти();
КонецПроцедуры
Если доступность команд внутри подменю зависит от того, какая конкретно строка сейчас выбрана пользователем, используем событие ПриАктивизацииСтроки табличного поля:
Процедура ТоварыПриАктивизацииСтроки(Элемент)
// Обновляем доступность действий подменю для текущей строки
СформироватьПодменюТабличнойЧасти();
КонецПроцедуры
Иногда команды внутри подменю выполняют сложные операции (например, проведение, печать сопутствующих бланков или открытие подчиненных регистров), для которых физическое наличие ссылки в информационной базе критично. В этом случае не нужно блокировать само подменю. Оставим кнопку доступной для нажатия, а проверку перенесем непосредственно в обработчик выполнения команды:
Процедура ДействиеПодменюВыполнить()
// Проверяем, записан ли документ
Если Модифицированность ИЛИ ЭтоНовый() Тогда
Предупреждение("Для выполнения данной операции документ необходимо записать!");
Возврат;
КонецЕсли;
// Логика обработки команды
ВыполнитьДействие();
КонецПроцедуры
Также можно автоматически вызывать метод ЭтотОбъект.Записать() перед выполнением целевой операции, предварительно запросив подтверждение у пользователя.
Если после настройки программного заполнения кнопка все равно остается неактивной, проанализируем следующие свойства элементов интерфейса:
ИзменяетДанные = Истина, платформа автоматически блокирует ее, если форма открыта только для просмотра или у текущего пользователя недостаточно прав на редактирование данного объекта.ИсточникДействий указано табличное поле, стандартные кнопки будут жестко привязаны к текущему состоянию фокуса и строк этого поля. Для нестандартных динамических меню предпочтительнее создавать отдельные пользовательские кнопки, не завязанные на автоматическое управление источником действий.