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

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

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

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

Причина 1. Неназначенные обработчики событий в свойствах формы (Классика жанра)

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

Когда мы копируем готовые куски кода интеграции БСП, процедуры типа ПриСозданииНаСервере или СписокПриАктивизацииСтроки появляются в тексте модуля, но сама платформа 1С:Предприятие о них не знает, так как связь между событием объекта интерфейса и процедурой модуля не установлена.

Выясним, как правильно проверить и исправить эту связь:

  1. Откроем нужную управляемую форму списка документов в конфигураторе.
  2. В окне элементов формы выберем самый верхний элемент (саму форму) и откроем ее свойства (клавиша F4).
  3. Прокрутим список свойств до раздела «События».
  4. Найдем строку события «При создании на сервере». Если поле пустое, нажмем на кнопку с лупой и выберем уже существующую в модуле процедуру ПриСозданииНаСервере.
  5. Аналогично проверим таблицу динамического списка (обычно элемент Список). Перейдем в его свойства, найдем событие «При активизации строки» и свяжем его с процедурой СписокПриАктивизацииСтроки.

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


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

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

Если эти события не привязаны в конфигураторе, программный код БСП просто не инициализируется при открытии формы, и командные панели остаются в своем первозданном виде.

Причина 2. Отсутствие параметра «СписокФорм» в модуле менеджера

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

Рассмотрим пример правильного заполнения свойств команды печати в модуле менеджера документа:


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

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

Причина 3. Незаполненное свойство «Основная таблица» динамического списка

Эта проблема часто возникает при проектировании кастомных (произвольных) форм списков, где данные выводятся с помощью динамического списка, построенного на основе произвольного запроса.

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

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

Для исправления перейдите на вкладку «Реквизиты» в конструкторе формы, выберите реквизит Список (или ваш кастомный динамический список), откройте его свойства и в поле «Основная таблица» строго укажите ваш документ (например, Документ.КМО_ПлановыеНаправления).

Причина 4. Ручная настройка командной панели и отсутствие подменю

По умолчанию БСП умеет автоматически внедрять группы команд в стандартную командную панель формы списка, если у нее включено свойство «Автозаполнение». Но что делать, если автозаполнение отключено, и командная панель спроектирована вручную?

Если на вашей кастомной командной панели (или в контекстном меню списка) отсутствуют специальные группы-контейнеры, БСП физически не сможет добавить туда кнопки команд. Разберем по шагам, как подготовить форму списка к программному внедрению кнопок при отключенном автозаполнении:

  1. В дереве элементов формы найдите вашу командную панель (или создайте новую группу с видом КоманднаяПанель).
  2. Добавьте внутрь этой панели новые элементы с видом «Группа - Подменю».
  3. Задайте этим группам строгие системные имена, которые ожидает БСП:
    • ПодменюПечать — сюда будут помещены команды печати;
    • ПодменюОтчеты — для команд отчетов;
    • ПодменюСоздатьНаОсновании — для ввода документов на основании;
    • ПодменюЗаполнить — для команд заполнения табличных частей.
  4. В свойствах этих групп установите свойство «Отображение» в значение Картинка и текст или Авто.

Если БСП обнаружит на форме элементы с такими именами, она автоматически наполнит их актуальными командами при создании формы на сервере.

Причина 5. Кэширование данных и справочник «Идентификаторы объектов метаданных»

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

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

Решить эту проблему можно несколькими способами:

Причина 6. Особенности использования расширений и аннотации методов

При внедрении логики через расширения важно правильно выбрать способ переопределения стандартных процедур БСП. Автор темы использовал аннотацию &Перед для переопределения общего модуля:


&Перед("ОпределитьОбъектыСКомандамиПечати")
Процедура Расш1_ОпределитьОбъектыСКомандамиПечати(СписокОбъектов)
    СписокОбъектов.Добавить(Документы.КМО_ПлановыеНаправления);
КонецПроцедуры

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

Причина 7. Настройка свойства поля «Ссылка» в динамическом списке

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

Убедитесь, что у вас выполнена следующая настройка:

  1. Откройте форму списка в конфигураторе.
  2. Найдите реквизит формы Список (типа ДинамическийСписок).
  3. Раскройте его структуру и найдите поле «Ссылка».
  4. Откройте свойства этого поля и обязательно установите флаг «Использовать всегда».

Без этой настройки при оптимизации передачи данных между сервером и клиентом платформа может не передавать значение ссылки для невыводимых на экран колонок, что приведет к скрытию команд печати, завязанных на анализ типа данных текущей строки.

Резюме

Если на форме списка документов в 1С пропали подключаемые команды, последовательно проверьте эти четыре ключевые точки контроля:

  1. Свойства формы — назначены ли обработчики ПриСозданииНаСервере в свойствах самой формы и СписокПриАктивизацииСтроки в свойствах таблицы?
  2. Динамический список — указана ли в его свойствах Основная таблица и включен ли флаг Использовать всегда для поля Ссылка?
  3. Модуль менеджера — прописано ли свойство СписокФорм у создаваемых команд печати?
  4. Командная панель — есть ли на ней группы с именами ПодменюПечать и ПодменюОтчеты при ручном заполнении панели?

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

← На главную