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