Функция ОбработатьЭлементыОбъекта(ТипТаблицы, СтруктураКлючаОбъектаСПометкой, СтруктураКлючаОбъекта, СтруктураКлючаСтроки, СтрокаКлюча, СтрокиДляОбработки, ПараметрыОбработки,
    ТранзакцииРазрешены, ЭтоПервыйОбъектБД, ЭтоПоследнийОбъектБД, ИмяОбъектаОбработкиОбъекта, ИмяМетодаОбработкиОбъекта)

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

КонецФункции