Как добавить кнопку отправки отчета по электронной почте в пользовательскую форму отчета 1С и настроить автоматический отбор?

Программист 1С v8.3 (Управляемые формы) Сфера услуг, туризм и социальный сектор
← На главную

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

Основные подходы к добавлению кнопки отправки отчета по электронной почте

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

Подход 1: Копирование отдельной команды и кнопки

Изначально мы можем подумать о том, чтобы просто скопировать команду, отвечающую за отправку по почте, и соответствующую кнопку с типовой формы отчета. Обычно в типовых формах отчетов присутствует команда с именем, похожим на ОтправитьПоПочте. Мы можем найти ее в типовой форме отчета (например, в конфигурациях на БСП это часто ОбщиеФормы.ФормаОтчета) и перенести на нашу пользовательскую форму.

  1. Мы открываем типовую форму отчета в конфигураторе.
  2. Находим в элементах формы кнопку, отвечающую за отправку по почте.
  3. Изучаем связанную с ней команду (её имя, например, ОтправитьПоПочте) и обработчики.
  4. Копируем эту команду в наш внешний отчет.
  5. Добавляем элемент "Кнопка" на нашу форму и привязываем его к скопированной команде.

После выполнения этих шагов мы ожидаем, что кнопка появится и будет работать. Действительно, в некоторых случаях кнопка может появиться, и даже при ее нажатии будет открываться форма отправки электронного письма. Однако, как показывает практика и опыт многих разработчиков, письмо по факту может не отправляться. Это происходит потому, что команда ОтправитьПоПочте — это лишь часть сложного механизма. Сама отправка почты завязана на множество вспомогательных процедур и функций, которые могут находиться в общих модулях типовой конфигурации (например, РаботаСФайлами, УправлениеПечатью, РаботаСПочтовымиСообщениями) и не быть напрямую доступными или корректно инициализированными для внешнего отчета.

Подход 2: Копирование всей типовой формы отчета (рекомендуемый и наиболее надежный)

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

  1. Определяем типовую форму: Для отчетов, как правило, используется общая форма ОбщиеФормы.ФормаОтчета. Мы открываем ее в конфигураторе.
  2. Копируем форму: Мы копируем эту типовую форму в объект нашего внешнего отчета. Для этого в дереве объектов внешнего отчета мы создаем новую форму, а затем в ее свойствах указываем, что она должна быть создана на основе скопированной типовой формы или просто копируем содержимое (реквизиты, команды, элементы, модули) из типовой формы в нашу новую форму. Важно скопировать не только элементы, но и код из модулей формы (модуль формы, модуль команды, если есть).
  3. Назначаем форму: Убеждаемся, что наша скопированная форма назначена основной формой внешнего отчета.
  4. Вносим изменения: Теперь, когда у нас есть полная копия типовой формы, мы можем вносить в нее необходимые изменения: добавлять свои элементы, изменять обработчики, и, самое главное, настраивать автоматическую подстановку отборов.

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

Решение проблемы с автоматическим отбором

Одной из причин создания собственной формы отчета часто является необходимость установить определенные отборы автоматически, без возможности их изменения пользователем. Например, установить отбор Сотрудник = ТекущийПользователь. Рассмотрим, как мы можем это реализовать.

Проблема с прямым изменением параметров

Мы можем попытаться установить параметр отбора в обработчике формы, например, ПриОткрытии или ПриСозданииНаСервере. Однако, иногда возникает ситуация, когда наш параметр, установленный программно, замещается типовым пустым значением. Это может происходить из-за того, что стандартные механизмы работы с компоновщиком настроек или параметрами отчета в типовой форме перезаписывают наши изменения в более поздних обработчиках.

Метод 1: Использование дополнительных параметров компоновщика данных

Если прямое изменение основного отбора вызывает конфликты, мы можем использовать механизм дополнительных параметров компоновщика данных. Этот подход позволяет передать нужные значения в СКД, а затем использовать их для установки отбора, который будет "жестко" зафиксирован.

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

// Пример кода в обработчике ПриСозданииНаСервере() или ПриКомпоновкеРезультата()
// ...
Если ЗначениеЗаполнено(Пользователи.ТекущийПользователь()) Тогда
    // Получаем текущие настройки компоновщика данных
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();

    // Находим наш дополнительный параметр и устанавливаем его значение
    // (предполагается, что в СКД есть параметр с именем "ПараметрСотрудник")
    Для Каждого Параметр Из Настройки.ПараметрыДанных.Элементы Цикл
        Если Параметр.Параметр = "ПараметрСотрудник" Тогда
            Параметр.Значение = Пользователи.ТекущийПользователь(); // Предполагаем, что ТекущийПользователь() возвращает ссылку на Сотрудника
            Параметр.Использование = Истина;
            Прервать;
        КонецЕсли;
    КонецЦикла;

    // Также можно добавить элемент отбора напрямую, если это необходимо
    // и если в СКД явно не указан отбор по этому параметру
    ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновщикаНастроек"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновщикаДанных("Сотрудник"); // Имя поля в СКД
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновщикаДанных.Равно;
    ЭлементОтбора.ПравоеЗначение = Пользователи.ТекущийПользователь();
    ЭлементОтбора.Использование = Истина;
    ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновщикаДанных.Недоступный; // Чтобы нельзя было изменить в интерфейсе

    // Устанавливаем измененные настройки
    КомпоновщикНастроек.УстановитьНастройки(Настройки);
КонецЕсли;
// ...

Метод 2: Отладка для выявления перезаписи параметров

Если автоматический отбор все равно не устанавливается или перезаписывается, необходимо использовать отладчик. Мы устанавливаем точки останова в ключевых местах: в обработчиках формы (ПриОткрытии, ПриСозданииНаСервере, ПриКомпоновкеРезультата) и в модулях компоновщика настроек. Пошагово выполняя код, мы сможем увидеть, в какой именно момент происходит установка нашего параметра, а затем — где и почему он перезаписывается или игнорируется. Это критически важный шаг для понимания логики работы типовой формы и корректного вмешательства в нее.

Метод 3: Проверка типов данных

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


// Пример преобразования, если ТекущийПользователь() возвращает ПользовательИБ,
// а нужно получить ссылку на Справочник.Сотрудники
Функция ПолучитьСотрудникаПользователя()

    ТекущийПользовательИБ = Пользователи.ТекущийПользователь();
    Если ТекущийПользовательИБ = Неопределено Тогда
        Возврат Неопределено;
    КонецЕсли;

    // В типовых конфигурациях обычно есть связь между ПользователемИБ и Сотрудником
    // через регистр сведений или реквизит пользователя/сотрудника
    // Например, если есть регистр сведений "НастройкиПользователей" или "ДополнительныеСведенияПользователей"
    // где хранится связь ПользовательИБ <-> Сотрудник
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |    Сотрудники.Ссылка КАК Сотрудник
    |ИЗ
    |    Справочник.Сотрудники КАК Сотрудники
    |ГДЕ
    |    Сотрудники.Пользователь = &ПользовательИБ"; // Предполагаем, что у сотрудника есть реквизит "Пользователь"

    Запрос.УстановитьПараметр("ПользовательИБ", ТекущийПользовательИБ);

    Результат = Запрос.Выполнить().Выбрать();
    Если Результат.Следующий() Тогда
        Возврат Результат.Сотрудник;
    Иначе
        Возврат Неопределено;
    КонецЕсли;

КонецФункции

// Затем в обработчике формы используем:
// ОтборЗначение = ПолучитьСотрудникаПользователя();

Важно помнить, что без соответствия типов данных отбор может работать некорректно или не работать вовсе. Мы всегда должны проверять, какие объекты и типы данных ожидаются в поле отбора и какие значения мы передаем.

Возможные причины, по которым электронное письмо не отправляется

Когда кнопка отправки по почте уже добавлена (особенно если это был прямой перенос команды, а не всей формы), но письма не доходят до адресатов, мы сталкиваемся с новой проблемой. Рассмотрим наиболее частые причины и пути их устранения.

  1. Не настроен почтовый профиль в 1С: Для отправки писем 1С требуется настроенный профиль электронной почты. Это делается в разделе "Администрирование" или "Настройки" конфигурации. Мы должны создать и настроить профиль, указав параметры SMTP-сервера, логин, пароль, порт и необходимость использования SSL/TLS. Без корректно настроенного профиля отправка невозможна.
  2. Отсутствие прав доступа: У пользователя, под которым происходит попытка отправки письма, могут отсутствовать необходимые права на работу с почтовыми функциями. Мы проверяем роли и права пользователя на объекты ПрофильЭлектроннойПочты, ИнтернетПочта, ИнтернетПочтовоеСообщение, а также на использование общих команд, связанных с отправкой.
  3. Ошибки в коде логики отправки: Если мы копировали отдельные фрагменты кода или модули, возможно, какие-то переменные не инициализируются должным образом, или имеются ошибки в вызове функций. Необходимо использовать отладчик, чтобы пошагово пройтись по коду отправки письма и выявить конкретное место сбоя. Мы можем столкнуться с ошибками при формировании вложений, сборке тела письма или при непосредственном обращении к объекту ИнтернетПочта.
  4. Блокировка антивирусом или файрволом: Стороннее программное обеспечение (антивирусы, файрволы) на сервере 1С или клиентской машине может блокировать исходящие почтовые соединения, осуществляемые из 1С. Мы проверяем логи безопасности и настройки сетевого экрана.
  5. Некорректные параметры SMTP-соединения: Помимо базовых логина и пароля, критически важны такие параметры, как порт SMTP-сервера (часто 25, 465 для SSL, 587 для TLS), необходимость использования SSL/TLS, а также имя сервера. Даже небольшая ошибка в этих настройках приведет к невозможности соединения с почтовым сервером.
  6. Проблемы с формированием файлов отчета: Перед отправкой отчет должен быть сформирован в определенном формате (PDF, Excel, HTML) и сохранен во временный файл, который будет прикреплен к письму. Если на этом этапе возникают ошибки (например, недостаточно прав на запись во временную папку, некорректный вызов процедур печати, отсутствие установленного компонента для PDF), то вложение не будет создано, и письмо либо не отправится, либо отправится пустым.
  7. Отсутствие необходимых общих модулей: Типовая логика отправки почты может зависеть от функций, расположенных в общих модулях типовой конфигурации. При создании внешнего отчета или при частичном копировании кода, эти модули могут быть недоступны или их вызовы некорректны. Мы должны убедиться, что все необходимые процедуры и функции из общих модулей (например, ЭлектронныеПисьмаКлиент, ЭлектронныеПисьмаСервер, УправлениеПечатью) доступны и корректно вызываются из нашего отчета.

Заключение

Интеграция функционала отправки отчетов по электронной почте и настройка нередактируемых отборов в пользовательских формах отчетов 1С — это задача, требующая внимательного подхода. Мы выяснили, что наиболее надежным способом является копирование всей типовой формы отчета, что позволяет сохранить всю стандартную логику. Для отборов мы рекомендуем использовать дополнительные параметры компоновщика данных и тщательную отладку, а также проверку типов данных. При проблемах с самой отправкой письма мы анализируем настройки почтового профиля, права доступа, и детально отлаживаем код, проверяя также внешние факторы, такие как файрволы и параметры SMTP-сервера. Следуя этим рекомендациям, мы успешно реализуем нужный функционал в наших отчетах.

← На главную