Как реализовать ввод дополнительных параметров во внешней печатной форме 1С 8.3?

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

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

Рассмотрим подробнее, как отойти от стандартного «прямого» формирования печатной формы и реализовать механизм с использованием промежуточного диалогового окна. Мы разберем два основных подхода: классический (через создание формы обработки) и альтернативный (через дополнительные реквизиты объекта).

Способ 1. Создание интерактивной формы ввода параметров

Этот способ является наиболее гибким и профессиональным. Он позволяет создать полноценный интерфейс, где пользователь выберет нужные значения из справочников ФизическиеЛица и Должности, а затем нажмет кнопку «Печать».

Шаг 1. Настройка регистрационных данных в модуле объекта

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

Рассмотрим пример кода регистрации:


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
    
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = "Печать М-29 (с выбором лиц)";
    НоваяКоманда.Идентификатор = "М29_С_Параметрами";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипВызоваОткрытиеФормы(); // Важный момент!
    НоваяКоманда.ПоказыватьОповещение = Истина;
    
    Возврат ПараметрыРегистрации;
КонецФункции

Шаг 2. Создание формы для ввода данных

Теперь в составе внешней обработки необходимо создать управляемую форму. На этой форме разместим реквизиты:

  1. Подписант (тип СправочникСсылка.ФизическиеЛица).
  2. Должность (тип СправочникСсылка.Должности или Строка).
  3. ОбъектыНазначения (тип Массив) — это служебный реквизит, в который БСП автоматически передаст ссылки на документы, из которых была вызвана печать.

Проанализируем ситуацию: когда форма открывается, нам нужно знать, для каких именно документов мы печатаем форму. В модуле формы в процедуре ПриСозданииНаСервере мы должны принять эти данные:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если Параметры.Свойство("ОбъектыНазначения") Тогда
        ОбъектыНазначения.ЗагрузитьЗначения(Параметры.ОбъектыНазначения);
    КонецЕсли;
КонецПроцедуры

Шаг 3. Обработка нажатия кнопки «Печать» на форме

На форме создаем команду «Печать» и в ее обработчике вызываем формирование печатной формы, передавая в нее структуру с нашими параметрами. Выясним, как передать данные обратно в модуль объекта для формирования макета. Мы воспользуемся стандартной процедурой БСП УправлениеПечатьюКлиент.ВыполнитьКомандуПечати или сформируем коллекцию самостоятельно.

Пример кода на клиенте для кнопки «Печать»:


&НаКлиенте
Процедура КомандаПечать(Команда)
    // Подготовим структуру параметров
    ДополнительныеПараметры = Новый Структура;
    ДополнительныеПараметры.Вставить("Подписант", Объект.Подписант);
    ДополнительныеПараметры.Вставить("Должность", Объект.Должность);
    
    // Передаем управление обратно в БСП для печати
    ПараметрыОткрытия = Новый Структура;
    ПараметрыОткрытия.Вставить("ИсточникДанных", ЭтаФорма.УникальныйИдентификатор);
    ПараметрыОткрытия.Вставить("ПараметрыПечати", ДополнительныеПараметры);
    
    // Формируем коллекцию печатных форм
    // Здесь мы вызываем серверный метод модуля объекта
    СформироватьПечатнуюФормуНаСервере(ДополнительныеПараметры);
КонецПроцедуры

Шаг 4. Доработка модуля объекта для приема параметров

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


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

    // Далее используем эти переменные при заполнении макета
    СформироватьТабличныйДокументМ29(МассивОбъектов, КоллекцияПечатныхФорм, ФизЛицо, Должность);
КонецПроцедуры

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

Способ 2. Использование штатных «Дополнительных реквизитов»

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

Алгоритм действий следующий:

  1. Зайдите в раздел «Администрирование» — «Общие настройки» — «Дополнительные реквизиты и сведения».
  2. Для документа-основания (например, ТребованиеНакладная) добавьте два реквизита: «Подписант М-29» (тип Физическое лицо) и «Должность подписанта».
  3. Пользователь заполняет эти данные прямо в карточке документа на закладке «Дополнительно».
  4. Во внешней печатной форме в запросе на получение данных мы просто обращаемся к табличной части ДополнительныеРеквизиты объекта.

Рассмотрим пример запроса для получения таких данных:


ВЫБРАТЬ
    ДопРеквизиты.Значение КАК Подписант,
    ДопРеквизиты.Свойство.Наименование КАК ИмяСвойства
ИЗ
    Документ.ТребованиеНакладная.ДополнительныеРеквизиты КАК ДопРеквизиты
ГДЕ
    ДопРеквизиты.Ссылка = &СсылкаНаДокумент
    И ДопРеквизиты.Свойство.Наименование ПОДОБНО "Подписант М-29"

Плюсы этого метода: не нужно создавать формы и менять тип вызова команды. Минусы: пользователю нужно совершить лишние действия по записи документа перед печатью, и эти данные «засоряют» базу данных, если они нужны только один раз для печати.

Резюме по реализации

Проанализировав оба подхода, можно сделать вывод, что для создания качественного продукта лучше всего использовать первый вариант с открытием формы. Это обеспечивает лучший пользовательский опыт (UX): человек нажимает кнопку «Печать», видит аккуратное окно, выбирает данные и тут же получает результат.

Основные моменты, на которые стоит обратить внимание:

Таким образом, комбинируя возможности БСП по программному открытию форм и стандартные методы формирования табличных документов, мы получаем гибкий инструмент для формирования любых сложных отчетов и печатных форм.

← На главную