При работе с внешними печатными формами в среде 1С:Предприятие часто возникает задача автоматизации процесса сохранения документа. Стандартное поведение системы предполагает вывод сформированного табличного документа на экран для последующего просмотра и ручной печати. Однако для оптимизации бизнес-процессов (например, для быстрой отправки счета клиенту в формате PDF или выгрузки данных в текстовый файл) удобно реализовать автоматическое открытие диалога сохранения файла сразу после нажатия кнопки «Печать».
В данной статье мы подробно разберем, как модифицировать код внешней печатной формы для обычных форм, чтобы вместо (или вместе с) выводом на экран открывалось окно выбора пути сохранения с уже предзаполненным именем файла.
Для того чтобы реализовать функционал сохранения, нам необходимо внести изменения в модуль объекта внешней обработки. Основная логика работы внешней печатной формы сосредоточена в экспортной функции Печать. Именно эта функция вызывается системой при выборе соответствующего пункта меню в документе.
Рассмотрим по шагам, как должна измениться структура этой функции:
ДиалогВыбораФайла в режиме сохранения.Записать у объекта ТабличныйДокумент.Неопределено.Проанализируем пример кода, который успешно решает поставленную задачу. В данном примере мы формируем имя файла на основе данных о контрагенте и дате документа, а затем предлагаем пользователю сохранить результат в формате PDF.
Функция Печать() Экспорт
// 1. Формируем табличный документ (стандартная логика вашей формы)
// Допустим, функция ПечатьЗ2() возвращает готовый ТабличныйДокумент
ТабДокумент = СформироватьТабличныйДокумент();
// Получаем данные для формирования имени файла
// (Предположим, переменная Шапка содержит данные документа)
ИмяФайла = Строка(Шапка.Контрагент) + "_" + Формат(Шапка.ДатаДокумента, "ДФ=dd.MM.yyyy");
// 2. Инициализируем диалог сохранения файла
Режим = РежимДиалогаВыбораФайла.Сохранение;
ДиалогСохраненияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогСохраненияФайла.ПолноеИмяФайла = ИмяФайла;
// Настраиваем фильтры форматов (например, PDF)
Фильтр = "Документ PDF (*.pdf)|*.pdf";
ДиалогСохраненияФайла.Фильтр = Фильтр;
ДиалогСохраненияФайла.Заголовок = "Выберите путь для сохранения документа";
// 3. Открываем диалог и записываем файл
Если ДиалогСохраненияФайла.Выбрать() Тогда
ПутьКФайлу = ДиалогСохраненияФайла.ПолноеИмяФайла;
// Используем метод Записать для сохранения в нужном формате
ТабДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
Сообщить("Файл успешно сохранен: " + ПутьКФайлу);
КонецЕсли;
// 4. КРИТИЧЕСКИ ВАЖНО:
// Возвращаем Неопределено, чтобы 1С не открывала стандартное окно просмотра
Возврат Неопределено;
КонецФункции
При программном формировании имени файла (например, на основе наименования контрагента) мы часто сталкиваемся с проблемой недопустимых символов. В операционных системах семейства Windows имена файлов не могут содержать такие знаки, как /, \, :, *, ?, ", <, >, |. Если наименование контрагента содержит кавычки (ООО "Ромашка"), метод Выбрать() или Записать() может отработать некорректно или вызвать исключение.
Разберем, как обезопасить наш код. Рекомендуется создать вспомогательную функцию для очистки строки от "мусора":
Функция ОчиститьИмяФайла(Знач ИсхИмя)
НедопустимыеСимволы = "/\:*?""<>|";
Результат = ИсхИмя;
Для Индекс = 1 По СтрДлина(НедопустимыеСимволы) Цикл
Символ = Сред(НедопустимыеСимволы, Индекс, 1);
Результат = СтрЗаменить(Результат, Символ, "_");
КонецЦикла;
Возврат Результат;
КонецФункции
Использование такой очистки гарантирует, что диалог сохранения откроется без ошибок, даже если в данных документа присутствуют спецсимволы.
Объект ТипФайлаТабличногоДокумента предоставляет широкий выбор форматов. Выясним, какие из них наиболее востребованы:
XLSX (формат Excel 2007+) поддерживает большее количество строк и столбцов, чем старый XLS.Иногда требуется сохранять печатную форму вообще без вывода диалогового окна — например, если мы печатаем 100 документов сразу и хотим, чтобы они "тихо" упали в определенную папку на сервере или диске. В этом случае мы исключаем ДиалогВыбораФайла и сразу вызываем метод Записать().
Проанализируем ситуацию: для реализации такого подхода нам нужно заранее знать путь сохранения. Его можно хранить в константе, в дополнительных сведениях пользователя или в настройках самой обработки.
ПутьКаталога = "C:\PrintForms\";
ПолныйПуть = ПутьКаталога + ОчиститьИмяФайла(ИмяФайла) + ".pdf";
Попытка
ТабДокумент.Записать(ПолныйПуть, ТипФайлаТабличногоДокумента.PDF);
Исключение
Сообщить("Не удалось сохранить файл! Возможно, папка недоступна или файл уже открыт.", СтатусСообщения.Важное);
КонецПопытки;
Стоит отметить, что описанный выше подход (с использованием ДиалогВыбораФайла напрямую в функции Печать) характерен для обычных форм. В современной архитектуре управляемого приложения (платформа 8.3) выполнение кода разделено на серверную и клиентскую части. Поскольку функция Печать в модуле объекта выполняется на сервере, она не может вызвать диалоговое окно (интерфейсные объекты на сервере недоступны).
Если вы столкнулись с задачей на управляемых формах, стратегия меняется: на сервере формируется ТабличныйДокумент, затем он передается на клиент (в модуль формы), и уже на клиенте вызывается асинхронный диалог или метод ПолучитьФайл. Однако для внешних печатных форм в типовых конфигурациях на БСП (Библиотека стандартных подсистем) предусмотрены свои механизмы переопределения команд печати, которые позволяют добавить опцию "Сохранить в файл" штатным образом.
При программной записи файлов всегда учитывайте права доступа пользователя в операционной системе. Если пользователь 1С работает под учетной записью с ограниченными правами, попытка записи в корень диска C:\ или в системные папки приведет к ошибке "Доступ запрещен". Рекомендуется использовать для сохранения временные папки пользователя или сетевые ресурсы, на которые явно выданы права на чтение и запись.
Также важно обрабатывать ситуации, когда файл с таким же именем уже открыт у пользователя (например, в Adobe Reader). В этом случае 1С не сможет перезаписать файл и выдаст ошибку. Использование блока Попытка ... Исключение является обязательным стандартом при работе с файловой системой.
Подводя итог, можно сказать, что модификация функции Печать с возвратом Неопределено — это элегантный и эффективный способ перехватить стандартный процесс печати в 1С и направить его по нужному вам сценарию сохранения.