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