Почему не отображаются подключаемые команды в форме списка документа в 1С

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

При разработке собственных документов в типовых конфигурациях (таких как «1С:Управление торговлей 11», «1С:ERP» или «1С:Комплексная автоматизация») разработчики часто сталкиваются с ситуацией, когда подключаемые команды БСП (печать, ввод на основании, контекстные отчеты) отлично функционируют в форме документа, но наотрез отказываются появляться в форме списка. Разберем по шагам, почему возникает эта проблема, как ее быстро диагностировать и правильно настроить командные панели и программный код формы.

Анализ основной причины: расположение групп подменю на форме

Самая распространенная ошибка заключается в том, куда именно разработчик помещает группы подменю для подключаемых команд в дереве элементов формы. По умолчанию подсистема «Подключаемые команды» Библиотеки Стандартных Подсистем ищет стандартные группы (например, ПодменюПечать, ПодменюЗаполнить, ПодменюОтчеты) в главной командной панели формы (Элементы.ФормаКоманднаяПанель).

Если вы создаете форму списка и помещаете группы подменю внутрь командной панели таблицы динамического списка (например, Элементы.СписокКоманднаяПанель), подсистема БСП при стандартном вызове не сможет их обнаружить и, соответственно, не заполнит командами.

Для устранения этой проблемы рассмотрим два возможных решения:

  1. Перенос групп подменю в командную панель формы. Переместите созданные группы команд из командной панели таблицы динамического списка на уровень командной панели самой формы. Это наиболее простой способ, гарантирующий автоматическую инициализацию стандартными механизмами.
  2. Явная передача панели в параметры подключения. Если вам необходимо оставить кнопки именно в командной панели таблицы, следует явно указать эту панель подсистеме БСП при вызове процедуры инициализации в модуле формы.

Посмотрим, как выглядит инициализация команд с явным указанием целевой командной панели в процедуре ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	// Получаем структуру параметров подключаемых команд
	ПараметрыПодключаемыхКоманд = ПодключаемыеКоманды.ПараметрыПодключаемыхКоманд();
	
	// Явно указываем командную панель динамического списка
	ПараметрыПодключаемыхКоманд.КоманднаяПанель = Элементы.СписокКоманднаяПанель;
	
	// Инициализируем подсистему с передачей параметров
	ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект, ПараметрыПодключаемыхКоманд);
	
КонецПроцедуры

Проверка обработчиков событий формы

Выясним следующую причину, из-за которой команды могут не обновляться или не срабатывать при выборе строк в списке. Подключаемые команды динамически изменяют свою доступность и состав в зависимости от того, какой именно объект сейчас выделен в таблице. За это отвечает обработчик события ПриАктивизацииСтроки динамического списка.

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

  1. Событие формы ПриСозданииНаСервере должно быть связано с процедурой в свойствах формы, а внутри должен присутствовать вызов ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);.
  2. У таблицы динамического списка (элемент Список) обязательно должно быть назначено событие ПриАктивизацииСтроки, вызывающее клиентский метод обновления команд.
  3. Должна быть реализована клиентская процедура выполнения команды.

Разберем пример стандартного клиентского кода для формы списка:


&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
	
	// Обновляем доступность команд при переключении между строками
	ПодключаемыеКомандыКлиент.ПриАктивизацииСтроки(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
	
	// Выполняем выбранную подключаемую команду
	ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Элементы.Список);
	
КонецПроцедуры

Требования к динамическому списку и реквизиту «Ссылка»

Подсистема подключаемых команд извлекает идентификаторы выбранных объектов непосредственно из данных текущей строки таблицы. Поэтому критически важно проверить настройки динамического списка:

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

Регистрация документа в переопределяемых модулях

Рассмотрим серверную сторону регистрации объекта. Для того чтобы команды БСП стали доступны для документа, его необходимо зарегистрировать в соответствующих общих модулях конфигурации:

  1. Команды печати. В общем модуле УправлениеПечатьюПереопределенный в процедуре ПриОпределенииОбъектовСКомандамиПечати необходимо зарегистрировать метаданные документа:

Процедура ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт
	
	СписокОбъектов.Добавить(Документы.НашСамописныйДокумент);
	
КонецПроцедуры
  1. Команды отчетов и ввода на основании. Для контекстных отчетов регистрация выполняется в модуле ОтчетыПереопределенный (или ВариантыОтчетовПереопределенный), а для ввода на основании — в свойствах метаданных на вкладке «Ввод на основании» либо через модуль ВводНаОснованииПереопределенный.

Фильтрация по типам форм в модуле менеджера

Перейдем в модуль менеджера самого документа к экспортной процедуре ДобавитьКомандыПечати. При формировании команд печати часто используется параметр ФормыИнтерфейса. Проверьте условия формирования описания команды:


Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
	
	КомандаПечати = КомандыПечати.Добавить();
	КомандаПечати.Идентификатор = "АктПриемаПередачи";
	КомандаПечати.Представление = НСтр("ru = 'Акт приема-передачи'");
	
	// Если указана только форма документа, в списке команда не появится
	// Обязательно проверяем список форм, где должна выводиться команда:
	КомандаПечати.ФормыИнтерфейса = "ФормаДокумента,ФормаСписка";
	
КонецПроцедуры

Если параметр ФормыИнтерфейса заполнен значением "ФормаДокумента", то в форме списка эта печатная форма отображаться не будет.

Актуализация кэша метаданных и БСП

Если все настройки проверены, но команды по-прежнему не выводятся, выясним состояние кэша подсистем. БСП хранит состав команд и объектов во внутренних служебных регистрах сведений. При добавлении нового объекта метаданных или изменении состава процедур в модуле менеджера кэш может не обновиться автоматически в режиме предприятия.

Для принудительного обновления выполните следующие шаги:

  1. Запустите информационную базу в режиме «1С:Предприятие» с параметром командной строки: /ЗапуститьОбновлениеИнформационнойБазы.
  2. Или выполните программное обновление идентификаторов метаданных через внешнюю обработку:

Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанные();

После применения этих рекомендаций подключаемые команды гарантированно займут свое место в командной панели формы списка.

← На главную