Перенос функционала из обычной обработки, запускаемой пользователем вручную, в автоматический режим регламентных заданий — это классическая задача для разработчика 1С. Однако на этом пути часто возникают препятствия, связанные с разницей между контекстом клиентского приложения и сервера. В этой статье мы разберем, почему код, успешно работающий в форме, может «отказываться» запускаться по расписанию, и как правильно настроить серверное окружение для работы с файлами.
Разберем основную причину неудачи при первом запуске регламентного задания. Когда мы нажимаем кнопку на форме, код выполняется в контексте клиента (или с переходом на сервер от имени текущего пользователя ОС). Регламентное задание всегда выполняется на сервере в фоновом сеансе. Это накладывает два важнейших ограничения:
КомандаФормы, Элементы, а также нельзя использовать интерактивные методы вроде Предупреждение() или Вопрос().USR1CV8). У этого пользователя нет доступа к вашему рабочему столу или личным папкам "Мои документы".Проанализируем типичную ошибку в объявлении метода. Если ваша процедура в общем модуле выглядит так:
Процедура ЗаписьДанных(Команда) Экспорт
// Код выгрузки
КонецПроцедуры
Она никогда не запустится из регламентного задания. Параметр Команда передается платформой только при нажатии кнопки в интерфейсе. Регламентное задание вызывает метод «напрямую» и, если в настройках задания не указаны параметры, оно ожидает увидеть процедуру без параметров. Правильный вариант для фонового процесса:
Процедура ЗаписьДанных() Экспорт
// Код выгрузки, не зависящий от элементов формы
КонецПроцедуры
Чтобы платформа «увидела» ваш метод, необходимо убедиться, что общий модуль, в котором размещен код, настроен правильно. Проверим следующие свойства в палитре свойств модуля:
Проанализируем ситуацию, когда возникает ошибка «Метод задания не найден». Помимо проверки флага Экспорт, обязательно убедитесь, что вы применили изменения конфигурации (нажали F7). В серверном режиме платформа кэширует конфигурацию, и иногда требуется перезапуск фонового задания после обновления базы данных.
Рассмотрим вопрос сохранения XML-файла. Попытка записать файл по пути C:\Users\Администратор\Desktop\... обречена на провал, если сервер 1С находится на другом физическом компьютере или если у пользователя службы 1С нет прав на эту папку. Разберем шаги по организации доступа:
D:\Exchange\XML\.USR1CV8 (или того, под которым запущен сервер) и дать ему права «Изменение» и «Запись».\\ServerName\Folder\file.xml. При этом права должны быть даны как на уровне файловой системы (NTFS), так и на уровне общего доступа (Sharing).Посмотрим на оптимизированный пример кода, который учитывает серверную специфику и требования к безопасности:
Процедура ЗаписьДанных() Экспорт
// Определяем путь. Лучше вынести его в константу или настройку программы
ПутьКФайлу = "D:\Exchange\my_document.xml";
ЗаписьXML = Новый ЗаписьXML;
Попытка
ЗаписьXML.ОткрытьФайл(ПутьКФайлу);
Исключение
// Если не удалось открыть файл, записываем ошибку в журнал регистрации
ЗаписьЖурналаРегистрации("ВыгрузкаXML", УровеньЖурналаРегистрации.Ошибка, , ,
"Не удалось открыть файл для записи: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("Корневой");
ЗаписьXML.ЗаписатьАтрибут("ИмяСправочника", "Контрагенты");
// Используем запрос для получения данных на сервере - это быстрее и надежнее
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.ИНН КАК УНП,
| Контрагенты.Наименование КАК Наименование,
| Контрагенты.НаименованиеПолное КАК ПолноеНаименование
|ИЗ
| Справочник.Контрагенты КАК Контрагенты";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("ЭлементСправочника");
ЗаписьXML.ЗаписатьНачалоЭлемента("УНП");
ЗаписьXML.ЗаписатьТекст(Строка(ВыборкаДетальныеЗаписи.УНП));
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьНачалоЭлемента("Наименование");
ЗаписьXML.ЗаписатьТекст(ВыборкаДетальныеЗаписи.Наименование);
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьНачалоЭлемента("ПолноеНаименование");
ЗаписьXML.ЗаписатьТекст(ВыборкаДетальныеЗаписи.ПолноеНаименование);
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьКонецЭлемента(); // ЭлементСправочника
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента(); // Корневой
ЗаписьXML.Закрыть();
ЗаписьЖурналаРегистрации("ВыгрузкаXML", УровеньЖурналаРегистрации.Информация, , , "Выгрузка успешно завершена");
КонецПроцедуры
Если задание все равно не выполняется, проанализируем ситуацию с помощью встроенных инструментов. Выясним причину через Журнал регистрации (меню Администрирование – Обслуживание – Журнал регистрации). Отфильтруйте события по колонке «Приложение» со значением «Фоновое задание».
Для «живой» отладки кода выполним следующие действия:
Помните, что для работы регламентных заданий в клиент-серверном варианте не нужно держать открытым сеанс пользователя или конфигуратор — достаточно запущенной службы сервера 1С. В файловом же варианте для работы заданий должен быть запущен хотя бы один сеанс пользователя, который будет выступать в роли «планировщика».