1С аварийно завершился рабочий процесс фонового задания

Имеем:
Платформа 1С:Предприятие 8.1 (8.1.15.14)
Конфигурация Альфа-Авто: Автосалон+Автосервис+Автозапчасти. Редакция 4.1 (4.1.01.04)
Выполняется Регламентное задание(самописное). Вываливается с ошибкой:
количество фактических параметров фонового задания не совпадает с количеством параметров метода фонового задания
Вываливается, когда выполняется по расписанию. Вручную если запустить — всё прекрасно работает.
Код общего модуля:
Процедура СозданиеДокументаОтменыРезерва(Знач СтруктураПараметров) Экспорт
Запрос=Новый Запрос;
Запрос.Текст=»ВЫБРАТЬ
| СкладАвтомобилейОстатки.Заказ
|ИЗ
| РегистрНакопления.СкладАвтомобилей.Остатки КАК СкладАвтомобилейОстатки
|ГДЕ
| СкладАвтомобилейОстатки.Заказ ССЫЛКА Документ.РезервНаАвтомобиль
| И СкладАвтомобилейОстатки.Заказ.ДатаОкончанияРезерва <= КОНЕЦПЕРИОДА(&ТекДата, ДЕНЬ)»;
Запрос.УстановитьПараметр(«ТекДата»,Дата(ТекущаяДата()));
Запрос=Запрос.Выполнить().Выбрать();
Пока Запрос.Следующий() Цикл
НовыйДокумент = Документы.асОтменаРезерваНаАвтомобиль.СоздатьДокумент();
НовыйДокумент.Дата = Дата(ТекущаяДата());
НовыйДокумент.Автор=Справочники.Пользователи.НайтиПоНаименованию(«Робот»);
НовыйДокумент.Организация=Справочники.Организации.НайтиПоКоду(«00001»);
НовыйДокумент.ПодразделениеКомпании = Справочники.ПодразделенияКомпании.НайтиПоКоду(«ЦБ000001»);
НовыйДокумент.ХозОперация = Справочники.ХозОперации.НайтиПоКоду(«000001»);
НовыйДокумент.ДокументОснование = Запрос.Заказ;
НовыйДокумент.Заказчик = Запрос.Заказ.Заказчик;
НовыйДокумент.Автомобиль = Запрос.Заказ.Автомобиль;
НовыйДокумент.Модель = Запрос.Заказ.Модель;
НовыйДокумент.ВариантКомплектации = Запрос.Заказ.ВариантКомплектации ;
НовыйДокумент.Цвет = Запрос.Заказ.Цвет;
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
КонецЦикла;
КонецПроцедуры
Кто что скажет?

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

В моём случае обмен настраивается между конфигурациями «Управление торговлей 11.2» (далее УТ) и «Бухгалтерия предприятия 3.0.43» (далее БП). Обмен односторонний, из УТ в БП. До обновления «Управление торговлей 11.1» на версию «11.2» обмен данными был настроен с помощью конфигурации «Конвертация данных 2.0». Однако после перехода на «11.2» в «Управление торговлей» появились ошибки при работе пользователей. Процедура обновления правил обмена была проведена, но результата это не дало. Отладчик показывал, что проблема в обмене данными. Было решено удалить настройку обмена данными в обеих конфигурациях и настроить заново.

И «Управление торговлей», и «Бухгалтерия предприятия» у нас работают в клиент-серверном варианте. Настройку синхронизации я начал с УТ. Выполнил её таким образом, чтобы данные выгружались из УТ в файл. То есть синхронизация через сетевой каталог. В БП настроил обмен таким образом, чтобы из БП никакие данные не выгружались.

Далее запустил синхронизацию на стороне УТ. Выгрузка данных не произошла. В журнале регистрации появились ошибки:

Для анализа ошибки нажал на пиктограмму «Состав отправляемых данных» и в списке зарегистрированных к отправке договоров контрагентов нашёл договор, по которому появилась ошибка. Открыл договор, запомнил банковский счёт контрагента, указанный в договоре. Затем перешёл к зарегистрированным к отправке банковским счетам. Оказалось, что нужного счёта нет в списке зарегистрированных. Я перепровёл проблемный банковский счёт и договор. После этого зарегистрировал вручную нужный банковский счёт.

Повторил попытку синхронизировать данные из УТ. На этот раз данные успешно выгрузились. В сетевой папке сформировался XML файл, содержащий данные для переноса из УТ в БП.

Следующий этап — загрузить данные из файла в Бухгалтерию предприятия. В конфигурации «Бухгалтерия предприятия» я нажал кнопку «Синхронизировать», открылась форма обработки с сообщением «Выполняется анализ данных». Чуть позже сообщение сменилось на «Выполняется выгрузка данных». При этом индикатор и счётчик показывали, что из БП выгружается более 80-ти тысяч объектов. Это меня смутило, ведь я указывал в настройках, что из БП ничего не должно выгружаться. Обработка выполнялась довольно долго и завершилась ошибкой:

Событие: Обмен данными
{ОбщийМодуль.ДлительныеОперации.Модуль(371)}: Аварийно завершился рабочий процесс фонового задания
ВызватьИсключение(ТекстОшибки);

Чтобы локализовать ошибку, попробовал изменять настройки синхронизации и вараанты работы базы БП. В итоге, когда я перевёл базу в файловый вариант, система отработала адекватно: открылась форма сопоставления двух баз. После сопоставления объектов начальная синхронизация прошла успешно. Затем я снова перевёл базу в клиент-серверный вариант.

При дальнейшей «обкатке» синхронизации, потребовалось внести кое-какие изменения в правила конвертации объектов. Настало время воспользоваться конфигурацией «Конвертация данных 3.0». Во встроенной справке конфигурации описан порядок работы. Также помогли статьи на сайте ИТС.

В итоге я загрузил в «Конвертация данных 3.0» следующие данные:

  • Тексты общего модуля «МенеджерОбменаДаннымиЧерезУниверсальныйФормат» из двух баз
  • Схема обеих баз
  • Описание формата EnterpriseData (из одной любой базы)
  • Правила конвертации

После загрузки открыл в «Конвертация данных 3.0» правила конвертации данных, объектов, свойств. Внёс необходимые мне правки. Затем воспользовался кнопкой «Выгрузить модуль менеджера обмена». Текст модуля скопировался в буфер обмена. Осталось только вставить его в конфигурацию.

Поэксперементировав с настройкой правил в «Конвертация данных 3.0», я для себя заключил, что в случае, когда вносимые правки незначительны, проще настраивать правила непосредственно в конфигурациях УТ и БП, в общем модуле «МенеджерОбменаДаннымиЧерезУниверсальныйФормат». Если же правки серъёзные, такие как, например, добавление нового объекта в обмен, тогда стоит воспользоваться конфигурацией «Конвертация данных 3.0».

Задачу по добавлению документа «Заказ поставщику» в план обмена я выполнял с помощью «Конвертация данных 3.0». В стандартном варианте УТ — БП этого документа в плане обмена нет.

Будем помнить, что правила регистрации объектов для выгрузки попрежнему настраиваются в конфигурации «Конвертация данных 2.0».

Вот такие первые впечатления о синхронизации данных через универсальный формат EnterpriseData.

Как в 1С производится запуск фоновых заданий, каким образом можно получить список заданий при помощи метода «ПолучитьФоновыеЗадания()?

В одном проекте понадобилось запускать выполнение выгрузки на сайт с сервера.

Пользователь на своем клиенте открывает обработку, устанавливает параметры и нажимает выгрузить.

Выгрузка идет не с компьютера клиента, а создается фоновое задание на сервере!

На клиенте в модуле Кнопки Выгрузить:

Код 1C v 8.3 Процедура КоманднаяПанель1ВыгрузитьНаСайт(Кнопка)
//Выгружается фоновым заданием на серваке
ПараметрыФоновогоЗадания = Новый Массив;
ПараметрыФоновогоЗадания.Добавить(Группа); //Группа номенклатуры
ФоновыеЗадания.Выполнить(«МодульРегламентныхЗаданий.ВыгрузкаПрайсаНАФТП»,
ПараметрыФоновогоЗадания, Новый УникальныйИдентификатор,
«Выгрузка прайса на сайт»);
ПоказатьОповещениеПользователя(«Выгрузка прайса на сайт», ,»Запущено задание выгрузки прайса на сайт, проверьте данные на сайте через 2-3 минуты…», БиблиотекаКартинок.Информация32);

ПараметрыФоновогоЗадания — это переменные функции, они задаются по порядку как определены в вызываемой функции.

На сервере в общем модуле МодульРегламентныхЗаданий:

Код 1C v 8.3 Процедура ВыгрузкаПрайсаНАФТП(Группа) Экспорт
Запрос = Новый Запрос();
Запрос.Текст =
«ВЫБРАТЬ
| ПрайсЛист1СрезПоследних.НоменклатураПрайса,
| ПрайсЛист1СрезПоследних.Цена
|ИЗ
| РегистрСведений.ПрайсЛист.СрезПоследних(, Поставщик = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)) КАК ПрайсЛист1СрезПоследних
|ГДЕ
| &Условие
| И ПрайсЛист1СрезПоследних.НоменклатураПрайса.ИДдляСайта > 0″;
Если ЗначениеЗаполнено(Группа) Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, «&Условие», «ПрайсЛист1СрезПоследних.НоменклатураПрайса В ИЕРАРХИИ(&НоменклатураПрайса)»)
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст, «&Условие», «ИСТИНА»)
КонецЕсли;
Запрос.УстановитьПараметр(«НоменклатураПрайса», Группа);
Выборка = Запрос.Выполнить().Выбрать();
Текст = Новый ТекстовыйДокумент;
Пока Выборка.Следующий() Цикл
НомПрайса = Выборка.НоменклатураПрайса;
ЦенаА = Выборка.Цена;
Цена = Ценообразование.ОкруглитьЦену(ЦенаА * ( 1 + НомПрайса.Наценка20 / 100) + НомПрайса.Надбавка20, НомПрайса.ПорядокОкругления, НомПрайса.ОкруглятьВБольшуюСторону);
Если Цена > 0 Тогда
Текст.ДобавитьСтроку(«»+Формат(НомПрайса.ИДдляСайта, «ЧГ=0″)+»;»+Формат(Цена, «ЧГ=0»));
КонецЕсли;
КонецЦикла;
// запись в текстовый файл
ПутьКФайлВыгр = «\\FG-1\1c_data\naSite\vigruz.csv»;//»D:\!!!For1C!!!\naSite\vigruz.csv»;
Текст.Записать(ПутьКФайлВыгр, «windows-1251»);
КаталогНаSFTPСервере = «/sitetest.ru/public_html/p»;
Попытка
ИмяПользователя = «serveruser»;
ПарольПользователя = «password»;
Сервер = «192.253.6.47»;
Порт = «21»;
Прокси = Новый ИнтернетПрокси();
Прокси.Пользователь = ИмяПользователя;
Прокси.Пароль = ПарольПользователя;
FTPСоединение = Новый FTPСоединение(Сервер,,ИмяПользователя,ПарольПользователя,,Ложь);

FTPСоединение.УстановитьТекущийКаталог(КаталогНаSFTPСервере);
//FTPСоединение.ПассивныйРежим(Ложь);
ТекущийКаталог = FTPСоединение.ТекущийКаталог();
Исключение
КонецПопытки;
FTPСоединение.Записать(ПутьКФайлВыгр,»vigruz.csv»);
//Вызов PHP скрипта для иморта данных из csv файла на сайт
НТТР = Новый HTTPСоединение(«sitetest.ru»);
ФайлРезультата = ПолучитьИмяВременногоФайла();
НТТР.Получить(«/p/import_price.php», ФайлРезультата);
КонецПроцедуры

Как Получить фоновые задания?

Напишем в процедуре обработки нажания следующий код:

Код 1C v 8.2 УП &НаКлиенте
Процедура ПолучитьФоновыеЗадания(Команда)
ПолучитьФоновыеЗаданияНаСервере();
КонецПроцедуры

Текст процедуры на сервере:

Код 1C v 8.2 УП &НаСервере
Процедура ПолучитьФоновыеЗаданияНаСервере()
ПараметрыОтбора = Новый Структура(«Наименование», «Тестовое задание»);
СписокФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(ПараметрыОтбора);
Для каждого Задание Из СписокФоновыхЗаданий Цикл
Сообщить(Задание.Наименование);
КонецЦикла;
КонецПроцедуры // ПолучитьФоновыеЗаданияНаСервере()

В окно сообщений выведутся наименования выполняющихся и выполненных в 1С фоновых заданий с наименованием «Тестовое задание», так как мы сделали отбор именно по этому наименованию.

Универсальное регламентное задание

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

Создаем регламентное задание

Создадим регламентное задание «Выполнение обработки».

Отключим использование регламентного задания, чтобы при обновлении конфигурации оно автоматом не запускалось.

Назначим процедуру, которая будет срабатывать при запуске регламентного задания: МодульРегламентныхЗаданий.РегламентноеЗаданиеВыполнениеОбработки.

Сама процедура имеет вид:

Процедура РегламентноеЗаданиеВыполнениеОбработки(Ключ) Экспорт

ПараметрыРегламентныхЗаданий.ВыполнитьОбработкуСПараметрами(Ключ);

КонецПроцедуры

Создаем справочник для регламентных заданий

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

Справочник «Параметры регламентных заданий»:

Реквизиты:

· КодПередЗапуском – неограниченная строка – код на языке 1С, который нужно выполнить перед запуском.

· Обработка из конфигурации – строка (100) — идентификатор обработки из конфигурации

· Обработка из справочника – строка (100) — ссылка на элемент справочника «Внешние обработки», если такой имеется в конфигурации

· Выполнять через приложение 1С – булево — будет создано отдельное приложение 1С и в нем будет запущено регламентное задание. Создано для 8.1, где не все методы приложения доступны на сервере, где работает регламентное задание.

· КодЗапуска — – неограниченная строка – код на языке 1С, который будет выполняться при запуске регламентного задания.

Создадим форму элемента:

По нажатию на кнопку «Создать регл. задание» программно создается регламентное задание с ключом-кодом:

Процедура ОсновныеДействияФормыСоздатьРеглЗадание(Кнопка)

Перем Задание;

Ключ = СокрЛП(Код);

Задание = РегламентныеЗадания.СоздатьРегламентноеЗадание(«ВыполнениеОбработки»);

Задание.Наименование = Ключ;

Задание.Ключ = Ключ;

Параметры = Новый Массив();

Параметры.Добавить(Ключ);

Задание.Параметры = Параметры;

Задание.Записать();

КонецПроцедуры

Запуск регламентного задания

Каждое созданное нами регламентное задание имеет ключ:

Этот ключ соответствует коду справочника «Параметры регламентных заданий», по нему осуществляется поиск при старте задания. Если элемент справочника не найдено, задание не выполняется.

Далее, если задан код КодПередЗапуском то будет выполнен этот код. Далее, если переменная Выполнять примет значение ложь, то задание не будет выполнено. При анализе доступна переменная Параметры, где хранится ссылка на найденный элемент справочника «Параметры регламентных заданий».

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

Для 1С81 предусмотрено выполнение в новом приложении – чтобы можно было использовать код, доступный только на клиенте, в том числе и использование внешних обработок. Для этого нужно установить галочку «Выполнять через приложение 1С». Иначе регламентное задание будет выполняться на сервере.

Рекомендую устанавливать пользователя в поле «Пользователь» у вновь созданного регламентного задания, чтобы задание выполнялось под определенными правами. Рекомендую такому пользователю давать полные права. У меня используется пользователь «robot».

Расписание регламентного задания создается по гиперссылке «Расписание» из формы регламентного задания. Можно использовать обработку «Консоль регламентных заданий».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *