При разработке внешних печатных форм для 1С:Бухгалтерии 3.0 и других конфигураций на базе БСП (Библиотеки стандартных подсистем) часто возникает задача: перед выводом макета на экран дать пользователю возможность выбрать специфические данные. Это могут быть ответственные лица (подписанты), должности, или, например, выбор между полным и сокращенным вариантом вывода строк. В случае с формой М-29 это особенно актуально, так как состав комиссии или ответственных лиц может меняться.
Рассмотрим подробнее, как отойти от стандартного «прямого» формирования печатной формы и реализовать механизм с использованием промежуточного диалогового окна. Мы разберем два основных подхода: классический (через создание формы обработки) и альтернативный (через дополнительные реквизиты объекта).
Этот способ является наиболее гибким и профессиональным. Он позволяет создать полноценный интерфейс, где пользователь выберет нужные значения из справочников ФизическиеЛица и Должности, а затем нажмет кнопку «Печать».
Шаг 1. Настройка регистрационных данных в модуле объекта
Проанализируем функцию СведенияОВнешнейОбработке. В стандартных формах в поле Использование обычно указывается значение ВызовСерверногоМетода. Но для нашей задачи нам нужно, чтобы система сначала открыла форму обработки. Поэтому мы должны изменить это значение на ОткрытиеФормы.
Рассмотрим пример кода регистрации:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Печать М-29 (с выбором лиц)";
НоваяКоманда.Идентификатор = "М29_С_Параметрами";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипВызоваОткрытиеФормы(); // Важный момент!
НоваяКоманда.ПоказыватьОповещение = Истина;
Возврат ПараметрыРегистрации;
КонецФункции
Шаг 2. Создание формы для ввода данных
Теперь в составе внешней обработки необходимо создать управляемую форму. На этой форме разместим реквизиты:
СправочникСсылка.ФизическиеЛица).СправочникСсылка.Должности или Строка).Массив) — это служебный реквизит, в который БСП автоматически передаст ссылки на документы, из которых была вызвана печать.Проанализируем ситуацию: когда форма открывается, нам нужно знать, для каких именно документов мы печатаем форму. В модуле формы в процедуре ПриСозданииНаСервере мы должны принять эти данные:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("ОбъектыНазначения") Тогда
ОбъектыНазначения.ЗагрузитьЗначения(Параметры.ОбъектыНазначения);
КонецЕсли;
КонецПроцедуры
Шаг 3. Обработка нажатия кнопки «Печать» на форме
На форме создаем команду «Печать» и в ее обработчике вызываем формирование печатной формы, передавая в нее структуру с нашими параметрами. Выясним, как передать данные обратно в модуль объекта для формирования макета. Мы воспользуемся стандартной процедурой БСП УправлениеПечатьюКлиент.ВыполнитьКомандуПечати или сформируем коллекцию самостоятельно.
Пример кода на клиенте для кнопки «Печать»:
&НаКлиенте
Процедура КомандаПечать(Команда)
// Подготовим структуру параметров
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Подписант", Объект.Подписант);
ДополнительныеПараметры.Вставить("Должность", Объект.Должность);
// Передаем управление обратно в БСП для печати
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("ИсточникДанных", ЭтаФорма.УникальныйИдентификатор);
ПараметрыОткрытия.Вставить("ПараметрыПечати", ДополнительныеПараметры);
// Формируем коллекцию печатных форм
// Здесь мы вызываем серверный метод модуля объекта
СформироватьПечатнуюФормуНаСервере(ДополнительныеПараметры);
КонецПроцедуры
Шаг 4. Доработка модуля объекта для приема параметров
Теперь вернемся в модуль объекта внешней обработки. Процедура Печать должна уметь принимать наши дополнительные параметры. Проанализируем сигнатуру этой процедуры:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// В ПараметрыВывода.ДополнительныеПараметры будут наши данные,
// если мы правильно их передали из формы.
ФизЛицо = "";
Должность = "";
Если ПараметрыВывода.Свойство("ДополнительныеПараметры") Тогда
ФизЛицо = ПараметрыВывода.ДополнительныеПараметры.Подписант;
Должность = ПараметрыВывода.ДополнительныеПараметры.Должность;
КонецЕсли;
// Далее используем эти переменные при заполнении макета
СформироватьТабличныйДокументМ29(МассивОбъектов, КоллекцияПечатныхФорм, ФизЛицо, Должность);
КонецПроцедуры
Выясним важную деталь: если вы хотите, чтобы программа «запоминала» ваш выбор, используйте механизм СохраняемыеДанные в свойствах реквизитов формы или записывайте значения в ХранилищеОбщихНастроек в процедуре ПриЗакрытии и восстанавливайте в ПриСозданииНаСервере.
Разберем ситуацию, когда программирование форм кажется избыточным. В современных конфигурациях 1С (БП 3.0, ERP, УТ 11) есть встроенный механизм «Дополнительные сведения и реквизиты».
Алгоритм действий следующий:
ТребованиеНакладная) добавьте два реквизита: «Подписант М-29» (тип Физическое лицо) и «Должность подписанта».ДополнительныеРеквизиты объекта.Рассмотрим пример запроса для получения таких данных:
ВЫБРАТЬ
ДопРеквизиты.Значение КАК Подписант,
ДопРеквизиты.Свойство.Наименование КАК ИмяСвойства
ИЗ
Документ.ТребованиеНакладная.ДополнительныеРеквизиты КАК ДопРеквизиты
ГДЕ
ДопРеквизиты.Ссылка = &СсылкаНаДокумент
И ДопРеквизиты.Свойство.Наименование ПОДОБНО "Подписант М-29"
Плюсы этого метода: не нужно создавать формы и менять тип вызова команды. Минусы: пользователю нужно совершить лишние действия по записи документа перед печатью, и эти данные «засоряют» базу данных, если они нужны только один раз для печати.
Проанализировав оба подхода, можно сделать вывод, что для создания качественного продукта лучше всего использовать первый вариант с открытием формы. Это обеспечивает лучший пользовательский опыт (UX): человек нажимает кнопку «Печать», видит аккуратное окно, выбирает данные и тут же получает результат.
Основные моменты, на которые стоит обратить внимание:
Использование в сведениях установлено в ОткрытиеФормы.Таким образом, комбинируя возможности БСП по программному открытию форм и стандартные методы формирования табличных документов, мы получаем гибкий инструмент для формирования любых сложных отчетов и печатных форм.