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