Создать временную таблицу заблокированных для чтения изменения ссылок. Создает временную таблицу заблокированных ссылок.
// Создает временную таблицу заблокированных ссылок.
// Имя таблицы: ВТЗаблокировано.
// Колонки таблицы:
// * Ссылка.
//
// Параметры:
// Очередь - Число, Неопределено - очередь обработки, в которой выполняется
// текущий обработчик. Если передано Неопределено, то проверяется во всех очередях.
// ПолныеИменаОбъектов - Строка, Массив - полные имена объектов, для которых выполняется проверка,
// например Справочник.Номенклатура.
// Могут быть переданы объекты ссылочного типа, или регистры, подчиненные регистратору.
// МенеджерВременныхТаблиц - МенеджерВременныхТаблиц - менеджер, в котором будет создана временная таблица.
// ДополнительныеПараметры - Структура - см. ОбновлениеИнформационнойБазы.ДополнительныеПараметрыВыборкиДанныхДляОбработки,
// параметр ВыбиратьПорциями игнорируется, заблокированные данные
// всегда помещаются в таблицу целиком.
//
// Возвращаемое значение:
// Структура - структура со свойствами:
// * ЕстьЗаписиВоВременнойТаблице - Булево - в создаваемой таблице есть хотя бы одна запись.
// * ИмяВременнойТаблицы - Строка - имя созданной временной таблицы.
//
Функция СоздатьВременнуюТаблицуЗаблокированныхДляЧтенияИИзмененияСсылок(Очередь, ПолныеИменаОбъектов, МенеджерВременныхТаблиц, ДополнительныеПараметры = Неопределено) Экспорт
Если ДополнительныеПараметры = Неопределено Тогда
ДополнительныеПараметры = ДополнительныеПараметрыВыборкиДанныхДляОбработки();
КонецЕсли;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
Если ПолучитьФункциональнуюОпцию("ОтложенноеОбновлениеЗавершеноУспешно") Тогда
ТекстЗапроса =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| НЕОПРЕДЕЛЕНО КАК Ссылка
|ПОМЕСТИТЬ #ИмяВременнойТаблицы
|ГДЕ
| ЛОЖЬ";
Иначе
Если ТипЗнч(ПолныеИменаОбъектов) = Тип("Строка") Тогда
ПолныеИменаОбъектовМассив = СтрРазделить(ПолныеИменаОбъектов,",",Ложь);
ИначеЕсли ТипЗнч(ПолныеИменаОбъектов) = Тип("Массив") Тогда
ПолныеИменаОбъектовМассив = ПолныеИменаОбъектов;
Иначе
ПолныеИменаОбъектовМассив = Новый Массив;
ПолныеИменаОбъектовМассив.Добавить(ПолныеИменаОбъектов);
КонецЕсли;
МассивТекстовЗапросов = Новый Массив;
ЕстьРегистры = Ложь;
Для Каждого ОбрабатываемыйТип Из ПолныеИменаОбъектовМассив Цикл
Если ТипЗнч(ОбрабатываемыйТип) = Тип("ОбъектМетаданных") Тогда
МетаданныеОбъекта = ОбрабатываемыйТип;
ПолноеИмяОбъекта = ОбрабатываемыйТип.ПолноеИмя();
Иначе
МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ОбрабатываемыйТип);
ПолноеИмяОбъекта = ОбрабатываемыйТип;
КонецЕсли;
МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъекта);
Если ОбщегоНазначения.ЭтоОбъектСсылочногоТипа(МетаданныеОбъекта) Тогда
Если МассивТекстовЗапросов.Количество() = 0 Тогда
ТекстЗапроса =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТаблицаИзменений.Ссылка КАК Ссылка
|//ПервыйЗапрос
|ИЗ
| #ТаблицаИзменений КАК ТаблицаИзменений
|ГДЕ
| &УсловиеОтбораУзла";
Иначе
ТекстЗапроса =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТаблицаИзменений.Ссылка КАК Ссылка
|ИЗ
| #ТаблицаИзменений КАК ТаблицаИзменений
|ГДЕ
| &УсловиеОтбораУзла";
КонецЕсли;
ИначеЕсли ОбщегоНазначения.ЭтоРегистр(МетаданныеОбъекта) Тогда
Если МассивТекстовЗапросов.Количество() = 0 Тогда
ТекстЗапроса =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТаблицаИзменений.Регистратор КАК Ссылка
|//ПервыйЗапрос
|ИЗ
| #ТаблицаИзменений КАК ТаблицаИзменений
|ГДЕ
| &УсловиеОтбораУзла";
Иначе
ТекстЗапроса =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТаблицаИзменений.Регистратор КАК Ссылка
|ИЗ
| #ТаблицаИзменений КАК ТаблицаИзменений
|ГДЕ
| &УсловиеОтбораУзла";
КонецЕсли;
ЕстьРегистры = Истина;
Иначе
ТекстИсключения = НСтр("ru = 'Для типа метаданных ""%МетаданныеОбъекта%"" не поддерживается проверка в функции ОбновлениеИнформационнойБазы.СоздатьВременнуюТаблицуЗаблокированныхДляЧтенияИИзмененияСсылок'");
ТекстИсключения = СтрЗаменить(ТекстИсключения, "%МетаданныеОбъекта%", Строка(МетаданныеОбъекта));
ВызватьИсключение ТекстИсключения;
КонецЕсли;
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ТаблицаИзменений", ПолноеИмяОбъекта + ".Изменения");
МассивТекстовЗапросов.Добавить(ТекстЗапроса);
КонецЦикла;
Соединитель = "
|
|ОБЪЕДИНИТЬ ВСЕ
|";
ТекстЗапроса = СтрСоединить(МассивТекстовЗапросов, Соединитель);
Если ЕстьРегистры
И МассивТекстовЗапросов.Количество() > 1 Тогда
ТекстЗапроса =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВложенныйЗапрос.Ссылка КАК Ссылка
|ПОМЕСТИТЬ #ИмяВременнойТаблицы
|ИЗ
| (" + ТекстЗапроса + ") КАК ВложенныйЗапрос
|
|ИНДЕКСИРОВАТЬ ПО
| Ссылка";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "//ПервыйЗапрос", "");
Иначе
ТекстЗапроса = ТекстЗапроса + "
|
|ИНДЕКСИРОВАТЬ ПО
| Ссылка";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "//ПервыйЗапрос", "ПОМЕСТИТЬ #ИмяВременнойТаблицы");
КонецЕсли;
Если Очередь = Неопределено Тогда
УсловиеОтбораУзла = " ТаблицаИзменений.Узел ССЫЛКА ПланОбмена.ОбновлениеИнформационнойБазы ";
Иначе
УсловиеОтбораУзла = " ТаблицаИзменений.Узел В (&Узлы) ";
Запрос.УстановитьПараметр("Узлы", УзлыМеньшейОчереди(Очередь));
КонецЕсли;
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеОтбораУзла", УсловиеОтбораУзла);
КонецЕсли;
Если ПустаяСтрока(ДополнительныеПараметры.ИмяВременнойТаблицы) Тогда
ИмяВременнойТаблицы = "ВТЗаблокировано";
Иначе
ИмяВременнойТаблицы = ДополнительныеПараметры.ИмяВременнойТаблицы;
КонецЕсли;
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ИмяВременнойТаблицы", ИмяВременнойТаблицы);
Запрос.Текст = ТекстЗапроса;
РезультатЗапроса = Запрос.Выполнить();
Результат = Новый Структура("ЕстьЗаписиВоВременнойТаблице,ИмяВременнойТаблицы", Ложь, "");
Результат.ИмяВременнойТаблицы = ИмяВременнойТаблицы;
Результат.ЕстьЗаписиВоВременнойТаблице = РезультатЗапроса.Выгрузить()[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К участников)