1с как проверить изменение реквизитов

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

Я
   Михаил Анянов

17.05.12 — 10:01

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

Возможно ли это и как реализовать?

   alextom81

1 — 17.05.12 — 10:02

Через объект метаданных и элемент формы

   Михаил Анянов

2 — 17.05.12 — 10:02

Суть задачи, при изменении только Родителя — никаких проверок при записи не делать, во всех остальных случаях осуществлять ряд проверок.

   Cube

3 — 17.05.12 — 10:03

Если Наименование <> Ссылка.Наименование Тогда

   Сообщить(«Наименование изменено»);

КонецЕсли;

   Reset

4 — 17.05.12 — 10:03

а) Хранить структуру реквизитов до измения

б) Взять предыдущие из БД ПередЗаписью (по ссылке)

   НЕА123

5 — 17.05.12 — 10:04

(3)+1

   Михаил Анянов

6 — 17.05.12 — 10:04

(3) а как пробежаться по всем реквизитам?

   Reset

7 — 17.05.12 — 10:05

(6)

а) Из метаданных

б) Выбрать *

   Cube

8 — 17.05.12 — 10:07

(6) А тебе нужно конкретно знать, что изменено или пофиг?

   Reset

9 — 17.05.12 — 10:09

Да, (8) прав, можно использовать модифицированность, при таковой сравнивать только Родителя (если (2))

   Михаил Анянов

10 — 17.05.12 — 10:10

Для Каждого текРеквизит из СписокРеквизитов Цикл

   Если // а вот как тут проверку написать? Тогда

       Сообщить(«Реквизит » + текРеквизит + » изменен!»);

   КонецЕсли;

КонецЦикла;

   Михаил Анянов

11 — 17.05.12 — 10:11

Забыл:

СписокРеквизитов = ЭтотОбъект.Метаданные().Реквизиты;

   Reset

12 — 17.05.12 — 10:11

(10) Что написать — зависит от того, что находится в СписокРеквизитов

   Михаил Анянов

13 — 17.05.12 — 10:11

Мне нужно определить, что не изменилось ничего кроме родителя

   Михаил Анянов

14 — 17.05.12 — 10:11

Т.е. перебрать все реквизиты надо

   Reset

15 — 17.05.12 — 10:12

(11)

Если Ссылка[текРеквизит.Имя]<>ЭтотОбъект[текРеквизит.Имя]

Хотя меня лично коробит множественное обращение по ссылке

   Reset

16 — 17.05.12 — 10:13

(13) и (14) — взаимоисключающие утверждения

   Maxus43

17 — 17.05.12 — 10:13

(15) запросом вытащить предварительно можно

   Cube

18 — 17.05.12 — 10:13

(13) Фигня какая-то… Информация может храниться в регистрах сведений и/или подчиненных справочниках… Как их проверять будешь?

   Reset

19 — 17.05.12 — 10:13

(16) Поторопился —

   Reset

20 — 17.05.12 — 10:14

(17) Я так и предлагаю :)

   Михаил Анянов

21 — 17.05.12 — 10:14

(16) как же они взаимоисключающие? Мне нужно получить список измененных реквизитов, если он будет состоять только из Родителя — тогда Возврат, иначе — проверки.

   Михаил Анянов

22 — 17.05.12 — 10:15

Интересуют только реквизиты! :)

   Михаил Анянов

23 — 17.05.12 — 10:15

(18) Интересуют только реквизиты самого объекта!

   Михаил Анянов

24 — 17.05.12 — 10:17

(15) ну а иначе никак… либо перед записью в таблицу все реквизиты текущего объекта просто выгружать… В результате обращение к объекту будет одно.

   Михаил Анянов

25 — 17.05.12 — 10:17

Спасибо за советы, сейчас буду мудрить :)

   Reset

26 — 17.05.12 — 10:20

(24) Можно оптимизировать

а) Получить запросом

б) Создать временный объект — копию:

ОбъектДоИзменения=Ссылка.ПолучитьОбъект()

//блабла

    Если ОбъектДоИзменения[текРеквизит.Имя]<>ЭтотОбъект[текРеквизит.Имя]

// Так читабельней и меня меньше коробит ;)

   hhhh

27 — 17.05.12 — 10:22

(26) не, там и так всё в порядке. По ссылке один раз получается объект и дальше уже он используется. То есть временный объект сам создается платформой. Не нужно заморачиваться.

   Maxus43

28 — 17.05.12 — 10:23

(27) некрасиво просто. я за запрос!

   Михаил Анянов

29 — 17.05.12 — 10:37

Всем спасибо большое! Сделал так в модуле ПередЗаписью()

   Если НЕ ЭтоНовый() Тогда

       Запрос = Новый Запрос;

       Запрос.Текст =

           «ВЫБРАТЬ *

           |ИЗ

           |    Справочник.Номенклатура КАК Номенклатура

           |ГДЕ

           |    Номенклатура.Ссылка = &Ссылка»;

       Запрос.УстановитьПараметр(«Ссылка», ЭтотОбъект.Ссылка);

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

       Если Результат.Количество() > 0 Тогда

           Результат.Следующий();

           СписокРеквизитов = ЭтотОбъект.Метаданные().Реквизиты;

           Для Каждого текРеквизит из СписокРеквизитов Цикл

               Если Результат[текРеквизит.Имя] <> ЭтотОбъект[текРеквизит.Имя] Тогда

                   Сообщить(«Реквизит » + текРеквизит + » изменен!»);

               КонецЕсли;

           КонецЦикла;

       КонецЕсли;

   КонецЕсли;

   Михаил Анянов

30 — 17.05.12 — 10:44

Есть один косяк, СписокРеквизитов = ЭтотОбъект.Метаданные().Реквизиты — в список Родитель не попадает, и другие стандартные реквизиты

   Михаил Анянов

31 — 17.05.12 — 10:45

СписокРеквизитов = ЭтотОбъект.Метаданные().СтандартныеРеквизиты;

Вопрос снят :)

   Reset

32 — 17.05.12 — 10:46

(29)(31) Нормально вполне себе, молодца :)

   AAlexandra

33 — 17.05.12 — 10:48

(30) КолонкиИзЗапроса = Запрос.Выполнить().Колонки;

   Alex375

34 — 17.05.12 — 10:48

А тебе надо отследить изменения в объекте при редактировании через форму или при любых изменениях объекта? Просто если через форму, тогда можно проще — завести флаг и его выставлять при изменении реквизитов в форме.

   Михаил Анянов

35 — 17.05.12 — 10:52

(34) при любых, как обработкой, так и обменом

   hhhh

36 — 17.05.12 — 10:53

(31) а чего у вас там постоянно родителя туда-сюда меняют у элементов? Может не стоит такую офигенную проверку устраивать каждый раз, а сделать с родителем так же.

   Михаил Анянов

37 — 17.05.12 — 10:53

(34) тот флаг о котором ты говоришь итак есть стандартно, ЭтотОбъект.Модифицированность()

   Михаил Анянов

38 — 17.05.12 — 10:54

(36) справочник обрабатывается как ручками, так и обработками различными. Если подскажешь как мне определить, что происходит событие смены родителя, то буду благодарен :)

   hhhh

39 — 17.05.12 — 10:57

(38) ну легко:

ТабличноеПоле (TableBox)

ПриСменеТекущегоРодителя (OnCurrentParentChange)

Синтаксис:

ПриСменеТекущегоРодителя()

Описание:

Возникает при изменении текущего родителя в режиме иерархического списка.

   DrShad

40 — 17.05.12 — 11:02

(38) подписку на событие не предлагать?

   Михаил Анянов

41 — 17.05.12 — 11:57

Ага, только рассмотрите еще один момент, помимо родителя я одновременно могу например еще и наименование изменить, и т.п.

  

Михаил Анянов

42 — 17.05.12 — 12:00

(39) — собитие при записи все равно ведь выполнится с кучей проверок внутри?

Обычная задача — перед записью поймать изменение реквизита (пусть это будет реквизит ВремяНачала)и выполнить некоторое действие.
Раньше оно было совсем просто в процедуре ПередЗаписью

Если Ссылка.ВремяНачала <> Объект.ВремяНачала Тогда
// реквизит изменен - выполняем нужные действия
КонецЕсли

Сейчас такой фокус не пройдет — придется написать чуть побольше кода.

&НаСервере
Функция ИзменениеВРасписании(ВремяНачалаАктуальное)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ОказаниеУслуг.ВремяНачала
|ИЗ
| Документ.ОказаниеУслуг КАК ОказаниеУслуг
|ГДЕ
| ОказаниеУслуг.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);

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

Если Выборка.Следующий() Тогда
ВремяНачалаСохраненное = Выборка.ВремяНачала;
Если ВремяНачалаСохраненное <> ВремяНачалаАктуальное Тогда
Возврат Истина;
КонецЕсли;
КонецЕсли;
Возврат Ложь;
КонецФункции

Ну и используем новую функцию в процедуре ПередЗаписью

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
Если ИзменениеВРасписании(Объект.ВремяНачала) Тогда
// реквизит изменен - выполняем нужные действия
КонецЕсли;
КонецПроцедуры

Цитата
Сообщение от Tklwegsd
Посмотреть сообщение

Если Модифицированность() тогда а=0; КонецЕсли;

так не работает, выдает ошибку

1C
1
2
3
Ошибка при выполнении обработчика - 'ПередЗаписью'
по причине:
{Справочник.Номенклатура.МодульОбъекта(116)}: Метод объекта не обнаружен (Модифицированность)[quote="Dethmontt;14015893"]Модифицированность() - это свойство формы или объекта в памяти (но уж точно не ссылки)[/quote]

Модифицированность() — это свойство формы или объекта в памяти (но уж точно не ссылки)

это надо понимать так?

1C
1
ЭтаФорма.Модифицированность()

так тоже не понимает

1C
1
{(1,1)}: Переменная не определена (ЭтаФорма)

Цитата
Сообщение от Yulunga
Посмотреть сообщение

;-)

чувство юмора это хорошо, а решение где, поспешил вам плюс поставить)

Добавлено через 17 минут
Или ошибка в том, что я проверяю в Модуле менеджера справочника в событии Перед записью, а надо проверять в Модуле Формы?

еще потестировал, в модуле объекта Справочника номенклатуры работает.
Работает и просто в форме по событию ПриИзменении элемента, но использовал это событие чисто для тестирования. В идеале нужно, что бы работало в Модуле Объекта ПередЗаписью().
Результат положительный, но пока нет четкого понимания, как это работает.

Добавлено через 24 минуты

Цитата
Сообщение от Tklwegsd
Посмотреть сообщение

А так?
1C
Выделить код
1
2
3
Если Модифицированность() тогда
а=0;
КонецЕсли;

еще потестировал
Оказалось, что даже если выбран тот же самый реквизит, программа думает что данные в форме изменилась, причем так думает и сама форма и Модуль объекта перед записью?

Можно ли где то узнать алгоритм этой функции, 1С ведь на си вроде написана, эти модули есть где нибудь или нет? Или может есть описание таких функциональных модулей?

Не по теме:

интернет видимо медленный и проходит дребезг клавиши, почему то иногда выходят повторы ответов через 15 сек)

Добавлено через 1 час 34 минуты
Пока получается так
Разные действия на форме име.ют разные действия:
1. Если меняем реквизит на другой признак Модифицированности
устанавливается в ИСТИНУ, * в шапке
2. Если не меняем реквизит, но открываем форму реквизита (если это ссылка) => Модифицированность
в ИСТИНУ и * в шапке формы.
3. Если нажимаем на крестик в открывшейся форме, => Модифицированность ложь и * НЕТ

Добавлено через 42 минуты
вот Синтаксис помощник

1C
1
2
3
Если Объект.Модифицированность() Тогда
    Объект.Записать();
КонецЕсли;

как это правильно применить в коде?
У объекта — Метод, у формы — свойство — в чем зазница?
У объекта событие ПередЗаписью, у формы событие ПередЗакрытием

Логика понятна.
Объект — прочитали данные из базы, что то изменили и пробуем записать обратно, все поля можно проверить , в базе они отличаются от новых.

Форма — поля формы вроде бы не где не сохраняются и их изменение при закрытии формы разве можно как то проверить сразу все на уровне программы?

У формы по идее в программе настроен простой механизм, если был открыт хоть один реквизит на изменение и не важно изменили там что либо или нет, проверяется только сам факт, сохранили действие или отменили по крестику к примеру и все флаг Модификации перещелкивается и при закрытии формы, проверяется просто его значение ложь или истина.

так или нет?

Хотя при сохранению в базу программа может и не проверять поля (старые и новые) [такой вывод можно сделать из статьи https://forum.infostart.ru/forum9/topic129997/ там сохраняется каждое поле и потом сверяется перед записью], а тоже работать только по этому флагу

Форма — поля формы вроде бы не где не сохраняются и их изменение при закрытии формы разве можно как то проверить сразу все на уровне программы?

У формы по идее в программе настроен простой механизм, если был открыт хоть один реквизит на изменение и не важно изменили там что либо или нет, проверяется только сам факт, сохранили действие или отменили по крестику к примеру и все флаг Модификации перещелкивается и при закрытии формы, проверяется просто его значение ложь или истина.

так или нет?

Хотя при сохранению в базу программа может и не проверять поля (старые и новые) [такой вывод можно сделать из статьи https://forum.infostart.ru/forum9/topic129997/ там сохраняется каждое поле и потом сверяется перед записью], а тоже работать только по этому флагу

Опубликовано 12.08.2021 10:30
Просмотров: 10107

Наша статья «Документ в 1С изменен. Как узнать, кто это сделал?» очень популярна среди пользователей. Благодаря ей вы можете узнать общие данные: кто и когда создал документ, изменил его или удалил. Но вот что именно удалил либо поменял пользователь в конкретном документе, вы не увидите. А хотелось бы, правда? Для решения этого вопроса разработчики внедрили в программу 1С специальный механизм хранения версий объектов, так называемое версионирование, с помощью которого вы как раз можете увидеть всю конкретику измененных документов. В этой статье мы расскажем обо всех плюсах и минусах версионирования, а также покажем на конкретном примере в 1С: Зарплата и управление персоналом ред. 3.1 как именно работает этот механизм. 

Начиная с платформы 8.3.11, механизм версионирования встроен в систему и называется «История данных». Он имеется во всех конфигурациях, работающих на основе библиотеки стандартных подсистем (БСП). Например, в 1С: Бухгалтерии предприятия он реализован начиная с версии 3.0.35.

Использование данного механизма актуально как на этапах начала работы с программой, так и при дальнейшем ее использовании, когда имеются пользователи «новички», которые могут что-то «подпортить» в учете.

Версионирование – это механизм хранения истории изменения объектов в 1С, который позволяет:

• просматривать, какие изменения внес пользователь в объект (справочник, документ);

• анализировать версии объектов;

• сравнивать эти версии между собой;

• восстанавливать любую из версий объекта.

Механизм версионирования позволяет пользователю выполнять гибкую настройку хранения данных, выборочно применять к объектам или табличным частям, сохранять данные лишь в определенный пользователем момент, например, при проведении документов.

Плюсов данного функционала, конечно, много.

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

Как включить версионирование в 1С?

Данный механизм может включить как разработчик в конфигураторе, так и сам пользователь в пользовательском режиме.

Для включения версионирования объектов выполните следующие пункты.

Шаг 1. Перейдите в раздел «Администрирование» — «Общие настройки».

Пример раздела в 1С: Зарплата и управление персоналом, ред. 3.1. 

Пример раздела в 1С: Бухгалтерия предприятия ред. 3.0.

Шаг 2. Разверните подраздел «История изменений» и установите галочку «Хранить историю изменений». Для перехода к настройкам нажмите гиперссылку «Настроить».

Как видите, в 1С: ЗУП и 1С: Бухгалтерии предприятия эти пункты выглядят совершенно одинаково. Соответственно, и настройка версионирования во всех конфигурациях 1С выполняется аналогично, т.к. это одна подсистема.

Настройки истории хранения изменений

Рассмотрим основные настройки подсистемы «Версионирование» и механизма «Хранение данных» на примере программы 1С: Зарплата и управление персоналом ред. 3.1.

В составе объектов настройки два пункта: справочники и документы.

Настройку можно выполнить для каждого справочника отдельно, задав срок хранения и указав, когда сохранять версии.

В разделе «Документы» перечислены все имеющиеся в конфигурации документы, для которых также отдельно выполняется настройка хранения данных.

Параметр «Когда сохранять версии»

Для изменения параметра выделите ячейку и нажмите стрелочку. В выпадающем списке выберите нужное значение.

Значение параметра «Когда сохранять версии» может принимать значение:

«При записи» — версия сохраняется при создании или изменении справочника либо документа.

«При проведении» — применима для документов, для которых предусмотрено проведение. Запись производится при их проведении.

«Никогда» — запись истории изменения объекта не ведется.

Применить настройки можно и к группе объектов.

Выберите несколько объектов с помощью кнопки Shift (в указанном диапазоне «с какого по какой») или Ctrl (выборочное выделение) и, нажав кнопку «Установить когда сохранять версии», выберите нужное значение для указанных объектов.

В данном пункте, кроме описанных выше вариантов, доступна настройка «По умолчанию». В данном случае устанавливаются рекомендуемые настройки. Для справочников это – «Никогда», для документов – «При проведении».

Для справочников варианты значений параметров отличаются от значений параметров для документов.

Параметр «Срок хранения версий»

Аналогично задается параметр «Срок хранения версий».

Выделите ячейку и выберите вариант срока хранения заданного элемента.

Он может принимать значение:

• «За последнюю неделю»;

• «За последний месяц»;

• За последние три месяца»;

• «За последний год»;

• «Бессрочно».

Для выбранной группы объектов изменить данные параметр также можно с помощью кнопки «Установить срок хранения версий».

Выделите объекты, нажмите вышеуказанную кнопку и выберите нужное значение.

Рассмотрим настройку на примере.

Пример настройки версионирования в 1С: ЗУП ред. 3.1

Установите настройки хранения истории изменений для документа «Начисление зарплаты и взносов». Значение параметра «Когда сохранять версии» — При проведении», «Срок хранения» — «За последнюю неделю» (для примера).

После того, как активировано версионирование, в объектах 1С станут доступны кнопки в виде карандаша с часиками – «Перейти к истории изменений».

В нашем примере она расположена в журнале документов на панели инструментов, а также по нажатию кнопки «Еще».

Во втором варианте она выглядит как строка – «История изменений».

При открытии документа, в нем также присутствует такая кнопка и команда по нажатию кнопки «Еще».

Рассмотрим пример, когда бухгалтер вносила изменения в документ «Начисление зарплаты и взносов».

Конечно, когда изменения производились по одному сотруднику, проще исправить и пересмотреть начисления этого сотрудника. Но предположим, что возникла ситуация, когда «массово напортачили» в программе и данные изменены.

Для иллюстрации примера изменим заработную плату Булочкиной О.И. с 67000 руб. на 75000 руб. и посмотрим, как программа сохранит версии документов и сможем ли мы, используя механизм хранения данных, вернуться к прежней версии.

Нажмите «кнопку-карандашик» — «Перейти к истории изменений».

Становится видно информацию о версиях документа «Начисление зарплаты и взносов»: кто изменил данный объект, а также дату и время изменения.

Для просмотра версии выделите строку и нажмите кнопку «Открыть версию».

В отчете представлены вся информация, показатели и данные документа выделенной версии. Кнопками «+» и «-» можно свернуть и развернуть блоки для удобства чтения.

В нашем примере мы знаем, что пользователь изменил зарплату по окладу Булочкиной О.И. на 75000 руб.

Но как же пользователь проанализирует такой объем информации и определит, какие изменения произведены в какой версии?

Для этого есть функция сравнения с помощью одноименной кнопки «Сравнить».

Для сравнения версий выделите нужные строки (с помощью Shift или Ctrl) и нажмите кнопку «Сравнить».

Обратите внимание, при выделении нескольких версий другие команды неактивны, т.к. предназначены для работы с одной строкой-версией.

В отчете отобразится таблица по выделенным версиям объекта. Голубым цветом выделены измененные данные, пролистав и проанализировав которые, пользователь может сопоставить произведенные изменения и при необходимости вернуться к той версии, которая его более устроит.

Пролистав таблицу, мы видим, что пользователем Кругловой О. были изменены данные по Булочкиной О.И. Сохраненные версии №1 и №2 идентичные, а в версии №3 прослеживаются изменения.

Обратите внимание на значение поля «Изменения в реквизитах». По умолчанию установлено – «Все». Поэтому отчет получился объемным. Нажав кнопку выбора с тремя точками, пользователь может задать выводимые реквизиты, отметив нужные галочками.

Главный бухгалтер, проанализировав ситуацию, приняла решение восстановить данные документа «Начисления зарплаты и взносов» до внесения изменений зарплаты.

Как это сделать?

Выделите версию объекта, на который хотите перейти и нажмите кнопку «Перейти на версию».

В моделируемом примере нас устроит версия №2 (до внесения изменений). На нее и перейдем.

В результате проведенных манипуляций в таблице «История изменений: Начисление зарплаты и взносов от 31.08.2021» появилась четвертая версия документа с пометкой – «Выполнен переход к версии №2 от 10.08.2021 18:32:49» (пример моделировался 10.08.2021).

Откройте документ и проверьте, что в нем изменилось.

Документ перешел к варианту до внесения в него изменений. В нашем примере зарплата сотрудника Булочкиной О.И. автоматически изменилась на 67000 руб. (напомним, она была изменена ранее на 75000 руб.). Начисление НДФЛ и страховых взносов также приняло прежние значения. Т.е. документ полностью принял первоначальный вид.

Этот способ очень удобен. Он позволяет не только отслеживать, когда и кем были произведены изменения, но и «откатывать» состояние объекта в предшествующее состояние. Перейдя на версию объекта и не получив результата, пользователь может повторить операцию снова. Переходы от версии к версии не ограничены и их можно выполнять в пределах хранящихся версий.

Напоминаем, единственный минус версионирования – это то, что хранящиеся данные занимают место и при больших объемах накопленной информации программа может начать притормаживать и подвисать, особенно при работе на слабых компьютерах. Поэтому возможно имеет смысл устанавливать версионирование только для конкретных документов в программе, по которым могут быть спорные моменты.

Объем хранимых версий объектов и их удаление в 1С

Вернемся к разделу «Настройка и хранение истории изменений».

Нажмите гиперссылку «Количество и объем хранения версий объектов».

Нажмите «Сформировать».

В отчете представлена информация в графическом и в табличном варианте, где пользователь видит структуру данных версий хранения объектов.

В нашем примере видно, что объект – документ «Начисление зарплаты и взносов» имеет четыре версии и этот объем данных занимает 0,01Мб.

Но это всего лишь один документ. Поэтому, если вы настраиваете версионирование и активно им пользуетесь, смотрите какой объем занимают данные.

Обратите внимание на строку «Очистка устаревших версий». У нас пока таковых не имеется, но при их появлении появится кнопка «Очистить». Здесь также выводится информация об их количестве и объеме. Нажав на эту кнопку старые, неактуальные версии удаляются.

Для автоматизации процесса удаления устаревших версий, установите одноименную галочку «Автоматически удалять устаревшие версии» и вам не придется постоянно отвлекаться на контроль этого процесса.

Теперь вы знаете что такое версионирование и как настроить хранение истории изменения справочников и документов в программах 1С.

Как говорится: «Все гениальное – просто!». Экспериментируйте, используйте данный функционал программы и, главное, не бойтесь что-то испортить, ведь всегда можно вернуть версию объекта. Если вы сочтете это ненужным, то в любой момент вы сможете отключить данную настройку.

Автор статьи: Ольга Круглова

Понравилась статья? Подпишитесь на рассылку новых материалов

Добавить комментарий

Перейти в раздел примеры кода 1С 8.3:

Программно проверить модифицирован ли объект в 1С 8.3:

Функция ОбъектМодифицирован(Объект, ПроверятьТабличныеЧасти = Истина, ПроверятьСтандартные = Истина)

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

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

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

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

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

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

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

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

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

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

Функция ОбъектМодифицирован(Объект)

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

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

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

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

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

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

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

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

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

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

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

Copyright©, «Программист 1С в г.Минске», 05.12.2020

Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник

Понравилась статья? Поделить с друзьями:

Вот еще несколько интересных статей нашего сайта:

  • Монгольские компании в москве
  • Мондиал бизнес консорциум ооо
  • Монетка реквизиты организации
  • Монополия на большую компанию
  • Монопольные компании в россии

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии