Почему не печатается печатная форма из формы списка нетипового документа в БП 3.0 и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При разработке нетиповых конфигураций или добавлении новых объектов в типовые решения на базе 1С:Бухгалтерия Предприятия 3.0 (БП 3.0) разработчики часто сталкиваются с ситуацией, когда печатная форма (ПФ) отлично работает внутри самого документа, но наотрез отказывается появляться и функционировать в форме списка. На первый взгляд кажется, что достаточно прописать вызовы БСП (Библиотеки стандартных подсистем) в процедуре ПриСозданииНаСервере, однако кнопка «Печать» в командной панели списка так и не появляется.

В этой статье мы подробно разберем, как устроен механизм подключаемых команд печати БСП, выясним причину такого поведения платформы и реализуем пошаговое решение проблемы, чтобы ваши пользователи могли без проблем печатать документы прямо из динамического списка.

В чем причина проблемы?

Для того чтобы подсистема печати БСП смогла вывести команды на форму, ей требуется не только программная инициализация, но и строго определенная визуальная структура самой управляемой формы. В отличие от стандартных команд платформы, подключаемые команды БСП внедряются в интерфейс динамически. Если на форме отсутствует специальный контейнер (группа элементов) с определенным именем, подсистеме БСП просто «некуда» поместить создаваемые кнопки, и они игнорируются при генерации интерфейса.

Давайте пошагово исправим эту ситуацию и настроим форму списка нашего нетипового документа для полноценной работы с печатными формами.

Шаг 1. Настройка визуального интерфейса формы списка

Первым делом нам необходимо создать контейнер для размещения команд печати. Выполним следующие действия в конфигураторе:

  1. Откроем управляемую форму списка нашего нетипового документа.
  2. В дереве элементов формы найдем командную панель (обычно она называется АвтоматическаяКоманднаяПанель или является отдельным элементом типа КоманднаяПанель).
  3. Добавим в командную панель новую группу элементов. Для этого нажмем правой кнопкой мыши по панели и выберем Добавить -> Группа.
  4. В свойствах созданной группы установим вид группы как Подменю.
  5. Критически важный момент: укажем имя этой группы строго как ПодменюПечать. Если имя будет отличаться хотя бы на один символ, БСП не сможет обнаружить эту группу.
  6. Зададим понятный заголовок для группы, например, «Печать», и выберем стандартную картинку печати для наглядности.

Если в вашем документе предполагается большое количество печатных форм, вы можете дополнительно структурировать их вывод. Для этого внутри группы ПодменюПечать можно создать подчиненные группы со следующими предопределенными именами:

Шаг 2. Программный код в модуле управляемой формы списка

Одного визуального размещения группы ПодменюПечать недостаточно. Нам необходимо связать интерактивные действия пользователя (нажатие на кнопки печати) с серверным кодом БСП, который отвечает за формирование табличных документов. Для этого полностью обновим код в модуле формы списка, добавив туда предопределенные обработчики:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // СтандартныеПодсистемы.ПодключаемыеКоманды
    ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
    // Конец СтандартныеПодсистемы.ПодключаемыеКоманды
    
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    
    // СтандартныеПодсистемы.ПодключаемыеКоманды
    ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
    // Конец СтандартныеПодсистемы.ПодключаемыеКоманды
    
КонецПроцедуры

// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
    
    // Передаем Элементы.Список, чтобы система знала, какие именно строки выделены пользователем
    ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманд(ЭтотОбъект, Команда, Элементы.Список);
    
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
    
    ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
    
КонецПроцедуры

&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
    
    ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Элементы.Список);
    
КонецПроцедуры

Обратите внимание на параметр Элементы.Список в вызовах процедур. Динамический список передает в подсистему БСП массив выделенных строк (ссылок на документы). Это позволяет пользователям отправлять на печать сразу несколько документов одновременно, просто выделив их в списке зажатыми клавишами Ctrl или Shift.

Шаг 3. Настройка параметров команды в модуле менеджера

Перейдем в модуль менеджера нашего нетипового документа. Здесь должна быть объявлена процедура ДобавитьКомандыПечати(КомандыПечати). Нам нужно убедиться, что свойство команды СписокФорм заполнено правильно.

Рассмотрим пример настройки команды печати:


Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
    
    КомандаПечати = КомандыПечати.Добавить();
    КомандаПечати.Идентификатор = "РеализацияТоваров";
    КомандаПечати.Представление = НСтр("ru = 'Накладная на реализацию'");
    КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
    
    // Важнейшая настройка для видимости команды!
    // Если указать только "ФормаДокумента", в списке кнопка не появится.
    // Если оставить свойство пустым, команда будет доступна во всех формах по умолчанию.
    // Если нужно задать явно, перечисляем формы через запятую:
    КомандаПечати.СписокФорм = "ФормаДокумента,ФормаСписка";
    
КонецПроцедуры

Проверьте этот фрагмент кода в вашем документе. Частой ошибкой является жесткое ограничение видимости команды только значением "ФормаДокумента".

Шаг 4. Регистрация документа в глобальных модулях БСП

Для того чтобы подсистема печати БСП вообще знала о существовании нашего нетипового документа и вызывала в нем процедуру ДобавитьКомандыПечати, необходимо зарегистрировать его в общих переопределяемых модулях системы.

Выполним следующие шаги:

  1. Найдем в конфигураторе общий модуль УправлениеПечатьюПереопределяемый.
  2. Перейдем в процедуру ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов).
  3. Добавим наш документ в список обслуживаемых объектов:

Процедура ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт
    
    // Добавление вашего нетипового документа в общий пул БСП
    СписокОбъектов.Добавить(Документы.ИмяВашегоНетиповогоДокумента);
    
КонецПроцедуры

В актуальных версиях БСП также может потребоваться регистрация в модуле ПодключаемыеКомандыПереопределяемый в функции УниверсальнаяСтруктураОписанияОбъектовПодключаемыхКоманд, где имя вашего документа нужно поместить в массив ИменаДокументов.

Шаг 5. Особенности реализации пакетной печати

Поскольку мы настраиваем печать из формы списка, крайне важно адаптировать процедуру печати в модуле менеджера для обработки массива документов. Если пользователь выделит три строки в списке и нажмет «Печать», в качестве первого параметра процедуры Печать придет массив из трех ссылок.

Проанализируем правильную структуру обработки коллекций документов:


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

Использование метода УправлениеПечатью.ЗадатьОбластьПечатиДокумента гарантирует, что платформа корректно распределит документы при отправке на принтер, позволит пользователю гибко настраивать количество копий для каждого отдельного документа в пакете и предотвратит хаотичное "склеивание" страниц разных документов.

Выполнив все описанные шаги, мы получим полностью рабочую, отказоустойчивую и соответствующую стандартам БСП печать документов напрямую из динамического списка формы нетипового документа.

← На главную