Гость
Форумы / [игнор отключен] [закрыт для гостей] / Сохранение данных в регистр сведений / 18 сообщений из 18, страница 1 из 1
25.11.2008, 16:49
    #35674656
TyShiSvEt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение данных в регистр сведений
Мне необходимо все реквизиты справочника сохранить в регистре сведений. Редактирование и добавление элементов справочника делаю в ФормеЭлемента.
Как отследить были или нет внесены какие- нибудь изменения данных. Если изменения не вносились , то как сделать что бы в регистр сведений данные не помещались (сохранение происходит при вызове события "после записи").

Я пытаюсь сравнить 2 объекта

Объект1 = Ссылка.ПолучитьОбъект() - хранит изменяемую запись до записи в справочник

Объект2 = Ссылка.ПолучитьОбъект() - хранит измененную запись после записи в справочник

Если измененний не было, то Объект1=Объект2, но мне пишет что они не равны, хотя при просмотре в отладчике никакой разницы я не заметил Почему? ИЛИ подскажите другой способ сохранения данных в регистре.
...
Рейтинг: 0 / 0
25.11.2008, 17:09
    #35674706
BestProgrammist
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение данных в регистр сведений
TyShiSvEt,
1) Изменен или нет объект относительно базы, проверять всегда в событиях "ПередЗАписью"
2) "Перед записью" для справочника элемент и его значения из базы доступны по ссылке
ЭтотОбъект.Ссылка
3) Следовательно сравниваешь значение Реквизитов из "ЭтотОбъект.ИмяРеквизита" с "ЭтотОбъект.Ссылка.ИмяРеквизита"

4) Если сравнивать со значениями хранимыми в регистре, тогда в "ПередЗаписью" нужно прочитать значения из регистра и так же сравнить их с новыми значениями элемента.
...
Рейтинг: 0 / 0
25.11.2008, 17:20
    #35674741
TyShiSvEt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение данных в регистр сведений
Проблема в том что количество реквизитов изменения которых необходимо отслеживать 17 штук.
и проверять изменение каждого совсем не хочется.
С помощью Ссылка.ПолучитьОбъект() гораздо удобней.

Процедура ПередЗаписью(Отказ)
Объект1 = Ссылка.ПолучитьОбъект();
КонецПроцедуры

Процедура ПослеЗаписи()
Объект2 = Ссылка.ПолучитьОбъект();

Если Объект1 <> Объект2 тогда
Запись = РегистрыСведений.ШтатноеРасписание.СоздатьМенеджерЗаписи();
бла- бла- бла
Запись.Записать(Истина);
КонецПроцедуры

Объект1 <> Объект2 (если изменений не было), но как я уже писал что при отсутсвие изменений Объект1 и Объект2 всеравно не равны.
...
Рейтинг: 0 / 0
25.11.2008, 17:22
    #35674743
TyShiSvEt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение данных в регистр сведений
Пардон
Объект1 <> Объект2 ЕСЛИ БЫЛИ ИЗМЕНЕНИЯ
...
Рейтинг: 0 / 0
25.11.2008, 18:12
    #35674875
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение данных в регистр сведений
примерно так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
Функция ОбъектыСправочникаРавны(Объект1,Объект2)

	Объект1 = Справочники.Банки.СоздатьЭлемент();
	Объект2 = Справочники.Банки.СоздатьЭлемент();
	
	Равны = (Объект1.Код=Объект2.Код) и (Объект1.Наименование=Объект2.Наименование) и (Объект1.Родитель=Объект2.Родитель) и (Объект1.Владелец=Объект2.Владелец) и (Объект1.ПометкаУдаления=Объект2.ПометкаУдаления);
	
	Если не Равны Тогда
	    Возврат Ложь;	
	КонецЕсли; 
	
	Для каждого Реквизит Из Объект1.Метаданные().Реквизиты Цикл
		ИмяРеквизита = Реквизит.Имя;
		Если не(Объект1[ИмяРеквизита]=Объект2[ИмяРеквизита]) Тогда
			Возврат Ложь;	
		КонецЕсли;     	
	КонецЦикла; 
	
	Для каждого ТабличнаяЧасть Из Объект1.Метаданные().ТабличныеЧасти Цикл
		ИмяТЧ = ТабличнаяЧасть.Имя;
		ТЧ1 = Объект1[ИмяТЧ];
		ТЧ2 = Объект2[ИмяТЧ];
		Если не(ТЧ1.Количество()=ТЧ2.Количество()) Тогда
			Возврат Ложь;	
		КонецЕсли;     	
		Для й= 0  По ТЧ1.Количество()- 1  Цикл
			Стр1 = ТЧ1[й];		
			Стр2 = ТЧ2[й];		
			Для каждого Реквизит Из ТабличнаяЧасть.Реквизиты Цикл
				ИмяРеквизита = Реквизит.Имя;
				Если не(Стр1[ИмяРеквизита]=Стр2[ИмяРеквизита]) Тогда
					Возврат Ложь;	
				КонецЕсли;     				
			КонецЦикла; 
		КонецЦикла; 
	КонецЦикла; 
	
	Возврат Истина;

КонецФункции
С уважением, Naf
...
Рейтинг: 0 / 0
25.11.2008, 18:53
    #35674983
BestProgrammist
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение данных в регистр сведений
TyShiSvEt,
это ваша "хотелка", а не возможности 1С,
Naf привел код который допустим в 1С
...
Рейтинг: 0 / 0
26.11.2008, 14:31
    #35676699
TyShiSvEt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение данных в регистр сведений
Naf,
Спасибо заработало!

Но всетаки почему не работает?

Объект1 = Ссылка.ПолучитьОбъект() до записи
Объект2 = Ссылка.ПолучитьОбъект() после записи

Даже если изменений не было Объект1==Объект2 всегда ЛОЖЬ
...
Рейтинг: 0 / 0
26.11.2008, 14:32
    #35676705
Reder
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение данных в регистр сведений
TyShiSvEt,

Потому что это разные экземпляры объектов.
...
Рейтинг: 0 / 0
27.11.2008, 06:21
    #35678091
Dolter
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение данных в регистр сведений
RederTyShiSvEt,

Потому что это разные экземпляры объектов.

Даже не столько потому, что это разные экземпляры одного и того же объекта, а потому что у них как минимум один реквизит в базе разный: _Version (обновляется при каждой записи вне зависимости от наличия изменений).

Т.е. либо заблокировать на форме кнопку записи до внесения каких-либо изменений в реквизиты (Модифицированность) либо в ПередЗаписью() взводить какой-либо флаг при отсутствии это самой модифицированности и при его "взведенном" состоянии не отрабатывать кусок кода в ПослеЗаписи().
...
Рейтинг: 0 / 0
27.11.2008, 12:28
    #35678749
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение данных в регистр сведений
DolterRederTyShiSvEt,

Потому что это разные экземпляры объектов.

Даже не столько потому, что это разные экземпляры одного и того же объекта, а потому что у них как минимум один реквизит в базе разный: _Version (обновляется при каждой записи вне зависимости от наличия изменений).

Т.е. либо заблокировать на форме кнопку записи до внесения каких-либо изменений в реквизиты (Модифицированность) либо в ПередЗаписью() взводить какой-либо флаг при отсутствии это самой модифицированности и при его "взведенном" состоянии не отрабатывать кусок кода в ПослеЗаписи().

Может оказаться на форме элементы с галкой "изменяет данные". при его отработке взведется галка Модифицированность, хотя данные и не изменялись
...
Рейтинг: 0 / 0
02.12.2008, 01:10
    #35686745
av.tor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение данных в регистр сведений
Два объекта полученные при помощи вызова двух методов ПолучитьОбъект() всегда будут НЕ равны . Независимо ни от чего.

Код: plaintext
1.
2.
3.
с = Справочники.Валюты.НайтиПоКоду( 643 ); 
о1 = с.ПолучитьОбъект();
о2 = с.ПолучитьОбъект();
Сообщить(о1=о2); // здесь всегда будет Ложь


Как вариант можно при открытии формы сохранять значения в виде строки XML, при/после записи получать такую строку снова и сравнивать их. Если отличаются - значит есть отличия:

Код: plaintext
1.
2.
3.
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ЗаписатьXML(ЗаписьXML, Ссылка.ПолучитьОбъект());
xmlСтрока = ЗаписьXML.Закрыть();

Еще вариант

в процедуре ПередЗаписью делаем

Код: plaintext
1.
2.
3.
4.
5.
6.
Запрос = Новый Запрос("Выбрать * из "+ ИмяОбъекта + " Как Эл Где Эл.Ссылка = &Ссылка");
//читаем данные объекта до изменений
Для Каждого Реквизит Из МетаданныеОбъект.Реквизиты Цикл
	Если НЕ Выборка[Реквизит.Имя] = ЭтаФорма[Реквизит.Имя] Тогда
		//есть изменения
	КонецЕсли;
КонецЦикла;
...
Рейтинг: 0 / 0
02.12.2008, 01:55
    #35686768
Deosfen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение данных в регистр сведений
Используйте метод "Модифицированность".
...
Рейтинг: 0 / 0
02.12.2008, 12:36
    #35687510
TyShiSvEt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение данных в регистр сведений
Прбовал Ссылка.ПолучитьОбъект().Модифицированность(), при любом варианте = ложь
...
Рейтинг: 0 / 0
03.12.2008, 04:30
    #35689401
Deosfen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение данных в регистр сведений
Вы писали: "Мне необходимо все реквизиты справочника сохранить в регистре сведений. Редактирование и добавление элементов справочника делаю в ФормеЭлемента. "

- тогда в событии ПередЗаписью, используйте метод "Модифицированность"
...
Рейтинг: 0 / 0
03.12.2008, 10:35
    #35689772
TyShiSvEt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение данных в регистр сведений
Deosfen,
Не совсем понятно как использовать этот метод, я уже писал что и после записи и до записи Объект.Модифицированность()=ложь, даже при наличии изменений.

Да и к слову у меня прекрасно работает код который предложил Naf.
...
Рейтинг: 0 / 0
03.12.2008, 13:58
    #35690577
pail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение данных в регистр сведений
TyShiSvEtDeosfen,
Не совсем понятно как использовать этот метод, я уже писал что и после записи и до записи Объект.Модифицированность()=ложь, даже при наличии изменений.

Да и к слову у меня прекрасно работает код который предложил Naf.

Сколько же еще раз нужно прямым текстом сказать, что разные экземпляры объектов - они РАЗНЫЕ,
и (в частности) у свежесозданного экземпляра Модифицированности быть не может.
...
Рейтинг: 0 / 0
03.12.2008, 14:33
    #35690753
TyShiSvEt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение данных в регистр сведений
pailTyShiSvEtDeosfen,
Не совсем понятно как использовать этот метод, я уже писал что и после записи и до записи Объект.Модифицированность()=ложь, даже при наличии изменений.

Да и к слову у меня прекрасно работает код который предложил Naf.

Сколько же еще раз нужно прямым текстом сказать, что разные экземпляры объектов - они РАЗНЫЕ,
и (в частности) у свежесозданного экземпляра Модифицированности быть не может.


То что экземпляры разные это понятно. Сейчас я хочу знать другое: можно ли в данном случае использовать метод Модифицированность(), если можно, то хотелось бы больше конкретики.
...
Рейтинг: 0 / 0
03.12.2008, 17:22
    #35691434
Dolter
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение данных в регистр сведений
TyShiSvEtpailTyShiSvEtDeosfen,
Не совсем понятно как использовать этот метод, я уже писал что и после записи и до записи Объект.Модифицированность()=ложь, даже при наличии изменений.

Да и к слову у меня прекрасно работает код который предложил Naf.

Сколько же еще раз нужно прямым текстом сказать, что разные экземпляры объектов - они РАЗНЫЕ,
и (в частности) у свежесозданного экземпляра Модифицированности быть не может.


То что экземпляры разные это понятно. Сейчас я хочу знать другое: можно ли в данном случае использовать метод Модифицированность(), если можно, то хотелось бы больше конкретики.
Попробуйте в форме объекта, после изменения данных вывести следующее:
Модифицированность()
ЭтотОбъект.Модифицированность()
Ссылка.ПолучитьОбъект().Модифицированность()
и увидите в чем разница последнего перед двумя предыдущими...
...
Рейтинг: 0 / 0
Форумы / [игнор отключен] [закрыт для гостей] / Сохранение данных в регистр сведений / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]