Найден запрет изменения данных. Найти даты запрета по проверяемым данным
// Найти даты запрета по проверяемым данным
// для указанного пользователя и/или узла плана обмена.
//
// Параметры:
// ДанныеДляПроверки - ТаблицаЗначений - возвращается функцией ШаблонДанныхДляПроверки
// общего модуля ДатыЗапретаИзменения.
//
// ОписаниеДанных - Неопределено - текст сообщения о запрете не формируется.
// - Структура - со свойствами:
// * НоваяВерсия - Булево - если Истина, то сообщение о запрете
// формировать для новой версии, иначе для старой версии.
// * Данные - Ссылка,Объект - ссылка или объект данных для получения
// представления, которое будет использовано в сообщении о запрете.
// - НаборЗаписей - набор записей регистра для получения
// представления, которое будет использовано в сообщении о запрете.
// - Структура - со свойствами для сообщения о запрете:
// * Регистр - Строка - полное имя регистра.
// * - НаборЗаписей - набор записей регистра.
// * Отбор - Отбор - отбор набора записей.
// - Строка - подготовленное представление данных,
// которое будет использовано в сообщении о запрете.
//
// ОписаниеОшибки - 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
///////////////////////////////////////////////////////////////////////////////////////////////////////
Определение границы запрета изменения данных в УПП
Проверка даты запрета изменения данных
ЗапретИзмененияПроверяется (БСП)
ПропуститьПроверкуДатЗапрета (БСП)
ЗаполнитьИсточникиДанныхДляПроверкиЗапретаИзменения (БСП)
ПроверитьДатыЗапретаИзмененияЗагрузкиДанных (БСП)
ОткрытьДатыЗапретаИзмененияДанных (БСП)