При получении данных от подчиненного. См. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтПодчиненного.
// См. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтПодчиненного.
Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт
Если ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ВерсииОбъектов") И ЭлементДанных.Количество() > 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
///////////////////////////////////////////////////////////////////////////////////////////////////////