Почему перестали добавляться вложения в письма в 1С и как это исправить?

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

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

Выясним причину: почему сервер не видит файл?

Проанализируем типичную ситуацию. Программист использует метод Вложения.Добавить(), передавая в него путь к файлу в сетевой папке, например, \\BUH-SERVER\Documents\Invoice.pdf. Внезапно операция начинает давать сбой, хотя пользователь со своего рабочего места может открыть этот файл без проблем. Главная причина кроется в архитектуре 1С. Когда процедура выполняется «на сервере», все операции с файловой системой происходят не от имени текущего пользователя Windows, а от имени учетной записи, под которой запущена служба «Агент сервера 1С:Предприятия» (обычно это usr1cv8 или LocalSystem).

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

  1. Права NTFS и права на общий доступ: Учетная запись сервера 1С должна иметь права «Чтение» не только в настройках безопасности папки, но и на уровне сетевого доступа (Share Permissions).
  2. Интерактивный вход: Служба сервера не является интерактивным пользователем, поэтому она не может «подключить сетевой диск» (например, диск Z:). Использование UNC-путей (вида \\Server\Folder) является обязательным, но и оно требует явного разрешения для учетной записи службы.
  3. Протоколы SMB: После обновлений безопасности Windows может быть отключена поддержка старых протоколов (SMB 1.0), что мешает серверу 1С корректно обращаться к старым файловым хранилищам.

Разберем решение: переход на использование двоичных данных

Чтобы сделать код независимым от прав доступа службы сервера к сетевым ресурсам, мы применим метод передачи данных через ДвоичныеДанные и временное хранилище. Это универсальный способ, который позволяет «поднять» файл на клиенте (где у пользователя точно есть доступ) и передать его на сервер для вложения в письмо. Рассмотрим этот процесс по шагам.

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


// Код на клиенте
ПутьКФайлу = "\\BUH-SERVER\Документы\Счет №924.pdf";
ФайлНаДиске = Новый Файл(ПутьКФайлу);

Если ФайлНаДиске.Существует() Тогда
    // Получаем двоичные данные файла
    ДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлу);
    // Помещаем во временное хранилище и получаем адрес
    АдресХранилища = ПоместитьВоВременноеХранилище(ДанныеФайла, ЭтаФорма.УникальныйИдентификатор);
    
    // Передаем адрес и имя файла на сервер
    ОтправитьПисьмоНаСервере(АдресХранилища, ФайлНаДиске.Имя);
КонецЕсли;

Теперь проанализируем ситуацию на стороне сервера. Получив адрес во временном хранилище, сервер извлекает данные и создает вложение. Важно помнить, что при использовании ДвоичныеДанные нам нужно явно указать имя файла, иначе получатель увидит вложение с техническим именем типа no_name.


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

Рассмотрим оптимизацию: как избежать лишних строк кода

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

Обратите внимание на свойство Расширение. Если вы формируете имя файла программно, всегда проверяйте наличие точки. Использование ДвоичныеДанные позволяет передавать файлы любых типов: PDF, Excel, TXT — серверу 1С будет «все равно» на расширение, пока вы не укажете его во втором параметре метода Вложения.Добавить().

Дополнительные технические нюансы

Существуют ситуации, когда даже работа через двоичные данные может дать сбой. Разберем наиболее частые случаи:

  1. Ограничение MAX_PATH: В операционных системах Windows стандартное ограничение длины пути составляет 260 символов. Если ваш файл лежит очень глубоко в сетевых папках, 1С может выдать ошибку файловой операции. Старайтесь использовать короткие пути или перекладывать файлы во временный каталог КаталогВременныхФайлов() перед обработкой.
  2. Блокировка антивирусом: Некоторые антивирусные системы (EDR) блокируют попытки процесса rphost.exe читать файлы из сетевых шар, расценивая это как подозрительную активность (похоже на работу вируса-шифровальщика). Проверьте логи антивируса на сервере 1С.
  3. Файл занят другим процессом: Если счет или отчет генерируется в этой же процедуре за секунду до отправки, файл может быть еще не «отпущен» операционной системой. В таких случаях полезно использовать конструкцию Попытка...Исключение с небольшой паузой.

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

← На главную