Синхронизация данных справочника и регистра сведений

1. dzianis.puhach 20.11.14 13:26 Сейчас в теме
Добрый день.

Есть необходимость отражать изменения ранее созданного элемента справочника в регистре сведений.

Сперва сделал так:

	Если РольКонтактногоЛица = Справочники.РолиКонтактныхЛиц.ПодписываетДоговор Тогда
	
		НаборЗаписейОЛК = РегистрыСведений.A_ОтветственныеЛицаКонтрагентов.СоздатьНаборЗаписей();  			
		НаборЗаписейОЛК.Отбор.Период.Установить(ПодписываетС);
		НаборЗаписейОЛК.Отбор.КонтактноеЛицоКонтрагента.Установить(Ссылка);
		НаборЗаписейОЛК.Отбор.Контрагент.Установить(Владелец);
		НаборЗаписейОЛК.Прочитать();

		Если НаборЗаписейОЛК.Количество() = 0 Тогда
			НоваяЗаписьОЛК = НаборЗаписейОЛК.Добавить();
			НоваяЗаписьОЛК.Период 						= ПодписываетС;
			НоваяЗаписьОЛК.КонтактноеЛицоКонтрагента 	= Ссылка;
			НоваяЗаписьОЛК.Контрагент 					= Владелец;
			НоваяЗаписьОЛК.Должность 					= Должность;
			НоваяЗаписьОЛК.НаОсновании 					= НаОсновании;
		ИначеЕсли НаборЗаписейОЛК.Количество() = 1 Тогда
			ЗаписьОЛК = НаборЗаписейОЛК[0];
			ЗаписьОЛК.Период 						= ПодписываетС;
			ЗаписьОЛК.КонтактноеЛицоКонтрагента 	= Ссылка;
			ЗаписьОЛК.Контрагент 					= Владелец;
			ЗаписьОЛК.Должность 					= Должность;
			ЗаписьОЛК.НаОсновании 					= НаОсновании;
		КонецЕсли;
		НаборЗаписейОЛК.Записать();
		
	КонецЕсли;
Показать


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

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

Заранее спасибо.
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. miniogn 23 20.11.14 13:49 Сейчас в теме
(1) Для чего? Какова задача в общем?
8. miniogn 23 20.11.14 14:21 Сейчас в теме
(1) Не понимаю смысла телодвижений.
Есть регистр выполняющий свои функции. Зачем мудрить с попыткой исправления ошибки пользователя.
Накосячить пользователи могут во многом, всего не предусмотришь.
Дать ему кнопку история и закрыть регистр в прошлых периодах по дате запрета.
И всего делов.
11. dzianis.puhach 20.11.14 20:21 Сейчас в теме
(8) Напомню, что этот регистр был создан для того, чтобы отобрать в него контактные лица по роли, и получать из него быструю выборку, в т.ч. через СрезПоследних.
Поэтому единственная функция этого регистра - это быть зеркалом части справочника.
10. Agapov_Stas 1 20.11.14 14:58 Сейчас в теме
(1) dzianis.puhach, а почему нельзя настроить/включить версионирование? именно для таких целей оно и было придумано. В отчете можно посмотреть кто что когда менял. (но есть минусы - быстро пухнет база - и версии надо чистить - у нас реализована чистка версий, которая, например, после запуска оставляет по 3 версии макс на объект )
12. dzianis.puhach 20.11.14 20:24 Сейчас в теме
(10) К сожалению за плечами лишь полгода знакомства с 1С, поэтому с версионированием еще не сталкивался, хотя и теперь не уверен, что в этом случае оно уместно.
2. Tiger86 20.11.14 13:37 Сейчас в теме
а если изменяемые реквизиты не являются ресурсами регистра в чем смысл удалять строку? или вообще что=то менять в регистре?
6. dzianis.puhach 20.11.14 14:08 Сейчас в теме
(2)(4) В справочнике ДоговорыКонтрагентов введен новый реквизит ОтветственноеЛицоКонтрагента, которое должно выбираться из справочника КонтактныеЛицаКонтрагентов с фильтром по контрагенту и по роли контактного лица (ПодписываетДоговор).

В справочнике КонтактныеЛицаКонтрагентов созданы новые реквизиты ПодписываетС и НаОсновании.

Создан регистр сведений A_ОтветственныеЛицаКонтрагентов с измерениями ОтветственноеЛицоКонтрагента и Контрагент, и ресурсами Должность и НаОсновании.
Период регистра является датой (ПодписываетС), с которой ОтветственноеЛицоКонтрагента имеет право подписи на основании, например, доверенности.

Право подписи договора могут иметь несколько лиц одного контрагента.
Регистр заведен с целью получения последнего ответственного лица контрагента через СрезПоcледних для автозаполнения формы договора (с учетом даты договора).

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

Надеюсь, текста не слишком много, и изъяснился я понятно :)
3. spezc 786 20.11.14 13:44 Сейчас в теме
ПередЗаписью получаешь существующие реквизиты справочника, сохраняешь в дополнительных свойствах. При записи имея ранее сохраненные значения реквизитов, сравниваешь их с новыми, и исходя из обстоятельств либо изменяешь существующие записи, либо удаляешь старые записи и создаешь новые
7. dzianis.puhach 20.11.14 14:10 Сейчас в теме
(3)(5) Спасибо, чуть позже опробую.
5. adrassad 16 20.11.14 14:01 Сейчас в теме
ИначеЕсли НаборЗаписейОЛК.Количество() = 1 Тогда
            ЗаписьОЛК = НаборЗаписейОЛК[0];
            НаборЗаписейОЛК.Удалить(ЗаписьОЛК);
      КонецЕсли;
9. spezc 786 20.11.14 14:31 Сейчас в теме
(5) да, как вы думаете, сколько будет записей в регистре сведений, если был изменен реквизит справочника, значение которого используется в качестве измерения регистра?
13. dzianis.puhach 20.11.14 21:03 Сейчас в теме
(5) Увы, строки множатся.
14. miniogn 23 21.11.14 06:28 Сейчас в теме
Надуманная проблема. Записывай в регистр, так как введет пользователь.
Добавь ему кнопку "история", по которой можно открыть список регистра, где пользователь при необходимости может исправить косяки.
15. dzianis.puhach 21.11.14 13:40 Сейчас в теме
(14) miniogn, вероятно, так и сделаю. (3) Этот вариант (с моей базой знаний) отнимет больше времени, чем стоило бы.
16. dzianis.puhach 21.11.14 15:34 Сейчас в теме
(14)(3) И все-таки сделано, как и планировалось :)

// Объявляю переменные модуля

Перем ИсхПодписываетС;
Перем ИсхСсылка;
Перем ИсхВладелец;
Перем ИсхДолжность;
Перем ИсхНаОсновании;	

// Присваиваю им исходные реквизиты

Процедура ПриОткрытии()
	Если НЕ ЭтоНовый() Тогда
		ИсхПодписываетС = ПодписываетС;
		ИсхСсылка = Ссылка;
		ИсхВладелец = Владелец;
		ИсхДолжность = Должность;
		ИсхНаОсновании = НаОсновании;		
	КонецЕсли; 		
КонецПроцедуры

// Нахожу по исходным переменным запись в регистре и удаляю ее. Затем создаю новую.

Процедура ПриЗаписи(Отказ)
	Если РольКонтактногоЛица = Справочники.РолиКонтактныхЛиц.ПодписываетДоговор Тогда
		
		Удаление = РегистрыСведений.A_ОтветственныеЛицаКонтрагентов.СоздатьМенеджерЗаписи();
		Удаление.Период = ИсхПодписываетС;
		Удаление.КонтактноеЛицоКонтрагента = ИсхСсылка;
		Удаление.Контрагент = ИсхВладелец;
		Удаление.Должность = ИсхДолжность;
		Удаление.НаОсновании = ИсхНаОсновании;
		Удаление.Прочитать();
		Удаление.Удалить();
		
		Создание = РегистрыСведений.A_ОтветственныеЛицаКонтрагентов.СоздатьМенеджерЗаписи();
		Создание.Период = ПодписываетС;
		Создание.КонтактноеЛицоКонтрагента = Ссылка;
		Создание.Контрагент = Владелец;
		Создание.Должность = Должность;
		Создание.НаОсновании = НаОсновании;
		Создание.Записать();
				
	КонецЕсли;
КонецПроцедуры
Показать


Это костяк, а остальное уже мелочи.
Оставьте свое сообщение

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