Добрый день, коллеги!
Столкнулись с проблемой - созданная внешняя обработка иногда работает правильно, а в большинстве случаев выполняется, но при этом процедура ВыполнитьКоманду () в модуле не вызывается, при этом ошибок не происходит.
Платформа: 1С:Предприятие 8.3 (8.3.15.1565)
Конфигурация: Розница, редакция 2.2 (2.2.11.29)
Режим: Файловый (без сжатия)
Приложение: Тонкий клиент
Локализация: Информационная база: русский (Россия), Сеанс: русский (Россия)
Вариант интерфейса: Такси
Пробовали и на других конфигурациях (Бухгалтерия, Торговля), результат - тот же.
Обработка примитивная. Формы нет, только модуль. Вот он:
Кто нибудь сталкивался? В чем может быть проблема?
Столкнулись с проблемой - созданная внешняя обработка иногда работает правильно, а в большинстве случаев выполняется, но при этом процедура ВыполнитьКоманду () в модуле не вызывается, при этом ошибок не происходит.
Платформа: 1С:Предприятие 8.3 (8.3.15.1565)
Конфигурация: Розница, редакция 2.2 (2.2.11.29)
Режим: Файловый (без сжатия)
Приложение: Тонкий клиент
Локализация: Информационная база: русский (Россия), Сеанс: русский (Россия)
Вариант интерфейса: Такси
Пробовали и на других конфигурациях (Бухгалтерия, Торговля), результат - тот же.
Обработка примитивная. Формы нет, только модуль. Вот он:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Назначение.Добавить("Документ.ПоступлениеТоваров");
ПараметрыРегистрации.Версия = "2.0";
ПараметрыРегистрации.БезопасныйРежим = ЛОЖЬ;
ПараметрыРегистрации.Информация = "(с) ООО ""ИНФОТЕХ"", 2019";
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд,
"Автоматическая загрузка поступлений товаров...",
"АвтозагрузкаПоступленийТоваров",
ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода(),
ЛОЖЬ,
"");
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицуКоманд()
// Тип данных - таблица значений.
// Таблица содержит 5 колонок:
// 1) Представление. Наименование команды в пользовательском интерфейсе;
// 2) Идентификатор. Для печатных форм список макетов, для остальных обработок любая строка, уникальная для данной обработки.
// 3) Использование. Строка, одно из значений -
// - ОткрытиеФормы. Открывает форму обработки.
// - ВызовКлиентскогоМетода. Вызов клиентского экспортного метода модуля формы
// - ВызовСерверногоМетода. Вызов экспортного серверного метода модуля объекта.
// Для внешних печатных форм нужно указывать последнее значение.
// 4) ПоказыватьОповещение. Булево, нужно ли показывать оповещение при начале и окончании действия.
// 5) Модификатор. Для внешних печатных форм должно содержаться значение "ПечатьMXL".
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения = Неопределено ) Экспорт
Сообщить ("Выполняется " + ИдентификаторКоманды + " " + ТекущаяДата());
ПутьКФайлам = "C:\Test";
МассивФайлов = НайтиФайлы(ПутьКФайлам, "*.txt");
Для Каждого Стр из МассивФайлов Цикл
Сообщить("Обработка: " + Стр.Имя);
ЗаписьЖурналаРегистрации ("Обработан файл: " + Стр.Имя + " " +ТекущаяДата());
КонецЦикла;
ЗаписьЖурналаРегистрации ("Выполнена "+ИдентификаторКоманды + " " +ТекущаяДата());
КонецПроцедуры
ПоказатьКто нибудь сталкивался? В чем может быть проблема?
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
ну, во-первых, не знаю как в Рознице 2.2, но сейчас в БСП функция ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке() уже возвращает таблицу команд. так что отдельные процедуры на это писать не надо. достаточно добавить строчку и заполнить значения. это я пишу к тому, что возможно проблема с типами данных в описании. сейчас корректно делать описание так:
далее, вы хотя бы в начале процедуры сделайте запись в ЖР, что вы туда пришли и начали выполнение. это уже будет показатель.
также можно ваш код обернуть попыткой и в случае исключения писать в ЖР описание ошибки. это на случай проблем работы с файловой системой, так как это чаще всего основная ошибка с фоновыми заданиями и безопасным режимом.
ну и разберитесь с параметрами записи в ЖР. писать комментарий в событие то еще извращение.
Функция СведенияОВнешнейОбработке() Экспорт
ВерсияБСП = СтандартныеПодсистемыСервер.ВерсияБиблиотеки();
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(ВерсияБСП);
ПараметрыРегистрации.Информация = НСтр("ru = '(с) ООО ""ИНФОТЕХ"", 2019'");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Версия = "2.0";
ПараметрыРегистрации.Назначение.Добавить("Документ.ПоступлениеТоваров");
ПараметрыРегистрации.БезопасныйРежим = Ложь;
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = НСтр("ru = 'Автоматическая загрузка поступлений товаров...'");
Команда.Идентификатор = "АвтозагрузкаПоступленийТоваров";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Команда.ПоказыватьОповещение = Ложь;
Команда.Модификатор = "";
Возврат ПараметрыРегистрации;
КонецФункции
Показатьдалее, вы хотя бы в начале процедуры сделайте запись в ЖР, что вы туда пришли и начали выполнение. это уже будет показатель.
также можно ваш код обернуть попыткой и в случае исключения писать в ЖР описание ошибки. это на случай проблем работы с файловой системой, так как это чаще всего основная ошибка с фоновыми заданиями и безопасным режимом.
ну и разберитесь с параметрами записи в ЖР. писать комментарий в событие то еще извращение.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Хм, настроил расписание раз в 30 секунд - все запускает.
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения = Неопределено ) Экспорт
ЗаписьЖурналаРегистрации ("Запуск "+ИдентификаторКоманды);
ПутьКФайлам = "C:\Test";
МассивФайлов = НайтиФайлы(ПутьКФайлам, "*.txt");
Для Каждого Стр из МассивФайлов Цикл
Сообщить("Обработка: " + Стр.Имя);
ЗаписьЖурналаРегистрации ("Обработан файл: " + Стр.Имя + " " +ТекущаяДата());
КонецЦикла;
ЗаписьЖурналаРегистрации ("Выполнена "+ИдентификаторКоманды + " " +ТекущаяДата());
КонецПроцедуры
ПоказатьПрикрепленные файлы:
(9) Это уже все было сделано, ошибок нет, точки стоят. Эта обработка и так сама по себе эмулятор, она ничего не делает, кроме чтения списка пустых файлов в каталоге. Предполагается, что в дальнейшем она в автоматическом режиме будет их читать и заполнять табличные части документов информацией из них.
Главный вопрос: ПОЧЕМУ СИСТЕМА ВЕДЕТ СЕБЯ ТАК, ЧТО В НЕКОТОРЫХ СЛУЧАЯХ ОБРАБОТКА РАБОТАЕТ НОРМАЛЬНО, А В НЕКОТОРЫХ НИЧЕГО НЕ ВЫПОЛНЯЕТ И ОШИБОК НЕ ВЫДАЕТ?
Может, кто-то скачает мою обработку к себе и протестирует ее?
Главный вопрос: ПОЧЕМУ СИСТЕМА ВЕДЕТ СЕБЯ ТАК, ЧТО В НЕКОТОРЫХ СЛУЧАЯХ ОБРАБОТКА РАБОТАЕТ НОРМАЛЬНО, А В НЕКОТОРЫХ НИЧЕГО НЕ ВЫПОЛНЯЕТ И ОШИБОК НЕ ВЫДАЕТ?
Может, кто-то скачает мою обработку к себе и протестирует ее?
Собственно, а с чего вы вообще взяли, что «при этом процедура ВыполнитьКоманду () в модуле не вызывается»?
По отсутствию сообщений? Ну, так обработка выполняется в фоновом задании в другом сеансе. Сообщения из другого сеанса не передаются в ваш сеанс.
Иногда при запуске обработки очередь фоновых заданий бывает уже занята чем-то другим, потому обработка запускается не в фоне, а в вашем сеансе. В этом случае вы видите вывод сообщений.
Для эксперимента можете включить РежимОтладки БСП (см. вложение) — тогда обработка будет запускаться в вашем сеансе всегда (без фоновых заданий).
Ещё, например, можете запустить Process Monitor и проверить: происходит ли чтение вашей папки при запуске обработки или нет.
По отсутствию сообщений? Ну, так обработка выполняется в фоновом задании в другом сеансе. Сообщения из другого сеанса не передаются в ваш сеанс.
Иногда при запуске обработки очередь фоновых заданий бывает уже занята чем-то другим, потому обработка запускается не в фоне, а в вашем сеансе. В этом случае вы видите вывод сообщений.
Для эксперимента можете включить РежимОтладки БСП (см. вложение) — тогда обработка будет запускаться в вашем сеансе всегда (без фоновых заданий).
Ещё, например, можете запустить Process Monitor и проверить: происходит ли чтение вашей папки при запуске обработки или нет.
Прикрепленные файлы:
(13) Стоило мне по Вашему совету установить параметр запуска РежимОтладки, как моя обработка по кнопке Выполнить в справочнике доп.отчетов и обработок стала стабильно вызываться и отрабатывать код. Стоило мне его очистить, как опять все проблемы те же вернулись.
Однако в фоновом режиме она по-прежнему не отрабатывает код, запускается по времени, но впустую.
Мне по-прежнему непонятна причина: Вы пишете, что обработка может выполняться в фоне в другом сеансе, и сообщения мне не видны. Да, но в таком случае отсутствуют и записи в журнале регистрации, которые по-любому должны быть видны. Здесь что-то не так.
Однако в фоновом режиме она по-прежнему не отрабатывает код, запускается по времени, но впустую.
Мне по-прежнему непонятна причина: Вы пишете, что обработка может выполняться в фоне в другом сеансе, и сообщения мне не видны. Да, но в таком случае отсутствуют и записи в журнале регистрации, которые по-любому должны быть видны. Здесь что-то не так.
(25)
Судя по скриншоту вы пользуетесь формой журанала регистрации из БСП. Похоже, в ней есть проблемы при отображении новых событий из фоновых заданий записанных после открытия этой формы. Подробно в причине такого поведения не разбирался. Попробуйте закрыть/открыть форму журнала и поискать записи ещё раз. Или попробуйте использовать стандартную форму журнала.
Да, но в таком случае отсутствуют и записи в журнале регистрации, которые по-любому должны быть видны.
Судя по скриншоту вы пользуетесь формой журанала регистрации из БСП. Похоже, в ней есть проблемы при отображении новых событий из фоновых заданий записанных после открытия этой формы. Подробно в причине такого поведения не разбирался. Попробуйте закрыть/открыть форму журнала и поискать записи ещё раз. Или попробуйте использовать стандартную форму журнала.
Прикрепленные файлы:
ПараметрыРегистрации.Назначение.Добавить("Документ.ПоступлениеТоваров"); - Если не ошибаюсь, для Вашей обработки это лишнее.
Проверьте и исключите административную проблему - права доступа к файлам пользователя, под которым запущен сервер.
Проверьте и исключите административную проблему - права доступа к файлам пользователя, под которым запущен сервер.
Добрый вечер. Попробуйте точку остановы в команде "Выполнить" на общей форме дополнительных обработок. Ваша обработка работает верно, но её где-то срезает проверка безопасности. Есть риск, что часть коды вы не предоставили, какое-нибудь com соединение не закрывается или еще что-то похожее. Политика фирмы 1С по борьбе с внешними обработками на лицо =)
Ваша обработка по расписанию действительно не срабатывает, прилагаю рабочий проверенный вариант, вставьте туда свой код, все должно взлететь
Прикрепленные файлы:
ВыгрузкаВБазу-test.epf
ну, во-первых, не знаю как в Рознице 2.2, но сейчас в БСП функция ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке() уже возвращает таблицу команд. так что отдельные процедуры на это писать не надо. достаточно добавить строчку и заполнить значения. это я пишу к тому, что возможно проблема с типами данных в описании. сейчас корректно делать описание так:
далее, вы хотя бы в начале процедуры сделайте запись в ЖР, что вы туда пришли и начали выполнение. это уже будет показатель.
также можно ваш код обернуть попыткой и в случае исключения писать в ЖР описание ошибки. это на случай проблем работы с файловой системой, так как это чаще всего основная ошибка с фоновыми заданиями и безопасным режимом.
ну и разберитесь с параметрами записи в ЖР. писать комментарий в событие то еще извращение.
Функция СведенияОВнешнейОбработке() Экспорт
ВерсияБСП = СтандартныеПодсистемыСервер.ВерсияБиблиотеки();
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(ВерсияБСП);
ПараметрыРегистрации.Информация = НСтр("ru = '(с) ООО ""ИНФОТЕХ"", 2019'");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Версия = "2.0";
ПараметрыРегистрации.Назначение.Добавить("Документ.ПоступлениеТоваров");
ПараметрыРегистрации.БезопасныйРежим = Ложь;
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = НСтр("ru = 'Автоматическая загрузка поступлений товаров...'");
Команда.Идентификатор = "АвтозагрузкаПоступленийТоваров";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Команда.ПоказыватьОповещение = Ложь;
Команда.Модификатор = "";
Возврат ПараметрыРегистрации;
КонецФункции
Показатьдалее, вы хотя бы в начале процедуры сделайте запись в ЖР, что вы туда пришли и начали выполнение. это уже будет показатель.
также можно ваш код обернуть попыткой и в случае исключения писать в ЖР описание ошибки. это на случай проблем работы с файловой системой, так как это чаще всего основная ошибка с фоновыми заданиями и безопасным режимом.
ну и разберитесь с параметрами записи в ЖР. писать комментарий в событие то еще извращение.
В общем, что удалось в итоге выяснить:
(28) По Вашему совету оформили СведенияОВнешнейОбработке. В результате она стала запускаться всегда.
В код обработки было добавленно изменение найденных файлов, чтобы понять, происходит ли что-либо при выполнении обработки. Она приобрела такой вид:
После чего стало понятно, что все работает! Расписание установили на "каждые 10 сек". В файлы стали дописываться строчки:
Далее, по совету (37) открыли стандартную форму ЖР и увидели, что все сообщения в журнал выводятся и отображаются. То есть и здесь все работает, только БСПшная форма журнала, которая открывается в стандартном меню Администрирование их почему-то не отображает.
Далее, по совету (13) использовали параметр РежимОтладки и пришли к выводу, что:
- при установленном параметре процедура Сообщить() выводит сообщение
- при не установленном - не выводит.
В общем, совместными усилиями разобрались. Спасибо всем, кто принял участие в обсуждении и особенно тем, кто помог найти путь решения проблемы.
Приз достается Lord_Michael и Igor_K_
(28) По Вашему совету оформили СведенияОВнешнейОбработке. В результате она стала запускаться всегда.
В код обработки было добавленно изменение найденных файлов, чтобы понять, происходит ли что-либо при выполнении обработки. Она приобрела такой вид:
Функция СведенияОВнешнейОбработке() Экспорт
ВерсияБСП = СтандартныеПодсистемыСервер.ВерсияБиблиотеки();
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(ВерсияБСП);
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Назначение.Добавить("Документ.ПоступлениеТоваров");
ПараметрыРегистрации.Версия = "2.1";
ПараметрыРегистрации.БезопасныйРежим = ЛОЖЬ;
ПараметрыРегистрации.Информация = "(с) ООО ""ИНФОТЕХ"", 2019";
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = НСтр("ru = 'Автоматическая загрузка поступлений товаров...'");
Команда.Идентификатор = "АвтозагрузкаПоступленийТоваров";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Команда.ПоказыватьОповещение = Ложь;
Команда.Модификатор = "";
Возврат ПараметрыРегистрации;
КонецФункции
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения = Неопределено ) Экспорт
Сообщить ("Выполняется " + ИдентификаторКоманды + " " + ТекущаяДата());
ПутьКФайлам = "C:\Test";
Попытка
МассивФайлов = НайтиФайлы(ПутьКФайлам, "*.txt");
Исключение
Инфо = ИнформацияОбОшибке();
ЗаписьЖурналаРегистрации("Описание='" + Инфо.Описание +
"'"+"ИмяМодуля='" + Инфо.ИмяМодуля +
"'" + "НомерСтроки=" + Инфо.НомерСтроки +
" ИсходнаяСтрока='" + Инфо.ИсходнаяСтрока + "'",
УровеньЖурналаРегистрации.Ошибка);
Возврат;
КонецПопытки;
Для Каждого Стр из МассивФайлов Цикл
Сообщить("Обработка: " + Стр.Имя);
ТекФайл = Стр.ПолноеИмя;
ВыбФайл = Новый Файл(ТекФайл);
ДатаИзмененияФайла = ВыбФайл.ПолучитьУниверсальноеВремяИзменения();
ТекДок = Новый ТекстовыйДокумент;
ТекДок.Прочитать(ТекФайл, КодировкаТекста.ANSI);
НовТекст = ТекДок.ПолучитьТекст()+Символы.ПС+ "Изменен:" +ДатаИзмененияФайла;
ТекДок.УстановитьТекст(НовТекст);
ТекДок.Записать(ТекФайл, КодировкаТекста.ANSI);
ЗаписьЖурналаРегистрации ("Обработан файл: " + Стр.Имя + " " +ТекущаяДата(), УровеньЖурналаРегистрации.Информация );
КонецЦикла;
ЗаписьЖурналаРегистрации ("Выполнена "+ИдентификаторКоманды + " " +ТекущаяДата(), УровеньЖурналаРегистрации.Информация);
КонецПроцедуры
ПоказатьПосле чего стало понятно, что все работает! Расписание установили на "каждые 10 сек". В файлы стали дописываться строчки:
Изменен:28.10.2019 12:01:26
Изменен:28.10.2019 12:02:27
Изменен:28.10.2019 12:03:27
Изменен:28.10.2019 12:06:03
Изменен:28.10.2019 12:06:39
Изменен:28.10.2019 12:06:39
Изменен:28.10.2019 12:06:45
Изменен:28.10.2019 12:07:44
Изменен:28.10.2019 12:07:45
Изменен:28.10.2019 12:07:47
Изменен:28.10.2019 12:08:47
Изменен:28.10.2019 12:09:08
Изменен:28.10.2019 12:10:08
Изменен:28.10.2019 12:11:09
Изменен:28.10.2019 12:12:09
Изменен:28.10.2019 12:13:10
Изменен:28.10.2019 12:14:10
Изменен:28.10.2019 12:15:11
Изменен:28.10.2019 12:16:11
Изменен:28.10.2019 12:17:11
Изменен:28.10.2019 12:18:12
Изменен:28.10.2019 12:19:12
Изменен:28.10.2019 12:20:13
Изменен:28.10.2019 12:21:13
Изменен:28.10.2019 12:22:14
Изменен:28.10.2019 12:23:14
Изменен:28.10.2019 12:23:26
Изменен:28.10.2019 12:23:26
Изменен:28.10.2019 12:23:28
Изменен:28.10.2019 12:24:28
Изменен:28.10.2019 12:25:12
Изменен:28.10.2019 12:25:12
Изменен:28.10.2019 12:25:33
ПоказатьДалее, по совету (37) открыли стандартную форму ЖР и увидели, что все сообщения в журнал выводятся и отображаются. То есть и здесь все работает, только БСПшная форма журнала, которая открывается в стандартном меню Администрирование их почему-то не отображает.
Далее, по совету (13) использовали параметр РежимОтладки и пришли к выводу, что:
- при установленном параметре процедура Сообщить() выводит сообщение
- при не установленном - не выводит.
В общем, совместными усилиями разобрались. Спасибо всем, кто принял участие в обсуждении и особенно тем, кто помог найти путь решения проблемы.
Приз достается Lord_Michael и Igor_K_
(39)
Ну логично, при установленном параметре все выполняется в текущем сеансе, а при не установленном - в фоновом задании.
Если хотите выводить сообщения из фонового задания, это надо отдельно прописывать.
Далее, по совету (13) использовали параметр РежимОтладки и пришли к выводу, что:
- при установленном параметре процедура Сообщить() выводит сообщение
- при не установленном - не выводит.
- при установленном параметре процедура Сообщить() выводит сообщение
- при не установленном - не выводит.
Ну логично, при установленном параметре все выполняется в текущем сеансе, а при не установленном - в фоновом задании.
Если хотите выводить сообщения из фонового задания, это надо отдельно прописывать.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот