После обновления конфигурации «Бухгалтерия предприятия» до версии 3.0.143.32 и выше многие разработчики столкнулись с неприятной ситуацией: привычные внешние печатные формы (ВПФ) перестали функционировать. Проблема проявляется двояко: либо при нажатии на кнопку печати вообще ничего не происходит, либо открывается совершенно пустое окно предварительного просмотра без сформированного документа. Давайте вместе разберем причины этого поведения и выясним, как адаптировать ваш код под новые требования Библиотеки стандартных подсистем (БСП).
Первым делом проанализируем ситуацию, которая возникает при использовании типа команды ОткрытиеФормы. В новых редакциях БСП (начиная с версии 3.1.9) существенно изменилась логика работы общей формы ПечатьДокументов. Если раньше система была более «лояльна» к неполному набору параметров и пыталась самостоятельно инициализировать процесс печати, то теперь механизмы стали более жесткими.
Рассмотрим подробнее процедуру ПриСозданииНаСервере в общей форме ПечатьДокументов. В последних релизах туда добавлена проверка наличия данных в параметрах. Если внешняя обработка просто открывает эту форму, не подготовив заранее структуру КоллекцияПечатныхФорм, стандартный код выполняет команду Возврат. Именно поэтому мы видим пустое окно с заголовком: форма открылась, но код формирования табличного документа внутри неё не запустился, так как не нашел входных данных.
Многие разработчики используют ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы, когда перед печатью нужно вывести пользователю окно для уточнения каких-либо параметров. В этом случае вся ответственность за формирование печатной формы ложится на плечи программиста. Выясним, как должен выглядеть правильный алгоритм в модуле формы внешней обработки.
Посмотрим на пример того, как теперь необходимо вызывать общую форму печати из модуля формы вашей обработки. Вместо простого открытия формы, мы должны самостоятельно подготовить параметры:
&НаКлиенте
Процедура ВыполнитьКомандуПечати(Команда)
// 1. Формируем массив объектов, которые будем печатать
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(Объект.СсылкаНаОбъект);
// 2. Подготавливаем параметры для открытия формы печати
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("ИсточникДанных", МассивОбъектов);
ПараметрыОткрытия.Вставить("ПараметрыИсточника", Новый Структура("ИдентификаторКоманды", "АктСверки_Внешняя"));
// 3. Самое важное: формируем коллекцию печатных форм (на сервере)
КоллекцияПечатныхФорм = СформироватьКоллекциюНаСервере(МассивОбъектов);
ПараметрыОткрытия.Вставить("КоллекцияПечатныхФорм", КоллекцияПечатныхФорм);
// 4. Открываем общую форму печати документов
ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия);
КонецПроцедуры
Обратите внимание: если в ПараметрыОткрытия не будет ключа КоллекцияПечатныхФорм, система отработает «вхолостую», и вы получите то самое пустое окно, даже если вы используете стандартные внешние печатные формы для Бухгалтерии 3.0.
Часто ошибки начинаются еще на этапе регистрации обработки. Проанализируем типичный код функции СведенияОВнешнейОбработке. Важно убедиться, что структура регистрации соответствует актуальным требованиям конфигурации. Выясним причину, по которой кнопка может не реагировать на нажатие.
Если при нажатии на кнопку не происходит ровным счетом ничего, это может означать, что кэш регистрации обработок в справочнике «Дополнительные отчеты и обработки» устарел или содержит некорректные идентификаторы. Посмотрим на правильный вариант заполнения структуры регистрации:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("3.1.9.1"); // Указываем актуальную версию БСП
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма;
ПараметрыРегистрации.Назначение.Добавить("Документ.АктСверкиВзаиморасчетов");
ПараметрыРегистрации.Наименование = "Акт сверки (внешняя форма)";
ПараметрыРегистрации.Версия = "1.1";
ПараметрыРегистрации.БезопасныйРежим = Ложь;
// Настройка разрешений (если используем штрихкоды или внешние компоненты)
Разрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнейКомпоненты("ОбщийМакет.КомпонентаПечатиШтрихкодов");
ПараметрыРегистрации.Разрешения.Добавить(Разрешение);
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить;
НоваяКоманда.Представление = "Акт сверки (внешняя)";
НоваяКоманда.Идентификатор = "АктСверки_Внешняя";
// Выбираем тип команды.
// Для прямого вызова печати без форм лучше использовать ВызовСерверногоМетода
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы;
НоваяКоманда.ПоказыватьОповещение = Истина;
Возврат ПараметрыРегистрации;
КонецФункции
Важный совет: После внесения изменений в код функции СведенияОВнешнейОбработке, не забудьте не просто перезаписать файл в справочнике, а полностью удалить старую запись и создать новую. Это принудительно обновит кэш команд в системных таблицах конфигурации.
Если вашей печатной форме не требуется ввод дополнительных данных от пользователя перед печатью, мы рекомендуем использовать тип команды ВызовСерверногоМетода. Это избавляет от необходимости вручную управлять открытием форм и минимизирует риски при обновлениях БСП. Проанализируем, как должна выглядеть экспортная процедура Печать в модуле объекта обработки.
В новых версиях 1С:Бухгалтерии состав параметров этой процедуры строго регламентирован. Пропустив хотя бы один из них, вы рискуете получить ошибку времени выполнения. Разберем правильную структуру:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// Проверяем, нужна ли наша печатная форма в текущем вызове
НужнаяФорма = ДополнительныеОтчетыИОбработкиКлиентСервер.НужнаяПечатнаяФорма(КоллекцияПечатныхФорм, "АктСверки_Внешняя");
Если НужнаяФорма <> Неопределено Тогда
// Указываем макет и способ формирования
НужнаяФорма.ТабличныйДокумент = СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати);
НужнаяФорма.СинонимМакета = "Акт сверки (внешний)";
КонецЕсли;
КонецПроцедуры
Здесь ПараметрыВывода — это структура, которая позволяет управлять процессом после печати (например, изменять имя файла при сохранении или указывать количество копий). Использование этого стандартного механизма гарантирует, что ваша форма будет корректно подхвачена системным окном печати документов.
Разберем еще один критический момент. Начиная с последних релизов, контроль безопасности в 1С стал еще строже. Если ваша печатная форма использует внешние компоненты (например, для печати штрихкодов QR-кодов), установка флага БезопасныйРежим = Ложь в сведениях об обработке может быть недостаточной.
Система требует явного описания разрешений. Если вы заметили, что форма печатается, но на ней отсутствуют штрихкоды или возникают ошибки доступа к файловой системе, проверьте массив Разрешения. Как мы видели в примере выше, использование РаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнейКомпоненты является обязательным для корректной регистрации в профилях безопасности.
Чтобы восстановить работу внешней печатной формы после обновления «1С:Бухгалтерии» до 3.0.143.32, нам необходимо выполнить следующие шаги:
СведенияОВнешнейОбработке и указана правильная версия БСП.ОткрытиеФормы, обязательно формировать КоллекцияПечатныхФорм в коде обработки перед вызовом системной формы ПечатьДокументов.МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода.Следуя этим инструкциям, вы сможете быстро адаптировать свои разработки под требования современных версий конфигураций 1С и избежать простоев в работе пользователей. Помните, что каждое крупное обновление БСП стремится к унификации механизмов, и своевременное приведение кода к стандартам — залог стабильной работы вашей системы.