//ирПортативный Перем ирПортативный Экспорт; //ирПортативный Перем ирОбщий Экспорт; //ирПортативный Перем ирСервер Экспорт; //ирПортативный Перем ирКэш Экспорт; //ирПортативный Перем ирПривилегированный Экспорт; Перем мПлатформа Экспорт; Перем мСервисныйПроцессор Экспорт; // Для программного вызова из Интеграции Перем ТаблицаБукв; Перем мИскомыйОбъектПоискаДублей Экспорт; Перем мСтруктураПоиска Экспорт; Функция ЭтоБуква (Символ) Код = КодСимвола(Символ); Если (Код<=47) ИЛИ (Код>=58 И Код<=64) ИЛИ (Код>=91 И Код<=96) ИЛИ (Код>=123 И Код<=126) Тогда Возврат Ложь; Иначе Возврат Истина; КонецЕсли; КонецФункции Функция АнализРазличийВСловах(Список1, Список2, ПолныйСписок, ОдинаковыхСлов,ДопустимоеРазличиеСлов) Экспорт Если Список1.Количество() = ПолныйСписок.Количество() ИЛИ Список2.Количество() = ПолныйСписок.Количество() Тогда Возврат Истина; КонецЕсли; Если ПолныйСписок.Количество() = 0 Тогда Возврат Истина; КонецЕсли; Если Список1.Количество() = Список2.Количество() Тогда ЕстьОтличия = ПроверитьСловаНаОтличие(Список1, Список2, ДопустимоеРазличиеСлов); ЕСли НЕ ЕстьОтличия Тогда Возврат Ложь; КонецЕсли; КонецЕсли; ЦелоеСлово = ""; Для Каждого Слово ИЗ ПолныйСписок Цикл ЦелоеСлово = ЦелоеСлово + Слово.Значение; КонецЦикла; Слово1 = ""; Для Каждого Слово ИЗ Список1 Цикл Слово1 = Слово1 + Слово.Значение; КонецЦикла; Слово2 = ""; Для Каждого Слово ИЗ Список2 Цикл Слово2 = Слово2 + Слово.Значение; КонецЦикла; Если Окр(СтрДлина(Слово1)/СтрДлина(ЦелоеСлово)*100) < ДопустимоеРазличиеСлов И Окр(СтрДлина(Слово2)/СтрДлина(ЦелоеСлово)*100) < ДопустимоеРазличиеСлов Тогда Возврат Ложь; КонецЕсли; Возврат Истина; КонецФункции Функция СравнитьСлова(Слово1, Слово2, ДопустимоеРазличиеСлов) ТаблицаБукв.Очистить(); ТаблицаБуквПустая = Истина; ЕСли СтрДлина(Слово1)<=СтрДлина(Слово2) Тогда Слово = ВРЕГ(Слово1); ИскомоеСлово = ВРЕГ(Слово2); Иначе Слово = ВРЕГ(Слово2); ИскомоеСлово = ВРЕГ(Слово1); КонецЕсли; Для индекс = 1 по СтрДлина(Слово) Цикл Символ = Сред(Слово, индекс, 1); ЕСли ТаблицаБуквПустая Тогда поз = Найти(ИскомоеСлово, Символ); поправка = 0; Пока поз>0 Цикл ТаблицаБуквПустая = Ложь; НовСтр = ТаблицаБукв.Добавить(); НовСтр.Позиция = поз + поправка; НовСтр.ДлинаСлова = 1; НовСтр.КолвоПропущенных = 0; поправка = поправка + поз; поз = Найти(Сред(ИскомоеСлово, поправка+1), Символ); КонецЦикла; Иначе Для Каждого Вхождение ИЗ ТаблицаБукв Цикл Если Сред(ИскомоеСлово, Вхождение.Позиция + Вхождение.ДлинаСлова, 1) = Символ Тогда Вхождение.ДлинаСлова = Вхождение.ДлинаСлова + 1; ИначеЕсли Сред(Слово, Вхождение.Позиция + Вхождение.ДлинаСлова - Вхождение.КолвоПропущенных, 1) = Вхождение.ПропущеноНа Тогда Вхождение.ПропущеноНа = ""; Вхождение.ДлинаСлова = Вхождение.ДлинаСлова + 1; Если Сред(ИскомоеСлово, Вхождение.Позиция + Вхождение.ДлинаСлова, 1) = Символ Тогда Вхождение.ДлинаСлова = Вхождение.ДлинаСлова + 1; Иначе Вхождение.КолвоПропущенных = Вхождение.КолвоПропущенных + 1; КонецЕсли; Иначе ЕСли Окр((Вхождение.КолвоПропущенных + 1) / СтрДлина(ИскомоеСлово) * 100)<=ДопустимоеРазличиеСлов Тогда Вхождение.КолвоПропущенных = Вхождение.КолвоПропущенных + 1; Вхождение.ДлинаСлова = Вхождение.ДлинаСлова + 1; Вхождение.ПропущеноНа = Символ; Иначе Вхождение.КолвоПропущенных = Вхождение.КолвоПропущенных + 1; КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; КонецЦикла; ЕСли ТаблицаБуквПустая Тогда Возврат Ложь; КонецЕсли; ТаблицаБукв.Сортировать("ДлинаСлова УБЫВ, КолвоПропущенных ВОЗР"); СовпалоСимволов = ТаблицаБукв[0].ДлинаСлова - ТаблицаБукв[0].КолвоПропущенных; Возврат (Окр(СовпалоСимволов / СтрДлина(ИскомоеСлово) * 100) >= (100 - ДопустимоеРазличиеСлов)); КонецФункции Функция ПроверитьСловаНаОтличие(СписокСлов1, СписокСлов2, ДопустимоеРазличиеСлов) Экспорт СписокРазличающихсяСлов = Новый СписокЗначений; Для Каждого Слово1 ИЗ СписокСлов1 Цикл ЕстьПара = Ложь; Для Каждого Слово2 Из СписокСлов2 Цикл Если СравнитьСлова(Слово1.Значение, Слово2.Значение, ДопустимоеРазличиеСлов) Тогда ЕстьПара = Истина; СписокСлов2.Удалить(Слово2); Прервать; КонецЕсли; КонецЦикла; ЕСли НЕ ЕстьПара Тогда СписокРазличающихсяСлов.Добавить(Слово1.Значение); КонецЕсли; КонецЦикла; СписокСлов1 = СписокРазличающихсяСлов; Возврат Не (СписокСлов1.Количество() = 0 И СписокСлов2.Количество() = 0) КонецФункции Функция ПолучитьСписокСлов(ЗначениеРеквизита) Экспорт СписокСлов = Новый СписокЗначений; Слово = ""; Для индекс = 1 по СтрДлина(ЗначениеРеквизита) Цикл Символ = Сред(ЗначениеРеквизита, индекс, 1); Если ЭтоБуква(Символ) Тогда Слово = Слово + Символ; Иначе Если Слово<>"" Тогда СписокСлов.Добавить(ВРЕГ(Слово)); Слово = ""; КонецЕсли; КонецЕсли; КонецЦикла; Если Слово<>"" Тогда СписокСлов.Добавить(ВРЕГ(Слово)); КонецЕсли; СписокСлов.СортироватьПоЗначению(); Возврат СписокСлов; КонецФункции // () Функция НайтиДубли(ИскомыйОбъект, СтруктураПоиска) Экспорт мИскомыйОбъектПоискаДублей = ИскомыйОбъект; мСтруктураПоиска = СтруктураПоиска; НайденныеОбъекты = Новый ТаблицаЗначений; НайденныеОбъекты.Колонки.Добавить("Ссылка"); ИмяСправочника = ИскомыйОбъект.Метаданные().Имя; Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ Разрешенные | Ссылка* |Из Справочник." + ИмяСправочника + " КАК Спр |Где Не Спр.ЭтоГруппа"; Реквизиты = ""; СтрокаГде = ""; ВЗапросеТолькоРавенство = Истина; МетаданныеОбъекта = ИскомыйОбъект.Метаданные(); МетаданныеРеквизитов = МетаданныеОбъекта.Реквизиты; СтруктураИсходныхРеквизитов = Новый Структура; Для каждого КлючИЗначение Из СтруктураПоиска Цикл ИмяРеквизита = КлючИЗначение.Ключ; СтепеньСхожести = КлючИЗначение.Значение; ЗначениеРеквизита = ИскомыйОбъект[ИмяРеквизита]; МетаданныеРеквизита = МетаданныеРеквизитов.Найти(ИмяРеквизита); ПредставлениеРеквизита = ?(МетаданныеРеквизита = Неопределено, ИмяРеквизита, Строка(МетаданныеРеквизита)); СтруктураИсходногоРеквизита = Новый Структура("ЗначениеРеквизита,СтепеньСхожести,СписокСлов" ,ЗначениеРеквизита,СтепеньСхожести,ПолучитьСписокСлов(ЗначениеРеквизита)); СтруктураИсходныхРеквизитов.Вставить(ИмяРеквизита,СтруктураИсходногоРеквизита); Если Не МетаданныеРеквизита = Неопределено Тогда ТипРеквизита = МетаданныеРеквизита.Тип; ИначеЕсли ИмяРеквизита = "Код" Тогда Если МетаданныеОбъекта.ТипКода = Метаданные.СвойстваОбъектов.ТипКодаСправочника.Строка Тогда ТипРеквизита = Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(МетаданныеОбъекта.ДлинаКода)); Иначе ТипРеквизита = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(МетаданныеОбъекта.ДлинаКода)); КонецЕсли; ИначеЕсли ИмяРеквизита = "Наименование" Тогда ТипРеквизита = Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(МетаданныеОбъекта.ДлинаНаименования)); Иначе ТипРеквизита = Неопределено; КонецЕсли; НайденныеОбъекты.Колонки.Добавить(ИмяРеквизита, ТипРеквизита, ПредставлениеРеквизита); НайденныеОбъекты.Колонки.Добавить(ИмяРеквизита+"_Флаг"); Реквизиты = Реквизиты+", | "+ ИмяРеквизита; Если ЗначениеЗаполнено(ЗначениеРеквизита) Тогда Если СтепеньСхожести = "=" Тогда ЗнакСравнения = ?(Не МетаданныеРеквизита = Неопределено И МетаданныеРеквизита.Тип.СодержитТип(Тип("Строка")) и МетаданныеРеквизита.Тип.КвалификаторыСтроки.Длина = 0,"Подобно","="); СтрокаГде = ?(СтрокаГде = "", "",СтрокаГде +" или ")+"Спр."+ИмяРеквизита +" " +ЗнакСравнения+ " &"+ИмяРеквизита; Запрос.УстановитьПараметр(""+ИмяРеквизита,ЗначениеРеквизита); ИначеЕсли Не СтепеньСхожести = Неопределено Тогда ВЗапросеТолькоРавенство = Ложь; КонецЕсли; КонецЕсли; КонецЦикла; Запрос.Текст = СтрЗаменить(Запрос.Текст, "*", Реквизиты); Если ВЗапросеТолькоРавенство Тогда Запрос.Текст = Запрос.Текст + Символы.ПС + " И("+СтрокаГде+")"; КонецЕсли; ТаблицаСправочника = Запрос.Выполнить().Выгрузить(); Для каждого Строка Из ТаблицаСправочника Цикл СтруктураНайденных = Новый Структура; Для каждого КлючИЗначение Из СтруктураИсходныхРеквизитов Цикл СтепеньСхожести = КлючИЗначение.Значение.СтепеньСхожести; Если СтепеньСхожести = "=" Тогда ИмяРеквизита = КлючИЗначение.Ключ; ЗначениеРеквизита = КлючИЗначение.Значение.ЗначениеРеквизита; //Поиск по равному значению Если ЗначениеРеквизита = Строка[ИмяРеквизита] Тогда СтруктураНайденных.Вставить(ИмяРеквизита); КонецЕсли; ИначеЕсли Не СтепеньСхожести = Неопределено Тогда ИмяРеквизита = КлючИЗначение.Ключ; //Поиск по похожим словам СписокИскомыхСлов = КлючИЗначение.Значение.СписокСлов.Скопировать(); СписокНайденыхСлов = ПолучитьСписокСлов(Строка[ИмяРеквизита]); Если Не ПроверитьСловаНаОтличие(СписокИскомыхСлов,СписокНайденыхСлов,СтепеньСхожести) Тогда СтруктураНайденных.Вставить(ИмяРеквизита); КонецЕсли; КонецЕсли; КонецЦикла; Если Не СтруктураНайденных.Количество()=0 Тогда НоваяСтрока = НайденныеОбъекты.Добавить(); НоваяСтрока.Ссылка = Строка.Ссылка; Для каждого КлючИЗначение Из СтруктураПоиска Цикл ИмяРеквизита = КлючИЗначение.Ключ; НоваяСтрока[ИмяРеквизита] = Строка[ИмяРеквизита]; НоваяСтрока[ИмяРеквизита+"_Флаг"] = СтруктураНайденных.Свойство(ИмяРеквизита); КонецЦикла; КонецЕсли; КонецЦикла; Возврат НайденныеОбъекты; КонецФункции // () // Заменяемые - Соответствие, Массив строк таблицы Функция ВыполнитьЗаменуЭлементов(Заменяемые, ТаблицаСсылающихсяОбъектов = Неопределено, Знач ЗаголовокИндикации = "", ЗамещениеВсегда = 0) Экспорт БылиИсключения = Ложь; Если ВыполнятьВТранзакции Тогда НачатьТранзакцию(); КонецЕсли; //ОбрабатываемаяСсылка = Неопределено; Параметры = Новый Структура; Параметры.Вставить("Объект", Неопределено); СтруктураКоллизий = Новый Структура; ИзмененныеПроведенныеДокументы.Очистить(); Если ТаблицаСсылающихсяОбъектов = Неопределено Тогда СписокСсылок = Новый Массив; Для Каждого КлючИЗначение Из Заменяемые Цикл СписокСсылок.Добавить(КлючИЗначение.Ключ); КонецЦикла; ТаблицаСсылающихсяОбъектов = НайтиПоСсылкам(СписокСсылок); КонецЕсли; Если Не ЗначениеЗаполнено(ЗаголовокИндикации) Тогда ЗаголовокИндикации = "Замена ссылок"; КонецЕсли; Если мСервисныйПроцессор <> Неопределено Тогда Индикатор = мСервисныйПроцессор.ПолучитьИндикаторПроцесса(ТаблицаСсылающихсяОбъектов.Количество(), ЗаголовокИндикации); Иначе Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(ТаблицаСсылающихсяОбъектов.Количество(), ЗаголовокИндикации); КонецЕсли; Для Каждого СтрокаТаблицы Из ТаблицаСсылающихсяОбъектов Цикл Если мСервисныйПроцессор <> Неопределено Тогда мСервисныйПроцессор.ОбновитьИндикатор(Индикатор); Иначе ирОбщий.ОбработатьИндикаторЛкс(Индикатор); КонецЕсли; Ссылка = СтрокаТаблицы.Ссылка; ПравильныйЭлемент = Заменяемые[Ссылка]; Если ПравильныйЭлемент = Неопределено Тогда Продолжить; КонецЕсли; ОбъектИзменен = Ложь; Если ТипЗнч(СтрокаТаблицы.Данные) = Тип("Строка") Тогда ОбъектСодержащийСсылку = ЗначениеИзСтрокиВнутр(СтрокаТаблицы.Данные); Иначе ОбъектСодержащийСсылку = СтрокаТаблицы.Данные; КонецЕсли; Параметры.Объект = Неопределено; Если ТипЗнч(СтрокаТаблицы.Метаданные) = Тип("Строка") Тогда //ОбъектМД = Метаданные.НайтиПоПолномуИмени(СтрокаТаблицы.Метаданные); ОбъектМД = мПлатформа.ПолучитьОбъектМДПоПолномуИмени(СтрокаТаблицы.Метаданные); Иначе ОбъектМД = СтрокаТаблицы.Метаданные; КонецЕсли; ТипТаблицы = ирОбщий.ПолучитьТипТаблицыБДЛкс(ОбъектМД.ПолноеИмя()); Если ирОбщий.ЛиКорневойТипОбъектаБДЛкс(ТипТаблицы) Тогда Параметры.Объект = ОбъектСодержащийСсылку.ПолучитьОбъект(); Если Параметры.Объект <> Неопределено Тогда ПредставлениеОбъекта = "" + Параметры.Объект; ОбъектИзменен = ирОбщий.ЗаменитьЗначениеВОбъектеБДЛкс(Параметры.Объект, Ссылка, ПравильныйЭлемент) Или ОбъектИзменен; Иначе ПредставлениеОбъекта = "" + ОбъектСодержащийСсылку; КонецЕсли; Иначе ПредставлениеОбъекта = "" + ОбъектСодержащийСсылку; КонецЕсли; Сообщить("Обрабатывается " + ПредставлениеОбъекта); Если Метаданные.Документы.Содержит(ОбъектМД) Тогда Для Каждого Движение ИЗ ОбъектМД.Движения Цикл //НаборЗаписей = Параметры.Объект.Движения[Движение.Имя]; НаборЗаписей = Новый (СтрЗаменить(Движение.ПолноеИмя(), ".", "НаборЗаписей.")); НаборЗаписей.Отбор.Регистратор.Установить(ОбъектСодержащийСсылку); БылиИсключения = Не ОбработатьЗаписьРегистра(НаборЗаписей, Заменяемые); Если Истина И БылиИсключения И ВыполнятьВТранзакции Тогда Перейти ~ОТКАТ; КонецЕсли; КонецЦикла; Для Каждого Последовательность ИЗ Метаданные.Последовательности Цикл Если Последовательность.Документы.Содержит(ОбъектМД) Тогда НадоЗаписывать = Ложь; НаборЗаписей = Последовательности[Последовательность.Имя].СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Установить(ОбъектСодержащийСсылку); НаборЗаписей.Прочитать(); Если НаборЗаписей.Количество() = 0 Тогда Продолжить; КонецЕсли; Для Каждого Измерение ИЗ Последовательность.Измерения Цикл Если Истина И Измерение.Тип.СодержитТип(ТипЗнч(Ссылка)) И НаборЗаписей[0][Измерение.Имя] = Ссылка Тогда НадоЗаписывать = ирОбщий.БезопасноПрисвоитьПроизвольнуюСсылкуЛкс(НаборЗаписей[0][Измерение.Имя], ПравильныйЭлемент) Или НадоЗаписывать; КонецЕсли; КонецЦикла; Если НадоЗаписывать Тогда Если ОтключатьКонтрольЗаписи Тогда НаборЗаписей.ОбменДанными.Загрузка = Истина; КонецЕсли; Попытка ирОбщий.ЗаписатьОбъектЛкс(НаборЗаписей, ЗаписьНаСервере); Исключение Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное); БылиИсключения = Истина; Если ВыполнятьВТранзакции Тогда Перейти ~ОТКАТ; КонецЕсли; КонецПопытки; КонецЕсли; КонецЕсли; КонецЦикла; ИначеЕсли Метаданные.Константы.Содержит(ОбъектМД) Тогда Если ОбъектМД.Тип.СодержитТип(ТипЗнч(ПравильныйЭлемент)) Тогда Константы[ОбъектМД.Имя].Установить(ПравильныйЭлемент); ОбъектИзменен = Истина; КонецЕсли; ИначеЕсли Метаданные.РегистрыСведений.Содержит(ОбъектМД) Тогда МенеджерЗаписи = РегистрыСведений[ОбъектМД.Имя].СоздатьМенеджерЗаписи(); КоллизийныйМенеджерЗаписи = РегистрыСведений[ОбъектМД.Имя].СоздатьМенеджерЗаписи(); Периодический = (ОбъектМД.ПериодичностьРегистраСведений <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический); МассивИзмененныхИзмерений = Новый Массив; Если Периодический Тогда МенеджерЗаписи.Период = ОбъектСодержащийСсылку.Период; КоллизийныйМенеджерЗаписи.Период = ОбъектСодержащийСсылку.Период; КонецЕсли; Для каждого Рекв Из ОбъектМД.Измерения Цикл ЗначениеИзмерения = ОбъектСодержащийСсылку[Рекв.Имя]; МенеджерЗаписи[Рекв.Имя] = ЗначениеИзмерения; Если ЗначениеИзмерения = Ссылка Тогда Если ирОбщий.БезопасноПрисвоитьПроизвольнуюСсылкуЛкс(КоллизийныйМенеджерЗаписи[Рекв.Имя], ПравильныйЭлемент) Тогда МассивИзмененныхИзмерений.Добавить(Рекв.Имя); ОбъектИзменен = Истина; КонецЕсли; Иначе КоллизийныйМенеджерЗаписи[Рекв.Имя] = ЗначениеИзмерения; КонецЕсли; КонецЦикла; БылаКоллизия = Ложь; Если МассивИзмененныхИзмерений.Количество() > 0 Тогда КоллизийныйМенеджерЗаписи.Прочитать(); Если КоллизийныйМенеджерЗаписи.Выбран() Тогда МенеджерЗаписи.Прочитать(); МассивКоллекцийРеквизитов = Новый Массив; МассивКоллекцийРеквизитов.Добавить(ОбъектМД.Ресурсы); МассивКоллекцийРеквизитов.Добавить(ОбъектМД.Реквизиты); Если Не СтруктураКоллизий.Свойство(ОбъектМД.Имя) Тогда ТаблицаЗаписей = РегистрыСведений[ОбъектМД.Имя].СоздатьНаборЗаписей().Выгрузить(); ТаблицаЗаписей.Колонки.Добавить("МенеджерЗамены"); ТаблицаЗаписей.Колонки.Добавить("МенеджерОригинала"); Для Каждого КоллекцияРеквизитов Из МассивКоллекцийРеквизитов Цикл Для Каждого МетаРеквизит Из КоллекцияРеквизитов Цикл ИмяКолонки = МетаРеквизит.Имя; ПредставлениеКолонки = МетаРеквизит.Представление(); КолонкаОригинала = ТаблицаЗаписей.Колонки[ИмяКолонки]; КолонкаОригинала.Имя = "Оригинал" + ИмяКолонки; КолонкаОригинала.Заголовок = "Оригинал: " + ПредставлениеКолонки; КолонкаЗамены = ТаблицаЗаписей.Колонки.Вставить(ТаблицаЗаписей.Колонки.Индекс(КолонкаОригинала), "Замена" + ИмяКолонки, , "Замена: " + ПредставлениеКолонки); ЗаполнитьЗначенияСвойств(КолонкаЗамены, КолонкаОригинала, , "Имя, Заголовок"); КонецЦикла; КонецЦикла; ТаблицаЗаписей.Колонки.Вставить(0, "Заменить", Новый ОписаниеТипов("Булево"), "Заменить"); СтруктураКоллизий.Вставить(ОбъектМД.Имя, ТаблицаЗаписей); КонецЕсли; НоваяКоллизийнаяЗапись = СтруктураКоллизий[ОбъектМД.Имя].Добавить(); Для Каждого КоллекцияРеквизитов Из МассивКоллекцийРеквизитов Цикл Для Каждого МетаРеквизит Из КоллекцияРеквизитов Цикл ИмяКолонки = МетаРеквизит.Имя; ЗначениеРеквизита = МенеджерЗаписи[ИмяКолонки]; НоваяКоллизийнаяЗапись["Оригинал" + ИмяКолонки] = КоллизийныйМенеджерЗаписи[ИмяКолонки]; Если ЗначениеРеквизита = Ссылка Тогда НоваяКоллизийнаяЗапись["Замена" + ИмяКолонки] = ПравильныйЭлемент; Иначе НоваяКоллизийнаяЗапись["Замена" + ИмяКолонки] = ЗначениеРеквизита; КонецЕсли; КоллизийныйМенеджерЗаписи[ИмяКолонки] = НоваяКоллизийнаяЗапись["Замена" + ИмяКолонки]; Если НоваяКоллизийнаяЗапись["Оригинал" + ИмяКолонки] <> НоваяКоллизийнаяЗапись["Замена" + ИмяКолонки] Тогда БылаКоллизия = Истина; КонецЕсли; КонецЦикла; КонецЦикла; Если БылаКоллизия Тогда ЗаполнитьЗначенияСвойств(НоваяКоллизийнаяЗапись, КоллизийныйМенеджерЗаписи); Для Каждого ИмяКолонки Из МассивИзмененныхИзмерений Цикл НоваяКоллизийнаяЗапись[ИмяКолонки] = МенеджерЗаписи[ИмяКолонки]; КонецЦикла; НоваяКоллизийнаяЗапись.МенеджерЗамены = КоллизийныйМенеджерЗаписи; НоваяКоллизийнаяЗапись.МенеджерОригинала = МенеджерЗаписи; Иначе СтруктураКоллизий[ОбъектМД.Имя].Удалить(НоваяКоллизийнаяЗапись); МенеджерЗаписи.Удалить(); БылаКоллизия = Истина; КонецЕсли; КонецЕсли; КонецЕсли; Если БылаКоллизия Тогда БылиИсключения = Ложь; Иначе БылиИсключения = Не ОбработатьЗаписьРегистра(МенеджерЗаписи, Заменяемые); КонецЕсли; Если Истина И БылиИсключения И ВыполнятьВТранзакции Тогда Перейти ~ОТКАТ; КонецЕсли; //Иначе // Сообщить("Ссылки типа в объектах типа " + ОбъектМД.ПолноеИмя() + " не заменяются!!"); КонецЕсли; Если Параметры.Объект <> Неопределено Тогда //Если Параметры.Объект.Модифицированность() Тогда Если ОбъектИзменен Тогда Если ОтключатьКонтрольЗаписи Тогда Попытка Параметры.Объект.ОбменДанными.Загрузка = Истина; Исключение // Для планов обмена такой прием не проходит КонецПопытки; КонецЕсли; Попытка ирОбщий.ЗаписатьОбъектЛкс(Параметры.Объект, ЗаписьНаСервере); Если ОтключатьКонтрольЗаписи Тогда ЗаписьЖурналаРегистрации("Запись с флагом Загрузка", УровеньЖурналаРегистрации.Информация, ОбъектМД, ОбъектСодержащийСсылку, ""); КонецЕсли; Исключение Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное); БылиИсключения = Истина; ОбъектИзменен = Ложь; Если ВыполнятьВТранзакции Тогда Перейти ~ОТКАТ; КонецЕсли; КонецПопытки; Если Истина И ОбъектИзменен И Метаданные.Документы.Содержит(ОбъектМД) И ОбъектМД.Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить И Параметры.Объект.Проведен Тогда СтрокаДляДокумента = ИзмененныеПроведенныеДокументы.Добавить(); СтрокаДляДокумента.ДатаДокумента = Параметры.Объект.Дата; СтрокаДляДокумента.ТипДокумента = ОбъектМД.Имя; СтрокаДляДокумента.Документ = Параметры.Объект.Ссылка; КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; Если мСервисныйПроцессор <> Неопределено Тогда мСервисныйПроцессор.ОсвободитьИндикаторПроцесса(Индикатор, Истина); Иначе ирОбщий.ОсвободитьИндикаторПроцессаЛкс(Индикатор, Истина); КонецЕсли; МассивЭлементовКУдалению = Новый Массив; Для Каждого ЭлементТаблицыРегистра Из СтруктураКоллизий Цикл Если ЭлементТаблицыРегистра.Значение.Количество() = 0 Тогда МассивЭлементовКУдалению.Добавить(ЭлементТаблицыРегистра.Ключ); КонецЕсли; КонецЦикла; Для Каждого ЭлементКУдалению Из МассивЭлементовКУдалению Цикл СтруктураКоллизий.Удалить(ЭлементКУдалению); КонецЦикла; Если СтруктураКоллизий.Количество() > 0 Тогда ФормаЗамещенияВНезависимыхРегистрахСведений = ПолучитьФорму("ФормаЗамещенияВНезависимыхРегистрахСведений"); ФормаЗамещенияВНезависимыхРегистрахСведений.КодВсегда = ЗамещениеВсегда; ФормаЗамещенияВНезависимыхРегистрахСведений.СтруктураКоллизий = СтруктураКоллизий; ФормаЗамещенияВНезависимыхРегистрахСведений.ОткрытьМодально(); ЗамещениеВсегда = ФормаЗамещенияВНезависимыхРегистрахСведений.КодВсегда; КонецЕсли; ~ОТКАТ: Если ВыполнятьВТранзакции Тогда Если БылиИсключения Тогда ОтменитьТранзакцию(); ИзмененныеПроведенныеДокументы.Очистить(); Иначе ЗафиксироватьТранзакцию(); КонецЕсли; КонецЕсли; Возврат Не БылиИсключения; КонецФункции // ВыполнитьЗаменуЭлементов() Функция ОбработатьЗаписьРегистра(НаборЗаписейИлиМенеджерЗаписи, Заменяемые) ОбъектМД = ирОбщий.ПолучитьМетаданныеЛкс(НаборЗаписейИлиМенеджерЗаписи); НаборЗаписейИлиМенеджерЗаписи.Прочитать(); Если Не НаборЗаписейИлиМенеджерЗаписи.Выбран() Тогда Возврат Истина; КонецЕсли; Если ирОбщий.ЛиМенеджерЗаписиРегистраЛкс(НаборЗаписейИлиМенеджерЗаписи) Тогда НаборЗаписей = ирОбщий.ПолучитьНаборЗаписейПоКлючуЛкс(ОбъектМД.ПолноеИмя(), НаборЗаписейИлиМенеджерЗаписи, Истина); Иначе НаборЗаписей = НаборЗаписейИлиМенеджерЗаписи; КонецЕсли; // Старый пустой набор нужен для очистки строк по старому отбору в случае изменения отбора набора ПолноеИмяРегистра = ОбъектМД.ПолноеИмя(); СтарыйНабор = Новый (СтрЗаменить(ПолноеИмяРегистра, ".", "НаборЗаписей.")); ирОбщий.СкопироватьОтборЛкс(СтарыйНабор.Отбор, НаборЗаписей.Отбор); ОтборИзменен = Ложь; Для Каждого ЭлементОтбора Из НаборЗаписей.Отбор Цикл ЗначениеПоля = ЭлементОтбора.Значение; НаЧтоЗаменять = Заменяемые[ЗначениеПоля]; Если НаЧтоЗаменять = Неопределено Тогда Продолжить; КонецЕсли; ОтборИзменен = ирОбщий.БезопасноПрисвоитьПроизвольнуюСсылкуЛкс(ЭлементОтбора.Значение, НаЧтоЗаменять) Или ОтборИзменен; КонецЦикла; КомпоновщикТаблицы = ирКэш.ПолучитьКомпоновщикТаблицыМетаданныхЛкс(ОбъектМД.ПолноеИмя()); #Если _ Тогда КомпоновщикТаблицы = Новый КомпоновщикНастроекКомпоновкиДанных #КонецЕсли ДоступныеПоляВыбора = КомпоновщикТаблицы.Настройки.ДоступныеПоляВыбора.Элементы; ОбъектИзменен = ОтборИзменен; // Антибаг платформы 8.2. При изменении реквизитов строк набора записей для регистра бухгалтерии не взводится модифицированность ЭтоРегистрБухгалтерии = ирОбщий.ПолучитьПервыйФрагментЛкс(ПолноеИмяРегистра) = "РегистрБухгалтерии"; Если ЭтоРегистрБухгалтерии Тогда ТаблицаНабора = НаборЗаписей.Выгрузить(); Иначе ТаблицаНабора = НаборЗаписей; КонецЕсли; Для Каждого Запись Из ТаблицаНабора Цикл Для каждого Поле Из ДоступныеПоляВыбора Цикл //Если Не Поле.Поле Тогда // было для полей построителя запроса // // Антибаг платформы. Зачем то добавляются лишние поля в доступные поля, не свойственные по признаку наличия корресподнеции // // у бухгалтерских таблиц. // Продолжить; //КонецЕсли; //ИмяПоля = Поле.Имя; Если Поле.Папка Тогда Продолжить; КонецЕсли; ИмяПоля = "" + Поле.Поле; ЗначениеПоля = Запись[ИмяПоля]; НаЧтоЗаменять = Заменяемые[ЗначениеПоля]; Если НаЧтоЗаменять = Неопределено Тогда Продолжить; КонецЕсли; ОбъектИзменен = ирОбщий.БезопасноПрисвоитьПроизвольнуюСсылкуЛкс(Запись[ИмяПоля], НаЧтоЗаменять) Или ОбъектИзменен; КонецЦикла; #Если Клиент Тогда ОбработкаПрерыванияПользователя(); #КонецЕсли КонецЦикла; Если ЭтоРегистрБухгалтерии Тогда НаборЗаписей.Загрузить(ТаблицаНабора); КонецЕсли; Если ОбъектИзменен Тогда Если ОтключатьКонтрольЗаписи Тогда СтарыйНабор.ОбменДанными.Загрузка = Истина; НаборЗаписей.ОбменДанными.Загрузка = Истина; КонецЕсли; НачатьТранзакцию(); Попытка Если ОтборИзменен Тогда ирОбщий.ЗаписатьОбъектЛкс(СтарыйНабор, ЗаписьНаСервере); КонецЕсли; ирОбщий.ЗаписатьОбъектЛкс(НаборЗаписей, ЗаписьНаСервере); Исключение ОтменитьТранзакцию(); Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное); Возврат Ложь; КонецПопытки; ЗафиксироватьТранзакцию(); КонецЕсли; Возврат Истина; КонецФункции // ОбработатьЗаписьРегистра() //ирПортативный #Если Клиент Тогда //ирПортативный Контейнер = Новый Структура(); //ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер); //ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда //ирПортативный ПолноеИмяФайлаБазовогоМодуля = ВосстановитьЗначение("ирПолноеИмяФайлаОсновногоМодуля"); //ирПортативный ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля); //ирПортативный КонецЕсли; //ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий"); //ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш"); //ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер"); //ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный"); //ирПортативный #КонецЕсли мПлатформа = ирКэш.Получить(); ТаблицаБукв = Новый ТаблицаЗначений; ТаблицаБукв.Колонки.Добавить("Позиция"); ТаблицаБукв.Колонки.Добавить("КолвоПропущенных"); ТаблицаБукв.Колонки.Добавить("ДлинаСлова"); ТаблицаБукв.Колонки.Добавить("ПропущеноНа"); ЗаписьНаСервере = ирОбщий.ПолучитьРежимЗаписиНаСервереПоУмолчаниюЛкс();