Разработка и отладка регламентных заданий в 1С — это процесс, который часто преподносит сюрпризы. Типичная ситуация: вы написали сложный механизм загрузки документов, отладили его на клиенте через внешнюю обработку, и всё работает идеально. Однако, как только этот же код запускается планировщиком в виде регламентного задания, начинается "магия" — задание отрабатывает без ошибок, но обрабатывает лишь часть данных (например, 2-3 документа из 10). Рассмотрим подробнее, почему так происходит и как найти "бутылочное горлышко" в серверном коде.
Первое, что мы должны проанализировать — это разница в окружении. Когда вы запускаете код из обработки, он выполняется в контексте вашего сеанса. Регламентное же задание выполняется в специальном фоновом сеансе на сервере. Разберем по шагам ключевые отличия:
Предупреждение(), Вопрос() или открытие формы, фоновое задание может вести себя непредсказуемо. На сервере нет интерфейса, и любые попытки взаимодействия с пользователем либо вызывают исключение, либо игнорируются, прерывая логику алгоритма.Выясним причину, связанную с внешними данными. Если ваше регламентное задание загружает файлы из сетевых каталогов, проверьте следующие моменты:
Служба сервера 1С (обычно под пользователем usr1cv8) не видит сетевые диски (например, диск Z:), которые подключены в вашем сеансе Windows. Проанализируем пример правильного обращения к файлу:
// Плохо: путь к диску, который видит только текущий пользователь
ПутьКФайлу = "Z:\Exchange\import.xml";
// Хорошо: использование UNC-пути, доступного серверу
ПутьКФайлу = "\\ServerName\Exchange\import.xml";
Важно убедиться, что у учетной записи, от имени которой запущена служба 1C:Enterprise Server, есть физические права на чтение и запись в целевую папку.
Одной из наиболее вероятных причин частичного выполнения являются блокировки. Рассмотрим ситуацию: регламентное задание запускается в момент активной работы пользователей. При попытке записать 4-й документ по счету, задание сталкивается с тем, что объект заблокирован другим пользователем или другим фоновым процессом.
Если в коде используется конструкция Попытка...Исключение с пустым блоком Исключение, ошибка записи просто "проглатывается", и цикл переходит к следующему объекту. Проанализируем, как правильно логгировать такие моменты:
Для Каждого ДокументСсылка Из СписокДокументов Цикл
Попытка
ОбъектДок = ДокументСсылка.ПолучитьОбъект();
ОбъектДок.Записать(РежимЗаписиДокумента.Проведение);
Исключение
// Обязательно записываем ошибку в Журнал Регистрации
ЗаписьЖурналаРегистрации("ЗагрузкаДанных",
УровеньЖурналаРегистрации.Ошибка,
,
,
"Ошибка при записи документа " + ДокументСсылка + ": " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Если ваша процедура вызывается из расширения или через механизм дополнительных отчетов и обработок, она может запускаться в Безопасном режиме. В этом режиме накладываются жесткие ограничения на:
Проверьте настройки в справочнике "Дополнительные отчеты и обработки" или параметры вызова фонового задания. Возможно, стоит временно отключить безопасный режим для проверки гипотезы.
Поскольку "вслепую" искать ошибку в тысячах строк кода крайне сложно, воспользуемся инструментами отладки. Разберем алгоритм настройки:
Важный нюанс: Отладка на сервере возможна только в том случае, если сервер 1С запущен с параметром -debug. Если отладчик не "цепляется", проверьте параметры запуска службы 1С.
Если отладка на сервере невозможна по техническим причинам, применим метод "трассировки" через текстовый файл. Это поможет понять, на каком именно шаге прерывается выполнение. Рассмотрим пример функции для записи лога:
Процедура ЗаписатьВЛог(ТекстСообщения)
Текст = Новый ТекстовыйДокумент;
ПутьКЛогу = "C:\Logs\my_job_log.txt";
Попытка
Текст.Прочитать(ПутьКЛогу);
Исключение
// Файл не существует
КонецПопытки;
Текст.ДобавитьСтроку("" + ТекущаяДата() + ": " + ТекстСообщения);
Текст.Записать(ПутьКЛогу);
КонецПроцедуры
Добавляя вызов этой процедуры после каждого ключевого этапа (чтение данных, поиск контрагента, создание договора, запись документа), вы увидите полную картину происходящего в фоновом режиме.
Подводя итог, можно сказать: чудес не бывает. Если 1С выполняет код лишь частично, значит, она либо не видит данные из-за прав/RLS, либо натыкается на блокировку, либо выполнение прерывается из-за неявной ошибки, которая не выводится в интерфейс. Тщательное логгирование и отладка именно серверного контекста — единственный верный путь к решению.