Как реализовать сохранение, печать и отправку документов по электронной почте в 1С:Бухгалтерия 8?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При разработке нового документа в конфигурации часто возникает типовая бизнес-задача: предоставить пользователю возможность вывести печатную форму на экран, отправить её на принтер, сохранить в популярных форматах (например, PDF или Excel) либо мгновенно отправить контрагенту по электронной почте во вложении.

Проанализируем ситуацию: если просто включить новый документ в состав общей команды отправки почты в дереве метаданных, функционал работать не начнет. Для решения этой задачи в современных конфигурациях (таких как «1С:Бухгалтерия предприятия 3.0») существуют два подхода: интеграция со стандартной подсистемой печати БСП и низкоуровневая программная отправка через объекты платформы. Разберем оба пути по шагам.

Вариант 1. Интеграция со встроенной подсистемой печати БСП

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

Разберем по шагам, что для этого требуется сделать разработчику:

  1. Описать команды печати в модуле менеджера. В модуле менеджера вашего документа создается экспортная процедура ДобавитьКомандыПечати, где регистрируются печатные формы, их идентификаторы и правила доступности.
  2. Сформировать печатную форму. В модуле менеджера объявляется экспортная процедура Печать, принимающая массив ссылок на документы и возвращающая заполненный объект ТабличныйДокумент в коллекцию форм.
  3. Подключить команды на форме документа. В модуле формы в обработчике создания вызывается подключение команд печати подсистемы.

Когда печатная форма формируется штатно через механизмы БСП, открывается единое окно предварительного просмотра. В нем платформа и библиотека берут всю рутину на себя: пользователь получает готовые кнопки сохранения в форматах PDF, Excel (XLSX, XLS), Word, а также штатную кнопку Отправить по электронной почте. При этом отправка использует зарегистрированную в базе учетную запись из справочника УчетныеЗаписиЭлектроннойПочты без необходимости жестко прописывать логины и пароли в коде.

Вариант 2. Программное сохранение и отправка через объекты платформы

Если требуется реализовать отправку в фоновом режиме, без показа форм пользователю или в рамках специфического бизнес-процесса, мы можем задействовать объекты платформы: ТабличныйДокумент, ИнтернетПочтовыйПрофиль, ИнтернетПочта и ИнтернетПочтовоеСообщение.

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

Посмотрим на пример кода, реализующего подготовку профиля, сохранение макета и непосредственную отправку письма:


Функция ПолучитьПрофиль() Экспорт
    Профиль = Новый ИнтернетПочтовыйПрофиль;
    
    // Параметры 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);
    КонецЕсли;
    
    Попытка
        Сообщение.Вложения.Добавить(ПолноеИмяФайла);
        ПослатьПисьмо(Сообщение);
    Финал
        // Обязательно освобождаем временный каталог
        УдалитьФайлы(ПолноеИмяФайла);
    КонецПопытки;
КонецПроцедуры

Важные нюансы реализации

Рассмотрим подробнее ошибки и технические ограничения, с которыми можно столкнуться при ручной программной реализации:

  1. Получение имени временного файла: Метод ПолучитьИмяВременногоФайла("расширение") возвращает готовый абсолютный путь к файлу в системном каталоге. Складывать его повторно со значением КаталогВременныхФайлов() нельзя, так как это нарушает синтаксис файлового пути.
  2. Синтаксис метода Записать(): Вторым параметром метода ТабличныйДокумент.Записать должно передаваться конкретное системное перечисление, например ТипФайлаТабличногоДокумента.PDF или ТипФайлаТабличногоДокумента.XLSX. Нельзя использовать логические выражения внутри вызова метода.
  3. Устаревший формат XLS: Старый формат ТипФайлаТабличногоДокумента.XLS имеет жесткое ограничение на 65 536 строк и может искажать форматирование. Для таблиц Excel рекомендуется всегда указывать современный формат ТипФайлаТабличногоДокумента.XLSX.
  4. Безопасность соединений: Большинство почтовых провайдеров блокируют соединения без шифрования через открытый порт 25. Обязательно включайте флаги ИспользоватьSSLSMTP и задавайте защищенные порты (465 или 587).
  5. Удаление временных файлов: Созданные файлы вложений необходимо принудительно очищать с помощью метода УдалитьФайлы() в блоке Попытка ... Финал, чтобы диск сервера не переполнялся временными копиями.
← На главную