При работе с Библиотекой стандартных подсистем (БСП) версии 2.4 и выше программисты часто сталкиваются с ситуацией, когда команда печати прекрасно работает в форме документа, но наотрез отказывается появляться в форме списка. Разберем по шагам, как правильно настроить этот функционал, какие обработчики необходимо добавить в модуль формы и почему иногда кнопка «пропадает» или заменяется странными системными идентификаторами.
Прежде всего, проанализируем, как регистрируется команда печати. В БСП команды описываются в модуле менеджера соответствующего объекта (документа или справочника) в процедуре ДобавитьКомандыПечати. Для того чтобы команда была доступна в списке, необходимо явно указать это в параметрах команды.
Рассмотрим пример кода в модуле менеджера:
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
// Добавление команды печати комплекта документов
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Представление = "Печать комплекта документов";
КомандаПечати.Идентификатор = "КомплектДокументов";
КомандаПечати.ПроверкаПроведенности = Истина;
// Критически важная настройка: указываем формы, где должна появиться кнопка
// Если оставить пустым, БСП попытается определить формы автоматически,
// но явное указание "ФормаСписка" гарантирует регистрацию в подсистеме.
КомандаПечати.СписокФорм = "ФормаДокумента,ФормаСписка";
КонецПроцедуры
Важный нюанс: Если вы столкнулись с тем, что при указании СписокФорм кнопка исчезает из формы документа, убедитесь, что названия форм указаны точно так же, как они называются в конфигураторе. Любая опечатка приведет к тому, что подсистема не найдет соответствия.
Далее перейдем к настройке самой формы списка. В отличие от старых версий БСП, в 2.4 программное создание команд требует обязательного вызова нескольких процедур. Проанализируем стандартный набор обработчиков, которые должны быть в модуле формы.
В обработчике ПриСозданииНаСервере необходимо инициализировать подсистему подключаемых команд:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Инициализация подключаемых команд печати
ПараметрыПодключаемыхКоманд = ПодключаемыеКоманды.Параметры();
ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект, ПараметрыПодключаемыхКоманд);
КонецПроцедуры
Обратите внимание на группу команд на форме. В конфигураторе рекомендуется заранее создать группу (подменю) с именем ПодменюПечать. Если ее не будет, БСП попытается создать ее программно, что на некоторых релизах платформы (например, 8.3.11) может приводить к ошибкам отрисовки и появлению технических имен вроде ПодменюПечатьОбычное_Авто....
Чтобы кнопка печати была активна только тогда, когда в списке выбраны объекты, и чтобы она корректно отрабатывала нажатие, добавим клиентские обработчики. Посмотрим на пример реализации:
&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
// Обновляем состояние команд (доступность) при перемещении по списку
ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
// Вызов основной логики выполнения команды
ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Элементы.Список);
КонецПроцедуры
&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат)
// Серверная часть выполнения команды
ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Элементы.Список, Результат);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
// Принудительное обновление состава команд
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Элементы.Список);
КонецПроцедуры
Проанализируем ситуацию: процедура НачатьОбновлениеКоманд крайне важна для динамических списков. Она проверяет, выделены ли строки, и если список пуст, делает кнопку печати недоступной.
Выясним причину, по которой команды часто не видят контекст. БСП анализирует данные выделенных строк. Если в динамическом списке у поля Ссылка не установлена галочка «Использовать всегда», клиентское приложение может не передать значение ссылки в процедуры БСП. Это приведет к тому, что подсистема «подумает», что объекты не выбраны, и скроет команды печати.
Рассмотрим порядок действий в конфигураторе:
Список).Ссылка.Посмотрим на общую структуру конфигурации. Чтобы ваш документ «увидел» механизмы печати, он должен быть включен в соответствующие определяемые типы БСП. Проверьте следующий момент:
ОбъектСКомандамиПечати.Без этого шага программный код в форме списка просто не будет знать, что для данного объекта нужно искать команды печати в модуле менеджера.
Проанализируем ситуацию, описанную в сообщениях форума, когда вместо нормального меню появлялись странные префиксы. На релизах платформы ниже 8.3.12 (например, 8.3.11.2899) наблюдались баги кэширования управляемых форм. Платформа могла некорректно обрабатывать динамически создаваемые элементы Подменю, путая их идентификаторы. Если ваш код написан верно, но кнопки двоятся или имеют странные имена, первым делом стоит рассмотреть вариант обновления платформы до актуального стабильного релиза.
Подведем итог: Для успешного вывода печати в список нужно совместить три фактора: правильную регистрацию в ДобавитьКомандыПечати (с указанием СписокФорм), наличие всех стандартных обработчиков ПодключаемыеКоманды в форме списка и обязательную установку признака «Использовать всегда» для ссылки в динамическом списке.