Как исправить ошибку «Не найдено созданное регламентное задание» при обмене в 1С?

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

Синхронизация данных между различными конфигурациями, например, между 1С:CRM и 1С:Бухгалтерия предприятия (БП), — это критически важный процесс для любого бизнеса. Большинство современных интеграций в экосистеме «1С:Предприятие 8» функционируют на базе Библиотеки стандартных подсистем (БСП). Автоматический обмен по расписанию опирается на механизм регламентных заданий. Однако пользователи и администраторы нередко сталкиваются с ошибкой: «Не найдено созданное регламентное задание». В результате автоматический обмен полностью блокируется.

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

Выясняем причину: почему уникальный идентификатор равен нулям?

Давайте проанализируем ситуацию изнутри. При попытке запустить обмен система обращается к процедуре запуска регламентного задания на сервере. Код этой процедуры выглядит следующим образом:


&НаСервере
Процедура ЗапуститьРегламентноеЗадание(Отказ)
    
    Если Не ЗначениеЗаполнено(РегламентноеЗаданиеУИН) Тогда
        Отказ = Истина;
        Возврат;
    КонецЕсли;
    
    ЗаданиеОбработки = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(РегламентноеЗаданиеУИН); 
    ЗаданиеОбработки.Использование = Истина;
    ЗаданиеОбработки.Записать();    
    
КонецПроцедуры

В процессе отладки выясняется, что реквизит формы РегламентноеЗаданиеУИН, имеющий тип УникальныйИдентификатор, содержит значение 00000000-0000-0000-0000-000000000000. Это так называемый пустой УИН.

Поскольку значение не заполнено, срабатывает условие проверки, переменная Отказ принимает значение Истина, и управление возвращается на клиентскую сторону, где пользователю выводится предупреждение:


Если Отказ Тогда
    ПоказатьПредупреждение(, НСтр("ru='Не найдено созданное регламентное задание.'"));
    Возврат;
КонецЕсли;

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

  1. Перенос или копирование информационной базы. Это самая частая причина. При создании тестовой копии базы данных («зеркала») на другом сервере или локальном компьютере старые связи с регламентными заданиями ломаются. Физически регламентные задания привязаны к конкретному кластеру серверов 1С. В новой копии базы старый УИН ссылается на «несуществующий» объект.
  2. Обмен никогда не настраивался по расписанию. Если обмен данными до этого запускался исключительно вручную, то регламентное задание для него могло быть вообще не создано в системе. Соответственно, и идентификатор остался незаполненным.
  3. Сбой при обновлении конфигурации или пересоздании узла обмена. Если в процессе обновления системы или ручного редактирования планов обмена узел был перезаписан или удален, служебные ссылки БСП могли быть утеряны.

Где в системе хранится этот идентификатор?

Многие разработчики совершают ошибку, пытаясь найти место заполнения реквизита РегламентноеЗаданиеУИН простым глобальным поиском по конфигурации. Поскольку поиск выдает лишь операции чтения, создается иллюзия, что значение берется «из ниоткуда».

На самом деле в типовых конфигурациях этот идентификатор сохраняется в базе данных в нескольких местах, в зависимости от версии БСП:

При открытии обработки обмена система считывает УИН из соответствующего узла плана обмена и помещает его в реквизит формы. Если в самом узле записан пустой УИН, то и на форме мы увидим нули.

Связывание происходит в момент первой успешной записи расписания обмена. В коде это выглядит так:


// Создание задания на сервере
ЗаданиеОбработки = РегламентныеЗадания.СоздатьРегламентноеЗадание("ИмяВашегоРегламентногоЗадания");
ЗаданиеОбработки.Наименование = "Синхронизация данных с CRM";
ЗаданиеОбработки.Записать();

// Получение нового УИН и его запись в реквизит
РегламентноеЗаданиеУИН = ЗаданиеОбработки.УникальныйИдентификатор;

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

Способ 1. Интерактивное пересоздание расписания (без изменения кода)

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

Выполним следующие шаги:

  1. Перейдем в раздел Администрирование — Синхронизация данных (или откроем настройки интеграции непосредственно в CRM).
  2. Найдем наш сценарий обмена данными, в котором возникает ошибка.
  3. Откроем настройки расписания этого обмена. Если флаг «Использовать расписание» (или «Автоматически по расписанию») включен, снимем его и сохраним настройки обмена.
  4. Снова откроем настройку расписания, установим флаг использования расписания обратно, зададим любое расписание (например, каждый день) и нажмем кнопку Записать или Готово.

В этот момент система выполнит стандартный алгоритм БСП: увидит, что старого задания нет, создаст на сервере новое регламентное задание, получит его свежий рабочий УИН и запишет его в узел плана обмена. После этого ошибка должна исчезнуть.

Способ 2. Программное восстановление связи через внешнюю обработку

Если интерактивный способ не помог (например, из-за доработок интерфейса кнопка настройки расписания недоступна или заблокирована), мы можем исправить ситуацию программно. Для этого воспользуемся внешней обработкой «Консоль кода» или создадим простую одноразовую обработку.

Нам потребуется написать скрипт, который создаст новое регламентное задание на сервере 1С и принудительно запишет его идентификатор в узел обмена. Рассмотрим пример такого кода:


// Шаг 1. Находим нужный узел плана обмена
// Вместо "ИнтеграцияС1СCRM" укажите имя вашего плана обмена из конфигуратора
УзелОбменаСсылка = ПланыОбмена.ИнтеграцияС1СCRM.НайтиПоКоду("001"); 

Если УзелОбменаСсылка.Пустая() Тогда
    ВызватьИсключение "Узел плана обмена не найден! Проверьте правильность кода узла.";
КонецЕсли;

УзелОбменаОбъект = УзелОбменаСсылка.ПолучитьОбъект();

// Шаг 2. Создаем новое регламентное задание на сервере 1С
// "СинхронизацияДанных" - это имя метаданных регламентного задания из конфигуратора
НовоеЗадание = РегламентныеЗадания.СоздатьРегламентноеЗадание("СинхронизацияДанных");
НовоеЗадание.Наименование = "Автоматический обмен CRM - БП (Восстановленный)";
НовоеЗадание.Использование = Истина;

Попытка
    НовоеЗадание.Записать();
Исключение
    Сообщить("Не удалось записать регламентное задание: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// Шаг 3. Записываем новый УИН в реквизит узла обмена
// Проверьте точное имя реквизита в вашем плане обмена
УзелОбменаОбъект.ИдентификаторРегламентногоЗадания = НовоеЗадание.УникальныйИдентификатор;

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

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

Способ 3. Проверка блокировки регламентных заданий в кластере

Если даже после программной перезаписи уникального идентификатора система продолжает выдавать ошибки доступа или не может выполнить фоновое задание, необходимо проверить настройки самого кластера серверов 1С:

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

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

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

Мы выяснили, что ошибка «Не найдено созданное регламентное задание» вызвана рассинхронизацией уникальных идентификаторов в метаданных и на сервере 1С. Чтобы избежать появления этой проблемы в будущем, придерживайтесь простых правил:

← На главную