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