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