При разработке и внедрении дополнительных инструментов в 1С часто возникает задача ограничить использование тех или иных внешних печатных форм (ВПФ) в зависимости от контекста. Например, когда в организации используется несколько типов складов (с НДС и без НДС), и для каждого из них предусмотрен свой набор сопроводительных документов. В этой статье мы разберем, как реализовать механизм скрытия или ограничения запуска внешней печатной формы в конфигурации «Управление торговлей», редакция 11.4.
Стандартный механизм Библиотеки стандартных подсистем (БСП), который отвечает за работу дополнительных отчетов и обработок, позволяет регистрировать ВПФ для определенных типов документов. Однако на уровне настроек в режиме «1С:Предприятие» нельзя задать условие видимости кнопки печати, опираясь на значения реквизитов объекта (например, на конкретный Склад или Организацию). Кнопка либо отображается для всех документов данного типа, либо отключена полностью.
Для решения задачи мы рассмотрим три основных подхода: от самого простого (прерывание печати с уведомлением) до более сложных и элегантных методов с использованием расширений конфигурации.
Этот метод не скрывает кнопку из меню «Печать», но предотвращает формирование документа, если условия не соблюдены. Это наиболее экономичный с точки зрения трудозатрат вариант, который не требует внесения изменений в основную конфигурацию или создания расширений.
Разберем логику реализации. В модуле объекта внешней печатной формы в процедуре Печать мы можем проанализировать массив передаваемых объектов. Рассмотрим пример кода:
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// Проверяем, соответствует ли склад в документе нашим критериям
Для Каждого СсылкаНаОбъект Из МассивОбъектов Цикл
Если СсылкаНаОбъект.Склад.Наименование = "Склад с НДС" Тогда
ТекстОшибки = "Для склада с НДС данная печатная форма не предусмотрена!";
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки);
Возврат; // Прекращаем выполнение процедуры
КонецЕсли;
КонецЦикла;
// Если проверка пройдена, формируем печатную форму штатно
// ... логика формирования макета ...
КонецПроцедуры
Преимущества: простота реализации, отсутствие необходимости изменять конфигурацию. Недостатки: кнопка остается видимой, что может путать пользователя.
Для того чтобы именно скрыть кнопку из подменю «Печать», нам потребуется вмешаться в процесс формирования команд. В БСП за это отвечает программный интерфейс, который можно перехватить через расширение.
Рассмотрим по шагам, как это сделать:
РеализацияТоваровУслуг) или общий модуль, отвечающий за печать.ДобавитьКомандыПечати или воспользуемся программным интерфейсом в модуле УправлениеПечатьюПереопределяемый.Проанализируем ситуацию на примере модификации коллекции команд. Мы можем программно удалить нашу внешнюю печатную форму из списка, если текущий контекст формы не соответствует условию.
&После("ДобавитьКомандыПечати")
Процедура Расш1_ДобавитьКомандыПечати(КомандыПечати)
// Здесь мы можем найти нашу команду по идентификатору,
// который был задан при регистрации ВПФ
Индекс = 0;
Пока Индекс < КомандыПечати.Количество() Цикл
Команда = КомандыПечати[Индекс];
// Допустим, идентификатор нашей ВПФ - "Торг12ВнешнийВал"
Если Команда.Идентификатор = "Торг12ВнешнийВал" Тогда
// Проверяем условие (например, через параметры формы или текущий объект)
// Внимание: на этапе формирования команд в списке объектов может быть много.
// Если условие зависит от данных объекта, этот метод лучше использовать в форме.
// Если нужно скрыть безусловно для определенных ролей или настроек:
// КомандыПечати.Удалить(Команда);
// Продолжить;
КонецЕсли;
Индекс = Индекс + 1;
КонецЦикла;
КонецПроцедуры
Это наиболее точный метод для формы документа. Мы можем управлять видимостью элементов формы «на лету» при изменении склада пользователем или при открытии документа. Выясним, как программно найти кнопку, созданную механизмом БСП.
В управляемых формах УТ 11.4 кнопки печати обычно группируются в подменю. Нам нужно через расширение формы (процедура ПриЧтенииНаСервере или ПриСозданииНаСервере) найти нужную кнопку и установить ей свойство Видимость.
&НаСервере
Процедура Расш1_УправлениеВидимостьюПечати()
// Определяем условие
НужныйСклад = (Объект.Склад = Справочники.Склады.НайтиПоНаименованию("Склад Без НДС"));
// Имя команды внешней печатной формы обычно формируется как
// "ДополнительнаяПечатнаяФорма_ИдентификаторВПФ_ИмяДокумента"
ИмяКнопки = "ПодменюПечатьДополнительныеКоманды_ДополнительнаяПечатнаяФорма_Торг12ВнешнийВал_РеализацияТоваровУслуг";
ЭлементКнопка = Элементы.Найти(ИмяКнопки);
Если ЭлементКнопка <> Неопределено Тогда
ЭлементКнопка.Видимость = НужныйСклад;
КонецЕсли;
КонецПроцедуры
Не забудьте вызвать эту процедуру также в обработчике ПриИзменении реквизита Склад, чтобы кнопка появлялась или исчезала мгновенно без переоткрытия формы.
При создании функции СведенияОВнешнейОбработке важно правильно заполнить таблицу команд. Вспомним стандартный шаблон, который упоминался в обсуждении на форуме:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Документ.РеализацияТоваровУслуг");
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
ПараметрыРегистрации.Вставить("Наименование", "Торг-12 (внешняя с условием)");
ПараметрыРегистрации.Вставить("Версия", "1.1");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд, "Торг-12 (внешняя)", "Торг12Вал", "ВызовСерверногоМетода", Истина, "ПечатьMXL");
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Использование параметра Модификатор (в примере выше это "ПечатьMXL") позволяет системе понять, как именно выводить форму, но само по себе не управляет видимостью. Однако вы можете использовать Модификатор как метку для поиска вашей команды в коде расширения, описанном в предыдущем способе.
Проанализировав ситуацию, можно сделать следующие выводы:
ОбщегоНазначенияКлиентСервер.СообщитьПользователю. Это гарантирует, что документ не будет распечатан ошибочно.Помните, что архитектура БСП постоянно развивается, и в будущих версиях 1С:УТ могут появиться более гибкие штатные механизмы фильтрации команд печати, но на данный момент описанные методы являются наиболее надежными и проверенными на практике решениями.