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