Публикации

БСП
Разработки

Найдено результатов: 157


Просмотр временной таблицы

Автор: HostHost

FastCode 64 8
Запрос.МенеджерВременныхТаблиц.Таблицы.Получить(0).ПолучитьДанные().Выгрузить();

Уничтожение временной таблицы

Автор: HostHost

FastCode 64 8
//1.
ЗарплатаКадры.УничтожитьВТ(

        МенеджерВременныхТаблиц,

        СтрРазделить("ВТФизическиеЛицаПатент,ВТКадровыеДанныеСотрудников,ВТИностранцыСотрудники,ВТИностранцы,ВТНерезиденты,ВТФиксированныеСтатусыФизическихЛиц,ВТТекущиеСтатусыФизическихЛиц,ВТИностранцыСДатами,ВТНачисления,ВТРегистрация,ВТРассчитанныеДниВРФ",","));

//2.
		
УдалитьВТ = Новый Массив;

УдалитьВТ.Добавить("втВременныеПозиции");

УдалитьВТ.Добавить("втВременныеПодразделения");

УдалитьВТ.Добавить("втФинальная");

ЗарплатаКадры.УничтожитьВТ(МенеджерВТ, УдалитьВТ);

Создает временную таблицу по набору записей

Автор: HostHost

FastCode 64 8
ЗарплатаКадры.СоздатьВТПоНаборуЗаписей(Запрос.МенеджерВременныхТаблиц, Движения.СведенияОДоходахНДФЛ, Истина, "ВТПеренесенныеДоходы");

Создать временную таблицу, с данными учета времени и состояний сотрудников

Автор: HostHost

FastCode 64 8
ПараметрыЗаполнения = УчетРабочегоВремениРасширенный.ПараметрыДляЗапросВТДанныеУчетаВремениИСостоянийСотрудников();

ПараметрыЗаполнения.ИмяВТСотрудники = "ВТСотрудникиПериоды";

ПараметрыЗаполнения.ИмяВТРезультат = "ВТУчетРабочегоВремениПолный";

ПараметрыЗаполнения.РассчитыватьПлановоеВремя = Истина;

ПараметрыЗаполнения.ДатаАктуальности  = ПериодПланирования;

ПараметрыЗаполнения.ДатаНачала = АнализируемыйГод;

ПараметрыЗаполнения.ДатаОкончания = КонецГода(АнализируемыйГод);

ПараметрыЗаполнения.МесяцДатаНачала = АнализируемыйГод;

ПараметрыЗаполнения.МесяцДатаОкончания = КонецГода(АнализируемыйГод);

ПараметрыЗаполнения.ВыделятьВыходныеВПериодыОтклонений = Ложь;

УчетРабочегоВремениРасширенный.СоздатьВТДанныеУчетаВремениИСостоянийСотрудников(Запрос.МенеджерВременныхТаблиц, Истина, ПараметрыЗаполнения);

Создать временную таблицу из таблицы значений

Автор: HostHost

FastCode 64 8
ЗарплатаКадры.СоздатьВТПоТаблицеЗначений(Запрос.МенеджерВременныхТаблиц, ТаблицаМВО, "ВТМВО", Истина);

Временная таблица периодического регистра с периодами

FastCode 64 8
ОписаниеФильтраПолученияГрафиков = ЗарплатаКадрыПериодическиеРегистры.ОписаниеФильтраДляСоздатьВТИмяРегистра("ВТПериодыЗапросаКадровойИстории", "ФизическоеЛицо", "ФизическоеЛицо");

ЗарплатаКадрыПериодическиеРегистры.СоздатьВТИмяРегистраПериоды("КадроваяИсторияСотрудников", МенеджерВременныхТаблиц, Ложь, ОписаниеФильтраПолученияГрафиков);

Создать временную таблицу по имени регистра СрезПоследних

Автор: HostHost

FastCode 64 8
// 1.

ОписаниеФильтра = ЗарплатаКадрыОбщиеНаборыДанных.ОписаниеФильтраДляСоздатьВТИмяРегистра("ВТСотрудникиПериоды","Сотрудник");

ОписаниеФильтра.СоответствиеИзмеренийРегистраИзмерениямФильтра.Вставить("Период", "Период");

ОписаниеФильтра.СоответствиеИзмеренийРегистраИзмерениямФильтра.Вставить("Сотрудник", "Сотрудник");

ЗарплатаКадрыОбщиеНаборыДанных.СоздатьВТИмяРегистраСрезПоследних(

        "ГрафикРаботыСотрудников",

        МенеджерВременныхТаблиц,

        Истина,

        ОписаниеФильтра,, "ВТГрафики");

// 2.

ОписаниеФильтра = ЗарплатаКадрыПериодическиеРегистры.ОписаниеФильтраДляСоздатьВТИмяРегистра("ВТФильтрПозиции", "Позиция");   

ПараметрыПостроения = ЗарплатаКадрыПериодическиеРегистры.ПараметрыПостроенияДляСоздатьВТИмяРегистраСрез();

ЗарплатаКадрыОбщиеНаборыДанных.ДобавитьВКоллекциюОтбор(ПараметрыПостроения.Отборы, "Позиция", "<>", Справочники.ШтатноеРасписание.ПустаяСсылка());

ПоказателиПремий = Новый Массив;

ПоказателиПремий.Добавить(Справочники.ПоказателиРасчетаЗарплаты.НайтиПоРеквизиту("Идентификатор", "ПроцентПпремииПроизводственной"));

ПоказателиПремий.Добавить(Справочники.ПоказателиРасчетаЗарплаты.НайтиПоРеквизиту("Идентификатор", "ПроцентГодовойПремии"));

ЗарплатаКадрыОбщиеНаборыДанных.ДобавитьВКоллекциюОтбор(ПараметрыПостроения.Отборы, "Показатель", "В", ПоказателиПремий);

ЗарплатаКадрыПериодическиеРегистры.СоздатьВТИмяРегистраСрезПоследних("ЗначенияПлановыхПоказателейРасчетаЗП", МенеджерВТ, Истина, ОписаниеФильтра, ПараметрыПостроения, "ВТЗначенияПлановыхПоказателейРасчетаЗП");

Создание временной таблицы "КадровыеДанныеСотрудников"

Автор: HostHost

FastCode 64 8
ОписательВТ = КадровыйУчет.ОписательВременныхТаблицДляСоздатьВТКадровыеДанныеСотрудников(Запрос.МенеджерВременныхТаблиц, "ВТСотрудникиПериоды");

КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников(ОписательВТ, Ложь, "ТекущаяДолжность, ДатаПриема, ДатаУвольнения");

Ищет по имени временную таблицу в менеджере

Автор: HostHost

FastCode 64 8
ЗарплатаКадры.ВТСуществует(МенеджерВременныхТаблиц, "ВТПоказателиРасчета")

Создать временную таблицу "Штатное расписание"

Автор: HostHost

FastCode 64 8
ПараметрыТаблицы = КадровыйУчет.ПараметрыПолученияВсехСотрудниковОрганизацийПоСпискуФизическихЛиц();

ПараметрыТаблицы.Организация = СтруктураПараметров.Организация;

ПараметрыТаблицы.НачалоПериода = СтруктураПараметров.Дата;

ПараметрыТаблицы.ОкончаниеПериода = СтруктураПараметров.Дата;

КадровыйУчет.СоздатьВТСотрудникиОрганизации(МенеджерВТ, Истина, ПараметрыТаблицы, "ВТСотрудникиПредварительно");

Запрос.Текст =

        "ВЫБРАТЬ

        |       *

        |ПОМЕСТИТЬ ВТСотрудники

        |ИЗ

        |       ВТСотрудникиПредварительно КАК ВТСотрудникиПредварительно

        |ГДЕ

        |       ВТСотрудникиПредварительно.ДатаУвольнения = ДАТАВРЕМЯ(1,1,1)

        |;

        |УНИЧТОЖИТЬ ВТСотрудникиПредварительно

        |";

Запрос.Выполнить();

ПараметрыТаблицы = УправлениеШтатнымРасписанием.ПараметрыПостроенияВТШтатноеРасписание(СтруктураПараметров.Дата, СтруктураПараметров.Организация);

ПараметрыТаблицы.ДополнитьОписаниемНачислений = Истина;

ПараметрыТаблицы.ПолноеОписаниеНачислений = Истина;

ПараметрыТаблицы.Вставить("ПоказыватьПлановыеПозиции");

 

УправлениеШтатнымРасписанием.СоздатьВТШтатноеРасписание(МенеджерВТ, Истина, ПараметрыТаблицы, , "ВТВыбраныПозицииШР");

Поместить таблицу в запрос

Процедура помещает Таблицу значений во временную таблицу Запроса
SDV 34 7
// Процедура - Поместить таблицу в запрос
// Зависит от ТипизированнаяТаблицаЗначений() https://fastcode.im/Templates/6734
// Параметры:
//  Запрос		 - Запрос 
//  Таблица		 - ТаблицаЗначений
//  ИмяТаблицы	 - Строка - Имя временной таблицы в Запросе
//
Процедура ПоместитьТаблицуВЗапрос(Запрос, Таблица, ИмяТаблицы)
	ТипизированнаяТаблица = ТипизированнаяТаблицаЗначений(Таблица);
	ИсходныйТекстЗапроса = Запрос.Текст;
	Запрос.Текст = "Выбрать * Поместить " + ИмяТаблицы + " Из &" + ИмяТаблицы + " как " + ИмяТаблицы;
	Если Запрос.МенеджерВременныхТаблиц = Неопределено Тогда
		Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
	КонецЕсли;
	Если Запрос.Параметры.Свойство(ИмяТаблицы) Тогда
		_Параметр =  Запрос.Параметры.ИмяТаблицы;
		Запрос.УстановитьПараметр(ИмяТаблицы, ТипизированнаяТаблица);
		Запрос.Выполнить();
		Запрос.УстановитьПараметр(ИмяТаблицы, _Параметр);
	Иначе
		Запрос.УстановитьПараметр(ИмяТаблицы, ТипизированнаяТаблица);
		Запрос.Выполнить();
		Запрос.Параметры.Удалить(ИмяТаблицы);
	КонецЕсли;
	Запрос.Текст = ИсходныйТекстЗапроса;
КонецПроцедуры

ПриОпределенииГруппИсполнителей

Возвращает менеджер временных таблиц, содержащий временную таблицу пользователей
ОбщийМодуль.ИнтеграцияПодсистемБСП
Автор: 1С
// Возвращает менеджер временных таблиц, содержащий временную таблицу пользователей
// некоторых дополнительных групп пользователей, например, пользователей групп
// исполнителей задач, которые соответствуют ключам адресации
// (РольИсполнителя + ОсновнойОбъектАдресации + ДополнительныйОбъектАдресации).
//
//  При изменении состава дополнительных групп пользователей, необходимо вызвать
// процедуру ОбновитьПользователейГруппИсполнителей в модуле УправлениеДоступом,
// чтобы применить изменения к внутренним данным подсистемы.
//
// Параметры:
//  МенеджерВременныхТаблиц - МенеджерВременныхТаблиц, в который можно поместить таблицу:
//                            ТаблицаГруппИсполнителей с полями:
//                              ГруппаИсполнителей - Например,
//                                                   СправочникСсылка.ГруппыИсполнителейЗадач.
//                              Пользователь       - СправочникСсылка.Пользователи,
//                                                   СправочникСсылка.ВнешниеПользователи.
//
//  СодержаниеПараметра     - Неопределено - параметр не указан, вернуть все данные.
//                            Строка, когда
//                              "ГруппыИсполнителей" требуется вернуть
//                               только составы указанных групп исполнителей.
//                              "Исполнители" требуется вернуть
//                               только составы групп исполнителей, которые
//                               в которые входят указанные исполнители.
//
//  ЗначениеПараметра       - Неопределено, когда СодержаниеПараметра = Неопределено,
//                          - Например, СправочникСсылка.ГруппыИсполнителейЗадач,
//                            когда СодержаниеПараметра = "ГруппыИсполнителей".
//                          - СправочникСсылка.Пользователи,
//                            СправочникСсылка.ВнешниеПользователи,
//                            когда СодержаниеПараметра = "Исполнители".
//                            Массив указанных выше типов.
//
//  НетГруппИсполнителей    - Булево, если Ложь, МенеджерВременныхТаблиц содержит временную таблицу, иначе нет.
//
Процедура ПриОпределенииГруппИсполнителей(МенеджерВременныхТаблиц, СодержаниеПараметра,
				ЗначениеПараметра, НетГруппИсполнителей) Экспорт
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда
		МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер");
		МодульБизнесПроцессыИЗадачиСервер.ПриОпределенииГруппИсполнителей(МенеджерВременныхТаблиц,
			СодержаниеПараметра, ЗначениеПараметра, НетГруппИсполнителей);
	КонецЕсли;
	
	Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииГруппИсполнителей Тогда
		МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС");
		МодульИнтеграцияПодсистемБТС.ПриОпределенииГруппИсполнителей(МенеджерВременныхТаблиц,
			СодержаниеПараметра, ЗначениеПараметра, НетГруппИсполнителей);
	КонецЕсли;
	
	Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииГруппИсполнителей Тогда
		МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП");
		МодульИнтеграцияПодсистемБИП.ПриОпределенииГруппИсполнителей(МенеджерВременныхТаблиц, СодержаниеПараметра, ЗначениеПараметра, НетГруппИсполнителей);
	КонецЕсли;
	
КонецПроцедуры

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

КоличествоЗаписейВоВременнойТаблицеБазыДанных

Возвращает количество записей во временной таблице базы данных.
ОбщийМодуль.ОбменДаннымиСервер
Автор: 1С
// Возвращает количество записей во временной таблице базы данных.
//
// Параметры:
//  ИмяТаблицы - Строка - имя таблицы. Например: "ВременнаяТаблица1".
//  МенеджерВременныхТаблиц - менеджер временных таблиц, который содержит указатель на временную таблицу ИмяТаблицы.
// 
// Возвращаемое значение:
//  Число - Количество записей в таблице базы данных.
//
Функция КоличествоЗаписейВоВременнойТаблицеБазыДанных(Знач ИмяТаблицы, МенеджерВременныхТаблиц) Экспорт
	
	ТекстЗапроса = "
	|ВЫБРАТЬ
	|	Количество(*) КАК Количество
	|ИЗ
	|	#ИмяТаблицы
	|";
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ИмяТаблицы", ИмяТаблицы);
	
	Запрос = Новый Запрос;
	Запрос.Текст = ТекстЗапроса;
	Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
	
	Выборка = Запрос.Выполнить().Выбрать();
	Выборка.Следующий();
	
	Возврат Выборка["Количество"];
	
КонецФункции

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

СоздатьВременнуюТаблицуЗначенийЗаблокированныхИзмерений

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

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

СоздатьВременнуюТаблицуСсылокДляОбработки

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

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

СоздатьВременнуюТаблицуЗаблокированныхДляЧтенияИИзмененияДанных

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

СоздатьВременнуюТаблицуЗаблокированныхДляЧтенияИИзмененияСсылок

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

СоздатьВременнуюТаблицуРегистраторовРегистраДляОбработки

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

		Иначе	
			ТекстЗапроса =
			"ВЫБРАТЬ
			|	ТаблицаРегистраИзменения.Регистратор КАК Регистратор
			|ПОМЕСТИТЬ #ВТДляОбработкиРегистратор
			|ИЗ
			|	#ТаблицаРегистраИзменения КАК ТаблицаРегистраИзменения
			|		ЛЕВОЕ СОЕДИНЕНИЕ ВТЗаблокированоРегистратор КАК ВТЗаблокированоРегистратор
			|		ПО ТаблицаРегистраИзменения.Регистратор = ВТЗаблокированоРегистратор.Регистратор
			|		ЛЕВОЕ СОЕДИНЕНИЕ ВТЗаблокированоСсылка КАК ВТЗаблокированоСсылка
			|		ПО ТаблицаРегистраИзменения.Регистратор = ВТЗаблокированоСсылка.Ссылка
			|		#ТекстЗапросаСоединениеСДопИсточникамиПоШапке
			|		#ТекстЗапросаСоединениеСДопИсточникамиПоТЧ
			|		#ТекстЗапросаСоединениеСДопИсточникамиРегистрами
			|ГДЕ
			|	ТаблицаРегистраИзменения.Узел = &ТекущаяОчередь
			|	И ТаблицаРегистраИзменения.Регистратор ССЫЛКА #ПолноеИмяДокумента 
			|	И ВТЗаблокированоРегистратор.Регистратор ЕСТЬ NULL 
			|	И ВТЗаблокированоСсылка.Ссылка ЕСТЬ NULL 
			|	И &УсловиеПоДопИсточникамСсылкам
			|	И &УсловиеПоДопИсточникамРегистрам
			|
			|ИНДЕКСИРОВАТЬ ПО
			|	Регистратор 
			|;
			|УНИЧТОЖИТЬ
			|	ВТЗаблокированоРегистратор 
			|;
			|УНИЧТОЖИТЬ
			|	ВТЗаблокированоСсылка";
		КонецЕсли;
		
		ДополнительныеПараметрыСозданияВТ = ДополнительныеПараметрыВыборкиДанныхДляОбработки();
		ДополнительныеПараметрыСозданияВТ.ИмяВременнойТаблицы = "ВТЗаблокированоСсылка";
		СоздатьВременнуюТаблицуЗаблокированныхДляЧтенияИИзмененияДанных(Очередь, ПолноеИмяДокумента, МенеджерВременныхТаблиц, ДополнительныеПараметрыСозданияВТ);
	КонецЕсли;
	
	Если ПустаяСтрока(ДополнительныеПараметры.ИмяВременнойТаблицы) Тогда
		ИмяВременнойТаблицы = "ВТДляОбработки" + ИмяРегистра;
	Иначе
		ИмяВременнойТаблицы = ДополнительныеПараметры.ИмяВременнойТаблицы;
	КонецЕсли;
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ТаблицаРегистраИзменения", ПолноеИмяРегистра + ".Изменения");	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ВТДляОбработкиРегистратор", ИмяВременнойТаблицы);
	
	ДополнительныеПараметрыСозданияВТ = ДополнительныеПараметрыВыборкиДанныхДляОбработки();
	ДополнительныеПараметрыСозданияВТ.ИмяВременнойТаблицы = "ВТЗаблокированоРегистратор";
	СоздатьВременнуюТаблицуЗаблокированныхДляЧтенияИИзмененияДанных(Очередь, ПолноеИмяРегистра, МенеджерВременныхТаблиц, ДополнительныеПараметрыСозданияВТ);
	
	ДобавитьПроверкуБлокировкиДополнительныхИсточников(Очередь, ТекстЗапроса, ПолноеИмяДокумента, ПолноеИмяРегистра, МенеджерВременныхТаблиц, Истина, ДополнительныеПараметры);
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПолноеИмяДокумента", ПолноеИмяДокумента);
		
	Запрос = Новый Запрос;
	Запрос.Текст = ТекстЗапроса;
	Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
	Запрос.УстановитьПараметр("ТекущаяОчередь", ТекущаяОчередь);
	РезультатЗапроса = Запрос.ВыполнитьПакет();
	
	Результат = Новый Структура("ЕстьЗаписиВоВременнойТаблице,ЕстьДанныеДляОбработки,ИмяВременнойТаблицы", Ложь, Ложь, "");
	Результат.ИмяВременнойТаблицы = ИмяВременнойТаблицы;
	Результат.ЕстьЗаписиВоВременнойТаблице = РезультатЗапроса[0].Выгрузить()[0].Количество <> 0;
	
	Если Результат.ЕстьЗаписиВоВременнойТаблице Тогда
		Результат.ЕстьДанныеДляОбработки = Истина;
	Иначе
		Результат.ЕстьДанныеДляОбработки = ЕстьДанныеДляОбработки(Очередь, ПолноеИмяРегистра);
	КонецЕсли;	
	
	Возврат Результат; 
	
КонецФункции

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

Создать временную таблицу периодов с заданной периодичностью

Формирует временную таблицу периодов с заданной периодичностью, формируемой, с помощью, запроса, возвращаемого методом ЗапросВТПериоды. Создает в МенеджерВременныхТаблиц временную таблицу с именем <ИмяВТ> и периодичностью <Периодичность> за интервал с <НачалоИнтервала> по <ОкончаниеИнтервала>.
FastCode 64 8
ЗарплатаКадрыОбщиеНаборыДанных.СоздатьВТПериоды(Запрос.МенеджерВременныхТаблиц, НачалоПериода, ОкончаниеПериода);

ЗарплатаКадрыОбщиеНаборыДанных.СоздатьВТПериоды(МенеджерВременныхТаблиц, НачалоИнтервала, ОкончаниеИнтервала, Периодичность = "МЕСЯЦ", ИмяПоляПериод = "Период", ИмяВТ = "ВТПериоды", ИспользоватьКонецПериода = Ложь) Экспорт

СоздатьВременнуюТаблицуИзмеренийНезависимогоРегистраСведенийДляОбработки

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