При разработке печатных форм и отчетов часто возникает задача контролировать процесс сохранения сформированного документа пользователем: например, автоматически формировать определенное имя файла, подставлять нужный путь, логировать действия или ограничивать форматы выгрузки (PDF, Excel). Разберем, как устроена работа со штатным сохранением в платформе 1С:Предприятие и какие существуют практические решения для управления этим процессом.
Проанализируем работу системного меню платформы. Команда Файл — Сохранить как... (а также стандартная дискета на панели инструментов) реализована на уровне ядра платформы (C++). Во встроенном языке 1С отсутствует событие уровня формы или табличного документа (такое как ПередСохранениемФайла), которое вызывалось бы при клике на этот штатный пункт.
Когда открывается окно предварительного просмотра (например, общая форма печати), табличный документ отображается в поле табличного документа или отдельном окне. При выборе пункта главного меню управление не передается в модули конфигурации, поэтому перехватить сам системный диалог штатными средствами языка 1С невозможно. Для решения прикладных задач применяются альтернативные подходы.
Наиболее надежный и рекомендуемый способ — вынести на форму печати собственную кнопку (или подменю сохранения), которая полностью берет процесс выгрузки под контроль разработчика.
Разберем по шагам реализацию обработчика сохранения табличного документа:
ДиалогВыбораФайла, указав режим сохранения.Записать() у объекта ТабличныйДокумент.Посмотрим на пример программного кода для обычной формы печати:
Процедура ДействияФормыСохранитьКак(Кнопка)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Заголовок = "Выберите файл для сохранения печатной формы";
Диалог.ПолноеИмяФайла = "ПечатнаяФорма_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd");
Диалог.Фильтр = "Лист Excel (*.xlsx)|*.xlsx|Документ PDF (*.pdf)|*.pdf|Табличный документ (*.mxl)|*.mxl";
Если Диалог.Выбрать() Тогда
// Определяем тип файла по расширению
Расширение = Врег(Прав(Диалог.ПолноеИмяФайла, 4));
Если Расширение = "XLSX" Тогда
ТипФайла = ТипФайлаТабличногоДокумента.XLSX;
ИначеЕсли Расширение = ".PDF" Тогда
ТипФайла = ТипФайлаТабличногоДокумента.PDF;
Иначе
ТипФайла = ТипФайлаТабличногоДокумента.MXL;
КонецЕсли;
Попытка
ЭлементыФормы.ПолеТабличногоДокумента.Записать(Диалог.ПолноеИмяФайла, ТипФайла);
ОповеститьПользователя("Файл успешно сохранен: " + Диалог.ПолноеИмяФайла);
Исключение
Предупреждение("Ошибка при сохранении файла: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Пользователи часто используют комбинации клавиш Ctrl+S или Ctrl+Shift+S вместо использования меню. Чтобы перенаправить эти действия на свой обработчик, выполним следующую настройку:
Ctrl+S).В этом случае платформа при нажатии горячих клавиш передаст управление коду 1С, переопределяя системное платформенное действие.
Если задача заключается в том, чтобы запретить неконтролируемое сохранение печатной формы через системное меню, рассмотрим встроенные инструменты защиты:
ТабличныйДокумент.ИспользованиеВывода = ИспользованиеВывода.Запретить;
Это полностью отключает в главном меню платформы команды сохранения, печати и копирования данных в буфер обмена для данного документа.ТабличныйДокумент.Защита = Истина блокирует выделение и редактирование ячеек.В современных конфигурациях на управляемых формах для унификации работы с печатными формами используется подсистема печати Библиотеки стандартных подсистем (БСП). В ней вывод осуществляется в специализированную форму управления печатью, где штатные команды платформы заменены командами общего модуля УправлениеПечатьюКлиент. Это позволяет централизованно управлять форматами экспорта, именами файлов и отправкой документов по электронной почте.