Проверка справочника или документа на модифицированность

Little Friend 20 2

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

Функция ОбъектМодифицирован(Объект)
	МетаданныеОбъекта = Объект.Метаданные();
	Если Метаданные.Справочники.Содержит(МетаданныеОбъекта) Тогда
		Вид = "Справочник";
	ИначеЕсли Метаданные.Документы.Содержит(МетаданныеОбъекта) Тогда
		Вид = "Документ";
	Иначе
		ВызватьИсключение СтрШаблон(
			НСтр("ru='Проверка модифицированности для объекта %1 не предусмотрена.'"),
			МетаданныеОбъекта
		);
	КонецЕсли;
	
	Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	*
	|ИЗ
	|	" + Вид + "." + МетаданныеОбъекта.Имя + "
	|ГДЕ
	|	Ссылка = &Ссылка");
	Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
	
	РезультатЗапроса = Запрос.Выполнить();
	Возврат ПроверитьМодифицированностьРеквизитов(Объект, РезультатЗапроса, "");
КонецФункции

Функция ПроверитьМодифицированностьРеквизитов(Объект, РезультатЗапроса, Префикс)
	НеобрабатываемыеРеквизиты = СтрРазделить("Ссылка,НомерСтроки", ",");
	
	Выборка = РезультатЗапроса.Выбрать();
	НомерСтроки = 0;
	Пока Выборка.Следующий() Цикл
		ТабличнаяЧасть = ?(Не ПустаяСтрока(Префикс), Объект[Префикс], Неопределено); 
		Если ТабличнаяЧасть <> Неопределено И Выборка.Количество() <> ТабличнаяЧасть.Количество() Тогда
			Возврат Истина;
		КонецЕсли;
		
		НомерСтроки = НомерСтроки + 1;
		Для каждого Колонка Из РезультатЗапроса.Колонки Цикл
			Если НеобрабатываемыеРеквизиты.Найти(Колонка.Имя) <> Неопределено Тогда
				Продолжить;
			КонецЕсли;
			
			ЗначениеДоРедактирования = Выборка[Колонка.Имя];
			ТипЗначения = ТипЗнч(ЗначениеДоРедактирования);
			Если ТипЗначения = Тип("ХранилищеЗначения") Тогда
				// ХранилищеЗначения не проверяем.
				Продолжить;
			ИначеЕсли ТипЗначения = Тип("РезультатЗапроса") Тогда
				Если ПроверитьМодифицированностьРеквизитов(Объект, ЗначениеДоРедактирования, Колонка.Имя) Тогда
					Возврат Истина;
				КонецЕсли;
			Иначе
				ЗначениеПослеРедактирования = ?(ТабличнаяЧасть = Неопределено,
					Объект[Колонка.Имя],
					ТабличнаяЧасть[НомерСтроки - 1][Колонка.Имя]
				);
				Если ЗначениеДоРедактирования <> ЗначениеПослеРедактирования Тогда
					Возврат Истина;
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	Возврат Ложь;
КонецФункции
1

Комментарии

Trey
#1, 07 июня 2023 17:53

Для конфигураций с БСП нет смысла, можно юзать следующую функцию
ОбщегоНазначенияУТ.ИзмененияДокумента


См. также

ПроверитьКодСправочникаПоОрганизации (БСП)

ПроверитьНомерДокументаПоДате (БСП)

ПроверитьНомерДокументаПоДатеИОрганизации (БСП)

Проверка Модифицированности объекта

ПроверитьНомерБизнесПроцессаПоДате (БСП)

ПроверитьНомерБизнесПроцессаПоДатеИОрганизации (БСП)

Проведение документа с проверкой заполнения

Как получить дату и время создания элемента справочника, документа по ссылке

Менеджер ссылки по менеджеру объектов

Модератору