ПриПолученииДанныхОтПодчиненного (БСП)

Автор: 1С
ОбщийМодуль.ВерсионированиеОбъектов
БСП

При получении данных от подчиненного. См. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтПодчиненного.

// См. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтПодчиненного.
Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт
	
	Если ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ВерсииОбъектов") И ЭлементДанных.Количество() > 0 Тогда
		ПрочитатьИнформациюОбУзле(ЭлементДанных[0]);
		
		Объект = ЭлементДанных.Отбор.Объект.Значение;
		
		ПорядковыйНомерСинхронизируемойВерсии = ЭлементДанных.Отбор.НомерВерсии.Значение - ЭлементДанных[0].Смещение;
		ПорядковыйНомерВерсииВладельца = ЭлементДанных[0].ВерсияВладелец;
		
		НомерВерсии = НомерВерсииВРегистре(Объект, ПорядковыйНомерСинхронизируемойВерсии);
		Если ЗначениеЗаполнено(ПорядковыйНомерВерсииВладельца) Тогда
			ЭлементДанных[0].ВерсияВладелец = НомерВерсииВРегистре(Объект, ПорядковыйНомерВерсииВладельца);
		КонецЕсли;
		
		НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
		НаборЗаписей.Отбор.Объект.Установить(ЭлементДанных.Отбор.Объект.Значение);
		НаборЗаписей.Отбор.НомерВерсии.Установить(НомерВерсии);
		НаборЗаписей.Прочитать();
		
		Если ОбщегоНазначения.ЗначениеВСтрокуXML(ЭлементДанных) = ОбщегоНазначения.ЗначениеВСтрокуXML(НаборЗаписей) Тогда
			// Считаем, что нет коллизии.
			ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать;
			Возврат;
		КонецЕсли;
		
		ЕстьКоллизия = ПланыОбмена.ИзменениеЗарегистрировано(Отправитель.Ссылка, Объект);
		
		ТипВерсииОбъекта = Перечисления.ТипыВерсийОбъекта.НепринятыеДанныеПоКоллизии;
		Если Отправитель.ДополнительныеСвойства.Свойство("НепринятыеПоДатеЗапрета")
			И Отправитель.ДополнительныеСвойства.НепринятыеПоДатеЗапрета[Объект] <> Неопределено Тогда
				ЕстьКоллизия = Истина;
				Если Отправитель.ДополнительныеСвойства.НепринятыеПоДатеЗапрета[Объект] = "НепринятыйПоДатеЗапретаОбъектСуществуетВБазе" Тогда
					ТипВерсииОбъекта = Перечисления.ТипыВерсийОбъекта.НепринятыйПоДатеЗапретаОбъектСуществуетВБазе;
				Иначе
					ТипВерсииОбъекта = Перечисления.ТипыВерсийОбъекта.НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе;
				КонецЕсли;
		КонецЕсли;
		
		// Проверяем отмечена ли эта же версия к выгрузке.
		ВерсииКВыгрузке = ВерсииКВыгрузке(Объект, Отправитель.Ссылка);
		Для Каждого ВерсияКВыгрузке Из ВерсииКВыгрузке Цикл
			Если ВерсияКВыгрузке.НомерВерсии = НомерВерсии Тогда
				ЕстьКоллизия = Истина;
			КонецЕсли;
		КонецЦикла;
		
		Если Не ЕстьКоллизия Тогда
			ЗаписатьВерсиюСИзменениемНомера(ЭлементДанных, ПолучениеЭлемента, Отправитель, НомерВерсии);
			Возврат;
		КонецЕсли;
		
		Если ТипВерсииОбъекта = Перечисления.ТипыВерсийОбъекта.НепринятыеДанныеПоКоллизии Тогда
			ВерсииКВыгрузке = ВерсииКВыгрузке(Объект, Отправитель.Ссылка);
			Если ВерсииКВыгрузке.Количество() = 0 Тогда 
				ЗаписатьВерсиюСИзменениемНомера(ЭлементДанных, ПолучениеЭлемента, Отправитель, НомерВерсии);
				Возврат;
			КонецЕсли;
			
			МинимальныйНомерВерсии = ВерсииКВыгрузке[0].НомерВерсии;
			Для Счетчик = 1 По ВерсииКВыгрузке.Количество() - 1 Цикл
				Если ВерсииКВыгрузке[Счетчик - 1].НомерВерсии - ВерсииКВыгрузке[Счетчик].НомерВерсии = 1 Тогда
					МинимальныйНомерВерсии = Мин(МинимальныйНомерВерсии, ВерсииКВыгрузке[Счетчик].НомерВерсии);
				Иначе
					Прервать;
				КонецЕсли;
			КонецЦикла;
			
			Если МинимальныйНомерВерсии > НомерВерсии Тогда
				ЗаписатьВерсиюСИзменениемНомера(ЭлементДанных, ПолучениеЭлемента, Отправитель, НомерВерсии);
				Возврат;
			КонецЕсли;
		КонецЕсли;
			
		КоллизииВерсийОбъектов = Новый Соответствие;
		Если Отправитель.ДополнительныеСвойства.Свойство("КоллизииВерсийОбъектов") Тогда
			КоллизииВерсийОбъектов = Отправитель.ДополнительныеСвойства.КоллизииВерсийОбъектов;
		Иначе
			Отправитель.ДополнительныеСвойства.Вставить("КоллизииВерсийОбъектов", КоллизииВерсийОбъектов);
		КонецЕсли;
		
		НомерВерсииСКоллизией = КоллизииВерсийОбъектов[Объект];
		НомерПоследнейВерсии = НомерПоследнейВерсии(Объект);
		ОбновитьВерсиюСКоллизией = Истина;
		Если НомерВерсииСКоллизией = Неопределено Тогда
			НомерВерсииСКоллизией = НомерПоследнейВерсии + 1;
			
			НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
			НаборЗаписей.Отбор.Объект.Установить(Объект);
			НаборЗаписей.Отбор.НомерВерсии.Установить(НомерВерсииСКоллизией);
			Запись = НаборЗаписей.Добавить();
			ЗаполнитьЗначенияСвойств(Запись, ЭлементДанных[0]);
			Запись.НомерВерсии = НомерВерсииСКоллизией;
			Запись.ТипВерсииОбъекта = ТипВерсииОбъекта;
			Запись.ДатаВерсии = ТекущаяДатаСеанса();
			Запись.АвторВерсии = Отправитель.Ссылка;
			Запись.Узел = ОбщегоНазначения.ПредметСтрокой(Запись.АвторВерсии);
			Запись.Комментарий = НСтр("ru = 'Отклоненная версия (автоматическое разрешение конфликта).'");
			НаборЗаписей.Записать();
			НомерПоследнейВерсии = НомерВерсииСКоллизией;
			КоллизииВерсийОбъектов.Вставить(Объект, НомерВерсииСКоллизией);
			ОбновитьВерсиюСКоллизией = Ложь;
		КонецЕсли;
		НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
		НаборЗаписей.Отбор.Объект.Установить(Объект);
		НаборЗаписей.Отбор.НомерВерсии.Установить(НомерПоследнейВерсии + 1);
		Запись = НаборЗаписей.Добавить();
		ЗаполнитьЗначенияСвойств(Запись, ЭлементДанных[0]);
		Запись.НомерВерсии = НомерПоследнейВерсии + 1;
		Запись.ВерсияВладелец = НомерВерсииСКоллизией;
		Запись.ТипВерсииОбъекта = ТипВерсииОбъекта;
		НаборЗаписей.Записать();
		
		Если ОбновитьВерсиюСКоллизией Тогда
			НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
			НаборЗаписей.Отбор.Объект.Установить(Объект);
			НаборЗаписей.Отбор.НомерВерсии.Установить(НомерВерсииСКоллизией);
			НаборЗаписей.Прочитать();
			Для Каждого Запись Из НаборЗаписей Цикл
				Запись.КонтрольнаяСумма = ЭлементДанных[0].КонтрольнаяСумма;
				Запись.ВерсияОбъекта = ЭлементДанных[0].ВерсияОбъекта;
				Запись.РазмерДанных = ЭлементДанных[0].РазмерДанных;
				Запись.ЕстьДанныеВерсии = ЭлементДанных[0].ЕстьДанныеВерсии;
			КонецЦикла;
			НаборЗаписей.Записать();
		КонецЕсли;
		
		ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать;
	КонецЕсли;
	
КонецПроцедуры

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

Рекомендации

Похожие публикации

ПриПолученииДанныхОтПодчиненного (БСП)

Обновлятор-1С: групповое (пакетное) обновление и обслуживание всех баз за один раз