Как при записи понять что объект изменен

1. schweigen 25.02.18 13:58 Сейчас в теме
Вопрос.
Как при записи объекта, в модуле объекта, понять, что он был изменен пользователем?
Ключевое слово "изменен пользователем". Требуется отличать [Запись с изменениями] и [Запись без изменений].
Модифицированность в объекте ПередЗаписью всегда Истина, ПриЗаписи всегда Ложь. Версия данных меняется при любой записи.
Мне на ум приходит только передать Модифицированность из формы в объект через ДополнительныеСвойства.

Есть менее извращенные варианты?
+
По теме из базы знаний
Найденные решения
2. DarkUser 25.02.18 14:15 Сейчас в теме
Можно получить перед записью копию объекта из БД (по ссылка.реквизиты или запросом) и сравнить их значение к реквизитами записываемого объекта.
Рамзес; fmfedotov2000; Thalt; DoctorRoot; kaps22; schweigen; +6
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
6. lefthander 25.02.18 20:06 Сейчас в теме
(1) СП не пробовали читать?

СправочникОбъект.<Имя справочника> (CatalogObject.<Имя справочника>)
Модифицированность (Modified)
Синтаксис:

Модифицированность()
Возвращаемое значение:

Тип: Булево.
Истина - объект изменен; Ложь - в противном случае.
Описание:

Определяет, был ли изменен объект после считывания из базы данных.

Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Примечание:

Метод не позволяет определить, был ли изменен объект другими пользователями.
Пример:

Если Объект.Модифицированность() Тогда
Объект.Записать();
КонецЕсли;
fmfedotov2000; +1 8
8. schweigen 25.02.18 23:34 Сейчас в теме
(6)
Определяет, был ли изменен объект после считывания из базы данных

Влепить бы вам минус, да рейтинг не позволяет
impextr; KoC_one; jONES1979; GATTUSO; alei1180; ProChelny; Tigreno; Student1C; 1_C; esqado; crosby; ArtiKDA; mars207; Риник; ilyaleontyev; +15
11. lefthander 26.02.18 08:57 Сейчас в теме
(8)мне все равно на ваш минус, если вы не умеете считать объект из базы данных на форме, то правильно система вам не позволила влепить минус.
fmfedotov2000; +1
13. пользователь 26.02.18 12:34
Сообщение было скрыто модератором.
...
7. lefthander 25.02.18 21:15 Сейчас в теме
(1)Зачем проверять это в объекте? проверяйте это в форме. В конце концов модифицированность можно проверить передав РеквизитФормыВЗначение(<ИмяРеквизита>, <Тип>) и проверить модифицированность.
Но я бы проверил это из формы передзаписью()
fmfedotov2000; +1
16. _KVI_ 30.05.21 00:38 Сейчас в теме
(1) на мой взгляд оптимальнее в "ПередЗаписью" запросом проверять.
В форме можно ещё в "ПередЗаписьюНаСервере" сравнить данные "Объект" и "ТекущийОбъект".
+
2. DarkUser 25.02.18 14:15 Сейчас в теме
Можно получить перед записью копию объекта из БД (по ссылка.реквизиты или запросом) и сравнить их значение к реквизитами записываемого объекта.
Рамзес; fmfedotov2000; Thalt; DoctorRoot; kaps22; schweigen; +6
3. schweigen 25.02.18 14:41 Сейчас в теме
(2) Не выдерживает критики, если:
Много реквизитов
Много табличных частей
Много метаданных, к которым требуется применить данный механизм. Считай под каждое метаданное отдельно писать.
Ресурсозатратно. Перепроводишь документы за период и у тебя при каждом выполняется отдельный запрос, если ты понимаешь о чем я.

Короче плохой вариант
+
4. schweigen 25.02.18 14:56 Сейчас в теме
(2)
Функция ОбъектМодифицирован(Объект, ПроверятьТабличныеЧасти = Истина, ПроверятьСтандартные = Истина) 
	
	Ссылка = Объект.Ссылка;
	Метаданное = Ссылка.Метаданные();
	
	Для каждого Реквизит из Метаданное.Реквизиты Цикл
		Если Объект[Реквизит.Имя] <> Ссылка[Реквизит.Имя] Тогда
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;
	
	Если ПроверятьСтандартные Тогда
	Для каждого Реквизит из Метаданное.СтандартныеРеквизиты Цикл
		Если Объект[Реквизит.Имя] <> Ссылка[Реквизит.Имя] Тогда
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;
	КонецЕсли;
	
	
	Если ПроверятьТабличныеЧасти Тогда
		Для каждого ТЧ из Метаданное.ТабличныеЧасти Цикл
			
			Если Объект[ТЧ.Имя].Количество() <> Ссылка[ТЧ.Имя].Количество() Тогда
				Возврат Истина;
			КонецЕсли;
						
			Для Индекс = 0 по Объект[ТЧ.Имя].Количество()-1 Цикл
				ОбъектСтрокаТЧ = Объект[ТЧ.Имя][Индекс];
				СсылкаСтрокаТЧ = Ссылка[ТЧ.Имя][Индекс];
				Для каждого РеквизитТЧ из ТЧ.Реквизиты Цикл
					Если ОбъектСтрокаТЧ[РеквизитТЧ.Имя] <> СсылкаСтрокаТЧ[РеквизитТЧ.Имя] Тогда
						Возврат Истина;
					КонецЕсли;
				КонецЦикла;
			КонецЦикла;
			
		КонецЦикла;		
	КонецЕсли;
	
	Возврат Ложь;
	
КонецФункции
Показать

=)
devtelscargo; Cat_Yamamoto; Неопределено; tigcorp; user785225; M_I_V_91; fmfedotov2000; kirameka; user1097143; Egovigor; klaus38; user686589_sev_s; kuznetsov1c; 3gf; user1643757; ezhikofff; gatsubin; GinGitsune; user720820720; Alister; user1252779; crosby; ivangrant; A7758735; LeXXeR; mars207; Deals; hachaturov; alex_makhnov; alevnev; IT_GG; a_a_burlakov; CXY; Aleksandr_prof; Denis_Shiln; markw; graf9190; itriot11; independ; +39
5. DarkUser 25.02.18 15:39 Сейчас в теме
Хорошая функция, утащу к себе. Универсальность наше всё :) Спасибо!
+
9. catena 110 26.02.18 04:55 Сейчас в теме
(4)Главное не нарваться на ХранилищеЗначений
schweigen; +1
10. schweigen 26.02.18 08:39 Сейчас в теме
12. lefthander 26.02.18 09:12 Сейчас в теме
(2)Пока идет сравнение, другой пользователь может внести изменения. :)
+
14. telephon 13.09.18 10:57 Сейчас в теме
А я всегда думал, что 1С следит за многопользовательской составляющей и не дает менять открытый документ другому пользователю.
+
15. Matveev_VS 160 19.09.19 12:20 Сейчас в теме
Спасибо! Помогло
+
17. Homs 28.12.21 19:12 Сейчас в теме
Если в документе то можно просто

&НаСервере
Функция ОбъектМодифицирован( ) 
	Попытка
		ОбъектП = РеквизитФормыВЗначение("Объект");   
	исключение
		возврат истина; 
	КонецПопытки;
   возврат ложь; 
КонецФункции
Показать
SergeySol-82; matashin; +2
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот