Почему не выводится второй макет во внешней печатной форме УПД для БП 3.0?

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

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

Разбор архитектуры работы ВПФ в БСП

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

  1. Регистрация: В функции СведенияОВнешнейОбработке мы описываем команды печати. Каждая команда имеет свой Идентификатор.
  2. Выполнение: При нажатии кнопки печати система вызывает процедуру Печать, передавая в неё КоллекцияПечатныхФорм. В этой коллекции содержатся только те макеты, которые соответствуют выбранной пользователем команде.

Выясним причину ошибки в коде автора. Использование функции УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ПФ_MXL_УПД981") возвращает Ложь, если идентификатор "ПФ_MXL_УПД981" не был передан в коллекцию из вызывающей формы. Если в окне выбора печати пользователь нажал на пункт, связанный только с первым идентификатором, то второй в коллекцию просто не попадет.

Решение 1: Правильная регистрация нескольких команд

Первым делом проверим модуль объекта внешней обработки. Чтобы оба макета были доступны системе, они должны быть зарегистрированы как отдельные команды или корректно обрабатываться внутри одной команды. Рассмотрим пример правильного заполнения таблицы команд:


Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение, Модификатор = "")
    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление = Представление;
    НоваяКоманда.Идентификатор = Идентификатор;
    НоваяКоманда.Использование = Использование;
    НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
    НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры

Если мы хотим, чтобы пользователь мог выбирать между двумя вариантами УПД, нужно добавить две строки с разными идентификаторами (например, УПД_Стандарт и УПД_981). Если же мы хотим, чтобы одна кнопка печатала сразу два разных листа, нам придется изменить логику в процедуре Печать.

Решение 2: Обход проверки НужноПечататьМакет

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

Проанализируем пример функции, которая позволяет вывести данные, игнорируя строгую фильтрацию коллекции:


Процедура ВывестиТабличныйДокументВКоллекциюМод(КоллекцияПечатныхФорм, ИмяМакета, СинонимМакета, ТабличныйДокумент) Экспорт
    // Пытаемся найти существующую запись в коллекции
    ОписаниеПечатнойФормы = КоллекцияПечатныхФорм.Найти(ИмяМакета, "ИмяМакета");
    
    // Если не нашли (например, идентификатор не был передан), 
    // можно принудительно использовать первую строку коллекции, если она там одна
    Если ОписаниеПечатнойФормы = Неопределено И КоллекцияПечатныхФорм.Количество() > 0 Тогда
        ОписаниеПечатнойФормы = КоллекцияПечатныхФорм[0];
    КонецЕсли;

    Если ОписаниеПечатнойФормы <> Неопределено Тогда
        ОписаниеПечатнойФормы.ТабличныйДокумент = ТабличныйДокумент;
        ОписаниеПечатнойФормы.СинонимМакета = СинонимМакета;
    КонецЕсли;
КонецПроцедуры

Важный момент: если ваша задача — печатать два макета одновременно при нажатии одной кнопки, то в процедуре Печать следует сначала сформировать один общий ТабличныйДокумент, объединив в нем два макета через ВывестиГоризонтальныйРазделительСтраниц(), и только потом передавать его в коллекцию.

Решение 3: Особенности формирования запроса для УПД (Постановление 981 и 534)

При работе с УПД в БП 3.0 крайне важно учитывать версию законодательства. В коде часто встречается обращение к функции менеджера документа: ТекстЗапросаПечатьУниверсальныхПередаточныхДокументов(Параметр).

Разберем, за что отвечает этот параметр:

Посмотрим на пример формирования данных в функции ТабличныйДокументУПД. Если запрос возвращает пустой результат, код автора выдает ошибку "Для документа УПД не применяется". Выясним, почему это происходит: скорее всего, массив МассивОбъектов пуст после проверки прав или в запросе установлены фильтры, которые не проходят ваши тестовые документы.


// Обязательно проверяйте наличие прав перед формированием данных
УправлениеДоступомБП.УдалитьНедоступныеЭлементыИзМассива(МассивОбъектов);

Если МассивОбъектов.Количество() = 0 Тогда
    Возврат Неопределено;
КонецЕсли;

// Получение данных через типовой менеджер
ДанныеУПД = ПолучитьДанныеДляПечатиУниверсальногоПередаточногоДокумента(МассивОбъектов, ТекстЗапроса);

Рекомендации по отладке ВПФ

Рассмотрим пошагово, как найти «узкое место», если форма все равно не выводится:

  1. Проверка коллекции: Поставьте точку останова в самом начале процедуры Печать. Посмотрите содержимое переменной КоллекцияПечатныхФорм. Какие ИмяМакета там присутствуют? Если там нет вашего второго макета, значит проблема в СведенияОВнешнейОбработке.
  2. Проверка параметров печати: Убедитесь, что структура ПараметрыПечати содержит корректный КлючПараметровПечати. Для разных версий УПД они должны отличаться, чтобы настройки колонок и полей сохранялись отдельно.
  3. Использование Конструктора ВПФ: Если ручное написание кода вызывает сложности, воспользуйтесь типовым «Конструктором печати» или сторонними консолями разработчика. Они автоматически генерируют правильную структуру регистрации, что исключает ошибки именования идентификаторов.

Важно помнить: В БП 3.0 макеты часто хранятся не только в самой обработке, но и подтягиваются из общих макетов конфигурации. Если вы используете ПолучитьМакет("ПФ_MXL_УПД981"), убедитесь, что макет с таким именем действительно создан в дереве объектов вашей внешней обработки и его имя совпадает до символа.

Таким образом, для успешного вывода второго макета необходимо синхронизировать три вещи: идентификатор команды в СведенияОВнешнейОбработке, имя проверяемого макета в НужноПечататьМакет и само имя макета в функции ПолучитьМакет. Если вы добьетесь их полного совпадения и корректного заполнения данными из запроса, проблема с выводом формы будет решена.

← На главную