Есть данные для обработки. Проверяет, есть ли еще необработанные данные.
// Проверяет, есть ли еще необработанные данные.
//
// Параметры:
// Очередь - Число - очередь, к которой отнесен обработчик и в которой зарегистрированы данные,
// которые он будет обрабатывать.
// - Неопределено - проверяется, завершена ли обработка в целом;
// - Массив - проверяется, есть данные для обработки в списке очередей.
// ПолноеИмяМетаданныеОбъекта- Строка, ОбъектМетаданных - полное имя обрабатываемого объекта или
// его метаданные. Например, "Документ.ПриходныйОрдерНаТовары"
// - Массив - массив полных имен объектов или объектов метаданных,
// в массиве не должно быть независимых регистров сведений.
// Отбор - ЛюбаяСсылка, Структура, Неопределено, Массив - отбор данных для проверки.
// Если передано Неопределено - проверяется по всему типу объекта.
// Если объект - регистр, подчиненный регистратору, то в отборе - ссылка
// на регистратор или массив ссылок.
// Если объект ссылочного типа, то в отборе - или ссылка, или массив ссылок.
// Если объект - независимый регистр сведений, то в отборе - структура со значениями измерений.
// Ключ структуры - имя измерения, значение - значение отбора (можно передать массив значений).
//
// Возвращаемое значение:
// Булево - Истина, если еще не все данные обработаны.
//
Функция ЕстьДанныеДляОбработки(Очередь, ПолноеИмяМетаданныеОбъекта, Отбор = Неопределено) Экспорт
Если ПолучитьФункциональнуюОпцию("ОтложенноеОбновлениеЗавершеноУспешно") Тогда
ЭтоПодчиненныйУзелРИБ = ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ();
Если Не ЭтоПодчиненныйУзелРИБ Тогда
Возврат Ложь;
ИначеЕсли ПолучитьФункциональнуюОпцию("ОтложенноеОбновлениеВГлавномУзлеЗавершеноУспешно") Тогда
Возврат Ложь;
КонецЕсли;
КонецЕсли;
Если ТипЗнч(ПолноеИмяМетаданныеОбъекта) = Тип("Строка") Тогда
ПолныеИменаОбрабатываемыхОбъектов = СтрРазделить(ПолноеИмяМетаданныеОбъекта, ",");
ИначеЕсли ТипЗнч(ПолноеИмяМетаданныеОбъекта) = Тип("Массив") Тогда
ПолныеИменаОбрабатываемыхОбъектов = ПолноеИмяМетаданныеОбъекта;
ИначеЕсли ТипЗнч(ПолноеИмяМетаданныеОбъекта) = Тип("ОбъектМетаданных") Тогда
ПолныеИменаОбрабатываемыхОбъектов = Новый Массив;
ПолныеИменаОбрабатываемыхОбъектов.Добавить(ПолноеИмяМетаданныеОбъекта.ПолноеИмя());
Иначе
ТекстИсключения = НСтр("ru = 'Передан неправильный тип параметра ""ПолноеИмяМетаданныеОбъекта"" в функцию ОбновлениеИнформационнойБазы.ЕстьДанныеДляОбработки'");
ВызватьИсключение ТекстИсключения;
КонецЕсли;
Запрос = Новый Запрос;
ТекстыЗапроса = Новый Массив;
ОтборУстановлен = Ложь;
Для каждого ОбрабатываемыйТип Из ПолныеИменаОбрабатываемыхОбъектов Цикл
Если ТипЗнч(ОбрабатываемыйТип) = Тип("ОбъектМетаданных") Тогда
МетаданныеОбъекта = ОбрабатываемыйТип;
ПолноеИмяОбъекта = ОбрабатываемыйТип.ПолноеИмя();
Иначе
МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ОбрабатываемыйТип);
ПолноеИмяОбъекта = ОбрабатываемыйТип;
КонецЕсли;
ИмяОбъекта = СтрРазделить(ПолноеИмяОбъекта,".",Ложь)[1];
УсловиеОтбораДанных = "ИСТИНА";
Если ОбщегоНазначения.ЭтоОбъектСсылочногоТипа(МетаданныеОбъекта) Тогда
ТекстЗапроса =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ТаблицаИзменений.Ссылка КАК Ссылка
|ИЗ
| #ТаблицаИзменений КАК ТаблицаИзменений
| ЛЕВОЕ СОЕДИНЕНИЕ #ТаблицаОбъекта КАК #ИмяОбъекта
| ПО #ИмяОбъекта.Ссылка = ТаблицаИзменений.Ссылка
|ГДЕ
| &УсловиеОтбораУзла
| И &УсловиеОтбораДанных
| И НЕ #ИмяОбъекта.Ссылка ЕСТЬ NULL";
Запрос.УстановитьПараметр("Ссылка", Отбор);
Если Отбор <> Неопределено Тогда
УсловиеОтбораДанных = "ТаблицаИзменений.Ссылка В (&Отбор)";
КонецЕсли;
ИначеЕсли ОбщегоНазначения.ЭтоРегистрСведений(МетаданныеОбъекта)
И МетаданныеОбъекта.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.Независимый Тогда
Если ПолныеИменаОбрабатываемыхОбъектов.Количество() > 1 Тогда
ТекстИсключения = НСтр("ru = 'В массиве имен в параметре ""ПолноеИмяМетаданныеОбъекта"" в функцию ОбновлениеИнформационнойБазы.ЕстьДанныеДляОбработки передан независимый регистр сведений.'");
ВызватьИсключение ТекстИсключения;
КонецЕсли;
ОтборУстановлен = Истина;
ТекстЗапроса =
"ВЫБРАТЬ ПЕРВЫЕ 1
| &ТекстВыборкиИзмерений
|ИЗ
| #ТаблицаИзменений КАК ТаблицаИзменений
|ГДЕ
| &УсловиеОтбораУзла
| И &УсловиеОтбораДанных";
ТекстВыборкиИзмерений = "";
Для Каждого Измерение Из МетаданныеОбъекта.Измерения Цикл
Если Не Измерение.ОсновнойОтбор Тогда
Продолжить;
КонецЕсли;
ТекстВыборкиИзмерений = ТекстВыборкиИзмерений + "
| ТаблицаИзменений." + Измерение.Имя + " КАК " + Измерение.Имя + ",";
Если Отбор <> Неопределено Тогда
УсловиеОтбораДанных = УсловиеОтбораДанных + "
| И (ТаблицаИзменений." + Измерение.Имя + " В (&ЗначениеОтбора" + Измерение.Имя + ")
| ИЛИ ТаблицаИзменений." + Измерение.Имя + " = &ПустоеЗначение" + Измерение.Имя + ")";
Если Отбор.Свойство(Измерение.Имя) Тогда
Запрос.УстановитьПараметр("ЗначениеОтбора" + Измерение.Имя, Отбор[Измерение.Имя]);
Иначе
Запрос.УстановитьПараметр("ЗначениеОтбора" + Измерение.Имя, Измерение.Тип.ПривестиЗначение());
КонецЕсли;
Запрос.УстановитьПараметр("ПустоеЗначение" + Измерение.Имя, Измерение.Тип.ПривестиЗначение());
КонецЕсли;
КонецЦикла;
Если ПустаяСтрока(ТекстВыборкиИзмерений) Тогда
ТекстВыборкиИзмерений = "*";
Иначе
ТекстВыборкиИзмерений = Лев(ТекстВыборкиИзмерений, СтрДлина(ТекстВыборкиИзмерений) - 1);
КонецЕсли;
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекстВыборкиИзмерений", ТекстВыборкиИзмерений);
ИначеЕсли ОбщегоНазначения.ЭтоРегистр(МетаданныеОбъекта) Тогда
ТекстЗапроса =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ТаблицаИзменений.Регистратор КАК Ссылка
|ИЗ
| #ТаблицаИзменений КАК ТаблицаИзменений
|ГДЕ
| &УсловиеОтбораУзла
| И &УсловиеОтбораДанных
| И НЕ Регистратор.Ссылка ЕСТЬ NULL";
Если Отбор <> Неопределено Тогда
УсловиеОтбораДанных = "ТаблицаИзменений.Регистратор В (&Отбор)";
КонецЕсли;
Иначе
ТекстИсключения = НСтр("ru = 'Для типа метаданных ""%МетаданныеОбъекта%"" не поддерживается проверка в функции ОбновлениеИнформационнойБазы.ЕстьДанныеДляОбработки'");
ТекстИсключения = СтрЗаменить(ТекстИсключения, "%МетаданныеОбъекта%", Строка(МетаданныеОбъекта));
ВызватьИсключение ТекстИсключения;
КонецЕсли;
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ТаблицаИзменений", ПолноеИмяОбъекта + ".Изменения");
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ТаблицаОбъекта", ПолноеИмяОбъекта);
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ИмяОбъекта", ИмяОбъекта);
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеОтбораДанных", УсловиеОтбораДанных);
ТекстыЗапроса.Добавить(ТекстЗапроса);
КонецЦикла;
Соединитель = "
|
|ОБЪЕДИНИТЬ ВСЕ
|";
ТекстЗапроса = СтрСоединить(ТекстыЗапроса, Соединитель);
Если Очередь = Неопределено Тогда
УсловиеОтбораУзла = " ТаблицаИзменений.Узел ССЫЛКА ПланОбмена.ОбновлениеИнформационнойБазы ";
Иначе
УсловиеОтбораУзла = " ТаблицаИзменений.Узел В (&Узлы) ";
Если ТипЗнч(Очередь) = Тип("Массив") Тогда
Запрос.УстановитьПараметр("Узлы", Очередь);
Иначе
Запрос.УстановитьПараметр("Узлы", ОчередьСсылкой(Очередь));
КонецЕсли;
КонецЕсли;
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеОтбораУзла", УсловиеОтбораУзла);
Если Не ОтборУстановлен Тогда
Запрос.УстановитьПараметр("Отбор", Отбор);
КонецЕсли;
Запрос.Текст = ТекстЗапроса;
Возврат Не Запрос.Выполнить().Пустой();
КонецФункции
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)