Коллеги, столкнулся с необычной ситуацией, которую не могу понять.
Ниже привожу полный код процедуры, которая должна выгрузить данные по правилам КД2, разбив сами данные на пакеты.
Процедура вызывается из обычной команды формы, никаких нестандартов нет. А проблема следующая - после 5-6 итераций цикла, отладка явно показывает что идет выполнение строки кода Обработка.ВыполнитьВыгрузку();, в настройках отладки стоит остановка по ошибке, но она не срабатывает, а срабатывает точка останова на самой первой строчке процедуры ВсеПакетыВыгружены = Ложь;. Т.е. начинается опять выгрузка с первого пакета, сам наблюдаю что запущенный обработчик создал несколько файлов и гоняет в них выгрузку по кругу. Не могу понять, как может исполнение кода выйти из цикла заново начаться с начала процедуры.
Прикрепил стек вызова такого выхода из цикла, но мне он ничего не дал.
Ниже привожу полный код процедуры, которая должна выгрузить данные по правилам КД2, разбив сами данные на пакеты.
&НаСервере
Процедура ВыгрузитьДанные()
ВсеПакетыВыгружены = Ложь;
Пока НЕ ВсеПакетыВыгружены Цикл
Обработка = ВнешниеОбработки.Создать(Объект.ПутьККаталогуВыгрузки + "УниверсальныйОбменДаннымиXML.epf", Ложь);
//Обработка = Обработки.УниверсальныйОбменДаннымиXML.Создать();
Обработка.РежимОбмена = "Выгрузка";
Обработка.ИмяФайлаПравилОбмена = Объект.ПутьКФайлуПравил;
Обработка.ЗагрузитьПравилаОбмена();
СтрокаДатаВыгрузки = Обработка.ТаблицаНастройкиПараметров[0];
СтрокаДатаВыгрузки.Значение = Объект.ДатаВыгрузки;
СтрокаКодПервый = Обработка.ТаблицаНастройкиПараметров[1];
СтрокаКодПоследний = Обработка.ТаблицаНастройкиПараметров[2];
Обработка.ИмяФайлаОбмена = Объект.ПутьККаталогуВыгрузки + "пакет_" + Формат(Объект.ТекКодПервый, "ЧДЦ=0; ЧГ=") + "_" + Формат(Объект.ТекКодПоследний, "ЧДЦ=0; ЧГ=") + ".xml";
СтрокаКодПервый.Значение = Объект.ТекКодПервый;
СтрокаКодПоследний.Значение = Объект.ТекКодПоследний;
Обработка.ВыполнитьОбменДаннымиВОптимизированномФормате = Истина;
Обработка.ВыполнитьВыгрузку();
Обработка = Неопределено;
//
Если Объект.ТекКодПоследний = Объект.МаксимальныйНомер Тогда
ВсеПакетыВыгружены = Истина;
Прервать;
КонецЕсли;
//
Объект.ТекКодПервый = Объект.ТекКодПоследний + 1;
Объект.ТекКодПоследний = Объект.ТекКодПоследний + Объект.ШагПакета;
Если Объект.ТекКодПоследний >= Объект.МаксимальныйНомер Тогда
Объект.ТекКодПоследний = Объект.МаксимальныйНомер;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
ПоказатьПроцедура вызывается из обычной команды формы, никаких нестандартов нет. А проблема следующая - после 5-6 итераций цикла, отладка явно показывает что идет выполнение строки кода Обработка.ВыполнитьВыгрузку();, в настройках отладки стоит остановка по ошибке, но она не срабатывает, а срабатывает точка останова на самой первой строчке процедуры ВсеПакетыВыгружены = Ложь;. Т.е. начинается опять выгрузка с первого пакета, сам наблюдаю что запущенный обработчик создал несколько файлов и гоняет в них выгрузку по кругу. Не могу понять, как может исполнение кода выйти из цикла заново начаться с начала процедуры.
Прикрепил стек вызова такого выхода из цикла, но мне он ничего не дал.
Прикрепленные файлы:

По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
прочел три строки кода
понял, что объект обработки создается в цикле всякий раз и больше не стал читать бред .
в средние века за такое вели на костер без апелляций.
ВсеПакетыВыгружены = Ложь;
Пока НЕ ВсеПакетыВыгружены Цикл
Обработка = ВнешниеОбработки.Создать(Объект.ПутьККаталогуВыгрузки + "УниверсальныйОбменДаннымиXML.epf", Ложь);
понял, что объект обработки создается в цикле всякий раз и больше не стал читать бред .
в средние века за такое вели на костер без апелляций.
Стесняюсь спросить...
Ставили на эти строчки точку останова?
Когда начинается бредовая ситуация нужно проверять даже те , которые кажутся изначальным бредом...
И все же вернитесь к исходному варианту , где создается выгрузка не в цикле а перед ним, ибо ваш теперешний вариант точно еще бредовее,
поскольку именно по этой причине в цикле создается новый объект и снова запускается эта же процедура с нуля
Ставили на эти строчки точку останова?
ВсеПакетыВыгружены = Истина;
Прервать;
Когда начинается бредовая ситуация нужно проверять даже те , которые кажутся изначальным бредом...
И все же вернитесь к исходному варианту , где создается выгрузка не в цикле а перед ним, ибо ваш теперешний вариант точно еще бредовее,
поскольку именно по этой причине в цикле создается новый объект и снова запускается эта же процедура с нуля
(5) Подключать внешнюю обработку или использовать встроенную - вопрос лишь быстродействия, а у меня другая проблема. Если вы не поняли, запущенная процедура вызывается лишь раз, в команде формы, она должна прокрутить цикл и завершиться, а у меня она начинается с самого начала даже когда не завершился ее же цикл.
&НаСервере
Процедура ВыгрузитьДанные()
ВсеПакетыВыгружены = Ложь;
ТекКодПервый = 1;
ТекКодПоследний = Объект.ШагПакета - 1;
Обработка = Обработки.УниверсальныйОбменДаннымиXML.Создать();
Обработка.РежимОбмена = "Выгрузка";
Обработка.ИмяФайлаПравилОбмена = Объект.ПутьКФайлуПравил;
Обработка.ВыполнитьОбменДаннымиВОптимизированномФормате = Истина;
Обработка.ЗагрузитьПравилаОбмена();
СтрокаДатаВыгрузки = Обработка.ТаблицаНастройкиПараметров[0];
СтрокаДатаВыгрузки.Значение = Объект.ДатаВыгрузки;
СтрокаКодПервый = Обработка.ТаблицаНастройкиПараметров[1];
СтрокаКодПоследний = Обработка.ТаблицаНастройкиПараметров[2];
Пока НЕ ВсеПакетыВыгружены Цикл
Обработка.ИмяФайлаОбмена = Объект.ПутьККаталогуВыгрузки + "пакет_" + Формат(ТекКодПервый, "ЧДЦ=0; ЧГ=") + "_" + Формат(ТекКодПоследний, "ЧДЦ=0; ЧГ=") + ".xml";
СтрокаКодПервый.Значение = ТекКодПервый;
СтрокаКодПоследний.Значение = ТекКодПоследний;
Обработка.ВыполнитьВыгрузку();
Если ТекКодПоследний = Объект.МаксимальныйНомер Тогда
ВсеПакетыВыгружены = Истина;
КонецЕсли;
ТекКодПервый = ТекКодПоследний + 1;
ТекКодПоследний = ТекКодПоследний + Объект.ШагПакета;
Если ТекКодПоследний >= Объект.МаксимальныйНомер Тогда
ТекКодПоследний = Объект.МаксимальныйНомер;
КонецЕсли;
КонецЦикла;
Обработка = Неопределено;
КонецПроцедуры
ПоказатьВот первоначальный вариант. Выгрузка в цикле нужна что бы разбить данные на пакеты, т.е. в ПВД предусмотрены необходимые параметры, которые отбирают данные. УниверсальныйОбменДаннымиXML это штатная обработка, если ей выгружать вручную никаких проблем нет, просто отнимает много времени что бы все пакеты выгрузить, а стоит задача сделать автомат и ночью формировать пакеты.
(12) Сколько же вас, ценителей красоты) а код прочитать?)
ТекКодПоследний всегда будет равен Объект.МаксимальныйНомер в конце цикла. Проблема в другом, цикл до конца даже не отрабатывает. Из 39 необходимых итераций проходят только 5-6, и процедура, а не цикл, начинаются заново.
Если ТекКодПоследний >= Объект.МаксимальныйНомер Тогда
ТекКодПоследний = Объект.МаксимальныйНомер;
КонецЕсли;
ТекКодПоследний всегда будет равен Объект.МаксимальныйНомер в конце цикла. Проблема в другом, цикл до конца даже не отрабатывает. Из 39 необходимых итераций проходят только 5-6, и процедура, а не цикл, начинаются заново.
(14)Дело не в красоте а в неоднозначности вашего кода (По вашему же утверждению!)
Так может писать просто и однозначно?
Так может писать просто и однозначно?
ТекКодПервый = ТекКодПоследний + 1;
ТекКодПоследний = ТекКодПоследний + Объект.ШагПакета;
Если ТекКодПоследний > Объект.МаксимальныйНомер Тогда
ВсеПакетыВыгружены = Истина;
ТекКодПоследний = Объект.МаксимальныйНомер;
Прервать;
КонецЕсли;
КонецЦикла;
Показать
(15) Если не поняли, объясняю еще раз. Проблема не с тем, что я не могу придумать нормальное условие выхода из цикла, десятки вариантов, которые будут работать, тут без разницы. Проблема в том, что ПРОЦЕДУРА начинается с самого начала, когда цикл еще не завершен.
(23) Обработка УниверсальныйОбменДаннымиXML есть в любой типовой. Моя обработка просто программно ее вызывает. Вот модуль формы моей обработки, там кода кот наплакал, что бы в нем что-то подозревать. Кстати, попробовал переименовать, не помогло.
&НаСервере
Процедура ВыгрузитьДанные111()
ВсеПакетыВыгружены = Ложь;
ТекКодПервый = 1;
ТекКодПоследний = Объект.ШагПакета - 1;
Обработка = Обработки.УниверсальныйОбменДаннымиXML.Создать();
Обработка.РежимОбмена = "Выгрузка";
Обработка.ИмяФайлаПравилОбмена = Объект.ПутьКФайлуПравил;
Обработка.ВыполнитьОбменДаннымиВОптимизированномФормате = Истина;
Обработка.ЗагрузитьПравилаОбмена();
СтрокаДатаВыгрузки = Обработка.ТаблицаНастройкиПараметров[0];
СтрокаДатаВыгрузки.Значение = Объект.ДатаВыгрузки;
СтрокаКодПервый = Обработка.ТаблицаНастройкиПараметров[1];
СтрокаКодПоследний = Обработка.ТаблицаНастройкиПараметров[2];
Пока НЕ ВсеПакетыВыгружены Цикл
Обработка.ИмяФайлаОбмена = Объект.ПутьККаталогуВыгрузки + "пакет_" + Формат(ТекКодПервый, "ЧДЦ=0; ЧГ=") + "_" + Формат(ТекКодПоследний, "ЧДЦ=0; ЧГ=") + ".xml";
Обработка.ИмяФайлаПротоколаОбмена = Объект.ПутьККаталогуВыгрузки + "протокол_" + Формат(ТекКодПервый, "ЧДЦ=0; ЧГ=") + "_" + Формат(ТекКодПоследний, "ЧДЦ=0; ЧГ=") + ".txt";
СтрокаКодПервый.Значение = ТекКодПервый;
СтрокаКодПоследний.Значение = ТекКодПоследний;
Обработка.ВыполнитьВыгрузку();
Если ТекКодПоследний = Объект.МаксимальныйНомер Тогда
ВсеПакетыВыгружены = Истина;
КонецЕсли;
ТекКодПервый = ТекКодПоследний + 1;
ТекКодПоследний = ТекКодПоследний + Объект.ШагПакета;
Если ТекКодПоследний >= Объект.МаксимальныйНомер Тогда
ТекКодПоследний = Объект.МаксимальныйНомер;
КонецЕсли;
КонецЦикла;
Обработка = Неопределено;
КонецПроцедуры
&НаКлиенте
Процедура ВыгрузитьОстатки(Команда)
ВыгрузитьДанные111();
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Объект.ПутьКФайлуПравил = "тут путь\ПравилаОбменаДаннымиУТ_ТТ.xml";
Объект.ПутьККаталогуВыгрузки = "тут путь\";
Объект.ШагПакета = 100000;
Объект.ДатаВыгрузки = Дата(2019, 06, 30);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| МАКСИМУМ(ТД_БалансовыеСчетаУчастниковПЛ.Код) КАК Код
|ИЗ
| Справочник.ТД_БалансовыеСчетаУчастниковПЛ КАК ТД_БалансовыеСчетаУчастниковПЛ";
ВыборкаПоиск = Запрос.Выполнить().Выбрать();
Если ВыборкаПоиск.Следующий() Тогда
Объект.МаксимальныйНомер = ВыборкаПоиск.Код;
КонецЕсли;
КонецПроцедуры
Показать
примерно так я выполняю внешние отчеты программно в потоках или итерациях
может комментарии вызовую у вас работу мысли.
...
// Создание экземпляра внешего отчета объекта штатным методом ВнешниеОтчеты.Подключить()
ОбъектОписанияЗащиты = Новый ОписаниеЗащитыОтОпасныхДействий;
ОбъектОписанияЗащиты.ПредупреждатьОбОпасныхДействиях = Ложь; // Отключает предупреждения защиты при работе с COMОбъект и т.д. независимо от настроек пользователя и информационной базы
//ОтчетИмя = ВнешниеОтчеты.Подключить(ОтчетАдрес,,Ложь); // Будет использовано имя, содержащееся в самом отчете
ОтчетИмя = ИмяОбъекта+"_"+СтрЗаменить(Строка(ТекущаяУниверсальнаяДатаВМиллисекундах()), Символы.НПП,""); // Например, получим строку вида "ОтчетПоАкциямСКД_63636735405379", где число - это количество миллисекунд текущей даты строкой
ВнешниеОтчеты.Подключить(ОтчетАдрес, ОтчетИмя, ОтчетСсылка.БезопасныйРежим, ОбъектОписанияЗащиты); // Благодаря уникальному имени в системе будет зарегистрирован уникальный объект для итерации или потока
ОтчетОбъект = ВнешниеОтчеты.Создать(ОтчетИмя, ОтчетСсылка.БезопасныйРежим);
...
ОтчетОбъект.СкомпоноватьРезультат(ДокументРезультат, ДанныеРасшифровкиОбъект);
Показатьможет комментарии вызовую у вас работу мысли.
(27)
ОбработкаМенеджер.<Имя обработки> (DataProcessorManager.<Имя обработки>)
Создать (Create)
Синтаксис:
Создать()
Возвращаемое значение:
Тип: ОбработкаОбъект.<Имя обработки>.
Описание:
Создает новый экземпляр обработки.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Пример:
ОбработкаДокументов = Обработки.ОбработкаДокументов.Создать();
Показать
СП говорит что экземпляр создается новый. Или вы имеете ввиду что-то другое?
ОбработкаМенеджер.<Имя обработки> (DataProcessorManager.<Имя обработки>)
Создать (Create)
Синтаксис:
Создать()
Возвращаемое значение:
Тип: ОбработкаОбъект.<Имя обработки>.
Описание:
Создает новый экземпляр обработки.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Пример:
ОбработкаДокументов = Обработки.ОбработкаДокументов.Создать();
СП говорит что экземпляр создается новый. Или вы имеете ввиду что-то другое?
Код под твою обработку
&НаСервере
Процедура УстановитьСчетчики(ТекКодПервый, ТекКодПоследний, ШагПакета, МаксимальныйНомер)
ТекКодПервый = ТекКодПоследний + 1;
ТекКодПоследний = МИН(ТекКодПоследний + ШагПакета - 1, МаксимальныйНомер);
КонецПроцедуры
&НаСервере
Процедура ВыгрузитьДанные()
ТекКодПервый = 0;
ТекКодПоследний = 0;
УстановитьСчетчики(ТекКодПервый, ТекКодПоследний, Объект.ШагПакета, Объект.МаксимальныйНомер);
Обработка = Обработки.УниверсальныйОбменДаннымиXML.Создать();
Обработка.РежимОбмена = "Выгрузка";
Обработка.ИмяФайлаПравилОбмена = Объект.ПутьКФайлуПравил;
Обработка.ВыполнитьОбменДаннымиВОптимизированномФормате = Истина;
Обработка.ЗагрузитьПравилаОбмена();
СтрокаДатаВыгрузки = Обработка.ТаблицаНастройкиПараметров[0];
СтрокаДатаВыгрузки.Значение = Объект.ДатаВыгрузки;
Пока ТекКодПервый <= Объект.МаксимальныйНомер Цикл
ВыгрузитьДанныеПоПакетам(Обработка, ТекКодПервый, ТекКодПоследний);
УстановитьСчетчики(ТекКодПервый, ТекКодПоследний, Объект.ШагПакета, Объект.МаксимальныйНомер)
КонецЦикла;
Обработка = Неопределено;
КонецПроцедуры
&НаСервере
Процедура ВыгрузитьДанныеПоПакетам(Обработка, ТекКодПервый, ТекКодПоследний)
СтрокаКодПервый = Обработка.ТаблицаНастройкиПараметров[1];
СтрокаКодПоследний = Обработка.ТаблицаНастройкиПараметров[2];
СтрокаКодПервый.Значение = ТекКодПервый;
СтрокаКодПоследний.Значение = ТекКодПоследний;
Обработка.ИмяФайлаОбмена = Объект.ПутьККаталогуВыгрузки + "пакет_" + Формат(ТекКодПервый, "ЧДЦ=0; ЧГ=") + "_" + Формат(ТекКодПоследний, "ЧДЦ=0; ЧГ=") + ".xml";
Обработка.ВыполнитьВыгрузку();
КонецПроцедуры
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот