При разработке нетиповых конфигураций или добавлении новых объектов в типовые решения на базе 1С:Бухгалтерия Предприятия 3.0 (БП 3.0) разработчики часто сталкиваются с ситуацией, когда печатная форма (ПФ) отлично работает внутри самого документа, но наотрез отказывается появляться и функционировать в форме списка. На первый взгляд кажется, что достаточно прописать вызовы БСП (Библиотеки стандартных подсистем) в процедуре ПриСозданииНаСервере, однако кнопка «Печать» в командной панели списка так и не появляется.
В этой статье мы подробно разберем, как устроен механизм подключаемых команд печати БСП, выясним причину такого поведения платформы и реализуем пошаговое решение проблемы, чтобы ваши пользователи могли без проблем печатать документы прямо из динамического списка.
Для того чтобы подсистема печати БСП смогла вывести команды на форму, ей требуется не только программная инициализация, но и строго определенная визуальная структура самой управляемой формы. В отличие от стандартных команд платформы, подключаемые команды БСП внедряются в интерфейс динамически. Если на форме отсутствует специальный контейнер (группа элементов) с определенным именем, подсистеме БСП просто «некуда» поместить создаваемые кнопки, и они игнорируются при генерации интерфейса.
Давайте пошагово исправим эту ситуацию и настроим форму списка нашего нетипового документа для полноценной работы с печатными формами.
Первым делом нам необходимо создать контейнер для размещения команд печати. Выполним следующие действия в конфигураторе:
АвтоматическаяКоманднаяПанель или является отдельным элементом типа КоманднаяПанель).ПодменюПечать. Если имя будет отличаться хотя бы на один символ, БСП не сможет обнаружить эту группу.Если в вашем документе предполагается большое количество печатных форм, вы можете дополнительно структурировать их вывод. Для этого внутри группы ПодменюПечать можно создать подчиненные группы со следующими предопределенными именами:
ПодменюПечатьВажное — для вывода наиболее часто используемых печатных форм (они будут отображаться в самом верху списка);ПодменюПечатьОбычное — для стандартных печатных форм;ПодменюПечатьСмТакже — для сопутствующих или редко используемых отчетов и форм.Одного визуального размещения группы ПодменюПечать недостаточно. Нам необходимо связать интерактивные действия пользователя (нажатие на кнопки печати) с серверным кодом БСП, который отвечает за формирование табличных документов. Для этого полностью обновим код в модуле формы списка, добавив туда предопределенные обработчики:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// СтандартныеПодсистемы.ПодключаемыеКоманды
ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// СтандартныеПодсистемы.ПодключаемыеКоманды
ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
КонецПроцедуры
// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
// Передаем Элементы.Список, чтобы система знала, какие именно строки выделены пользователем
ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманд(ЭтотОбъект, Команда, Элементы.Список);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры
&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Элементы.Список);
КонецПроцедуры
Обратите внимание на параметр Элементы.Список в вызовах процедур. Динамический список передает в подсистему БСП массив выделенных строк (ссылок на документы). Это позволяет пользователям отправлять на печать сразу несколько документов одновременно, просто выделив их в списке зажатыми клавишами Ctrl или Shift.
Перейдем в модуль менеджера нашего нетипового документа. Здесь должна быть объявлена процедура ДобавитьКомандыПечати(КомандыПечати). Нам нужно убедиться, что свойство команды СписокФорм заполнено правильно.
Рассмотрим пример настройки команды печати:
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "РеализацияТоваров";
КомандаПечати.Представление = НСтр("ru = 'Накладная на реализацию'");
КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
// Важнейшая настройка для видимости команды!
// Если указать только "ФормаДокумента", в списке кнопка не появится.
// Если оставить свойство пустым, команда будет доступна во всех формах по умолчанию.
// Если нужно задать явно, перечисляем формы через запятую:
КомандаПечати.СписокФорм = "ФормаДокумента,ФормаСписка";
КонецПроцедуры
Проверьте этот фрагмент кода в вашем документе. Частой ошибкой является жесткое ограничение видимости команды только значением "ФормаДокумента".
Для того чтобы подсистема печати БСП вообще знала о существовании нашего нетипового документа и вызывала в нем процедуру ДобавитьКомандыПечати, необходимо зарегистрировать его в общих переопределяемых модулях системы.
Выполним следующие шаги:
УправлениеПечатьюПереопределяемый.ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов).
Процедура ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт
// Добавление вашего нетипового документа в общий пул БСП
СписокОбъектов.Добавить(Документы.ИмяВашегоНетиповогоДокумента);
КонецПроцедуры
В актуальных версиях БСП также может потребоваться регистрация в модуле ПодключаемыеКомандыПереопределяемый в функции УниверсальнаяСтруктураОписанияОбъектовПодключаемыхКоманд, где имя вашего документа нужно поместить в массив ИменаДокументов.
Поскольку мы настраиваем печать из формы списка, крайне важно адаптировать процедуру печати в модуле менеджера для обработки массива документов. Если пользователь выделит три строки в списке и нажмет «Печать», в качестве первого параметра процедуры Печать придет массив из трех ссылок.
Проанализируем правильную структуру обработки коллекций документов:
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ПараметрыВывода.ДоступнаПечатьПоКолонкам = Истина;
// Проверяем, нужна ли наша печатная форма в текущем вызове
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "РеализацияТоваров") Тогда
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_РеализацияТоваров";
ПервыйДокумент = Истина;
Для Каждого ТекущийДокумент Из МассивОбъектов Цикл
// Если выводится второй и последующие документы, вставляем разделитель страниц
Если Не ПервыйДокумент Тогда
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
ПервыйДокумент = Ложь;
// Запоминаем стартовую строку текущего документа для разбивки по страницам
НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
// Здесь вызывается ваш алгоритм заполнения макета данными текущего документа
ЗаполнитьМакетДаннымиДокумента(ТабличныйДокумент, ТекущийДокумент);
// Регистрируем область выведенного документа в коллекции объектов печати БСП
УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало, ОбъектыПечати, ТекущийДокумент);
КонецЦикла;
// Записываем сформированный табличный документ в коллекцию форм
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "РеализацияТоваров", "Накладная на реализацию", ТабличныйДокумент);
КонецЕсли;
КонецПроцедуры
Использование метода УправлениеПечатью.ЗадатьОбластьПечатиДокумента гарантирует, что платформа корректно распределит документы при отправке на принтер, позволит пользователю гибко настраивать количество копий для каждого отдельного документа в пакете и предотвратит хаотичное "склеивание" страниц разных документов.
Выполнив все описанные шаги, мы получим полностью рабочую, отказоустойчивую и соответствующую стандартам БСП печать документов напрямую из динамического списка формы нетипового документа.