При разработке нового документа в конфигурации часто возникает типовая бизнес-задача: предоставить пользователю возможность вывести печатную форму на экран, отправить её на принтер, сохранить в популярных форматах (например, PDF или Excel) либо мгновенно отправить контрагенту по электронной почте во вложении.
Проанализируем ситуацию: если просто включить новый документ в состав общей команды отправки почты в дереве метаданных, функционал работать не начнет. Для решения этой задачи в современных конфигурациях (таких как «1С:Бухгалтерия предприятия 3.0») существуют два подхода: интеграция со стандартной подсистемой печати БСП и низкоуровневая программная отправка через объекты платформы. Разберем оба пути по шагам.
В типовых решениях на платформе «1С:Предприятие 8.3» уже предусмотрен богатый механизм предварительного просмотра, сохранения файлов и работы с почтовыми клиентами. Чтобы новый документ получил все эти функции автоматически, правильнее всего подключить его к подсистеме «Печать» Библиотеки стандартных подсистем (БСП).
Разберем по шагам, что для этого требуется сделать разработчику:
ДобавитьКомандыПечати, где регистрируются печатные формы, их идентификаторы и правила доступности.Печать, принимающая массив ссылок на документы и возвращающая заполненный объект ТабличныйДокумент в коллекцию форм.Когда печатная форма формируется штатно через механизмы БСП, открывается единое окно предварительного просмотра. В нем платформа и библиотека берут всю рутину на себя: пользователь получает готовые кнопки сохранения в форматах PDF, Excel (XLSX, XLS), Word, а также штатную кнопку Отправить по электронной почте. При этом отправка использует зарегистрированную в базе учетную запись из справочника УчетныеЗаписиЭлектроннойПочты без необходимости жестко прописывать логины и пароли в коде.
Если требуется реализовать отправку в фоновом режиме, без показа форм пользователю или в рамках специфического бизнес-процесса, мы можем задействовать объекты платформы: ТабличныйДокумент, ИнтернетПочтовыйПрофиль, ИнтернетПочта и ИнтернетПочтовоеСообщение.
Выясним причину частых ошибок: при программной отправке важно корректно сформировать временные файлы на сервере, правильно указать тип файла и параметры сетевого подключения.
Посмотрим на пример кода, реализующего подготовку профиля, сохранение макета и непосредственную отправку письма:
Функция ПолучитьПрофиль() Экспорт
Профиль = Новый ИнтернетПочтовыйПрофиль;
// Параметры SMTP (исходящая почта)
Профиль.АдресСервераSMTP = "smtp.company.ru";
Профиль.ПортSMTP = 465;
Профиль.ПользовательSMTP = "robot@company.ru";
Профиль.ПарольSMTP = "SecurePassword123";
Профиль.ИспользоватьSSLSMTP = Истина;
// Параметры POP3/IMAP (при необходимости авторизации перед отправкой)
Профиль.АдресСервераPOP3 = "pop.company.ru";
Профиль.ПортPOP3 = 995;
Профиль.Пользователь = "robot@company.ru";
Профиль.Пароль = "SecurePassword123";
Профиль.ИспользоватьSSLPOP3 = Истина;
Профиль.ВремяОжидания = 30;
Возврат Профиль;
КонецФункции
Процедура ПослатьПисьмо(Сообщение) Экспорт
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(ПолучитьПрофиль());
Почта.Послать(Сообщение);
Почта.Отключиться();
Исключение
Почта.Отключиться();
ВызватьИсключение "Ошибка при отправке почты: " + ОписаниеОшибки();
КонецПопытки;
КонецПроцедуры
Процедура ОтправитьТабличныйДокументПоПочте(ТабДокумент, ФорматСохранения, МассивПолучателей, ТемаПисьма, ТекстПисьма) Экспорт
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Отправитель = "robot@company.ru";
Сообщение.ИмяОтправителя = "Информационная система";
Для Каждого ТекущийАдрес Из МассивПолучателей Цикл
ПочтовыйАдрес = Сообщение.Получатели.Добавить();
ПочтовыйАдрес.Адрес = Сокращенно(ТекущийАдрес);
КонецЦикла;
Сообщение.Тема = ?(ЗначениеЗаполнено(ТемаПисьма), ТемаПисьма, "Документы во вложении");
Текст = Сообщение.Тексты.Добавить();
Текст.Текст = ?(ЗначениеЗаполнено(ТекстПисьма), ТекстПисьма, "Документ во вложении.");
Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
// Получение корректного пути к временному файлу
Если ВРег(ФорматСохранения) = "PDF" Тогда
ПолноеИмяФайла = ПолучитьИмяВременногоФайла("pdf");
ТабДокумент.Записать(ПолноеИмяФайла, ТипФайлаТабличногоДокумента.PDF);
Иначе
// По умолчанию выгружаем в формат XLSX
ПолноеИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
ТабДокумент.Записать(ПолноеИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
КонецЕсли;
Попытка
Сообщение.Вложения.Добавить(ПолноеИмяФайла);
ПослатьПисьмо(Сообщение);
Финал
// Обязательно освобождаем временный каталог
УдалитьФайлы(ПолноеИмяФайла);
КонецПопытки;
КонецПроцедуры
Рассмотрим подробнее ошибки и технические ограничения, с которыми можно столкнуться при ручной программной реализации:
ПолучитьИмяВременногоФайла("расширение") возвращает готовый абсолютный путь к файлу в системном каталоге. Складывать его повторно со значением КаталогВременныхФайлов() нельзя, так как это нарушает синтаксис файлового пути.ТабличныйДокумент.Записать должно передаваться конкретное системное перечисление, например ТипФайлаТабличногоДокумента.PDF или ТипФайлаТабличногоДокумента.XLSX. Нельзя использовать логические выражения внутри вызова метода.ТипФайлаТабличногоДокумента.XLS имеет жесткое ограничение на 65 536 строк и может искажать форматирование. Для таблиц Excel рекомендуется всегда указывать современный формат ТипФайлаТабличногоДокумента.XLSX.ИспользоватьSSLSMTP и задавайте защищенные порты (465 или 587).УдалитьФайлы() в блоке Попытка ... Финал, чтобы диск сервера не переполнялся временными копиями.