Как исправить ошибку с присоединенными файлами при отправке исходящей почты в 1С:ERP

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

При активной работе в системе 1С:ERP Управление предприятием пользователи могут столкнуться с неприятной ситуацией: при попытке отправить исходящее электронное письмо возникает ошибка, блокирующая отправку, а вкладка Файлы в документе становится недоступной. При этом в поле предмета письма или в связанных объектах может появиться надпись Объект не найден. Настройки томов хранения при этом активны, права доступа у пользователей присутствуют, а стандартные файлы без проблем записываются в систему.

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

Выясняем причину: почему блокируется отправка писем?

Для начала разберем природу ошибки. Наличие префикса СТ_ в параметре СТ_ВидПрисоединенногоФайла однозначно указывает на то, что в вашей информационной базе используется кастомное расширение или выполнена индивидуальная доработка конфигурации. Скорее всего, разработчики внедрили этот реквизит в справочники присоединенных файлов для классификации документов (например, разделения на договоры, акты, сканы) и автоматического распределения их по разным томам хранения на диске.

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

Стандартный код БСП ничего не знает о добавленном программистами реквизите СТ_ВидПрисоединенногоФайла и, соответственно, никак его не заполняет при автоматическом создании файла-вложения. При попытке записи нового элемента в справочник присоединенных файлов срабатывает кастомный контроль (или правила размещения в томах), который видит пустое значение реквизита и блокирует запись. Происходит аварийный откат транзакции, файлы не прикрепляются, а ссылка на них ломается, превращаясь в «Объект не найден».

Ниже мы рассмотрим три эффективных способа решения этой проблемы в зависимости от архитектурных стандартов вашей компании.

Вариант 1. Доработка через расширение общего модуля РаботаСФайлами

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

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

  1. Создайте или откройте существующее расширение конфигурации.
  2. Добавьте в расширение общий модуль РаботаСФайлами.
  3. Найдите функцию, отвечающую за подготовку параметров создания файла. В актуальных версиях БСП это ПараметрыДобавленияФайла().
  4. Напишите для неё метод-перехватчик с аннотацией &После.

Рассмотрим пример кода, который необходимо внедрить в расширение:


&После("ПараметрыДобавленияФайла")
Функция СТ_ПараметрыДобавленияФайла(ДополнительныеРеквизиты = Неопределено)
    Результат = ПродолжитьВызов(ДополнительныеРеквизиты);
    
    // Добавляем наш кастомный параметр в структуру параметров по умолчанию.
    // Если тип реквизита справочник, инициализируем его пустой ссылкой.
    Результат.Вставить("СТ_ВидПрисоединенногоФайла", Справочники.СТ_ВидыПрисоединенныхФайлов.ПустаяСсылка());
    
    Возврат Результат;
КонецФункции

Важное примечание: имя справочника видов файлов СТ_ВидыПрисоединенныхФайлов в вашей базе может отличаться. Замените его на фактическое имя метаданных, используемое в вашей конфигурации. Этот способ гарантирует, что при вызове функции РаботаСФайлами.ДобавитьФайлы структура параметров не вызовет ошибку отсутствия ключа.

Вариант 2. Использование подписки на событие ПередЗаписью (Рекомендуемый подход)

Этот способ является наиболее надежным и универсальным (Best Practice). Вместо вмешательства в логику работы общих модулей БСП, мы перехватим запись самого объекта присоединенного файла непосредственно перед фиксацией транзакции в базе данных. Это сработает для любых файлов, создаваемых как интерактивно, так и программно (через почту, бизнес-процессы или интеграции).

Для реализации этого сценария выполните следующие действия:

  1. В расширении создайте новую Подписку на событие. Назовите её, например, СТ_ПрисоединенныйФайлПередЗаписью.
  2. В качестве источника выберите определяемый тип ПрисоединенныйФайлОбъект (в этот тип входят все справочники присоединенных файлов системы, включая файлы писем).
  3. В качестве события выберите ПередЗаписью.
  4. Создайте обработчик события в общем модуле расширения и пропишите в нем заполнение реквизита.

Проанализируем пример программного кода для обработчика:


Процедура СТ_ПрисоединенныйФайлПередЗаписью(Источник, Отказ, Замещение) Экспорт
    
    // Исключаем работу обработчика при обмене данными
    Если Источник.ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    
    // Проверяем программно наличие нашего реквизита в метаданных справочника-источника
    ИмяСправочника = Источник.Метаданные().Имя;
    Если Метаданные.Справочники[ИмяСправочника].Реквизиты.Найти("СТ_ВидПрисоединенногоФайла") <> Неопределено Тогда
        
        // Если реквизит вида файла пустой, заполняем его значением по умолчанию
        Если Не ЗначениеЗаполнено(Источник.СТ_ВидПрисоединенногоФайла) Тогда
            // Пытаемся найти или предопределенный элемент, или элемент по умолчанию
            ДефолтныйВид = Справочники.СТ_ВидыПрисоединенныхФайлов.НайтиПоНаименованию("Электронная почта");
            
            Если ЗначениеЗаполнено(ДефолтныйВид) Тогда
                Источник.СТ_ВидПрисоединенногоФайла = ДефолтныйВид;
            Иначе
                // Если специального вида нет, оставляем пустую ссылку, при условии, 
                // что логика работы томов это корректно обрабатывает
                Источник.СТ_ВидПрисоединенногоФайла = Справочники.СТ_ВидыПрисоединенныхФайлов.ПустаяСсылка();
            EndIf;
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

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

Вариант 3. Настройка правил размещения файлов без изменения кода

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

Посмотрим, как устроена логика работы томов хранения:

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

Резюме

Мы проанализировали ошибку отправки исходящих писем в 1С:ERP и выяснили, что она вызвана конфликтом кастомного классификатора СТ_ВидПрисоединенногоФайла и стандартных механизмов БСП. Для исправления ситуации вы можете выбрать наиболее подходящий для вас путь: настроить дефолтное правило для пустых видов файлов в интерфейсе программы, либо программно гарантировать заполнение реквизита через расширение или подписку на событие ПередЗаписью.

← На главную