Почему перестали работать стандартные кнопки Печать, Сохранить и Отправить по почте во внешней печатной форме

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

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

  1. При нажатии на кнопку Печать документ не отправляется на принтер, хотя через пункт системного меню Файл — Печать всё печатается.
  2. При нажатии Сохранить как система выдает сообщение об успешном сохранении файла, однако в выбранном каталоге файл отсутствует или создается пустым.
  3. При нажатии Отправить по почте формируется письмо с пустым вложением.

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

Причина возникновения проблемы

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

Для этого подсистема вызывает серверную функцию ПечатныеФормыПоОбъектам в общей форме ПечатьДокументов:


&НаСервере
Функция ПечатныеФормыПоОбъектам(ПечатнаяФорма)
    Если ОбъектыПечати.Количество() = 0 Тогда
        Возврат Новый Структура("ОбъектыПечатиНеЗаданы", ПечатнаяФорма);
    КонецЕсли;
    
    Результат = Новый Соответствие;
    Для Каждого ОбъектПечати Из ОбъектыПечати Цикл
        ИмяОбласти = ОбъектПечати.Представление;
        Область = ПечатнаяФорма.Области.Найти(ИмяОбласти);
        Если Область = Неопределено Тогда
            Продолжить;
        КонецЕсли;
        ТабличныйДокумент = ПечатнаяФорма.ПолучитьОбласть(Область.Верх, , Область.Низ);
        ЗаполнитьЗначенияСвойств(ТабличныйДокумент, ПечатнаяФорма, УправлениеПечатью.КопируемыеСвойстваТабличногоДокумента);
        Результат.Вставить(ОбъектПечати.Значение, ТабличныйДокумент);
    КонецЦикла;
    Возврат Результат;
КонецФункции

Посмотрим на логику работы этой функции: она обходит массив ОбъектыПечати и ищет в печатной форме область с именем, равным свойству Представление элемента коллекции ОбъектыПечати.

Частая ошибка разработчиков при написании процедуры Печать заключается в следующем заполнении списка объектов печати:


Для Каждого Стр Из МассивОбъектов Цикл
    ОбъектыПечати.Добавить(Стр, Стр);
КонецЦикла;

В данном случае в качестве второго параметра метода Добавить передается сама ссылка на объект. Платформа преобразует её в строковое представление вида "Проект №001 от 01.01.2024 00:00:00". Так как область с таким именем в табличном документе отсутствует, метод ПечатнаяФорма.Области.Найти(ИмяОбласти) возвращает Неопределено. В результате подсистема формирует пустую коллекцию документов, что и приводит к описанным симптомам.

Способ решения проблемы

Разберем по шагам, как правильно исправить процедуру печати во внешней печатной форме.

Для корректного связывания объектов печати с секциями табличного документа в БСП предусмотрен специальный метод УправлениеПечатью.ЗадатьОбластьПечатиДокумента.

Рассмотрим правильную структуру процедуры Печать в модуле объекта внешней обработки:


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    УстановленыНастройкиПечати = УправлениеПечатью.СформироватьПечатныеФормы(КоллекцияПечатныхФорм);
    
    ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "Макет");
    Если ПечатнаяФорма <> Неопределено Тогда
        
        ТабличныйДокумент = СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати);
        ПечатнаяФорма.ТабличныйДокумент = ТабличныйДокумент;
        
    КонецЕсли;
    
КонецПроцедуры

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

Что делает метод ЗадатьОбластьПечатиДокумента

Метод УправлениеПечатью.ЗадатьОбластьПечатиДокумента автоматически создает именованную область в табличном документе (например, Документ_1), охватывающую строки с НомерСтрокиНачало по текущую высоту таблицы, и добавляет в ОбъектыПечати соответствие между ссылкой на документ и созданной именем области.

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

← На главную