8.х Регламентные задания. Запуск внешней обработки.

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Steel Rain, 21 авг 2015.

  1. TopicStarter Overlay
    Steel Rain
    Offline

    Steel Rain Опытный в 1С

    Регистрация:
    29 сен 2006
    Сообщения:
    408
    Симпатии:
    2
    Баллы:
    29
    Доброго времени суток.

    Платформа 1С:Предприятие 8.2 (8.2.18.104), конфигурация "Управление торговлей", редакция 10.3 (10.3.13.2). База на SQL.
    Возникла необходимость запуска некой внешней обработки по расписанию. Скурив несколько мануалов создал общий модуль, в него поместил процедуру вызова внешней обработки и сделал регламентное задание, запускающее эту процедуру по расписанию.
    Столкнулся со следующей проблемой - задание запускается, но завершается аварийно с ошибкой в журнале
    но там, каг бэ, вообще диалогов никаких нет :(
    Для теста сделал вызов той же процедуры из модуля ПриНачалеРаботыСистемы, все корректно отработало. Ниже код процедуры, которая стартуется регламентным заданием:
    Код:
    Процедура ОбработкаДокументов () ЭКСПОРТ
        ТекстОшибки = "";
        //попытаемся стартовать внешнюю обработку
        Попытка
            Код = "000000037";  //обработка ПроверкаДокументов
            СсылкаОбработка = Справочники.ВнешниеОбработки.НайтиПоКоду(Код);
            ОбъектОбработка = СсылкаОбработка.ПолучитьОбъект();
            ДвоичныеДанные = ОбъектОбработка.ХранилищеВнешнейОбработки.Получить();
       
            ИмяФайла = ПолучитьИмяВременногоФайла("epf");
       
            ДвоичныеДанные.Записать(ИмяФайла);
            Обработка = ВнешниеОбработки.Создать(ИмяФайла);
            НачПериода = Дата("20150814");
            КонПериода = Дата("20150814");
            // вызываем печать
            Обработка.ПроверитьПодразделение(НачПериода, КонПериода);
        Исключение
            ТекстОшибки = "Не удалось запустить внешнюю обработку - проверка Подразделения.";
            ЗаписьЖурналаРегистрации("Обработка документов",
            УровеньЖурналаРегистрации.Ошибка, , ,
            "Во время регламентнной обработки документов произошла ошибка: " + ОписаниеОшибки());
        КонецПопытки;
    
        //тут надо придумать запись какого нибудь лога куда-то... в идеале в задачу бы вывести
        Если НЕ ТекстОшибки = "" Тогда
            // Сознание Задачи
            НоваяЗадача = Задачи.ЗадачиПользователя.СоздатьЗадачу();
            //НоваяЗадача.Объект = ОбъектЗадачи;
            НоваяЗадача.Оповещение = Истина;
            НоваяЗадача.Наименование = ТекстОшибки;
            НоваяЗадача.Дата = ТекущаяДата();
            НоваяЗадача.СрокОповещения = ТекущаяДата()+60;
            НоваяЗадача.Инициатор = Справочники.Пользователи.НайтиПоКоду("Администратор");
            НоваяЗадача.Исполнитель = Справочники.Пользователи.НайтиПоКоду("Администратор");
            НоваяЗадача.Записать();
        КонецЕсли;
    КонецПроцедуры
    
    ЧЯДНТ?
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    РежимДиалогаВопрос, по всей видимости, где-то внутри внешний обработки, причем почему-то в модуле объекта.

    ПриНачалеРаботыСистемы - выполняется исключительно в клиентском контексте, поэтому и отработало.
  3. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    1. Зачем нужно было общий модуль. можно было сделать внешнюю обработку в ней в конце пропизать Завершить работу системы, а при открытии выполнять нужную процедуру, а на сервере создать батник в котором прописать строку запуска внешней обработки и поместить выполнеие этого батника по расписанию.
    2.{ОбщийМодуль.СобственныеПроцедуры(56,107)}: это что за строка - можете е показать?
  4. TopicStarter Overlay
    Steel Rain
    Offline

    Steel Rain Опытный в 1С

    Регистрация:
    29 сен 2006
    Сообщения:
    408
    Симпатии:
    2
    Баллы:
    29
    В обработке тоже никаких диалогов. Нужная процедура в модуле объекта обработки. Что бы форму не создавать. Вот код самой обработки:
    Код:
    Процедура ПроверитьПодразделение(НачПериода, КонПериода) ЭКСПОРТ
        Если НачПериода = НЕОПРЕДЕЛЕНО
            ИЛИ КонПериода = НЕОПРЕДЕЛЕНО Тогда
            НачПериода = ТекущаяДата();
            КонПериода = ТекущаяДата();
        КонецЕсли;   
       
        //поступления
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    ПоступлениеТоваровУслуг.Ссылка,
        |    ПоступлениеТоваровУслуг.Дата,
        |    ПоступлениеТоваровУслуг.СкладОрдер,
        |    ПоступлениеТоваровУслуг.Подразделение
        |ИЗ
        |    Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
        |ГДЕ
        |    ПоступлениеТоваровУслуг.Дата МЕЖДУ &НачДата И &КонДата";
        Запрос.УстановитьПараметр("НачДата", НачалоДня(НачПериода));
        Запрос.УстановитьПараметр("КонДата", КонецДня(КонПериода));
       
        Выборка = Запрос.Выполнить().Выбрать();
        Пока Выборка.Следующий() Цикл
            Если ЗначениеЗаполнено(Выборка.СкладОрдер) = Истина Тогда
                Если ТипЗнч(Выборка.СкладОрдер) = Тип("СправочникСсылка.Склады") Тогда
                    ДокОбъект = Выборка.Ссылка.ПолучитьОбъект();
                    ДокОбъект.Подразделение = Выборка.СкладОрдер.Подразделение;
                    ДокОбъект.Записать();
                КонецЕсли;
            Иначе
            КонецЕсли;
        КонецЦикла;   
       
        //реализации
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    РеализацияТоваровУслуг.Ссылка,
        |    РеализацияТоваровУслуг.Дата,
        |    РеализацияТоваровУслуг.Подразделение,
        |    РеализацияТоваровУслуг.Склад
        |ИЗ
        |    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        |ГДЕ
        |    РеализацияТоваровУслуг.Дата МЕЖДУ &НачДата И &КонДата";
        Запрос.УстановитьПараметр("НачДата", НачалоДня(НачПериода));
        Запрос.УстановитьПараметр("КонДата", КонецДня(КонПериода));
       
        Выборка = Запрос.Выполнить().Выбрать();
        Пока Выборка.Следующий() Цикл
            Если ЗначениеЗаполнено(Выборка.Склад) = Истина Тогда
                ДокОбъект = Выборка.Ссылка.ПолучитьОбъект();
                ДокОбъект.Подразделение = Выборка.Склад.Подразделение;
                ДокОбъект.Записать();
            Иначе   
            КонецЕсли;
        КонецЦикла;   
    КонецПроцедуры
    
    вроде все должно вполне работать на сервере
  5. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    А так уж если общий можкдль создавали то процедуры все можно было и там сделать и их уже вызывать по рассписанию регалментированным заданием
    --- Объединение сообщений, 21 авг 2015 ---
    ну сктит вот тут ДокОбъект.Записать();
    Это же у вас не новый объект, а старый, и когда перезаписваете он может спрашивать текущй датой или неоперативно
  6. TopicStarter Overlay
    Steel Rain
    Offline

    Steel Rain Опытный в 1С

    Регистрация:
    29 сен 2006
    Сообщения:
    408
    Симпатии:
    2
    Баллы:
    29
    ну вот захотелось мне разобраться с регламентными заданиями

    Не совсем понял как её найти 56,107 ? это строка и колонка что ли? Тогда это вообще в другом месте модуля.
  7. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    в общем модуле Собственные процелдуры 56 строка - что там.

    Просто если хотели с регламентным разобраться то делали тогда бы как в регламентных все в обзем модуле и оттуда уже идет вызов регламентного. если через внешнюю обработку, то зачем конфу портить. Ну это так отсутпление
  8. TopicStarter Overlay
    Steel Rain
    Offline

    Steel Rain Опытный в 1С

    Регистрация:
    29 сен 2006
    Сообщения:
    408
    Симпатии:
    2
    Баллы:
    29
    Конечный функционал требуемой обработки пока не определён до конца, на данном этапе удобнее изменять внешнюю обработку, нежели конфигурацию.
    в клиентском варианте не спрашивает, а в серверном спрашивает?
  9. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    Просто обычно не пишут просто Записать, а указывать режим провдения.
    Так что там за 56 строка что там?
  10. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    У меня, например, на уровне домена запрещено использование штатного шедуллера на ВСЕХ машинах.....
  11. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    можно и не штатный поставить :)
  12. TopicStarter Overlay
    Steel Rain
    Offline

    Steel Rain Опытный в 1С

    Регистрация:
    29 сен 2006
    Сообщения:
    408
    Симпатии:
    2
    Баллы:
    29
    Код:
            Ответ = Вопрос("В документе присутствуют товары не рекомендованные для отгрузки. Продолжить операцию?", РежимДиалогаВопрос.ДаНет,0);
    
    но это вообще другая процедура, которая никак в процессе не участвует
    или он пытается весь модуль скомпилировать для работы на сервере?
    Выкидывать из него прочие процедуры чтоли или новый модуль отдельно создать для регламентных операций? Во, точно, надо попробовать.
  13. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    ну вообще модуль серверный, или он на сервере отрабаотывается там такого не должно быть
  14. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    если модуль может исполнятся на сервере, то контекст исполнения кода в нем необходимо разделять директивами препроцессора.
  15. TopicStarter Overlay
    Steel Rain
    Offline

    Steel Rain Опытный в 1С

    Регистрация:
    29 сен 2006
    Сообщения:
    408
    Симпатии:
    2
    Баллы:
    29
    Я понял. Спасибо.
    --- Объединение сообщений, 21 авг 2015 ---
    А ещё тогда вопрос по этому поводу. Ранее не приходилось делать такие вещи. Если часть процедуры проведения документа может выполняться только на клиенте, а при выполнении на сервере это нужно пропустить, как правильно оформить?
    Если #НаКлиенте Тогда
    ...
    КонецЕсли ?
    Последнее редактирование: 21 авг 2015
  16. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    В С-П предельно четко написано на эту тему.

Поделиться этой страницей