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