При работе с платформой 1С:Предприятие 8.3 разработчики часто сталкиваются с необходимостью создания собственных форм отчетов или модификации существующих. Однако при создании полностью новой формы мы теряем часть стандартного функционала, который присутствует в типовых отчетах, например, кнопку отправки отчета по электронной почте. Также возникает задача автоматической установки отборов, которые пользователь не должен иметь возможность изменять. В данном материале мы рассмотрим, как интегрировать функциональность отправки отчета по почте в пользовательскую форму и эффективно настроить автоматические, нередактируемые отборы.
Когда мы создаем собственную форму для внешнего отчета, мы замечаем отсутствие стандартной панели с кнопкой для отправки по почте. Возникает естественный вопрос: можно ли добавить эту команду самостоятельно? Рассмотрим два основных подхода к решению этой задачи.
Подход 1: Копирование отдельной команды и кнопки
Изначально мы можем подумать о том, чтобы просто скопировать команду, отвечающую за отправку по почте, и соответствующую кнопку с типовой формы отчета. Обычно в типовых формах отчетов присутствует команда с именем, похожим на ОтправитьПоПочте. Мы можем найти ее в типовой форме отчета (например, в конфигурациях на БСП это часто ОбщиеФормы.ФормаОтчета) и перенести на нашу пользовательскую форму.
ОтправитьПоПочте) и обработчики.После выполнения этих шагов мы ожидаем, что кнопка появится и будет работать. Действительно, в некоторых случаях кнопка может появиться, и даже при ее нажатии будет открываться форма отправки электронного письма. Однако, как показывает практика и опыт многих разработчиков, письмо по факту может не отправляться. Это происходит потому, что команда ОтправитьПоПочте — это лишь часть сложного механизма. Сама отправка почты завязана на множество вспомогательных процедур и функций, которые могут находиться в общих модулях типовой конфигурации (например, РаботаСФайлами, УправлениеПечатью, РаботаСПочтовымиСообщениями) и не быть напрямую доступными или корректно инициализированными для внешнего отчета.
Подход 2: Копирование всей типовой формы отчета (рекомендуемый и наиболее надежный)
Наиболее универсальным и надежным подходом является не создание формы с нуля или частичное копирование, а копирование всей типовой формы отчета в ваш внешний отчет с последующей ее модификацией. Этот метод гарантирует, что весь базовый функционал, включая отправку по почте, сохранение настроек, печать и другие стандартные возможности, будет присутствовать и корректно работать, так как он завязан на логику типовой формы и ее связанные модули.
ОбщиеФормы.ФормаОтчета. Мы открываем ее в конфигураторе.Этот подход позволяет нам сохранить все преимущества типового функционала, включая корректную работу команды отправки по электронной почте, и при этом реализовать наши уникальные требования к отчету.
Одной из причин создания собственной формы отчета часто является необходимость установить определенные отборы автоматически, без возможности их изменения пользователем. Например, установить отбор Сотрудник = ТекущийПользователь. Рассмотрим, как мы можем это реализовать.
Проблема с прямым изменением параметров
Мы можем попытаться установить параметр отбора в обработчике формы, например, ПриОткрытии или ПриСозданииНаСервере. Однако, иногда возникает ситуация, когда наш параметр, установленный программно, замещается типовым пустым значением. Это может происходить из-за того, что стандартные механизмы работы с компоновщиком настроек или параметрами отчета в типовой форме перезаписывают наши изменения в более поздних обработчиках.
Метод 1: Использование дополнительных параметров компоновщика данных
Если прямое изменение основного отбора вызывает конфликты, мы можем использовать механизм дополнительных параметров компоновщика данных. Этот подход позволяет передать нужные значения в СКД, а затем использовать их для установки отбора, который будет "жестко" зафиксирован.
ПараметрСотрудник) на вкладке "Параметры".ПараметрСотрудник. Важно установить у этого элемента отбора флаг "Использование" в Истина, а также, возможно, установить "Режим отображения" в "Недоступный" или "Скрытый" на уровне настроек компоновщика, чтобы пользователь не мог его изменить.ПриСозданииНаСервере или ПриКомпоновкеРезультата) мы программно устанавливаем значение для этого параметра.
// Пример кода в обработчике ПриСозданииНаСервере() или ПриКомпоновкеРезультата()
// ...
Если ЗначениеЗаполнено(Пользователи.ТекущийПользователь()) Тогда
// Получаем текущие настройки компоновщика данных
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
// Находим наш дополнительный параметр и устанавливаем его значение
// (предполагается, что в СКД есть параметр с именем "ПараметрСотрудник")
Для Каждого Параметр Из Настройки.ПараметрыДанных.Элементы Цикл
Если Параметр.Параметр = "ПараметрСотрудник" Тогда
Параметр.Значение = Пользователи.ТекущийПользователь(); // Предполагаем, что ТекущийПользователь() возвращает ссылку на Сотрудника
Параметр.Использование = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
// Также можно добавить элемент отбора напрямую, если это необходимо
// и если в СКД явно не указан отбор по этому параметру
ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновщикаНастроек"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновщикаДанных("Сотрудник"); // Имя поля в СКД
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновщикаДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Пользователи.ТекущийПользователь();
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновщикаДанных.Недоступный; // Чтобы нельзя было изменить в интерфейсе
// Устанавливаем измененные настройки
КомпоновщикНастроек.УстановитьНастройки(Настройки);
КонецЕсли;
// ...
Метод 2: Отладка для выявления перезаписи параметров
Если автоматический отбор все равно не устанавливается или перезаписывается, необходимо использовать отладчик. Мы устанавливаем точки останова в ключевых местах: в обработчиках формы (ПриОткрытии, ПриСозданииНаСервере, ПриКомпоновкеРезультата) и в модулях компоновщика настроек. Пошагово выполняя код, мы сможем увидеть, в какой именно момент происходит установка нашего параметра, а затем — где и почему он перезаписывается или игнорируется. Это критически важный шаг для понимания логики работы типовой формы и корректного вмешательства в нее.
Метод 3: Проверка типов данных
Очень часто проблема с установкой отборов связана с несоответствием типов данных. Мы должны убедиться, что тип значения, которое мы подставляем в отбор (например, результат функции Пользователи.ТекущийПользователь()), соответствует типу поля, по которому мы отбираем (например, поле Сотрудник в базе данных). Если ТекущийПользователь() возвращает ссылку на объект типа "Пользователь", а поле отбора ожидает ссылку на объект типа "Сотрудник", нам потребуется выполнить преобразование или поиск соответствующего сотрудника на основе текущего пользователя.
// Пример преобразования, если ТекущийПользователь() возвращает ПользовательИБ,
// а нужно получить ссылку на Справочник.Сотрудники
Функция ПолучитьСотрудникаПользователя()
ТекущийПользовательИБ = Пользователи.ТекущийПользователь();
Если ТекущийПользовательИБ = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
// В типовых конфигурациях обычно есть связь между ПользователемИБ и Сотрудником
// через регистр сведений или реквизит пользователя/сотрудника
// Например, если есть регистр сведений "НастройкиПользователей" или "ДополнительныеСведенияПользователей"
// где хранится связь ПользовательИБ <-> Сотрудник
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Сотрудники.Ссылка КАК Сотрудник
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|ГДЕ
| Сотрудники.Пользователь = &ПользовательИБ"; // Предполагаем, что у сотрудника есть реквизит "Пользователь"
Запрос.УстановитьПараметр("ПользовательИБ", ТекущийПользовательИБ);
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда
Возврат Результат.Сотрудник;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
// Затем в обработчике формы используем:
// ОтборЗначение = ПолучитьСотрудникаПользователя();
Важно помнить, что без соответствия типов данных отбор может работать некорректно или не работать вовсе. Мы всегда должны проверять, какие объекты и типы данных ожидаются в поле отбора и какие значения мы передаем.
Когда кнопка отправки по почте уже добавлена (особенно если это был прямой перенос команды, а не всей формы), но письма не доходят до адресатов, мы сталкиваемся с новой проблемой. Рассмотрим наиболее частые причины и пути их устранения.
ПрофильЭлектроннойПочты, ИнтернетПочта, ИнтернетПочтовоеСообщение, а также на использование общих команд, связанных с отправкой.ИнтернетПочта.ЭлектронныеПисьмаКлиент, ЭлектронныеПисьмаСервер, УправлениеПечатью) доступны и корректно вызываются из нашего отчета.Заключение
Интеграция функционала отправки отчетов по электронной почте и настройка нередактируемых отборов в пользовательских формах отчетов 1С — это задача, требующая внимательного подхода. Мы выяснили, что наиболее надежным способом является копирование всей типовой формы отчета, что позволяет сохранить всю стандартную логику. Для отборов мы рекомендуем использовать дополнительные параметры компоновщика данных и тщательную отладку, а также проверку типов данных. При проблемах с самой отправкой письма мы анализируем настройки почтового профиля, права доступа, и детально отлаживаем код, проверяя также внешние факторы, такие как файрволы и параметры SMTP-сервера. Следуя этим рекомендациям, мы успешно реализуем нужный функционал в наших отчетах.