Как сохранить сформированный Excel-файл из 1С на сетевой диск и отправить по электронной почте?

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

При работе в 1С часто возникает необходимость не только сформировать какой-либо документ, например, Excel-файл, но и сохранить его в определённое место (локально или на сетевой диск), а также отправить по электронной почте. Рассмотрим подробнее, как реализовать этот функционал в 1С 8.2/8.3, уделяя особое внимание вопросам сохранения на сетевой ресурс и прав доступа.

Представим, что у нас уже есть сформированный табличный документ (ТабДок) в 1С, который мы хотим сохранить как Excel-файл.

Шаг 1: Базовое сохранение табличного документа в файл

Прежде всего, давайте разберем, как сохранить табличный документ в файл на локальный диск или во временную папку. Для этого используется метод Записать() объекта ТабличныйДокумент.

Рассмотрим пример кода:


// Определяем имя файла
ИмяФайла = КаталогВременныхФайлов + "название_файла" + ".xlsx";

// Помещаем содержимое ТабДок в файл
Попытка
    ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
    Сообщить("Успешное сохранение файла!");
Исключение
    Сообщить(ОписаниеОшибки);
КонецПопытки;

В этом примере:

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

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

Шаг 2: Сохранение файла на сетевой диск

Чтобы сохранить файл не во временную папку, а непосредственно в сетевую папку, нам необходимо изменить путь, который мы передаем в метод Записать().

Вместо КаталогВременныхФайлов, мы должны указать полный UNC-путь к сетевому ресурсу. UNC-путь имеет формат \\ИмяСервера\ИмяРесурса\ПапкаДляФайлов\ИмяФайла.xlsx.

Пример изменения кода:


// Указываем полный UNC-путь к сетевой папке
СетеваяПапка = "\\МойСерверФайлов\ОбщаяПапка\Отчеты\"; // Обязательно заканчивайте слешем
ИмяФайлаДляСохранения = СетеваяПапка + "название_файла_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmmss") + ".xlsx";

// Помещаем содержимое ТабДок в файл на сетевой ресурс
Попытка
    ТабДок.Записать(ИмяФайлаДляСохранения, ТипФайлаТабличногоДокумента.XLSX);
    Сообщить("Файл успешно сохранен на сетевой ресурс: " + ИмяФайлаДляСохранения);
Исключение
    Сообщить("Ошибка при сохранении файла на сетевой ресурс: " + ОписаниеОшибки);
КонецПопытки;

Здесь мы:

  1. Определяем переменную СетеваяПапка с полным UNC-путем к целевой сетевой папке. Важно использовать UNC-путь, а не букву диска (например, Z:\), так как буквы дисков привязаны к сессии конкретного пользователя и могут быть недоступны для серверных процессов 1С.
  2. Формируем уникальное имя файла, добавляя текущую дату и время, чтобы избежать перезаписи при повторном запуске.
  3. Вызываем метод ТабДок.Записать(), передавая ему новый путь.

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

Шаг 3: Настройка прав доступа для серверных операций

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

Сценарий 1: Сохранение на стороне клиента

Если код, который вы написали, выполняется в контексте клиентского приложения 1С (например, по нажатию кнопки в тонком или толстом клиенте), то файл будет сохраняться от имени того пользователя Windows, под которым запущено клиентское приложение 1С. В этом случае, именно у этого пользователя Windows должны быть права на запись в указанную сетевую папку.

Сценарий 2: Сохранение на стороне сервера

Если же формирование и сохранение файла происходит на сервере 1С (например, в регламентном задании, фоновом задании или в серверном вызове), то операции с файлами выполняются от имени пользователя, под которым запущен процесс сервера 1С. В большинстве случаев это служебный пользователь USR1CV8 (или аналогичный, зависящий от настроек сервера и операционной системы, например, nt service\1cv8 для некоторых версий). Именно этому пользователю необходимо предоставить полные права на чтение и запись в целевую сетевую папку.

Рассмотрим, как это сделать:

  1. Определите пользователя сервера 1С: На сервере 1С откройте "Службы" (services.msc). Найдите службу "1C:Enterprise 8.x Server" (или похожую). В свойствах этой службы на вкладке "Вход в систему" вы увидите, под какой учетной записью она запущена. Чаще всего это "Системная учетная запись" или специальный пользователь USR1CV8.
  2. Предоставьте права на сетевую папку: Перейдите к сетевой папке (на файловом сервере), на которую вы хотите сохранять файлы.
    • Щелкните правой кнопкой мыши по папке и выберите "Свойства".
    • Перейдите на вкладку "Доступ" или "Общий доступ" и убедитесь, что папка расшарена (доступна по сети). Запомните имя сетевого ресурса.
    • Перейдите на вкладку "Безопасность".
    • Нажмите кнопку "Изменить" (или "Дополнительно") и затем "Добавить".
    • Введите имя пользователя сервера 1С (например, USR1CV8 или имя доменной учетной записи, под которой запущена служба 1С) и нажмите "Проверить имена".
    • После того как пользователь будет найден, выберите его и предоставьте ему права на "Полный доступ" или как минимум "Изменение" и "Запись".
    • Примените изменения.

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

Шаг 4: Интеграция отправки файла по электронной почте

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

Для отправки писем в 1С используются объекты, связанные с электронной почтой. Обычно это метод ОтправитьСообщение объекта ЭлектроннаяПочта, который требует параметры письма в виде структуры.

Рассмотрим следующий код, который демонстрирует этот процесс:


// 1. Помещаем макет в файл .xlsx во временную папку
//    Это необходимо, так как для вложения файла в письмо нужен физический файл.
ИмяФайлаВременного = КаталогВременныхФайлов + "ИМЯ_ФАЙЛА" + ".xlsx";

Попытка
    ТабДок.Записать(ИмяФайлаВременного, ТипФайлаТабличногоДокумента.XLSX); // Помещаем содержимое ТабДок в файл
    Сообщить("Успешное сохранение временного файла!");
Исключение
    Сообщить("Ошибка при сохранении временного файла: " + ОписаниеОшибки);
    Возврат; // Выходим из процедуры, если не удалось сохранить файл
КонецПопытки;

// 2. Подготавливаем вложения для письма
Вложения = Новый Структура;
Вложения.Вставить("Отчет", ИмяФайлаВременного); // Ключ "Отчет" - это имя вложения, ИмяФайлаВременного - путь к файлу

// 3. Формируем параметры письма
ПараметрыПисьма = Новый Структура;
ТемаПисьма = "Excel-файл с отчетом";
ЭлектронкаПолучателя = "user@example.com"; // Укажите адрес получателя

// Заполняем структуру параметров письма
ПараметрыПисьма.Вставить("Тема", ТемаПисьма);
ПараметрыПисьма.Вставить("Тело", "Во вложении находится сформированный Excel-файл.");
ПараметрыПисьма.Вставить("Кому", ЭлектронкаПолучателя);
ПараметрыПисьма.Вставить("Вложения", Вложения);

// 4. Отправляем письмо
Попытка
    // Справочники.УчетныеЗаписиЭлектроннойПочты.СистемнаяУчетнаяЗаписьЭлектроннойПочты -
    // это предопределенный элемент справочника, который хранит настройки учетной записи почты.
    // Убедитесь, что эта учетная запись настроена и работает.
    ЭлектроннаяПочта.ОтправитьСообщение(Справочники.УчетныеЗаписиЭлектроннойПочты.СистемнаяУчетнаяЗаписьЭлектроннойПочты, ПараметрыПисьма);
    Сообщить("Письмо успешно отправлено!");
Исключение
    Сообщить("Ошибка при отправке письма: " + ОписаниеОшибки);
КонецПопытки;

// 5. Опционально: Сохраняем файл на сетевой диск (как было описано в Шаге 2)
СетеваяПапка = "\\МойСерверФайлов\ОбщаяПапка\Отчеты\";
ИмяФайлаНаСетевомРесурсе = СетеваяПапка + "название_файла_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmmss") + ".xlsx";

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

В этом комплексном примере мы:

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

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

Дополнительные рекомендации

Таким образом, путем последовательного выполнения этих шагов и внимательной настройки прав доступа, мы с вами успешно решим задачу сохранения сформированного Excel-файла на сетевой диск и его отправки по электронной почте из 1С.

← На главную