НайденЗапретИзмененияДанных (БСП)

Автор: 1С
ОбщийМодуль.ДатыЗапретаИзменения
БСП

Найден запрет изменения данных. Найти даты запрета по проверяемым данным

// Найти даты запрета по проверяемым данным
// для указанного пользователя и/или узла плана обмена.
//
// Параметры:
//  ДанныеДляПроверки - ТаблицаЗначений - возвращается функцией ШаблонДанныхДляПроверки
//                      общего модуля ДатыЗапретаИзменения.
//
//  ОписаниеДанных    - Неопределено - текст сообщения о запрете не формируется.
//                    - Структура - со свойствами:
//                      * НоваяВерсия - Булево - если Истина, то сообщение о запрете
//                                   формировать для новой версии, иначе для старой версии.
//                      * Данные - Ссылка,Объект - ссылка или объект данных для получения
//                                   представления, которое будет использовано в сообщении о запрете.
//                               - НаборЗаписей - набор записей регистра для получения
//                                   представления, которое будет использовано в сообщении о запрете.
//                               - Структура - со свойствами для сообщения о запрете:
//                                   * Регистр - Строка - полное имя регистра.
//                                   *         - НаборЗаписей - набор записей регистра.
//                                   * Отбор   - Отбор - отбор набора записей.
//                               - Строка - подготовленное представление данных,
//                                 которое будет использовано в сообщении о запрете.
//
//  ОписаниеОшибки    - Null      - (значение по умолчанию) - сведения о запретах не требуются.
//                    - Строка    - (возвращаемое значение) - вернуть текстовое описание найденных запретов.
//                    - Структура - (возвращаемое значение) - вернуть структурное описание найденных запретов:
//                        * ПредставлениеДанных - Строка - представление данных, используемое в заголовке ошибки.
//                        * ЗаголовокОшибки     - Строка - строка, подобная следующей:
//                                                "Заказ 10 от 01.01.2017 невозможно изменить в запрещенном периоде.".
//                        * Запреты - ТаблицаЗначений - найденные запреты в виде таблицы с колонками:
//                          ** Дата            - Дата         - проверяемая дата.
//                          ** Раздел          - Строка       - имя раздела, по которому выполнялся поиск запретов, если
//                                                 пустая строка, значит, выполнялся поиск даты, действующей для всех разделов.
//                          ** Объект          - ЛюбаяСсылка  - ссылка на объект, по которому выполнялся поиск даты запрета.
//                                             - Неопределено - выполнялся поиск даты, действующей для всех объектов.
//                          ** ДатаЗапрета     - Дата         - найденная дата запрета.
//                          ** ОбщаяДата       - Булево       - если Истина, значит, найденная дата запрета действует для
//                                                 всех разделов, а не только для раздела, по которому выполнялся поиск.
//                          ** ДляВсехОбъектов - Булево       - если Истина, значит, найденная дата запрета действует для
//                                                 всех объектов, а не только для объекта, по которому выполнялся поиск.
//                          ** Адресат         - ОпределяемыйТип.АдресатЗапретаИзменения - пользователь или узел
//                                                 плана обмена, для которого задана найденная дата запрета.
//                          ** Описание        - Строка - строка, подобная следующей:
//                            "Дате 01.01.2017 по объекту ""Склад программ"" раздела ""Складской учет"" соответствует
//                            запрет изменения данных для всех пользователей (установлена общая дата запрета)".
//
//  УзелПроверкиЗапретаЗагрузки - Неопределено - выполнить проверку изменения данных.
//                              - ПланыОбменаСсылка.<Имя плана обмена> - выполнить проверку
//                                загрузки данных для указанного узла.
//
// Возвращаемое значение:
//  Булево - если Истина, значит, найден хотя бы один запрет изменения.
//
Функция НайденЗапретИзмененияДанных(Знач ДанныеДляПроверки,
                                    ОписаниеДанных = Неопределено,
                                    ОписаниеОшибки = Null,
                                    УзелПроверкиЗапретаЗагрузки = Неопределено) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	
	Если ТипЗнч(ДанныеДляПроверки) = Тип("Структура") Тогда
		ДействующиеДаты   = ДанныеДляПроверки.ДействующиеДаты;
		ДанныеДляПроверки = ДанныеДляПроверки.ДанныеДляПроверки;
	Иначе
		ДействующиеДаты = ДатыЗапретаИзмененияСлужебный.ДействующиеДатыЗапрета();
	КонецЕсли;
	
	ЗапретИспользуется = ?(УзелПроверкиЗапретаЗагрузки = Неопределено,
		ДействующиеДаты.ЗапретИзмененияИспользуется,
		ДействующиеДаты.ЗапретЗагрузкиИспользуется);
	
	Если Не ЗапретИспользуется Тогда
		Возврат Ложь;
	КонецЕсли;
	
	СвойстваРазделов = ДействующиеДаты.СвойстваРазделов;
	ПустойРаздел = ДатыЗапретаИзмененияСлужебный.ПустаяСсылка(
		Тип("ПланВидовХарактеристикСсылка.РазделыДатЗапретаИзменения"));
	
	ЗаголовокОшибки =
		НСтр("ru = 'Ошибка в функции НайденЗапретИзмененияДанных общего модуля ДатыЗапретаИзменения.'")
		+ Символы.ПС
		+ Символы.ПС;
	
	// Приведение данных в соответствие варианту встраивания.
	Для Каждого Строка Из ДанныеДляПроверки Цикл
		
		Если Строка.Раздел = Неопределено Тогда
			Строка.Раздел = ПустойРаздел;
		КонецЕсли;
		
		СвойстваРаздела = СвойстваРазделов.Разделы.Получить(Строка.Раздел);
		Если СвойстваРаздела = Неопределено Тогда
			ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'В параметре ДанныеДляПроверки указан несуществующий раздел ""%1"".'"),
				Строка.Раздел);
		КонецЕсли;
		
		Если СвойстваРазделов.БезРазделовИОбъектов Тогда
			Строка.Раздел = ПустойРаздел;
			Строка.Объект = ПустойРаздел;
		Иначе
			Если ЗначениеЗаполнено(СвойстваРазделов.ЕдинственныйРаздел) Тогда
				Строка.Раздел = СвойстваРазделов.ЕдинственныйРаздел;
			Иначе
				Строка.Раздел = СвойстваРаздела.Ссылка;
			КонецЕсли;
			
			Если СвойстваРазделов.ВсеРазделыБезОбъектов
			 Или Не ЗначениеЗаполнено(Строка.Объект) Тогда
				
				Строка.Объект = Строка.Раздел;
			КонецЕсли;
		КонецЕсли;
		
	КонецЦикла;
	
	// Свертка лишних строк, чтобы сократить число проверок и сообщений.
	РазделыИОбъекты = ДанныеДляПроверки.Скопировать();
	РазделыИОбъекты.Свернуть("Раздел, Объект");
	Отбор = Новый Структура("Раздел, Объект");
	РазделыИОбъекты.Колонки.Добавить("Дата",
		Новый ОписаниеТипов("Дата", , , Новый КвалификаторыДаты(ЧастиДаты.Дата)));
	
	Для Каждого РазделИОбъект Из РазделыИОбъекты Цикл
		ЗаполнитьЗначенияСвойств(Отбор, РазделИОбъект);
		Строки = ДанныеДляПроверки.НайтиСтроки(Отбор);
		МинимальнаяДата = Неопределено;
		Для Каждого Строка Из Строки Цикл
			ТекущаяДата = НачалоДня(Строка.Дата);
			Если МинимальнаяДата = Неопределено Тогда
				МинимальнаяДата = ТекущаяДата;
			КонецЕсли;
			Если ТекущаяДата < МинимальнаяДата Тогда
				МинимальнаяДата = ТекущаяДата;
			КонецЕсли;
		КонецЦикла;
		РазделИОбъект.Дата = МинимальнаяДата;
	КонецЦикла;
	ДанныеДляПроверки = РазделыИОбъекты;
	
	// Приоритеты дат запрета изменения.
	// 1. Для раздела, объекта и пользователя.
	// 2. Для раздела, объекта и группы пользователей.
	// 3. Для раздела, объекта и любого пользователя.
	// 4. Для раздела, любого объекта (объект = раздел) и пользователя.
	// 5. Для раздела, любого объекта (объект = раздел) и группы пользователей.
	// 6. Для раздела, любого объекта (объект = раздел) и любого пользователя.
	// 7. Для любого раздела (пустой раздел), любого объекта (объект = раздел) и пользователя.
	// 8. Для любого раздела (пустой раздел), любого объекта (объект = раздел) и группы пользователей.
	// 9. Для любого раздела (пустой раздел), любого объекта (объект = раздел) и любого пользователя.
	
	// Приоритеты дат запрета загрузки.
	// 1. Для раздела, объекта и узла.
	// 2. Для раздела, объекта и любого узла.
	// 3. Для раздела, любого объекта (объект = раздел) и узла.
	// 4. Для раздела, любого объекта (объект = раздел) и любого узла.
	// 5. Для любого раздела (пустой раздел), любого объекта (объект = раздел) и узла.
	// 6. Для любого раздела (пустой раздел), любого объекта (объект = раздел) и любого узла.
	
	ЗапретыИзменения = ДанныеДляПроверки.Скопировать(Новый Массив);
	ЗапретыИзменения.Колонки.Добавить("Адресат");
	ЗапретыИзменения.Колонки.Добавить("Данные");
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("УзелПроверкиЗапретаЗагрузки", УзелПроверкиЗапретаЗагрузки);
	
	// Поиск запретов изменения данных.
	Если УзелПроверкиЗапретаЗагрузки = Неопределено Тогда
		Разделы = ДействующиеДаты.ДляПользователей.Разделы;
		Пользователь = Пользователи.АвторизованныйПользователь();
		ГруппыПользователя = ДействующиеДаты.ГруппыПользователей.Получить(Пользователь);
		Если ГруппыПользователя = Неопределено Тогда
			ГруппыПользователя = Новый Массив;
		КонецЕсли;
		ДополнительныеПараметры.Вставить("Пользователь",       Пользователь);
		ДополнительныеПараметры.Вставить("ГруппыПользователя", ГруппыПользователя);
	Иначе
		Разделы = ДействующиеДаты.ДляИнформационныхБаз.Разделы;
		ДополнительныеПараметры.Вставить("ПустойУзелПланаОбмена",
			ОбщегоНазначения.МенеджерОбъектаПоСсылке(УзелПроверкиЗапретаЗагрузки).ПустаяСсылка());
	КонецЕсли;
	
	Для Каждого Данные Из ДанныеДляПроверки Цикл
		РазделЗапрета = Данные.Раздел;
		ОбъектЗапрета = Данные.Объект;
		
		Объекты = Разделы.Получить(РазделЗапрета);
		Адресаты = Неопределено;
		ДатаЗапрета = Неопределено;
		
		Если Объекты <> Неопределено Тогда
			Адресаты = Объекты.Получить(ОбъектЗапрета);
			Если Адресаты <> Неопределено Тогда
				// Поиск для раздела и объекта.
				ДатаЗапрета = НайтиДатуЗапрета(Адресаты, РазделЗапрета, ОбъектЗапрета, ДополнительныеПараметры);
			КонецЕсли;
			Если ДатаЗапрета = Неопределено Тогда
				ОбъектЗапрета = РазделЗапрета;
				Адресаты = Объекты.Получить(ОбъектЗапрета);
				Если Адресаты <> Неопределено Тогда
					// Поиск для раздела и любого объекта.
					ДатаЗапрета = НайтиДатуЗапрета(Адресаты, РазделЗапрета, ОбъектЗапрета, ДополнительныеПараметры);
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		Если ДатаЗапрета = Неопределено Тогда
			РазделЗапрета = ПустойРаздел;
			ОбъектЗапрета = РазделЗапрета;
			Объекты = Разделы.Получить(РазделЗапрета);
			Если Объекты = Неопределено Тогда
				Продолжить;
			КонецЕсли;
			Адресаты = Объекты.Получить(ОбъектЗапрета);
			Если Адресаты = Неопределено Тогда
				Продолжить;
			КонецЕсли;
			// Поиск для любого раздела и любого объекта (общая дата).
			ДатаЗапрета = НайтиДатуЗапрета(Адресаты, РазделЗапрета, ОбъектЗапрета, ДополнительныеПараметры);
			Если ДатаЗапрета = Неопределено Тогда
				Продолжить;
			КонецЕсли;
		КонецЕсли;
		
		Если ДатаЗапрета < Данные.Дата Тогда
			Продолжить;
		КонецЕсли;
		
		Если УзелПроверкиЗапретаЗагрузки = Неопределено Тогда
			Адресат = Пользователь;
		Иначе
			Адресат = УзелПроверкиЗапретаЗагрузки;
		КонецЕсли;
		
		Строка = ЗапретыИзменения.Добавить();
		Строка.Данные  = Данные;
		Строка.Раздел  = РазделЗапрета;
		Строка.Объект  = ОбъектЗапрета;
		Строка.Адресат = Адресат;
		Строка.Дата    = ДатаЗапрета;
	КонецЦикла;
	
	Если ТипЗнч(ОписаниеДанных)  = Тип("Структура")
	   И ТипЗнч(ОписаниеОшибки) <> Тип("Null")
	   И ЗапретыИзменения.Количество() > 0 Тогда
		
		ОписаниеОшибки = СообщениеОЗапретах(ЗапретыИзменения, ОписаниеДанных, СвойстваРазделов,
			УзелПроверкиЗапретаЗагрузки <> Неопределено, ТипЗнч(ОписаниеОшибки) = Тип("Структура"));
	КонецЕсли;
	
	Возврат ЗапретыИзменения.Количество() > 0;
	
КонецФункции

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

Рекомендации

Похожие публикации

Определение границы запрета изменения данных в УПП

Проверка даты запрета изменения данных

ЗапретИзмененияПроверяется (БСП)

ПропуститьПроверкуДатЗапрета (БСП)

ЗаполнитьИсточникиДанныхДляПроверкиЗапретаИзменения (БСП)

ПроверитьДатыЗапретаИзмененияЗагрузкиДанных (БСП)

ОткрытьДатыЗапретаИзмененияДанных (БСП)

ОбновитьВерсиюДатЗапретаИзмененияПриЗагрузкеДанных (БСП)

ИсточникиДанныхДляПроверкиЗапретаИзменения (БСП)

1С Менеджер конфигураций