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

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

При работе с современными конфигурациями на базе 1С:Предприятие 8.3, такими как ERP Управление предприятием или Комплексная автоматизация, часто возникает задача автоматизации обмена данными. Одной из типовых задач является создание внешней обработки, которая должна самостоятельно, без участия пользователя, заходить в определенную папку, считывать файлы (например, логи, заказы в формате XML или CSV) и загружать их в систему. Основная сложность здесь заключается в правильном выборе контекста выполнения и настройке прав доступа.

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

Разбор архитектурной проблемы: Клиент или Сервер?

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

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

Шаг 1. Создание программного интерфейса обработки

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

Основной момент — использование вида ДополнительнаяОбработка и способа вызова ВызовСерверногоМетода. Рассмотрим пример кода для модуля объекта внешней обработки:


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

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
    
    Если ИдентификаторКоманды = "ЗагрузитьФайлыНаСервере" Тогда
        ЗагрузитьДанныеИзФайлов();
    КонецЕсли;
    
КонецПроцедуры

Обратите внимание на параметр БезопасныйРежим = Ложь. Если оставить его в значении Истина, платформа заблокирует любые попытки обращения к файловой системе, расценив это как потенциальную угрозу безопасности. Также мы определили процедуру ВыполнитьКоманду, которая является точкой входа при запуске задания.

Шаг 2. Реализация чтения файлов на сервере

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

Важное правило: используйте только полные сетевые пути в формате UNC (например, \\FileServer\Exchange\data.txt). Сервер 1С не знает о существовании диска Z:, так как этот диск был подключен в сессии конкретного пользователя, а служба 1С работает в своей собственной сессии.

Рассмотрим пример кода для чтения текстового файла на сервере:


Процедура ЗагрузитьДанныеИзФайлов()
    
    ПутьКПапке = "\\192.168.1.10\Exchange\Incoming\";
    МассивФайлов = НайтиФайлы(ПутьКПапке, "*.csv");
    
    Для Каждого ТекущийФайл Из МассивФайлов Цикл
        
        Попытка
            Текст = Новый ЧтениеТекста;
            Текст.Открыть(ТекущийФайл.ПолноеИмя, КодировкаТекста.UTF8);
            
            СтрокаДанных = Текст.ПрочитатьСтроку();
            Пока СтрокаДанных <> Неопределено Цикл
                // Здесь логика обработки строки
                СтрокаДанных = Текст.ПрочитатьСтроку();
            КонецЦикла;
            
            Текст.Закрыть();
            
            // После обработки файл желательно переместить или удалить
            ПереместитьФайл(ТекущийФайл.ПолноеИмя, ПутьКПапке + "Archive\" + ТекущийФайл.Имя);
            
        Исключение
            ЗаписьЖурналаРегистрации("ЗагрузкаФайлов", УровеньЖурналаРегистрации.Ошибка, , , 
                "Ошибка при обработке файла " + ТекущийФайл.Имя + ": " + ОписаниеОшибки());
        КонецПопытки;
        
    КонецЦикла;
    
КонецПроцедуры

Шаг 3. Настройка прав доступа и учетной записи службы

Даже при идеально написанном коде обработка может выдавать ошибку "Доступ запрещен". Выясним причину. По умолчанию служба Агент сервера 1С:Предприятия запускается от имени специального локального пользователя (например, USR1CV8). У этого пользователя нет прав на доступ к сетевым ресурсам вашего домена.

У нас есть два пути решения этой проблемы:

  1. Настройка прав на сетевой папке: Нужно предоставить права "Чтение и запись" пользователю ИМЯ_СЕРВЕРА\USR1CV8. Это работает, если папка находится на том же сервере или в той же доверенной среде.
  2. Смена учетной записи службы: В консоли управления службами Windows можно изменить пользователя, от которого запускается 1С, на доменную учетную запись, имеющую доступ к нужным сетевым путям. Внимание: это может потребовать перенастройки прав на локальные папки самого сервера 1С (журналы регистрации, временные файлы).

Шаг 4. Настройка «Безопасного режима» и профилей безопасности

В современных конфигурациях 1С:ERP просто установить БезопасныйРежим = Ложь в коде часто бывает недостаточно. При регистрации обработки в интерфейсе программы (Администрирование — Печатные формы, отчеты и обработки) система может принудительно включить безопасный режим.

Разберем, что нужно сделать в интерфейсе:

Особенности для Linux-серверов

Если ваш сервер 1С работает под управлением ОС Linux, следует помнить о ключевых отличиях. Во-первых, Linux чувствителен к регистру имен файлов и папок. Во-вторых, прямая работа с UNC-путями вида \\server\... там не поддерживается штатными средствами 1С.

Проанализируем алгоритм действий для Linux: сетевая папка должна быть сначала примонтирована к файловой системе сервера (например, через mount -t cifs в директорию /mnt/exchange), и в коде 1С вы будете обращаться к ней как к обычной локальной папке /mnt/exchange/data.xml. Не забудьте также проверить права доступа на уровне ОС Linux для пользователя usr1cv8.

Резюме и рекомендации

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

  1. Код должен быть строго серверным (ВызовСерверногоМетода).
  2. Использование полных сетевых путей (UNC) для Windows или точек монтирования для Linux.
  3. Наличие прав доступа у пользователя, под которым запущена служба 1С, к целевым папкам.

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

← На главную