1С 8.3 Проверка объекта на изменения (модифицированность)
Данные > Примеры кода 1С > 1С 8.3 Документы
Перейти в раздел примеры кода 1С 8.3:
Программно проверить модифицирован ли объект в 1С 8.3:
Функция ОбъектМодифицирован(Объект, ПроверятьТабличныеЧасти = Истина, ПроверятьСтандартные = Истина)
Ссылка = Объект.Ссылка;
Метаданное = Ссылка.Метаданные();
Для Каждого Реквизит Из Метаданное.Реквизиты Цикл
Если Объект[Реквизит.Имя] <> Ссылка[Реквизит.Имя] Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Если ПроверятьСтандартные Тогда
Для Каждого Реквизит Из Метаданное.СтандартныеРеквизиты Цикл
Если Объект[Реквизит.Имя] <> Ссылка[Реквизит.Имя] Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ПроверятьТабличныеЧасти Тогда
Для Каждого ТЧ Из Метаданное.ТабличныеЧасти Цикл
Если Объект[ТЧ.Имя].Количество() <> Ссылка[ТЧ.Имя].Количество() Тогда
Возврат Истина;
КонецЕсли;
Для Индекс = 0 По Объект[ТЧ.Имя].Количество()-1 Цикл
ОбъектСтрокаТЧ = Объект[ТЧ.Имя][Индекс];
СсылкаСтрокаТЧ = Ссылка[ТЧ.Имя][Индекс];
Для Каждого РеквизитТЧ Из ТЧ.Реквизиты Цикл
Если ОбъектСтрокаТЧ[РеквизитТЧ.Имя] <> СсылкаСтрокаТЧ[РеквизитТЧ.Имя] Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецЕсли;
Возврат Ложь;
КонецФункции
Ссылка = Объект.Ссылка;
Метаданное = Ссылка.Метаданные();
Для Каждого Реквизит Из Метаданное.Реквизиты Цикл
Если Объект[Реквизит.Имя] <> Ссылка[Реквизит.Имя] Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Если ПроверятьСтандартные Тогда
Для Каждого Реквизит Из Метаданное.СтандартныеРеквизиты Цикл
Если Объект[Реквизит.Имя] <> Ссылка[Реквизит.Имя] Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ПроверятьТабличныеЧасти Тогда
Для Каждого ТЧ Из Метаданное.ТабличныеЧасти Цикл
Если Объект[ТЧ.Имя].Количество() <> Ссылка[ТЧ.Имя].Количество() Тогда
Возврат Истина;
КонецЕсли;
Для Индекс = 0 По Объект[ТЧ.Имя].Количество()-1 Цикл
ОбъектСтрокаТЧ = Объект[ТЧ.Имя][Индекс];
СсылкаСтрокаТЧ = Ссылка[ТЧ.Имя][Индекс];
Для Каждого РеквизитТЧ Из ТЧ.Реквизиты Цикл
Если ОбъектСтрокаТЧ[РеквизитТЧ.Имя] <> СсылкаСтрокаТЧ[РеквизитТЧ.Имя] Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецЕсли;
Возврат Ложь;
КонецФункции
Программно проверить модифицирован ли объект одним запросом (как рекомендует стандарт вендора) в 1С 8.3:
Функция ОбъектМодифицирован(Объект)
МетаданныеОбъекта = Объект.Метаданные();
Если Метаданные.Справочники.Содержит(МетаданныеОбъекта) Тогда
Вид = "Справочник";
ИначеЕсли Метаданные.Документы.Содержит(МетаданныеОбъекта) Тогда
Вид = "Документ";
Иначе
ВызватьИсключение СтрШаблон(
НСтр("ru='Проверка модифицированности для объекта %1 не предусмотрена.'"),
МетаданныеОбъекта);
КонецЕсли;
Запрос = Новый Запрос(
"ВЫБРАТЬ
| *
|ИЗ
| " + Вид + "." + МетаданныеОбъекта.Имя + "
|ГДЕ
| Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Возврат ПроверитьМодифицированностьРеквизитов(Объект, РезультатЗапроса, "");
КонецФункции
Функция ПроверитьМодифицированностьРеквизитов(Объект, РезультатЗапроса, Префикс)
НеобрабатываемыеРеквизиты = СтрРазделить("Ссылка,НомерСтроки", ",");
Выборка = РезультатЗапроса.Выбрать();
НомерСтроки = 0;
Пока Выборка.Следующий() Цикл
ТабличнаяЧасть = ?(Не ПустаяСтрока(Префикс), Объект[Префикс], Неопределено);
Если ТабличнаяЧасть <> Неопределено И Выборка.Количество()
<> ТабличнаяЧасть.Количество() Тогда
Возврат Истина;
КонецЕсли;
НомерСтроки = НомерСтроки + 1;
Для Каждого Колонка Из РезультатЗапроса.Колонки Цикл
Если НеобрабатываемыеРеквизиты.Найти(Колонка.Имя) <> Неопределено Тогда
Продолжить;
КонецЕсли;
ЗначениеДоРедактирования = Выборка[Колонка.Имя];
ТипЗначения = ТипЗнч(ЗначениеДоРедактирования);
Если ТипЗначения = Тип("ХранилищеЗначения") Тогда
// ХранилищеЗначения не проверяем.
Продолжить;
ИначеЕсли ТипЗначения = Тип("РезультатЗапроса") Тогда
Если ПроверитьМодифицированностьРеквизитов(Объект,
ЗначениеДоРедактирования, Колонка.Имя) Тогда
Возврат Истина;
КонецЕсли;
Иначе
ЗначениеПослеРедактирования = ?(ТабличнаяЧасть = Неопределено,
Объект[Колонка.Имя],
ТабличнаяЧасть[НомерСтроки - 1][Колонка.Имя]);
Если ЗначениеДоРедактирования <> ЗначениеПослеРедактирования Тогда
Возврат Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат Ложь;
КонецФункции
МетаданныеОбъекта = Объект.Метаданные();
Если Метаданные.Справочники.Содержит(МетаданныеОбъекта) Тогда
Вид = "Справочник";
ИначеЕсли Метаданные.Документы.Содержит(МетаданныеОбъекта) Тогда
Вид = "Документ";
Иначе
ВызватьИсключение СтрШаблон(
НСтр("ru='Проверка модифицированности для объекта %1 не предусмотрена.'"),
МетаданныеОбъекта);
КонецЕсли;
Запрос = Новый Запрос(
"ВЫБРАТЬ
| *
|ИЗ
| " + Вид + "." + МетаданныеОбъекта.Имя + "
|ГДЕ
| Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Возврат ПроверитьМодифицированностьРеквизитов(Объект, РезультатЗапроса, "");
КонецФункции
Функция ПроверитьМодифицированностьРеквизитов(Объект, РезультатЗапроса, Префикс)
НеобрабатываемыеРеквизиты = СтрРазделить("Ссылка,НомерСтроки", ",");
Выборка = РезультатЗапроса.Выбрать();
НомерСтроки = 0;
Пока Выборка.Следующий() Цикл
ТабличнаяЧасть = ?(Не ПустаяСтрока(Префикс), Объект[Префикс], Неопределено);
Если ТабличнаяЧасть <> Неопределено И Выборка.Количество()
<> ТабличнаяЧасть.Количество() Тогда
Возврат Истина;
КонецЕсли;
НомерСтроки = НомерСтроки + 1;
Для Каждого Колонка Из РезультатЗапроса.Колонки Цикл
Если НеобрабатываемыеРеквизиты.Найти(Колонка.Имя) <> Неопределено Тогда
Продолжить;
КонецЕсли;
ЗначениеДоРедактирования = Выборка[Колонка.Имя];
ТипЗначения = ТипЗнч(ЗначениеДоРедактирования);
Если ТипЗначения = Тип("ХранилищеЗначения") Тогда
// ХранилищеЗначения не проверяем.
Продолжить;
ИначеЕсли ТипЗначения = Тип("РезультатЗапроса") Тогда
Если ПроверитьМодифицированностьРеквизитов(Объект,
ЗначениеДоРедактирования, Колонка.Имя) Тогда
Возврат Истина;
КонецЕсли;
Иначе
ЗначениеПослеРедактирования = ?(ТабличнаяЧасть = Неопределено,
Объект[Колонка.Имя],
ТабличнаяЧасть[НомерСтроки - 1][Колонка.Имя]);
Если ЗначениеДоРедактирования <> ЗначениеПослеРедактирования Тогда
Возврат Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат Ложь;
КонецФункции
2
комментарии
Андрей
15 май 2024
Я у себя модифицировал:
ОбъектМодифицирован(Знач Объект, ПроверятьТабличныеЧасти = Истина, ПроверятьСтандартные = Истина)
ОбъектМодифицирован(Знач Объект, ПроверятьТабличныеЧасти = Истина, ПроверятьСтандартные = Истина)
Борис
19 окт 2023
Ошибка в коде. Номер строки надо получать из выборки. Запрос выдает строки ТЧ не по порядку. ТЧ это таблица не ссылочная, не упорядоченная. данные в куче лежат. Только индекс по ссылке по умолчанию и все
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник