Синхронизация данных между различными конфигурациями, например, между 1С:CRM и 1С:Бухгалтерия предприятия (БП), — это критически важный процесс для любого бизнеса. Большинство современных интеграций в экосистеме «1С:Предприятие 8» функционируют на базе Библиотеки стандартных подсистем (БСП). Автоматический обмен по расписанию опирается на механизм регламентных заданий. Однако пользователи и администраторы нередко сталкиваются с ошибкой: «Не найдено созданное регламентное задание». В результате автоматический обмен полностью блокируется.
В этой статье мы подробно разберем, почему возникает эта ошибка, как устроен механизм идентификации регламентных заданий в коде 1С, и рассмотрим несколько практических способов решения проблемы — от простых интерактивных действий до программного исправления с помощью внешней обработки.
Давайте проанализируем ситуацию изнутри. При попытке запустить обмен система обращается к процедуре запуска регламентного задания на сервере. Код этой процедуры выглядит следующим образом:
&НаСервере
Процедура ЗапуститьРегламентноеЗадание(Отказ)
Если Не ЗначениеЗаполнено(РегламентноеЗаданиеУИН) Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
ЗаданиеОбработки = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(РегламентноеЗаданиеУИН);
ЗаданиеОбработки.Использование = Истина;
ЗаданиеОбработки.Записать();
КонецПроцедуры
В процессе отладки выясняется, что реквизит формы РегламентноеЗаданиеУИН, имеющий тип УникальныйИдентификатор, содержит значение 00000000-0000-0000-0000-000000000000. Это так называемый пустой УИН.
Поскольку значение не заполнено, срабатывает условие проверки, переменная Отказ принимает значение Истина, и управление возвращается на клиентскую сторону, где пользователю выводится предупреждение:
Если Отказ Тогда
ПоказатьПредупреждение(, НСтр("ru='Не найдено созданное регламентное задание.'"));
Возврат;
КонецЕсли;
Пустой уникальный идентификатор означает, что в базе данных отсутствует связь между конкретной настройкой обмена и объектом регламентного задания на сервере 1С. Выделяют три основные причины, почему так происходит:
Многие разработчики совершают ошибку, пытаясь найти место заполнения реквизита РегламентноеЗаданиеУИН простым глобальным поиском по конфигурации. Поскольку поиск выдает лишь операции чтения, создается иллюзия, что значение берется «из ниоткуда».
На самом деле в типовых конфигурациях этот идентификатор сохраняется в базе данных в нескольких местах, в зависимости от версии БСП:
ИдентификаторРегламентногоЗадания у планов обмена типа ИнтеграцияС1СCRM).РегламентныеЗаданияОбменаДанными или аналогичных таблицах настроек БСП.При открытии обработки обмена система считывает УИН из соответствующего узла плана обмена и помещает его в реквизит формы. Если в самом узле записан пустой УИН, то и на форме мы увидим нули.
Связывание происходит в момент первой успешной записи расписания обмена. В коде это выглядит так:
// Создание задания на сервере
ЗаданиеОбработки = РегламентныеЗадания.СоздатьРегламентноеЗадание("ИмяВашегоРегламентногоЗадания");
ЗаданиеОбработки.Наименование = "Синхронизация данных с CRM";
ЗаданиеОбработки.Записать();
// Получение нового УИН и его запись в реквизит
РегламентноеЗаданиеУИН = ЗаданиеОбработки.УникальныйИдентификатор;
Теперь, когда мы понимаем физику процесса, рассмотрим три способа решения этой проблемы.
Прежде чем приступать к написанию кода или использованию внешних обработок, попробуем решить проблему штатными средствами интерфейса 1С. Нам нужно заставить БСП самостоятельно сгенерировать новое регламентное задание и обновить УИН в узле обмена.
Выполним следующие шаги:
В этот момент система выполнит стандартный алгоритм БСП: увидит, что старого задания нет, создаст на сервере новое регламентное задание, получит его свежий рабочий УИН и запишет его в узел плана обмена. После этого ошибка должна исчезнуть.
Если интерактивный способ не помог (например, из-за доработок интерфейса кнопка настройки расписания недоступна или заблокирована), мы можем исправить ситуацию программно. Для этого воспользуемся внешней обработкой «Консоль кода» или создадим простую одноразовую обработку.
Нам потребуется написать скрипт, который создаст новое регламентное задание на сервере 1С и принудительно запишет его идентификатор в узел обмена. Рассмотрим пример такого кода:
// Шаг 1. Находим нужный узел плана обмена
// Вместо "ИнтеграцияС1СCRM" укажите имя вашего плана обмена из конфигуратора
УзелОбменаСсылка = ПланыОбмена.ИнтеграцияС1СCRM.НайтиПоКоду("001");
Если УзелОбменаСсылка.Пустая() Тогда
ВызватьИсключение "Узел плана обмена не найден! Проверьте правильность кода узла.";
КонецЕсли;
УзелОбменаОбъект = УзелОбменаСсылка.ПолучитьОбъект();
// Шаг 2. Создаем новое регламентное задание на сервере 1С
// "СинхронизацияДанных" - это имя метаданных регламентного задания из конфигуратора
НовоеЗадание = РегламентныеЗадания.СоздатьРегламентноеЗадание("СинхронизацияДанных");
НовоеЗадание.Наименование = "Автоматический обмен CRM - БП (Восстановленный)";
НовоеЗадание.Использование = Истина;
Попытка
НовоеЗадание.Записать();
Исключение
Сообщить("Не удалось записать регламентное задание: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Шаг 3. Записываем новый УИН в реквизит узла обмена
// Проверьте точное имя реквизита в вашем плане обмена
УзелОбменаОбъект.ИдентификаторРегламентногоЗадания = НовоеЗадание.УникальныйИдентификатор;
Попытка
УзелОбменаОбъект.Записать();
Сообщить("Связь успешно восстановлена!");
Сообщить("Новый УИН: " + Строка(НовоеЗадание.УникальныйИдентификатор));
Исключение
Сообщить("Не удалось записать изменения в узел обмена: " + ОписаниеОшибки());
КонецПопытки;
После выполнения данного кода в узле плана обмена появится валидный непустой уникальный идентификатор. При следующем запуске обработка обмена успешно найдет регламентное задание по этому УИН и выполнит синхронизацию в штатном режиме.
Если даже после программной перезаписи уникального идентификатора система продолжает выдавать ошибки доступа или не может выполнить фоновое задание, необходимо проверить настройки самого кластера серверов 1С:
Для файловых баз данных также важно помнить, что выполнение регламентных заданий требует либо запущенного специального сеанса (в старых версиях платформы), либо корректной работы веб-сервера, на котором опубликована база.
Мы выяснили, что ошибка «Не найдено созданное регламентное задание» вызвана рассинхронизацией уникальных идентификаторов в метаданных и на сервере 1С. Чтобы избежать появления этой проблемы в будущем, придерживайтесь простых правил:
УникальныйИдентификатор непосредственно перед вызовом серверных методов работы с регламентными заданиями.