При разработке внешних печатных форм (ВПФ) программисты часто сталкиваются с ситуацией, когда добавленная форма не появляется в основном корневом списке кнопки Печать, а «прячется» глубоко в подменю Дополнительные печатные формы. Для пользователя это лишние клики, а для руководства — повод для недовольства интерфейсом. Разберем подробно, как устроены механизмы БСП (Библиотеки стандартных подсистем) и что нужно сделать, чтобы внешняя форма вела себя как «родная».
Основным «паспортом» любой внешней обработки в 1С является функция СведенияОВнешнейОбработке, расположенная в модуле объекта. Именно она сообщает системе, к каким документам прикрепляется форма и как она должна отображаться. Проанализируем стандартную структуру этой функции на примере, который часто используется в конфигурациях уровня «Управление торговлей» или «CRM».
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
// Определяем, к каким объектам будет привязана печатная форма
МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Документ.РеализацияТоваровУслуг");
МассивНазначений.Добавить("Документ.ЗаказКлиента");
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
ПараметрыРегистрации.Вставить("Наименование", "Счет на оплату (внешний)");
ПараметрыРегистрации.Вставить("Версия", "1.1");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
ПараметрыРегистрации.Вставить("Информация", "Дополнительная печатная форма для документов реализации");
// Создаем таблицу команд
ТаблицаКоманд = ПолучитьТаблицуКоманд();
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = "Счет на оплату (внешний)";
НоваяКоманда.Идентификатор = "ПФ_MXL_СчетНаОплату";
НоваяКоманда.Использование = "ВызовСерверногоМетода";
НоваяКоманда.ПоказыватьОповещение = Истина;
// Важный параметр для позиционирования
НоваяКоманда.Модификатор = "ПечатьMXL";
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
Рассмотрим подробнее ключевые поля. Поле Вид со значением ПечатнаяФорма указывает системе, что данная обработка должна попасть в подсистему печати. Поле Назначение определяет список документов. Но самое интересное происходит в колонке Модификатор. В современных версиях БСП использование значения ПечатьMXL помогает системе понять, что это стандартный табличный документ, который можно выводить в общем списке.
Выясним причину, по которой даже при правильном коде форма может группироваться. В некоторых конфигурациях (особенно старых редакциях УТ 11, CRM 2.0 или решениях от «Рарус») разработчики сознательно разделяют типовые и внешние формы. Система проверяет наличие команд в модуле менеджера объекта. Если команда добавлена через механизм внешних обработок, БСП автоматически помещает её в отдельную ветку, чтобы не перегружать основной интерфейс.
Чтобы обойти это ограничение, проанализируем настройки в пользовательском режиме:
Если вам нужно, чтобы внешняя форма была на виду, можно воспользоваться штатной возможностью замены. Рассмотрим этот вариант подробнее. В справочнике Дополнительные отчеты и обработки для печатных форм предусмотрена колонка (или отдельная таблица в зависимости от версии), которая называется Заменяемые печатные формы.
Если вы укажете там одну из типовых форм документа (например, стандартную форму «Счет на оплату»), то при нажатии кнопки Печать в документе ваша внешняя форма заменит собой стандартную и будет стоять на её месте в основном списке. Это самый простой способ без изменения кода конфигурации добиться желаемого результата для руководства.
Если «хотелки» руководства подразумевают добавление именно новой кнопки рядом с типовыми, и стандартные средства БСП не справляются, проанализируем ситуацию с точки зрения расширений. Это позволит нам внести правки, не снимая конфигурацию с поддержки.
В большинстве современных конфигураций список команд печати формируется в модуле менеджера документа в процедуре ДобавитьКомандыПечати(КомандыПечати). Мы можем перехватить эту процедуру в расширении.
Посмотрим на пример кода в расширении для модуля менеджера документа:
&После("ДобавитьКомандыПечати")
Процедура Расш1_ДобавитьКомандыПечати(КомандыПечати)
// Добавляем свою команду программно
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Менеджер = "ОбщийМодуль.УправлениеПечатью"; // Или ссылка на вашу обработку
КомандаПечати.Идентификатор = "МояВнешняяФорма";
КомандаПечати.Представление = НСтр("ru = 'Моя супер-форма'");
КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
КомандаПечати.Порядок = 1; // Указываем приоритет в списке
КонецПроцедуры
Этот метод гарантированно выведет кнопку в корень меню Печать, так как для системы эта команда станет частью «родного» списка документа. При этом саму логику печати вы можете по-прежнему оставить во внешней обработке, вызывая её метод из расширения.
Иногда после внесения изменений в код СведенияОВнешнейОбработке или перезагрузки обработки в справочник, изменения не видны. Проанализируем причину: 1С сохраняет пользовательские настройки видимости кнопок в регистре сведений Настройки печати объектов.
Чтобы сбросить эти настройки, выполните следующие шаги:
НастройкиПечатиОбъектов.Подведем итог: для вывода формы в основной список в первую очередь используйте модификатор ПечатьMXL в коде. Если это не помогает из-за специфики конфигурации, воспользуйтесь механизмом заменяемых печатных форм в карточке регистрации обработки. В самых сложных случаях используйте расширение для модификации состава команд в модуле менеджера документа.