1С 8.3 Проверка объекта на изменения (модифицированность) - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

1С 8.3 Проверка объекта на изменения (модифицированность)

Данные > Примеры кода 1С > 1С 8.3 Документы
Перейти в раздел примеры кода 1С 8.3:
Программно проверить модифицирован ли объект в 1С 8.3:
Функция ОбъектМодифицирован(Объект, ПроверятьТабличныеЧасти = Истина, ПроверятьСтандартные = Истина)

   Ссылка = Объект.Ссылка;
   Метаданное = Ссылка.Метаданные();

   Для Каждого Реквизит Из Метаданное.Реквизиты Цикл
       Если Объект[Реквизит.Имя] <> Ссылка[Реквизит.Имя] Тогда
           Возврат Истина;
       КонецЕсли;
   КонецЦикла;

   Если ПроверятьСтандартные Тогда
       Для Каждого Реквизит Из Метаданное.СтандартныеРеквизиты Цикл
           Если Объект[Реквизит.Имя] <> Ссылка[Реквизит.Имя] Тогда
               Возврат Истина;
           КонецЕсли;
       КонецЦикла;
   КонецЕсли;


   Если ПроверятьТабличныеЧасти Тогда
       Для Каждого ТЧ Из Метаданное.ТабличныеЧасти Цикл

           Если Объект[ТЧ.Имя].Количество() <> Ссылка[ТЧ.Имя].Количество() Тогда
               Возврат Истина;
           КонецЕсли;

           Для Индекс = 0 По Объект[ТЧ.Имя].Количество()-1 Цикл
               ОбъектСтрокаТЧ = Объект[ТЧ.Имя][Индекс];
               СсылкаСтрокаТЧ = Ссылка[ТЧ.Имя][Индекс];
               Для Каждого РеквизитТЧ Из ТЧ.Реквизиты Цикл
                   Если ОбъектСтрокаТЧ[РеквизитТЧ.Имя] <> СсылкаСтрокаТЧ[РеквизитТЧ.Имя] Тогда
                       Возврат Истина;
                   КонецЕсли;
               КонецЦикла;
           КонецЦикла;

       КонецЦикла;
   КонецЕсли;

   Возврат Ложь;

КонецФункции
Программно проверить модифицирован ли объект одним запросом (как рекомендует стандарт вендора) в 1С 8.3:
Функция ОбъектМодифицирован(Объект)

   МетаданныеОбъекта = Объект.Метаданные();
   Если Метаданные.Справочники.Содержит(МетаданныеОбъекта) Тогда
       Вид = "Справочник";
   ИначеЕсли Метаданные.Документы.Содержит(МетаданныеОбъекта) Тогда
       Вид = "Документ";
   Иначе
       ВызватьИсключение СтрШаблон(
       НСтр("ru='Проверка модифицированности для объекта %1 не предусмотрена.'"),
       МетаданныеОбъекта);
   КонецЕсли;

   Запрос = Новый Запрос(
   "ВЫБРАТЬ
    |    *
    |ИЗ
    |    " + Вид + "." + МетаданныеОбъекта.Имя + "
    |ГДЕ
    |    Ссылка = &Ссылка");
   Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);

   РезультатЗапроса = Запрос.Выполнить();

   Возврат ПроверитьМодифицированностьРеквизитов(Объект, РезультатЗапроса, "");

КонецФункции

Функция ПроверитьМодифицированностьРеквизитов(Объект, РезультатЗапроса, Префикс)
   НеобрабатываемыеРеквизиты = СтрРазделить("Ссылка,НомерСтроки", ",");

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

       НомерСтроки = НомерСтроки + 1;
       Для Каждого Колонка Из РезультатЗапроса.Колонки Цикл
           Если НеобрабатываемыеРеквизиты.Найти(Колонка.Имя) <> Неопределено Тогда
               Продолжить;
           КонецЕсли;

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

   Возврат Ложь;

КонецФункции

1
комментарий
Борис
19 окт 2023
Ошибка в коде. Номер строки надо получать из выборки. Запрос выдает строки ТЧ не по порядку. ТЧ это таблица не ссылочная, не упорядоченная. данные в куче лежат. Только индекс по ссылке по умолчанию и все
____________________
Copyright©, «Программист 1С в г.Минске», 05.12.2020
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Яндекс.Метрика
Защищенное соединение ssl
visa
mastercard
Maestro
Яндекс деньги
Назад к содержимому