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