При работе с современными конфигурациями на базе 1С:Предприятие 8.3, такими как ERP Управление предприятием или Комплексная автоматизация, часто возникает задача автоматизации обмена данными. Одной из типовых задач является создание внешней обработки, которая должна самостоятельно, без участия пользователя, заходить в определенную папку, считывать файлы (например, логи, заказы в формате XML или CSV) и загружать их в систему. Основная сложность здесь заключается в правильном выборе контекста выполнения и настройке прав доступа.
В этой статье мы подробно разберем, почему не подходят клиентские методы, как правильно зарегистрировать обработку в справочнике Дополнительные отчеты и обработки и как настроить серверную часть для бесперебойной работы.
Рассмотрим ситуацию, описанную пользователем: попытка использовать вид обработки ВызовКлиентскогоМетода для регламентного задания. Проанализируем, почему это невозможно. Регламентное задание — это процесс, который инициируется самим сервером 1С по заданному расписанию. В момент его запуска нет активного сеанса пользователя с открытым окном программы. Следовательно, нет «Клиента», на котором мог бы выполниться код. Все действия должны происходить строго в серверном контексте.
Если нам нужно прочитать файл на сервере, мы сталкиваемся с тем, что сервер «живет» в своей изолированной среде. Он не видит рабочий стол программиста или его личные сетевые диски. Поэтому решение задачи всегда состоит из двух этапов: написание правильного программного кода и подготовка инфраструктуры (прав доступа).
Для того чтобы система БСП (Библиотека стандартных подсистем) поняла, что нашу обработку можно запускать по расписанию, мы должны правильно описать функцию СведенияОВнешнейОбработке в модуле объекта. Выясним, какие параметры являются ключевыми.
Основной момент — использование вида ДополнительнаяОбработка и способа вызова ВызовСерверногоМетода. Рассмотрим пример кода для модуля объекта внешней обработки:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидДополнительнойОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Наименование = "Автоматическая загрузка файлов из папки";
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.БезопасныйРежим = Ложь; // Важно для работы с файлами
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Выполнить загрузку файлов (по расписанию)";
НоваяКоманда.Идентификатор = "ЗагрузитьФайлыНаСервере";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
НоваяКоманда.ПоказыватьОповещение = Ложь;
Возврат ПараметрыРегистрации;
КонецФункции
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
Если ИдентификаторКоманды = "ЗагрузитьФайлыНаСервере" Тогда
ЗагрузитьДанныеИзФайлов();
КонецЕсли;
КонецПроцедуры
Обратите внимание на параметр БезопасныйРежим = Ложь. Если оставить его в значении Истина, платформа заблокирует любые попытки обращения к файловой системе, расценив это как потенциальную угрозу безопасности. Также мы определили процедуру ВыполнитьКоманду, которая является точкой входа при запуске задания.
Теперь проанализируем, как именно сервер должен искать файлы. Поскольку мы работаем в серверном контексте, мы не можем использовать диалоги выбора файлов. Пути должны быть либо жестко прописаны, либо (что правильнее) вынесены в настройки обработки.
Важное правило: используйте только полные сетевые пути в формате UNC (например, \\FileServer\Exchange\data.txt). Сервер 1С не знает о существовании диска Z:, так как этот диск был подключен в сессии конкретного пользователя, а служба 1С работает в своей собственной сессии.
Рассмотрим пример кода для чтения текстового файла на сервере:
Процедура ЗагрузитьДанныеИзФайлов()
ПутьКПапке = "\\192.168.1.10\Exchange\Incoming\";
МассивФайлов = НайтиФайлы(ПутьКПапке, "*.csv");
Для Каждого ТекущийФайл Из МассивФайлов Цикл
Попытка
Текст = Новый ЧтениеТекста;
Текст.Открыть(ТекущийФайл.ПолноеИмя, КодировкаТекста.UTF8);
СтрокаДанных = Текст.ПрочитатьСтроку();
Пока СтрокаДанных <> Неопределено Цикл
// Здесь логика обработки строки
СтрокаДанных = Текст.ПрочитатьСтроку();
КонецЦикла;
Текст.Закрыть();
// После обработки файл желательно переместить или удалить
ПереместитьФайл(ТекущийФайл.ПолноеИмя, ПутьКПапке + "Archive\" + ТекущийФайл.Имя);
Исключение
ЗаписьЖурналаРегистрации("ЗагрузкаФайлов", УровеньЖурналаРегистрации.Ошибка, , ,
"Ошибка при обработке файла " + ТекущийФайл.Имя + ": " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Даже при идеально написанном коде обработка может выдавать ошибку "Доступ запрещен". Выясним причину. По умолчанию служба Агент сервера 1С:Предприятия запускается от имени специального локального пользователя (например, USR1CV8). У этого пользователя нет прав на доступ к сетевым ресурсам вашего домена.
У нас есть два пути решения этой проблемы:
ИМЯ_СЕРВЕРА\USR1CV8. Это работает, если папка находится на том же сервере или в той же доверенной среде.В современных конфигурациях 1С:ERP просто установить БезопасныйРежим = Ложь в коде часто бывает недостаточно. При регистрации обработки в интерфейсе программы (Администрирование — Печатные формы, отчеты и обработки) система может принудительно включить безопасный режим.
Разберем, что нужно сделать в интерфейсе:
Если ваш сервер 1С работает под управлением ОС Linux, следует помнить о ключевых отличиях. Во-первых, Linux чувствителен к регистру имен файлов и папок. Во-вторых, прямая работа с UNC-путями вида \\server\... там не поддерживается штатными средствами 1С.
Проанализируем алгоритм действий для Linux: сетевая папка должна быть сначала примонтирована к файловой системе сервера (например, через mount -t cifs в директорию /mnt/exchange), и в коде 1С вы будете обращаться к ней как к обычной локальной папке /mnt/exchange/data.xml. Не забудьте также проверить права доступа на уровне ОС Linux для пользователя usr1cv8.
Подведем итог нашей совместной работы по настройке автоматизации. Чтобы внешняя обработка успешно читала файлы по расписанию, необходимо соблюдение трех условий:
ВызовСерверногоМетода).Используя данный подход, мы обеспечиваем надежную работу системы в фоновом режиме, исключая необходимость держать открытым клиентский сеанс 1С для работы обработчиков ожидания.