RDT1C/src/DataProcessors/ирПодборИОбработкаОбъектов/Ext/ObjectModule.bsl
Администратор 6728cf247a .
2023-04-14 08:12:43 +03:00

1341 lines
110 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//ирПортативный Перем ирПортативный Экспорт;
//ирПортативный Перем ирОбщий Экспорт;
//ирПортативный Перем ирСервер Экспорт;
//ирПортативный Перем ирКэш Экспорт;
//ирПортативный Перем ирКлиент Экспорт;
Перем мИмяКолонкиПометки Экспорт; // НеИзменяется
Перем мИмяКолонкиРезультатаОбработки Экспорт; // НеИзменяется
Перем мИмяКолонкиСообщенияОбработки Экспорт; // НеИзменяется
Перем мИмяКолонкиПолногоИмениТаблицы Экспорт; // НеИзменяется
Перем мИмяКолонкиОтсутствияСтрокиВБД Экспорт; // НеИзменяется
Перем мИмяПоляЧислоДвиженийСкрытое Экспорт; // НеИзменяется
Перем мЗапрос Экспорт;
Перем мПлатформа Экспорт;
Перем мРезультатЗапроса Экспорт;
Перем мСхемаКолонок Экспорт;
Перем мВопросНаОбновлениеСтрокДляОбработкиЗадавался Экспорт; //Используется на сервере
Перем мИменаВозвращаемыхСвойств Экспорт; // НеИзменяется
Перем мСоставПланаОбмена;
Перем мИмяНастройкиПоУмолчанию Экспорт;
Перем мКоличествоЗаписанныхАвтоматически;
Перем мКоличествоСтрокУспешно;
Перем мКоличествоСтрокНеуспешно;
Функция РеквизитыДляСервера(Параметры) Экспорт
Результат = Новый Структура(мИменаВозвращаемыхСвойств);
ЗаполнитьЗначенияСвойств(Результат, ЭтотОбъект, мИменаВозвращаемыхСвойств);
Для Каждого МетаРеквизит Из Метаданные().Реквизиты Цикл
Если МетаРеквизит.Имя = "Компоновщик" Тогда
Продолжить;
КонецЕсли;
Результат.Вставить(МетаРеквизит.Имя, ЭтотОбъект[МетаРеквизит.Имя]);
КонецЦикла;
Результат.Вставить("СтрокиДляОбработки", СтрокиДляОбработки);
Возврат Результат;
КонецФункции
#Если Клиент Тогда
Функция ВыполнитьЗаданиеГрупповойОбработки(Знач ФормаОбработки, Знач Кнопка = Неопределено, Знач БлокируемыеЭлементыФормы = Неопределено, Знач НастройкаВыполнения = Неопределено, РазрешитьМногопоточность = Истина) Экспорт
Если БлокируемыеЭлементыФормы = Неопределено Тогда
БлокируемыеЭлементыФормы = Новый Массив;
КонецЕсли;
БлокируемыеЭлементыФормы.Добавить(ФормаОбработки.ВладелецФормы.Панель);
БлокируемыеЭлементыФормы.Добавить(ФормаОбработки.ЭлементыФормы.ТекущаяНастройка);
ПараметрыЗадания = Новый Структура;
ПараметрыЗадания.Вставить("ИмяОбработки", ирОбщий.ПоследнийФрагментЛкс(ирОбщий.ПолноеИмяФормыЛкс(ФормаОбработки)));
Если НастройкаВыполнения = Неопределено Тогда
НастройкаВыполнения = ФормаОбработки.ПолучитьНастройкуЛкс();
КонецЕсли;
ПараметрыЗадания.Вставить("НастройкаОбработки", НастройкаВыполнения);
СтруктураЗапроса = Новый Структура("Текст, Параметры");
Если мЗапрос <> Неопределено Тогда
ЗаполнитьЗначенияСвойств(СтруктураЗапроса, мЗапрос);
КонецЕсли;
ПараметрыЗадания.Вставить("Запрос", СтруктураЗапроса);
ПараметрыЗадания.Вставить("РазрешитьМногопоточность", РазрешитьМногопоточность);
ПрефиксыОповещений = Новый Массив;
ПрефиксыОповещений.Добавить("*Строк обработано "); // Мультиметка01205820
ПрефиксыОповещений.Добавить("*Обработка "); // Мультиметка84652724
#Если Сервер И Не Сервер Тогда
ВыполнитьГрупповуюОбработку();
#КонецЕсли
РезультатЗадания = ирОбщий.ВыполнитьЗаданиеФормыЛкс("ВыполнитьГрупповуюОбработку", ПараметрыЗадания, ФормаОбработки, "ОбработкаОбъектов", "Обработка объектов " + ПараметрыЗадания.ИмяОбработки,
Кнопка, "ВыполнитьОбработкуЗавершение",, БлокируемыеЭлементыФормы, Истина,, Истина, ПрефиксыОповещений, Истина);
Возврат РезультатЗадания;
КонецФункции
Процедура ВернутьПараметрыПослеОбработки(РеквизитыОбработки, ВладелецФормы) Экспорт
ЗаполнитьЗначенияСвойств(ЭтотОбъект, РеквизитыОбработки, мИменаВозвращаемыхСвойств);
СтрокиДляОбработки.ЗагрузитьКолонку(РеквизитыОбработки.СтрокиДляОбработки.ВыгрузитьКолонку(мИмяКолонкиРезультатаОбработки), мИмяКолонкиРезультатаОбработки);
СтрокиДляОбработки.ЗагрузитьКолонку(РеквизитыОбработки.СтрокиДляОбработки.ВыгрузитьКолонку(мИмяКолонкиСообщенияОбработки), мИмяКолонкиСообщенияОбработки);
//ГлавнаяФорма = ПолучитьФорму(); // Главная форма может открываться с ключом уникальности
ВладелецФормы.ЭлементыФормы.СтрокиДляОбработки.Колонки[мИмяКолонкиСообщенияОбработки].Видимость = ВыполнятьНаСервере;
ОписаниеТипов = ОписаниеТиповКлючейРезультатов();
#Если Сервер И Не Сервер Тогда
ОписаниеТипов = Новый ОписаниеТипов;
#КонецЕсли
ирКлиент.ОповеститьОЗаписиОбъектаЛкс(ОписаниеТипов.Типы(), ВладелецФормы);
КонецПроцедуры
Процедура СохранитьНастройкуОбработки(Знач ФормаОбработки) Экспорт
НоваяНастройка = ФормаОбработки.ПолучитьНастройкуЛкс();
Если ФормаОбработки.ТекущаяНастройка.Родитель = Неопределено Тогда
НоваяСтрока = ФормаОбработки.ТекущаяНастройка.Строки.Добавить();
НоваяСтрока.Обработка = ФормаОбработки.ЭлементыФормы.ТекущаяНастройка.Значение;
ФормаОбработки.ТекущаяНастройка = НоваяСтрока;
ФормаОбработки.ВладелецФормы.ЭлементыФормы.ДоступныеОбработки.ТекущаяСтрока = НоваяСтрока;
ИначеЕсли ФормаОбработки.ТекущаяНастройка.Обработка <> ФормаОбработки.ЭлементыФормы.ТекущаяНастройка.Значение Тогда
НоваяСтрока = ФормаОбработки.ТекущаяНастройка.Родитель.Строки.Добавить();
НоваяСтрока.Обработка = ФормаОбработки.ЭлементыФормы.ТекущаяНастройка.Значение;
ФормаОбработки.ТекущаяНастройка = НоваяСтрока;
ФормаОбработки.ВладелецФормы.ЭлементыФормы.ДоступныеОбработки.ТекущаяСтрока = НоваяСтрока;
КонецЕсли;
ФормаОбработки.ТекущаяНастройка.Настройка = НоваяНастройка;
ФормаОбработки.Модифицированность = Ложь;
ирКлиент.СохранитьНастройкуФормыЛкс(ФормаОбработки.ВладелецФормы);
КонецПроцедуры
#КонецЕсли
Функция ОписаниеТиповКлючейРезультатов() Экспорт
МассивТипов = Новый Массив();
Если МноготабличнаяВыборка Тогда
Для Каждого ЭлементСписка Из ОбластьПоиска Цикл
ТипКлюча = ирОбщий.ТипКлючаЗаписиТаблицыЛкс(ЭлементСписка.Значение);
МассивТипов.Добавить(ТипКлюча);
КонецЦикла;
Иначе
ТипКлюча = ирОбщий.ТипКлючаЗаписиТаблицыЛкс(ОбластьПоиска);
МассивТипов.Добавить(ТипКлюча);
КонецЕсли;
ОписаниеТипов = Новый ОписаниеТипов(МассивТипов);
Возврат ОписаниеТипов;
КонецФункции
// Разбирает строку выделяя из нее префикс и числовую часть
//
// Параметры:
// Стр - Строка. Разбираемая строка
// ЧисловаяЧасть - Число. Переменная в которую возвратится числовая часть строки
// Режим - Строка. Если "Число", то возвратит числовую часть иначе - префикс
//
// Возвращаемое значение:
// Префикс строки
//
Функция вПолучитьПрефиксЧислоНомера(Знач Стр, ЧисловаяЧасть="", Режим="") Экспорт
Стр = СокрЛП(Стр);
Префикс = Стр;
Длина = СтрДлина(Стр);
Для Сч = 1 По Длина Цикл
Попытка
ЧисловаяЧасть = Число(Стр);
Исключение
Стр = Прав(Стр, Длина - Сч);
Продолжить;
КонецПопытки;
Если (ЧисловаяЧасть > 0) И (СтрДлина(Формат(ЧисловаяЧасть, "ЧГ=0")) = Длина - Сч + 1) Тогда
Префикс = Лев(Префикс, Сч - 1);
Пока Прав(Префикс, 1) = "0" Цикл
Префикс = Лев(Префикс, СтрДлина(Префикс)-1);
КонецЦикла;
Прервать;
Иначе
Стр = Прав(Стр, Длина - Сч);
КонецЕсли;
Если ЧисловаяЧасть < 0 Тогда ЧисловаяЧасть = - ЧисловаяЧасть КонецЕсли;
КонецЦикла;
Если Режим = "Число" Тогда
Возврат(ЧисловаяЧасть);
Иначе
Возврат(Префикс);
КонецЕсли;
КонецФункции // вПолучитьПрефиксЧислоНомера()
// Приводит номер (код) к требуемой длине. При этом выделяется префикс
// и числовая часть номера, остальное пространство между префиксом и
// номером заполняется нулями
//
// Параметры:
// Стр - Преобразовываемая строка
// Длина - Требуемая длина строки
//
// Возвращаемое значение:
// Строка - код или номер, приведенная к требуемой длине
//
Функция вПривестиНомерКДлине(Знач Стр, Длина) Экспорт
Стр = СокрЛП(Стр);
ЧисловаяЧасть = "";
Результат = вПолучитьПрефиксЧислоНомера(Стр, ЧисловаяЧасть);
Пока Длина - СтрДлина(Результат) - СтрДлина(Формат(ЧисловаяЧасть, "ЧГ=0")) > 0 Цикл
Результат = Результат + "0";
КонецЦикла;
Результат = Результат + Формат(ЧисловаяЧасть, "ЧГ=0");
Возврат(Результат);
КонецФункции // вПривестиНомерКДлине()
// Добавляет к префиксу номера или кода подстроку
//
// Параметры:
// Стр - Строка. Номер или код
// Добавок - Добаляемая к префиксу подстрока
// Длина - Требуемая результрирубщая длина строки
// Режим - "Слева" - подстрока добавляется слева к префиксу, иначе - справа
//
// Возвращаемое значение:
// Строка - номер или код, к префиксу которого добавлена указанная подстрока
//
Функция вДобавитьКПрефиксу(Знач Стр, Добавок="", Длина="", Режим="Слева") Экспорт
Стр = СокрЛП(Стр);
Если ПустаяСтрока(Длина) Тогда
Длина = СтрДлина(Стр);
КонецЕсли;
ЧисловаяЧасть = "";
Префикс = вПолучитьПрефиксЧислоНомера(Стр, ЧисловаяЧасть);
Если Режим="Слева" Тогда
Результат = СокрЛП(Добавок) + Префикс;
Иначе
Результат = Префикс + СокрЛП(Добавок);
КонецЕсли;
Пока Длина - СтрДлина(Результат) - СтрДлина(Формат(ЧисловаяЧасть, "ЧГ=0")) > 0 Цикл
Результат = Результат + "0";
КонецЦикла;
Результат = Результат + Формат(ЧисловаяЧасть, "ЧГ=0");
Возврат(Результат);
КонецФункции // вДобавитьКПрефиксу()
// Дополняет строку указанным символом до указанной длины
//
// Параметры:
// Стр - Дополняемая строка
// Длина - Требуемая длина результирующей строки
// Чем - Символ, которым дополняется строка
//
// Возвращаемое значение:
// Строка дополненная указанным символом до указанной длины
//
Функция вДополнитьСтрокуСимволами(Стр = "", Длина, Чем = " ") Экспорт
Результат = СокрЛП(Стр);
Пока Длина - СтрДлина(Результат) > 0 Цикл
Результат = Результат + Чем;
КонецЦикла;
Возврат(Результат);
КонецФункции
// Выполняет обработку объектов.
//
// Параметры:
// ПараметрыОбработки - Структура, Форма
//
Функция ВыполнитьГрупповуюОбработку(Параметры) Экспорт
ИмяОбработки = Параметры.ИмяОбработки;
ПараметрыОбработки = Параметры.НастройкаОбработки;
Если ЗначениеЗаполнено(Параметры.Запрос.Текст) Тогда
Запрос = Новый Запрос;
Запрос.Текст = Параметры.Запрос.Текст;
ирОбщий.СкопироватьУниверсальнуюКоллекциюЛкс(Параметры.Запрос.Параметры, Запрос.Параметры);
мЗапрос = Запрос;
КонецЕсли;
#Если Сервер И Не Сервер Тогда
ПараметрыОбработки = Новый Структура;
#КонецЕсли
ТранзакцииРазрешены = Истина;
Отказ = Ложь;
ИмяМетода = "ПередОбработкойВсех";
Если ПараметрыОбработки.Свойство("ФормаОбработки") Тогда
Если ирОбщий.МетодРеализованЛкс(ПараметрыОбработки.ФормаОбработки, ИмяМетода) Тогда
Выполнить("ПараметрыОбработки.ФормаОбработки." + ИмяМетода + "(ПараметрыОбработки, Отказ)");
КонецЕсли;
Иначе
ИмяМетода = ИмяОбработки + "_" + ИмяМетода;
Если ирОбщий.МетодРеализованЛкс(ЭтотОбъект, ИмяМетода) Тогда
Выполнить("ЭтотОбъект." + ИмяМетода + "(ПараметрыОбработки, Отказ)");
КонецЕсли;
КонецЕсли;
ИмяМетодаОбработкиОбъекта = "ОбработатьОбъект";
Если ПараметрыОбработки.Свойство("ФормаОбработки") Тогда
Если ирОбщий.МетодРеализованЛкс(ПараметрыОбработки.ФормаОбработки, ИмяМетодаОбработкиОбъекта) Тогда
ИмяОбъектаОбработкиОбъекта = "ПараметрыОбработки.ФормаОбработки";
Иначе
Отказ = Истина;
КонецЕсли;
Иначе
ИмяМетодаОбработкиОбъекта = ИмяОбработки + "_" + ИмяМетодаОбработкиОбъекта;
Если ирОбщий.МетодРеализованЛкс(ЭтотОбъект, ИмяМетодаОбработкиОбъекта) Тогда
ИмяОбъектаОбработкиОбъекта = "ЭтотОбъект";
Иначе
Отказ = Истина;
КонецЕсли;
КонецЕсли;
РезультатМетода = 0;
Если Не Отказ Тогда
СтрокиДляОбработки.ЗаполнитьЗначения("", мИмяКолонкиРезультатаОбработки + "," + мИмяКолонкиСообщенияОбработки);
#Если Сервер И Не Сервер Тогда
ЗагрузитьРезультатОбработкиОбъекта();
ОбработатьЭлементыОбъекта();
#КонецЕсли
СтруктураПотоков = ирОбщий.НоваяСтруктураМногопоточнойОбработкиЛкс("ОбработатьЭлементыОбъекта", ЭтотОбъект, "ЗагрузитьРезультатОбработкиОбъекта", КоличествоОбъектовВПорции,
?(Параметры.РазрешитьМногопоточность, КоличествоПотоков, 1));
мКоличествоЗаписанныхАвтоматически = 0;
мКоличествоСтрокНеуспешно = 0;
мКоличествоСтрокУспешно = 0;
Если СтруктураПотоков.ФактическоеКоличествоПотоков = 1 И ОбщаяТранзакция Тогда
НачатьТранзакцию();
КонецЕсли;
Попытка
мСоставПланаОбмена = Неопределено;
Если ЗначениеЗаполнено(УзелОтбораОбъектов) Тогда
мСоставПланаОбмена = УзелОтбораОбъектов.Метаданные().Состав;
КонецЕсли;
ТипТаблицы = ирОбщий.ТипТаблицыБДЛкс(?(МноготабличнаяВыборка, ОбластьПоиска[0].Значение, ОбластьПоиска));
СтруктураКлючаОбъектаДоп = ирОбщий.СтруктураКлючаТаблицыБДЛкс(?(МноготабличнаяВыборка, ОбластьПоиска[0].Значение, ОбластьПоиска), Ложь);
СтруктураКлючаОбъекта = ирОбщий.СтруктураКлючаТаблицыБДЛкс(?(МноготабличнаяВыборка, ОбластьПоиска[0].Значение, ОбластьПоиска), Ложь);
СтруктураКлючаСтроки = ирОбщий.СтруктураКлючаТаблицыБДЛкс(?(МноготабличнаяВыборка, ОбластьПоиска[0].Значение, ОбластьПоиска), Истина);
Если МноготабличнаяВыборка Тогда
СтруктураКлючаОбъектаДоп.Вставить(мИмяКолонкиПолногоИмениТаблицы);
СтруктураКлючаСтроки.Вставить(мИмяКолонкиПолногоИмениТаблицы);
КонецЕсли;
СтрокаКлюча = "";
Для Каждого КлючИЗначение Из СтруктураКлючаОбъектаДоп Цикл
Если СтрокаКлюча <> "" Тогда
СтрокаКлюча = СтрокаКлюча + ", ";
КонецЕсли;
СтрокаКлюча = СтрокаКлюча + КлючИЗначение.Ключ;
КонецЦикла;
ОбработаноОбъектов = 0;
ОбработаноСтрок = 0;
Если ДинамическаяВыборка Тогда
мРезультатЗапроса = мЗапрос.Выполнить();
Если СтруктураКлючаСтроки.Количество() = СтруктураКлючаОбъектаДоп.Количество() Тогда
ВыборкаКлючей = мРезультатЗапроса.Выбрать();
КоличествоОбъектов = ВыборкаКлючей.Количество();
КоличествоСтрок = КоличествоОбъектов;
Индикатор = ИндикаторОбработкиОбъектов(КоличествоОбъектов, СтруктураПотоков.ФактическоеКоличествоПотоков);
Пока ВыборкаКлючей.Следующий() Цикл
Если ирОбщий.ОбработатьИндикаторЛкс(Индикатор) Тогда
Если ирОбщий.ЛиПрерватьФоновоеЗаданиеЛкс(Индикатор) Тогда
Прервать;
КонецЕсли;
КонецЕсли;
КопияСтрокОбъекта = СтрокиДляОбработки.СкопироватьКолонки();
ЗаполнитьЗначенияСвойств(КопияСтрокОбъекта.Добавить(), ВыборкаКлючей);
ЗаполнитьЗначенияСвойств(СтруктураКлючаОбъектаДоп, ВыборкаКлючей);
ЗаполнитьЗначенияСвойств(СтруктураКлючаОбъекта, ВыборкаКлючей);
ЭтоПоследнийОбъектБД = Индикатор.Счетчик = КоличествоОбъектов;
ДобавитьОбъектВОчередьОбработки(ТипТаблицы, СтруктураКлючаОбъектаДоп, СтруктураКлючаОбъекта, СтруктураКлючаСтроки, КопияСтрокОбъекта, ПараметрыОбработки, ТранзакцииРазрешены,
Индикатор.Счетчик = 1, ЭтоПоследнийОбъектБД, ИмяОбъектаОбработкиОбъекта, ИмяМетодаОбработкиОбъекта, КопияСтрокОбъекта, СтруктураПотоков);
ОбработаноОбъектов = ОбработаноОбъектов + 1;
ОбработаноСтрок = ОбработаноСтрок + КопияСтрокОбъекта.Количество();
КонецЦикла;
Иначе
Если СтруктураКлючаОбъектаДоп.Количество() > 1 Тогда
ирОбщий.СообщитьЛкс("Динамическая выборка по сложному ключу не поддерживается. Загрузите выборку полностью.", СтатусСообщения.Внимание);
Возврат 0;
КонецЕсли;
ЗапросКлючей = Новый Запрос();
Фрагменты = ирОбщий.СтрРазделитьЛкс(мЗапрос.Текст, "//Секция_Упорядочить");
ИсключаемоеПоле = Неопределено;
//Если СтруктураКлючаСтроки <> СтруктураКлючаОбъектаСПометкой Тогда
ИсключаемоеПоле = ирОбщий.ПеревестиСтроку("НомерСтроки");
//КонецЕсли;
СтрокаПорядка = ирОбщий.ВыражениеПорядкаКомпоновкиНаЯзыкеЗапросовЛкс(Компоновщик.Настройки.Порядок, ИсключаемоеПоле);
СтрокаПолейПорядка = "";
Для Каждого Колонка Из мРезультатЗапроса.Колонки Цикл
Если Ложь
Или СтруктураКлючаОбъектаДоп.Свойство(Колонка.Имя)
Или ирОбщий.СтрокиРавныЛкс(ИсключаемоеПоле, Колонка.Имя)
Тогда
Продолжить;
КонецЕсли;
СтрокаПолейПорядка = ", " + Колонка.Имя;
КонецЦикла;
Если ЗначениеЗаполнено(СтрокаПорядка) Тогда
СтрокаПорядка = " УПОРЯДОЧИТЬ ПО " + СтрокаПорядка;
КонецЕсли;
Если Ложь
Или Не БезАвтоупорядочивания
//Или ЗначениеЗаполнено(СтрокаПорядка)
Тогда
СтрокаПорядка = СтрокаПорядка + "
|АВТОУПОРЯДОЧИВАНИЕ";
КонецЕсли;
ТекстЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ " + СтрокаКлюча + СтрокаПолейПорядка + "
| ИЗ (" + Фрагменты[0] + ") КАК Т " + СтрокаПорядка; // Доделать имя таблицы (Т.) у полей
ЗапросКлючей.Текст = ТекстЗапроса;
ирОбщий.СкопироватьУниверсальнуюКоллекциюЛкс(мЗапрос.Параметры, ЗапросКлючей.Параметры);
РезультатЗапроса = ЗапросКлючей.Выполнить();
#Если Сервер И Не Сервер Тогда
_Запрос = Новый Запрос;
ВыборкаЗапроса = _Запрос.Выполнить().Выбрать();
#КонецЕсли
ВыборкаКлючей = РезультатЗапроса.Выбрать();
//Построитель = Новый ПостроительЗапроса;
//Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(мРезультатЗапроса);
//Для Каждого КлючИЗначение Из СтруктураКлючаОбъекта Цикл
// Построитель.ИсточникДанных.Колонки[ИмяПоляСсылка].Измерение = Истина;
//КонецЦикла;
//Построитель.ЗаполнитьНастройки();
//Для Каждого КлючИЗначение Из СтруктураКлючаОбъекта Цикл
// Построитель.Измерения.Добавить(КлючИЗначение.Ключ);
//КонецЦикла;
//ВыборкаКлючей = Построитель.Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
ПостроительЗапросаДеталей = Новый ПостроительЗапроса();
ПостроительЗапросаДеталей.Текст = мЗапрос.Текст;
ПостроительЗапросаДеталей.ЗаполнитьНастройки();
Для Каждого КлючИЗначение Из СтруктураКлючаОбъектаДоп Цикл
ЭлементОтбора = ПостроительЗапросаДеталей.Отбор.Добавить(КлючИЗначение.Ключ);
ЭлементОтбора.Использование = Истина;
КонецЦикла;
КоличествоОбъектов = ВыборкаКлючей.Количество();
КоличествоСтрок = 0;
Индикатор = ИндикаторОбработкиОбъектов(КоличествоОбъектов, СтруктураПотоков.ФактическоеКоличествоПотоков);
ирОбщий.СкопироватьУниверсальнуюКоллекциюЛкс(мЗапрос.Параметры, ПостроительЗапросаДеталей.Параметры);
Пока ВыборкаКлючей.Следующий() Цикл
Если ирОбщий.ОбработатьИндикаторЛкс(Индикатор) Тогда
Если ирОбщий.ЛиПрерватьФоновоеЗаданиеЛкс(Индикатор) Тогда
Прервать;
КонецЕсли;
КонецЕсли;
Для Каждого КлючИЗначение Из СтруктураКлючаОбъектаДоп Цикл
ПостроительЗапросаДеталей.Отбор[КлючИЗначение.Ключ].Значение = ВыборкаКлючей[КлючИЗначение.Ключ];
КонецЦикла;
ТаблицаРезультатаДеталей = ПостроительЗапросаДеталей.Результат.Выгрузить();
КопияСтрокОбъекта = СтрокиДляОбработки.СкопироватьКолонки();
ирОбщий.ЗагрузитьВТаблицуЗначенийЛкс(ТаблицаРезультатаДеталей, КопияСтрокОбъекта);
ЗаполнитьЗначенияСвойств(СтруктураКлючаОбъектаДоп, ВыборкаКлючей);
ЗаполнитьЗначенияСвойств(СтруктураКлючаОбъекта, ВыборкаКлючей);
ЭтоПоследнийОбъектБД = ОбработаноОбъектов = КоличествоОбъектов - 1;
ДобавитьОбъектВОчередьОбработки(ТипТаблицы, СтруктураКлючаОбъектаДоп, СтруктураКлючаОбъекта, СтруктураКлючаСтроки, КопияСтрокОбъекта, ПараметрыОбработки, ТранзакцииРазрешены,
ОбработаноОбъектов = 0, ЭтоПоследнийОбъектБД, ИмяОбъектаОбработкиОбъекта, ИмяМетодаОбработкиОбъекта, КопияСтрокОбъекта, СтруктураПотоков);
КоличествоСтрок = КоличествоСтрок + КопияСтрокОбъекта.Количество();
ОбработаноОбъектов = ОбработаноОбъектов + 1;
ОбработаноСтрок = ОбработаноСтрок + КопияСтрокОбъекта.Количество();
КонецЦикла;
КонецЕсли;
Иначе
// Порядок обработки строк таблицы БД сохраняется только в случае, если на каждый объект БД приходится только одна строка
КлючиДляОбработки = СтрокиДляОбработки.Скопировать(Новый Структура(мИмяКолонкиПометки, Истина), СтрокаКлюча);
КоличествоСтрок = КлючиДляОбработки.Количество();
КлючиДляОбработки.Колонки.Добавить("_ПорядокСтроки");
Для Индекс = 0 По КлючиДляОбработки.Количество() - 1 Цикл
СтрокаТаблицы = КлючиДляОбработки[Индекс];
СтрокаТаблицы._ПорядокСтроки = Индекс;
КонецЦикла;
КлючиДляОбработки.Свернуть(СтрокаКлюча, "_ПорядокСтроки");
КлючиДляОбработки.Сортировать("_ПорядокСтроки");
КоличествоОбъектов = КлючиДляОбработки.Количество();
Индикатор = ИндикаторОбработкиОбъектов(КоличествоОбъектов, СтруктураПотоков.ФактическоеКоличествоПотоков);
СтруктураКлючаОбъектаДоп.Вставить(мИмяКолонкиПометки, Истина);
СтрокаИндекса = СтрокаКлюча;
СтрокаИндекса = СтрокаИндекса + ", " + мИмяКолонкиПометки;
Если МноготабличнаяВыборка Тогда
СтрокаИндекса = СтрокаИндекса + ", "+ мИмяКолонкиПолногоИмениТаблицы;
КонецЕсли;
ирОбщий.ДобавитьИндексВТаблицуЛкс(СтрокиДляОбработки, СтрокаИндекса);
ПроверитьДобавитьИндексВСтрокиДляОбработки();
Для ОбработаноОбъектов = 0 По КоличествоОбъектов - 1 Цикл
Если ирОбщий.ОбработатьИндикаторЛкс(Индикатор) Тогда
Если ирОбщий.ЛиПрерватьФоновоеЗаданиеЛкс(Индикатор) Тогда
Прервать;
КонецЕсли;
КонецЕсли;
КлючОбъекта = ирОбщий.СтруктураИзСтрокиТаблицыИлиДереваИлиВыборкиЛкс(КлючиДляОбработки[ОбработаноОбъектов]);
ЗаполнитьЗначенияСвойств(СтруктураКлючаОбъектаДоп, КлючОбъекта);
ЗаполнитьЗначенияСвойств(СтруктураКлючаОбъекта, КлючОбъекта);
СтрокиОбъекта = СтрокиДляОбработки.НайтиСтроки(СтруктураКлючаОбъектаДоп);
КопияСтрокОбъекта = СтрокиДляОбработки.Скопировать(СтрокиОбъекта);
ЭтоПоследнийОбъектБД = ОбработаноОбъектов = КоличествоОбъектов - 1;
ДобавитьОбъектВОчередьОбработки(ТипТаблицы, СтруктураКлючаОбъектаДоп, СтруктураКлючаОбъекта, СтруктураКлючаСтроки, КопияСтрокОбъекта, ПараметрыОбработки, ТранзакцииРазрешены,
ОбработаноОбъектов = 0, ЭтоПоследнийОбъектБД, ИмяОбъектаОбработкиОбъекта, ИмяМетодаОбработкиОбъекта, СтрокиОбъекта, СтруктураПотоков);
ОбработаноСтрок = ОбработаноСтрок + КопияСтрокОбъекта.Количество();
КонецЦикла;
КонецЕсли;
ирОбщий.ОжидатьЗавершенияВсехПотоковОбработкиЛкс(СтруктураПотоков);
Если КоличествоСтрок > 0 Тогда
// Мультиметка0120582093
ирОбщий.СообщитьЛкс("*Строк обработано - " + ОбработаноСтрок + ", неуспешно - " + мКоличествоСтрокНеуспешно + ", успешно - " + мКоличествоСтрокУспешно + ". "
+ "Объектов обработано - " + ОбработаноОбъектов + ", записано автоматически - " + мКоличествоЗаписанныхАвтоматически + ".");
КонецЕсли;
Если СтруктураПотоков.ФактическоеКоличествоПотоков = 1 И ОбщаяТранзакция Тогда
ЗафиксироватьТранзакцию();
КонецЕсли;
Исключение
Если СтруктураПотоков.ФактическоеКоличествоПотоков = 1 И ОбщаяТранзакция Тогда
ОтменитьТранзакцию();
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс(, Истина);
РезультатМетода = Неопределено;
ИмяМетода = "ПослеОбработкиВсех";
Если ПараметрыОбработки.Свойство("ФормаОбработки") Тогда
Если ирОбщий.МетодРеализованЛкс(ПараметрыОбработки.ФормаОбработки, ИмяМетода) Тогда
Выполнить("ПараметрыОбработки.ФормаОбработки." + ИмяМетода + "(ПараметрыОбработки)");
КонецЕсли;
Иначе
ИмяМетода = ИмяОбработки + "_" + ИмяМетода;
Если ирОбщий.МетодРеализованЛкс(ЭтотОбъект, ИмяМетода) Тогда
РезультатМетода = Вычислить("ЭтотОбъект." + ИмяМетода + "(ПараметрыОбработки)");
КонецЕсли;
КонецЕсли;
мВопросНаОбновлениеСтрокДляОбработкиЗадавался = Ложь;
КонецЕсли;
Результат = Новый Структура(мИменаВозвращаемыхСвойств);
ЗаполнитьЗначенияСвойств(Результат, ЭтотОбъект, мИменаВозвращаемыхСвойств);
Результат.Вставить("Результат", РезультатМетода);
Результат.Вставить("СтрокиДляОбработки", СтрокиДляОбработки);
Возврат Результат;
КонецФункции
Функция ИндикаторОбработкиОбъектов(Знач КоличествоОбъектов, ФактическоеКоличествоПотоков)
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(КоличествоОбъектов, "*Обработка " + ФактическоеКоличествоПотоков + " потоков"); // Мультиметка84652724
Возврат Индикатор;
КонецФункции
Процедура ДобавитьОбъектВОчередьОбработки(ТипТаблицы, СтруктураКлючаОбъектаСПометкой, СтруктураКлючаОбъекта, СтруктураКлючаСтроки, КопияСтрокОбъекта, ПараметрыОбработки,
ТранзакцииРазрешены, ЭтоПервыйОбъектБД, ЭтоПоследнийОбъектБД, ИмяОбъектаОбработкиОбъекта, ИмяМетодаОбработкиОбъекта, СтрокиРезультатовОбъекта = Неопределено, СтруктураПотоков)
ПараметрыОбработкиОбъекта = Новый Структура;
ПараметрыОбработкиОбъекта.Вставить("ИмяОбъектаОбработкиОбъекта", ИмяОбъектаОбработкиОбъекта);
ПараметрыОбработкиОбъекта.Вставить("ИмяМетодаОбработкиОбъекта", ИмяМетодаОбработкиОбъекта);
ПараметрыОбработкиОбъекта.Вставить("ТипТаблицы", ТипТаблицы);
ПараметрыОбработкиОбъекта.Вставить("СтруктураКлючаОбъектаСПометкой", ирОбщий.СкопироватьУниверсальнуюКоллекциюЛкс(СтруктураКлючаОбъектаСПометкой));
ПараметрыОбработкиОбъекта.Вставить("СтруктураКлючаОбъекта", ирОбщий.СкопироватьУниверсальнуюКоллекциюЛкс(СтруктураКлючаОбъекта));
ПараметрыОбработкиОбъекта.Вставить("СтруктураКлючаСтроки", СтруктураКлючаСтроки);
ПараметрыОбработкиОбъекта.Вставить("КопияСтрокОбъекта", КопияСтрокОбъекта);
ПараметрыОбработкиОбъекта.Вставить("ПараметрыОбработки", ПараметрыОбработки);
ПараметрыОбработкиОбъекта.Вставить("ТранзакцииРазрешены", ТранзакцииРазрешены);
ПараметрыОбработкиОбъекта.Вставить("ЭтоПервыйОбъектБД", ЭтоПервыйОбъектБД);
ПараметрыОбработкиОбъекта.Вставить("ЭтоПоследнийОбъектБД", ЭтоПоследнийОбъектБД);
ирОбщий.ДобавитьОбъектВОчередьМногопоточнойОбработкиЛкс(СтруктураПотоков, ПараметрыОбработкиОбъекта, СтрокиРезультатовОбъекта);
КонецПроцедуры
Процедура ЗагрузитьРезультатОбработкиОбъекта(Знач РезультатОбработки, Знач СтрокиРезультатов) Экспорт
Если СтрокиРезультатов = Неопределено Тогда
// Динамическая выборка
Иначе
#Если Сервер И Не Сервер Тогда
СтрокиРезультатов = Новый ТаблицаЗначений;
#КонецЕсли
Для Каждого СтрокаДанных Из СтрокиРезультатов Цикл
СтрокаДанных[мИмяКолонкиРезультатаОбработки] = РезультатОбработки.Результат;
КонецЦикла;
СтрокиРезультатов[0][мИмяКолонкиСообщенияОбработки] = РезультатОбработки.ТекстСообщений;
КонецЕсли;
Если РезультатОбработки.Результат = "Успех" Тогда
мКоличествоСтрокУспешно = мКоличествоСтрокУспешно + СтрокиРезультатов.Количество();
Иначе
мКоличествоСтрокНеуспешно = мКоличествоСтрокНеуспешно + СтрокиРезультатов.Количество();
КонецЕсли;
Если РезультатОбработки.ЗаписанАвтоматически Тогда
мКоличествоЗаписанныхАвтоматически = мКоличествоЗаписанныхАвтоматически + 1;
КонецЕсли;
КонецПроцедуры
// Функция - Обработать элементы объекта
//
// Параметры:
// ПараметрыОбработкиОбъекта - Структура -
//
// Возвращаемое значение:
// -
//
Функция ОбработатьЭлементыОбъекта(ПараметрыОбработкиОбъекта) Экспорт
#Если Сервер И Не Сервер Тогда
ПараметрыОбработкиОбъекта = Новый Структура;
#КонецЕсли
ТипТаблицы = ПараметрыОбработкиОбъекта.ТипТаблицы;
СтруктураКлючаОбъектаСПометкой = ПараметрыОбработкиОбъекта.СтруктураКлючаОбъектаСПометкой;
СтруктураКлючаОбъекта = ПараметрыОбработкиОбъекта.СтруктураКлючаОбъекта;
СтруктураКлючаСтроки = ПараметрыОбработкиОбъекта.СтруктураКлючаСтроки;
КопияСтрокОбъекта = ПараметрыОбработкиОбъекта.КопияСтрокОбъекта;
ПараметрыОбработки = ПараметрыОбработкиОбъекта.ПараметрыОбработки;
//ТранзакцииРазрешены = ПараметрыОбработкиОбъекта.ТранзакцииРазрешены;
ЭтоПервыйОбъектБД = ПараметрыОбработкиОбъекта.ЭтоПервыйОбъектБД;
ЭтоПоследнийОбъектБД = ПараметрыОбработкиОбъекта.ЭтоПоследнийОбъектБД;
ИмяОбъектаОбработкиОбъекта = ПараметрыОбработкиОбъекта.ИмяОбъектаОбработкиОбъекта;
ИмяМетодаОбработкиОбъекта = ПараметрыОбработкиОбъекта.ИмяМетодаОбработкиОбъекта;
#Если Сервер И Не Сервер Тогда
ПараметрыОбработки = Новый Структура;
#КонецЕсли
#Если Не Клиент Тогда
ПолучитьСообщенияПользователю(Истина);
#КонецЕсли
ИмяПоляСсылка = ирОбщий.ПеревестиСтроку("Ссылка");
ИмяПоляНомерСтроки = ирОбщий.ПеревестиСтроку("НомерСтроки");
ИмяПоляПериод = ирОбщий.ПеревестиСтроку("Период");
Если РежимОбходаДанных = "Строки" Тогда
Если КопияСтрокОбъекта.Колонки.Найти(ИмяПоляНомерСтроки) <> Неопределено Тогда
КопияСтрокОбъекта.Сортировать(ИмяПоляНомерСтроки + " Убыв");
КонецЕсли;
КонецЕсли;
Если МноготабличнаяВыборка Тогда
ПолноеИмяТаблицыСтроки = СтруктураКлючаОбъектаСПометкой[мИмяКолонкиПолногоИмениТаблицы];
Иначе
ПолноеИмяТаблицыСтроки = ирКэш.ИмяТаблицыИзМетаданныхЛкс(ОбластьПоиска);
КонецЕсли;
//ЭтоРегистрБухгалтерии = ирОбщий.ЛиПолноеИмяРегистраБухгалтерииЛкс(ПолноеИмяТаблицыСтроки);
ОбъектМДОбъекта = ирОбщий.ОбъектМДПоПолномуИмениТаблицыБДЛкс(ПолноеИмяТаблицыСтроки);
КоллекцияСтрок = Неопределено;
ЗагрузитьСтрокиПослеОбработки = Ложь;
ЭлементыОбъекта = Новый Массив();
ПрименятьПообъектныеТранзакции = Ложь
Или ПообъектныеТранзакции
Или (Истина
И ПараметрыОбработкиОбъекта.Свойство("ИзменятьИзмерения")
И ПараметрыОбработкиОбъекта.ИзменятьИзмерения
И ирОбщий.ЛиМетаданныеНезависимогоРегистраЛкс(ОбъектМДОбъекта));
//Если Не ТранзакцииРазрешены Тогда
// ПрименятьПообъектныеТранзакции = Ложь;
//КонецЕсли;
ЗаписанАвтоматически = Ложь;
Если ПрименятьПообъектныеТранзакции Тогда
Если ТипТаблицы = "Внешняя" Тогда
ВнешниеИсточникиДанных[ОбъектМДОбъекта.Родитель().Имя].НачатьТранзакцию();
Иначе
НачатьТранзакцию();
КонецЕсли;
КонецЕсли;
Попытка
Если Ложь
Или ирОбщий.ЛиМетаданныеСсылочногоОбъектаЛкс(ОбъектМДОбъекта, Ложь, Истина)
Или ирОбщий.ЛиКорневойТипЖурналаДокументовЛкс(ТипТаблицы)
Тогда
Если РежимОбходаДанных = "КлючиОбъектов" Тогда
//ОбъектДляОбработки = СтрокаКлюча[ИмяПоляСсылка];
ОбъектДляОбработки = Новый Структура;
ОбъектДляОбработки.Вставить("Методы", СтруктураКлючаОбъекта[ИмяПоляСсылка]);
ОбъектДляОбработки.Вставить("Данные", СтруктураКлючаОбъекта[ИмяПоляСсылка]);
Иначе
ирОбщий.ЗаблокироватьСсылкуВТранзакцииЛкс(СтруктураКлючаОбъекта[ИмяПоляСсылка], Истина);
ОбъектДляОбработки = ирОбщий.ОбъектБДПоКлючуЛкс(ПолноеИмяТаблицыСтроки, СтруктураКлючаОбъекта[ИмяПоляСсылка]);
КонецЕсли;
ЭлементыОбъекта.Добавить(ОбъектДляОбработки.Данные);
ИначеЕсли ирОбщий.ЛиКорневойТипКонстантыЛкс(ТипТаблицы) Тогда
ОбъектДляОбработки = ирОбщий.ОбъектБДПоКлючуЛкс(ПолноеИмяТаблицыСтроки);
Если РежимОбходаДанных = "КлючиОбъектов" Тогда
//
Иначе
ирОбщий.ЗаблокироватьКонстантуЛкс(ОбъектДляОбработки.Методы, Истина);
ОбъектДляОбработки.Методы.Прочитать();
КонецЕсли;
ЭлементыОбъекта.Добавить(ОбъектДляОбработки.Данные);
ИначеЕсли ирОбщий.ЛиКорневойТипПеречисленияЛкс(ТипТаблицы) Тогда
//ОбъектДляОбработки = СтрокаКлюча[ИмяПоляСсылка];
ОбъектДляОбработки = Новый Структура;
ОбъектДляОбработки.Вставить("Методы", СтруктураКлючаОбъекта[ИмяПоляСсылка]);
ОбъектДляОбработки.Вставить("Данные", СтруктураКлючаОбъекта[ИмяПоляСсылка]);
ЭлементыОбъекта.Добавить(ОбъектДляОбработки.Данные);
ИначеЕсли ирОбщий.ЛиТипВложеннойТаблицыБДЛкс(ТипТаблицы) Тогда
СсылкаОбъекта = СтруктураКлючаОбъекта[ИмяПоляСсылка];
ирОбщий.ЗаблокироватьСсылкуВТранзакцииЛкс(СсылкаОбъекта, Истина);
ОбъектМДОбъекта = СсылкаОбъекта.Метаданные();
ОбъектДляОбработки = ирОбщий.ОбъектБДПоКлючуЛкс(ирОбщий.СтрокаБезПоследнегоФрагментаЛкс(ПолноеИмяТаблицыСтроки), СсылкаОбъекта);
Если РежимОбходаДанных = "Строки" Тогда
ИмяТЧ = ирОбщий.СтрРазделитьЛкс(ирКэш.ИмяТаблицыИзМетаданныхЛкс(ПолноеИмяТаблицыСтроки))[2];
КоллекцияСтрок = ОбъектДляОбработки.Данные[ИмяТЧ];
Для Каждого СтрокаДляОбработки Из КопияСтрокОбъекта Цикл
Если КоллекцияСтрок.Количество() < СтрокаДляОбработки[ИмяПоляНомерСтроки] Тогда
ВызватьИсключение "Строка таблицы с номером " + СтрокаДляОбработки[ИмяПоляНомерСтроки] + " не найдена в объекте БД";
КонецЕсли;
ЭлементыОбъекта.Добавить(КоллекцияСтрок[СтрокаДляОбработки[ИмяПоляНомерСтроки] - 1]);
КонецЦикла;
Иначе
ЭлементыОбъекта.Добавить(ОбъектДляОбработки.Данные);
КонецЕсли;
ИначеЕсли ирОбщий.ЛиМетаданныеРегистраЛкс(ОбъектМДОбъекта) Тогда
ОбъектДляОбработки = ирОбщий.ОбъектБДПоКлючуЛкс(ПолноеИмяТаблицыСтроки, СтруктураКлючаОбъекта,, Ложь);
Если РежимОбходаДанных <> "КлючиОбъектов" Тогда
КоллекцияСтрок = ирОбщий.ПрочитатьНаборЗаписейВТаблицуЛкс(ОбъектДляОбработки.Методы, РежимБлокировкиДанных.Исключительный);
КонецЕсли;
Если РежимОбходаДанных = "Строки" Тогда
СтараяКоллекцияСтрок = КоллекцияСтрок.Скопировать();
ЗагрузитьСтрокиПослеОбработки = Истина;
Если СтруктураКлючаСтроки.Свойство(ИмяПоляНомерСтроки) Тогда
ИмяКлюча = ИмяПоляНомерСтроки;
КлючСтроки = Новый Структура(ИмяКлюча);
ИначеЕсли СтруктураКлючаСтроки.Свойство(ИмяПоляПериод) Тогда
ИмяКлюча = ИмяПоляПериод;
КлючСтроки = Новый Структура(ИмяКлюча);
Иначе
КлючСтроки = Неопределено;
КонецЕсли;
Для Каждого СтрокаДляОбработки Из КопияСтрокОбъекта Цикл
Если КлючСтроки = Неопределено Тогда
Если КоллекцияСтрок.Количество() = 0 Тогда
ВызватьИсключение "Строка таблицы не найдена в объекте БД. Возможно она уже была удалена.";
КонецЕсли;
СтрокаОбъекта = КоллекцияСтрок[0];
Иначе
ЗаполнитьЗначенияСвойств(КлючСтроки, СтрокаДляОбработки);
НайденныеСтроки = КоллекцияСтрок.НайтиСтроки(КлючСтроки);
Если НайденныеСтроки.Количество() = 0 Тогда
ВызватьИсключение "Строка таблицы по ключу " + КлючСтроки[ИмяКлюча] + " не найдена в объекте БД";
КонецЕсли;
//Если ЭтоРегистрБухгалтерии Тогда
СтрокаОбъекта = НайденныеСтроки[0];
//Иначе
// ИндексСтрокиНабора = КоллекцияСтрок.Индекс(НайденныеСтроки[0]);
// СтрокаОбъекта = ОбъектДляЗаписи[ИндексСтрокиНабора];
//КонецЕсли;
КонецЕсли;
ЭлементыОбъекта.Добавить(СтрокаОбъекта);
КонецЦикла;
Иначе
КоллекцияСтрок = Неопределено;
ЭлементыОбъекта.Добавить(ОбъектДляОбработки.Данные);
КонецЕсли;
Иначе
ВызватьИсключение "Неподдерживаемый тип таблицы """ + ТипТаблицы + """";
КонецЕсли;
//Если РежимОбходаДанных <> "КлючиОбъектов" Тогда
// ирОбщий.УстановитьПараметрыЗаписиОбъектаЛкс(ОбъектДляОбработки.Методы, ОтключатьКонтрольЗаписи, БезАвторегистрацииИзменений);
//КонецЕсли;
Если ОбъектДляОбработки = Неопределено Тогда
РезультатОбработки = "Пропущен";
Если ВыводитьСообщения Тогда
ирОбщий.СообщитьЛкс("Пропущен удаленный """ + СтруктураКлючаОбъекта[ИмяПоляСсылка] + """");
КонецЕсли;
Иначе
ТекстСообщенияОбОбработкеОбъекта = "Обработка объекта " + ирОбщий.XMLКлючОбъектаБДЛкс(ОбъектДляОбработки.Методы);
Если ВыводитьСообщения Тогда
ирОбщий.СообщитьЛкс(ТекстСообщенияОбОбработкеОбъекта);
КонецЕсли;
СчетчикЭлемента = 0;
КоличествоЭлементов = ЭлементыОбъекта.Количество();
Если ПараметрыОбработки.Свойство("ПринудительнаяЗапись") Тогда
ПринудительнаяЗапись = ПараметрыОбработки.ПринудительнаяЗапись;
Иначе
ПринудительнаяЗапись = Ложь;
КонецЕсли;
Для Каждого ЭлементОбъекта Из ЭлементыОбъекта Цикл
СчетчикЭлемента = СчетчикЭлемента + 1;
ПараметрыОбработки.Вставить("ЭтоПервыйОбъектБД", ЭтоПервыйОбъектБД);
ПараметрыОбработки.Вставить("ЭтоПоследнийОбъектБД", ЭтоПоследнийОбъектБД);
ПараметрыОбработки.Вставить("ЭтоПервыйЭлемент", СчетчикЭлемента = 1);
ПараметрыОбработки.Вставить("ЭтоПоследнийЭлемент", СчетчикЭлемента = КоличествоЭлементов);
ПараметрыОбработки.Вставить("СтрокаПараметров", СтрокиДляОбработки[СчетчикЭлемента - 1]);
Выполнить(ИмяОбъектаОбработкиОбъекта + "." + ИмяМетодаОбработкиОбъекта + "(ЭлементОбъекта, КоллекцияСтрок, ОбъектДляОбработки.Данные, ПараметрыОбработки, ОбъектДляОбработки.Методы, ПринудительнаяЗапись)");
КонецЦикла;
Если ЗагрузитьСтрокиПослеОбработки Тогда
Если ПринудительнаяЗапись Или Не ирОбщий.ТаблицыЗначенийРавныЛкс(СтараяКоллекцияСтрок, КоллекцияСтрок) Тогда
ОбъектДляОбработки.Методы.Загрузить(КоллекцияСтрок);
КонецЕсли;
КонецЕсли;
Если Истина
И Не ирОбщий.ЛиТипСсылкиБДЛкс(ТипЗнч(ОбъектДляОбработки.Методы), Ложь)
//И Не ирОбщий.ЛиКорневойТипПеречисленияЛкс(ТипТаблицы) // Поглощена
Тогда
ЭтоНовыйОбъект = Ложь;
Если ирОбщий.ЛиКорневойТипСсылкиЛкс(ТипТаблицы, Истина) Тогда
ЭтоНовыйОбъект = Ложь
Или Не ЗначениеЗаполнено(ОбъектДляОбработки.Методы.Ссылка)
Или ОбъектДляОбработки.Методы.ЭтоНовый(); // https://www.hostedredmine.com/issues/937634
КонецЕсли;
Попытка
Модифицированность = Истина
И Не ЭтоНовыйОбъект
И (Ложь
Или ОбъектДляОбработки.Методы.Модифицированность()
Или ПринудительнаяЗапись);
Исключение
// Объект мог быть удален
Модифицированность = Ложь;
КонецПопытки;
Если Модифицированность Тогда
РежимЗаписи = Неопределено;
Если Истина
И ПроводитьПроведенныеДокументыПриЗаписи
И ирОбщий.ЛиКорневойТипДокументаЛкс(ирОбщий.ПервыйФрагментЛкс(ПолноеИмяТаблицыСтроки))
И ОбъектМДОбъекта.Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить
И ОбъектДляОбработки.Данные.Проведен
Тогда
РежимЗаписи = РежимЗаписиДокумента.Проведение;
КонецЕсли;
ирОбщий.ЗаписатьОбъектЛкс(ОбъектДляОбработки.Методы,, РежимЗаписи);
ЗаписанАвтоматически = Истина;
КонецЕсли;
КонецЕсли;
РезультатОбработки = "Успех";
Если ВыводитьСообщения Тогда
ирОбщий.СообщитьЛкс(Символы.Таб + РезультатОбработки);
КонецЕсли;
КонецЕсли;
Если ПрименятьПообъектныеТранзакции Тогда
Если ТипТаблицы = "Внешняя" Тогда
ВнешниеИсточникиДанных[ОбъектМДОбъекта.Родитель().Имя].ЗафиксироватьТранзакцию();
Иначе
ЗафиксироватьТранзакцию();
КонецЕсли;
КонецЕсли;
Исключение
Если ПрименятьПообъектныеТранзакции Тогда
Если ТипТаблицы = "Внешняя" Тогда
ВнешниеИсточникиДанных[ОбъектМДОбъекта.Родитель().Имя].ОтменитьТранзакцию();
Иначе
ОтменитьТранзакцию();
КонецЕсли;
КонецЕсли;
РезультатОбработки = ОписаниеОшибки();
Если Не ВыводитьСообщения Тогда
ирОбщий.СообщитьЛкс(ТекстСообщенияОбОбработкеОбъекта);
КонецЕсли;
ирОбщий.СообщитьЛкс(Символы.Таб + РезультатОбработки, СтатусСообщения.Внимание);
Если Не ПропускатьОшибки Или ТранзакцияАктивна() Тогда
ВызватьИсключение;
КонецЕсли;
КонецПопытки;
Если Истина
И РезультатОбработки = "Успех"
И УдалятьРегистрациюНаУзлеПослеОбработкиОбъекта
И ЗначениеЗаполнено(УзелОтбораОбъектов)
Тогда
ОбъектМД = Метаданные.НайтиПоТипу(ирОбщий.ТипОбъектаБДЛкс(ОбъектДляОбработки.Методы));
Если мСоставПланаОбмена.Содержит(ОбъектМД) Тогда
ирОбщий.ПланыОбменаИзменитьРегистрациюЛкс(УзелОтбораОбъектов, ОбъектДляОбработки, Ложь);
КонецЕсли;
КонецЕсли;
ТекстСообщений = "";
#Если Не Клиент Тогда
СообщенияОбъекта = ПолучитьСообщенияПользователю(Истина);
ТекстСообщений = ирОбщий.СоединитьСообщенияПользователюЛкс(СообщенияОбъекта);
#КонецЕсли
РезультатОбработки = Новый Структура("Результат, ТекстСообщений, ЗаписанАвтоматически", РезультатОбработки, ТекстСообщений, ЗаписанАвтоматически);
Возврат РезультатОбработки;
КонецФункции
Процедура ПроверитьДобавитьИндексВСтрокиДляОбработки() Экспорт
Если СтрокиДляОбработки.Индексы.Количество() = 0 Тогда
//СтрокаИндекса = "";
//Для Каждого ЭлементКлюча Из мСтруктураКлюча Цикл
// СтрокаИндекса = СтрокаИндекса + "," + ЭлементКлюча.Ключ;
//КонецЦикла;
//СтрокаИндекса = Сред(СтрокаИндекса, 2);
//СтрокиДляОбработки.Индексы.Добавить(СтрокаИндекса); // Закомментирвано из-за высоких расходов времени
//СтрокаИндексаОбъекта = мИмяКолонкиПометки;
СтрокаИндексаОбъекта = "";
СтруктураКлючаОбъекта = ирОбщий.СтруктураКлючаТаблицыБДЛкс(?(МноготабличнаяВыборка, ОбластьПоиска[0].Значение, ОбластьПоиска), Ложь);
Для Каждого КлючИЗначение Из СтруктураКлючаОбъекта Цикл
СтрокаИндексаОбъекта = СтрокаИндексаОбъекта + "," + КлючИЗначение.Ключ;
КонецЦикла;
СтрокиДляОбработки.Индексы.Добавить(СтрокаИндексаОбъекта); // Для регистров с большим числом измерений тут будут высокие, но оправданные расходы
КонецЕсли;
КонецПроцедуры
Функция ПолучитьОписаниеТиповОбрабатываемогоЭлементаИлиОбъекта(ИскомыйОбъект, НуженТипОбъекта = Ложь, выхПолноеИмяТаблицы = "") Экспорт
МассивИлиИмяТаблицыБД = Новый Массив();
Если ИскомыйОбъект <> Неопределено Тогда
ТипТаблицы = ИскомыйОбъект.ТипТаблицы;
Если МноготабличнаяВыборка Тогда
МассивИлиИмяТаблицыБД = ОбластьПоиска.ВыгрузитьЗначения();
Иначе
МассивИлиИмяТаблицыБД.Добавить(ОбластьПоиска);
КонецЕсли;
КонецЕсли;
Результат = ирОбщий.ОписаниеТиповОбъектаИлиСтрокиБДПоИменамТаблицЛкс(МассивИлиИмяТаблицыБД, НуженТипОбъекта, РежимОбходаДанных, ТипТаблицы, выхПолноеИмяТаблицы);
Возврат Результат;
КонецФункции
Процедура Шаблон_ПередОбработкойВсех(ПараметрыОбработки, Отказ) Экспорт
КонецПроцедуры
Процедура Шаблон_ПослеОбработкиВсех(ПараметрыОбработки) Экспорт
КонецПроцедуры
Процедура Шаблон_ОбработатьОбъект(Знач Объект, Знач КоллекцияСтрок = Неопределено, Знач ОбъектБДДанные = Неопределено, Знач ПараметрыОбработки = Неопределено, Знач ОбъектБДМетоды = Неопределено, выхПринудительнаяЗапись = Ложь) Экспорт
КонецПроцедуры
Процедура ИзменитьДобавитьСтроку_ОбработатьОбъект(Знач Объект, Знач КоллекцияСтрок = Неопределено, Знач ОбъектБДДанные = Неопределено, Знач ПараметрыОбработки = Неопределено, Знач ОбъектБДМетоды = Неопределено, выхПринудительнаяЗапись = Ложь) Экспорт
Если ЗначениеЗаполнено(ПараметрыОбработки.ИмяТабличнойЧасти) Тогда
КлючПоиска = Новый Структура;
Для Каждого РеквизитПоиска Из ПараметрыОбработки.РеквизитыДляСохранения.НайтиСтроки(Новый Структура("Пометка, КлючПоиска, ТипИзменения", Истина, Истина, "УстановитьЗначение")) Цикл
КлючПоиска.Вставить(РеквизитПоиска.Идентификатор, РеквизитПоиска.Значение);
КонецЦикла;
НайденныеСтрокиТЧ = Объект[ПараметрыОбработки.ИмяТабличнойЧасти].НайтиСтроки(КлючПоиска);
Если НайденныеСтрокиТЧ.Количество() > 1 Тогда
ВызватьИсключение "Найдено более одной строки по реквизитам поиска";
ИначеЕсли НайденныеСтрокиТЧ.Количество() = 0 Тогда
Объект = Объект[ПараметрыОбработки.ИмяТабличнойЧасти].Добавить();
ЗаполнитьЗначенияСвойств(Объект, КлючПоиска);
ИначеЕсли Не ПараметрыОбработки.ОбрабатыватьСуществующую Тогда
Возврат;
Иначе
Объект = НайденныеСтрокиТЧ[0];
КонецЕсли;
КонецЕсли;
ИмяПоляЭтоГруппа = ирОбщий.ПеревестиСтроку("ЭтоГруппа");
ИмяПоляСсылка = "";
ТипОбъектаДанных = ирОбщий.ТипОбъектаБДЛкс(ОбъектБДМетоды);
ЭтоНаборЗаписей = ирОбщий.ЛиНаборЗаписейРегистраЛкс(ТипОбъектаДанных);
СтарыйНаборЗаписей = Неопределено;
ОбъектМодифицирован = Ложь;
Для каждого СтрокаРеквизита из ПараметрыОбработки.РеквизитыДляСохранения Цикл
#Если Сервер И Не Сервер Тогда
СтрокаРеквизита = Обработки.ирПодборИОбработкаОбъектов.Создать().ЗначенияРеквизитов.Добавить();
#КонецЕсли
Если Ложь
Или СтрокаРеквизита.Использование = ""
Или СтрокаРеквизита.Использование = "ДляГруппыИЭлемента"
Или (Объект[ИмяПоляЭтоГруппа] И СтрокаРеквизита.Использование = "ДляГруппы")
Или (Не Объект[ИмяПоляЭтоГруппа] И СтрокаРеквизита.Использование = "ДляЭлемента")
Тогда
ИмяРеквизита = СтрокаРеквизита.Идентификатор;
НовоеЗначение = СтрокаРеквизита.Значение;
ДопРеквизит = СтрокаРеквизита.ДопРеквизит;
#Если Сервер И Не Сервер Тогда
ДопРеквизит = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ПустаяСсылка();
#КонецЕсли
Если СтрокаРеквизита.ТипИзменения <> "УстановитьЗначение" Тогда
Если ЗначениеЗаполнено(ДопРеквизит) Тогда
ТекущееЗначение = ирОбщий.ЗначениеДопРеквизитаБСПЛкс(Объект, ДопРеквизит, ИмяПоляСсылка);
Иначе
ТекущееЗначение = Объект[ИмяРеквизита];
КонецЕсли;
Если СтрокаРеквизита.ТипИзменения = "Округлить" Тогда
НовоеЗначение = Окр(ТекущееЗначение);
ИначеЕсли СтрокаРеквизита.ТипИзменения = "УстановитьЦелуюЧасть" Тогда
НовоеЗначение = Цел(НовоеЗначение) + ТекущееЗначение - Цел(ТекущееЗначение);
ИначеЕсли СтрокаРеквизита.ТипИзменения = "УстановитьДробнуюЧасть" Тогда
НовоеЗначение = НовоеЗначение - Цел(НовоеЗначение) + Цел(ТекущееЗначение);
ИначеЕсли СтрокаРеквизита.ТипИзменения = "УстановитьВремя" Тогда
НовоеЗначение = Дата(Год(ТекущееЗначение), Месяц(ТекущееЗначение), День(ТекущееЗначение), Час(НовоеЗначение), Минута(НовоеЗначение), Секунда(НовоеЗначение));
ИначеЕсли СтрокаРеквизита.ТипИзменения = "УстановитьДату" Тогда
НовоеЗначение = Дата(Год(НовоеЗначение), Месяц(НовоеЗначение), День(НовоеЗначение), Час(ТекущееЗначение), Минута(ТекущееЗначение), Секунда(ТекущееЗначение));
ИначеЕсли СтрокаРеквизита.ТипИзменения = "СдвинутьВНачалоДня" Тогда
НовоеЗначение = НачалоДня(ТекущееЗначение);
ИначеЕсли СтрокаРеквизита.ТипИзменения = "СдвинутьВКонецДня" Тогда
НовоеЗначение = КонецДня(ТекущееЗначение);
ИначеЕсли СтрокаРеквизита.ТипИзменения = "СдвинутьВНачалоМесяца" Тогда
НовоеЗначение = НачалоМесяца(ТекущееЗначение);
ИначеЕсли СтрокаРеквизита.ТипИзменения = "СдвинутьВКонецМесяца" Тогда
НовоеЗначение = КонецМесяца(ТекущееЗначение);
ИначеЕсли СтрокаРеквизита.ТипИзменения = "СдвинутьВНачалоГода" Тогда
НовоеЗначение = НачалоГода(ТекущееЗначение);
ИначеЕсли СтрокаРеквизита.ТипИзменения = "СдвинутьВКонецГода" Тогда
НовоеЗначение = КонецГода(ТекущееЗначение);
ИначеЕсли СтрокаРеквизита.ТипИзменения = "ИнвертироватьЗначение" Тогда
НовоеЗначение = Не ТекущееЗначение;
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(ДопРеквизит) Тогда
ирОбщий.УстановитьЗначениеДопРеквизитаБСПЛкс(Объект, ДопРеквизит, НовоеЗначение, ИмяПоляСсылка);
Иначе
ирОбщий.ПрисвоитьЕслиНеРавноЛкс(Объект[ИмяРеквизита], НовоеЗначение, ОбъектМодифицирован);
Если Истина
И ОбъектМодифицирован
И ЭтоНаборЗаписей
И ПараметрыОбработки.ИзменятьИзмерения
Тогда
#Если Сервер И Не Сервер Тогда
ОбъектБДМетоды = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
#КонецЕсли
ЭлементОтбора = ОбъектБДМетоды.Отбор.Найти(ИмяРеквизита);
Если ЭлементОтбора <> Неопределено Тогда
Если СтарыйНаборЗаписей = Неопределено Тогда
ОбъектМД = Метаданные.НайтиПоТипу(ТипОбъектаДанных);
ИмяТаблицыРегистра = ирКэш.ИмяТаблицыИзМетаданныхЛкс(ОбъектМД.ПолноеИмя());
СтруктураКлючаЗаписи = ирОбщий.СтруктураКлючаТаблицыБДЛкс(ИмяТаблицыРегистра);
ЗаполнитьЗначенияСвойств(СтруктураКлючаЗаписи, ОбъектБДДанные[0]);
СтарыйНаборЗаписей = ирОбщий.ОбъектБДПоКлючуЛкс(ИмяТаблицыРегистра, СтруктураКлючаЗаписи,, Ложь);
КонецЕсли;
ЭлементОтбора.Значение = НовоеЗначение;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
// Антибаг 8.2.15 http://partners.v8.1c.ru/forum/thread.jsp?id=1034144#1034144
Если ОбъектМодифицирован И ЭтоНаборЗаписей И ПараметрыОбработки.РеквизитыДляСохранения.Количество() > 0 Тогда
ИмяПоляПериод = ирОбщий.ПеревестиСтроку("Период");
ИмяПоляРегистратор = ирОбщий.ПеревестиСтроку("Регистратор");
Попытка
Объект[ИмяПоляПериод] = Объект[ИмяПоляПериод];
Исключение
Попытка
Объект[ИмяПоляРегистратор] = Объект[ИмяПоляРегистратор];
Исключение
КонецПопытки;
КонецПопытки;
КонецЕсли;
Если СтарыйНаборЗаписей <> Неопределено Тогда
Если Не ТранзакцияАктивна() Тогда
ВызватьИсключение "Изменять измерения регистра можно только в транзакции";
КонецЕсли;
Если Не ПараметрыОбработки.ЗаменятьСуществующие Тогда
ирОбщий.ЗаблокироватьНаборЗаписейПоОтборуЛкс(ОбъектБДМетоды);
ЗаполнитьЗначенияСвойств(СтруктураКлючаЗаписи, Объект);
НаборУдаляемыхЗаписей = ирОбщий.ОбъектБДПоКлючуЛкс(ИмяТаблицыРегистра, СтруктураКлючаЗаписи,, Истина);
Если НаборУдаляемыхЗаписей.Методы.Количество() > 0 Тогда
ВызватьИсключение "Уже существует строка регистра " + ирОбщий.XMLКлючОбъектаБДЛкс(НаборУдаляемыхЗаписей.Методы);
КонецЕсли;
КонецЕсли;
ирОбщий.ЗаписатьОбъектЛкс(СтарыйНаборЗаписей.Методы);
КонецЕсли;
КонецПроцедуры
Процедура ИзменитьРегистрациюНаУзлеередОбработкойВсех(ПараметрыОбработки, Отказ) Экспорт
Если Не ЗначениеЗаполнено(ПараметрыОбработки.Узел) Тогда
ирОбщий.СообщитьЛкс("Обработка не может быть выполнена, т.к. не заполнен узел", СтатусСообщения.Внимание);
Отказ = Истина;
Возврат;
КонецЕсли;
КонецПроцедуры
Процедура ИзменитьРегистрациюНаУзле_ОбработатьОбъект(Знач Объект, Знач КоллекцияСтрок = Неопределено, Знач ОбъектБДДанные = Неопределено, Знач ПараметрыОбработки = Неопределено, Знач ОбъектБДМетоды = Неопределено, выхПринудительнаяЗапись = Ложь) Экспорт
ирОбщий.ПланыОбменаИзменитьРегистрациюЛкс(ПараметрыОбработки.Узел, ОбъектБДМетоды, ПараметрыОбработки.НовоеЗначениеРегистрации, ПараметрыОбработки.ВместеСДвижениями, ПараметрыОбработки.ДвиженияВместеСПоследовательностями);
КонецПроцедуры
Процедура Удалить_ОбработатьОбъект(Знач Объект, Знач КоллекцияСтрок = Неопределено, Знач ОбъектБДДанные = Неопределено, Знач ПараметрыОбработки = Неопределено, Знач ОбъектБДМетоды = Неопределено, выхПринудительнаяЗапись = Ложь) Экспорт
Если КоллекцияСтрок <> Неопределено Тогда
КоллекцияСтрок.Удалить(Объект);
Иначе
ирОбщий.УдалитьОбъектЛкс(ОбъектБДМетоды);
КонецЕсли;
КонецПроцедуры
Процедура ПроизвольныйАлгоритм_ОбработатьОбъект(Знач Объект, Знач КоллекцияСтрок = Неопределено, Знач ОбъектБДДанные = Неопределено, Знач ПараметрыОбработки = Неопределено, Знач ОбъектБДМетоды = Неопределено, выхПринудительнаяЗапись = Ложь) Экспорт
ТекстАлгоритма = ПараметрыОбработки.ТекстПроизвольногоАлгоритма;
ТекстАлгоритма = "Объект = _П0; ОбъектБД = _П1; ОбъектБДМетоды = _П2; Параметры = _П3; ЭтоПервыйОбъектБД = _П4; ЭтоПоследнийОбъектБД = _П5; ЭтоПервыйЭлемент = _П6; ЭтоПоследнийЭлемент = _П7; ПринудительнаяЗапись = _П8; СтрокаПараметров = _П9;
|" + ТекстАлгоритма;
Для Каждого СтрокаПараметра Из ПараметрыОбработки.Параметры Цикл
ТекстАлгоритма = СтрокаПараметра.Имя + " = _АлгоритмОбъект[" + ПараметрыОбработки.Параметры.Индекс(СтрокаПараметра) + "];
|" + ТекстАлгоритма;
КонецЦикла;
ТекстАлгоритма = ТекстАлгоритма + "
|;
|_П8 = ПринудительнаяЗапись;
|";
ирОбщий.ВыполнитьАлгоритм(ТекстАлгоритма, ПараметрыОбработки.Параметры.ВыгрузитьКолонку("Значение")
, , Объект, ОбъектБДДанные, ОбъектБДМетоды, ПараметрыОбработки, ПараметрыОбработки.ЭтоПервыйОбъектБД, ПараметрыОбработки.ЭтоПоследнийОбъектБД, ПараметрыОбработки.ЭтоПервыйЭлемент,
ПараметрыОбработки.ЭтоПоследнийЭлемент, выхПринудительнаяЗапись, ПараметрыОбработки.СтрокаПараметров);
КонецПроцедуры
Процедура ПровестиДокументы_ОбработатьОбъект(Знач Объект, Знач КоллекцияСтрок = Неопределено, Знач ОбъектБДДанные = Неопределено, Знач ПараметрыОбработки = Неопределено, Знач ОбъектБДМетоды = Неопределено, выхПринудительнаяЗапись = Ложь) Экспорт
Если Истина
И ПараметрыОбработки.ПропускатьНепроведенные
И Не Объект.Проведен
Тогда
Если ВыводитьСообщения Тогда
ТекстСообщения = "Документ " + Объект + " пропущен, т.к. является непроведенным";
ирОбщий.СообщитьЛкс(ТекстСообщения);
КонецЕсли;
Возврат;
КонецЕсли;
Если Истина
И ПараметрыОбработки.СниматьПометкиУдаления
И Объект.ПометкаУдаления
Тогда
Объект.ПометкаУдаления = Ложь;
КонецЕсли;
ОбъектМД = Метаданные.НайтиПоТипу(ирОбщий.ТипОбъектаБДЛкс(ОбъектБДМетоды));
Если ОбъектМД.Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить Тогда
ирОбщий.ЗаписатьОбъектЛкс(ОбъектБДМетоды, , РежимЗаписиДокумента.Проведение);
КонецЕсли;
КонецПроцедуры
Процедура ОтменитьПроведениеДокументов_ОбработатьОбъект(Знач Объект, Знач КоллекцияСтрок = Неопределено, Знач ОбъектБДДанные = Неопределено, Знач ПараметрыОбработки = Неопределено, Знач ОбъектБДМетоды = Неопределено, выхПринудительнаяЗапись = Ложь) Экспорт
ОбъектМД = Метаданные.НайтиПоТипу(ирОбщий.ТипОбъектаБДЛкс(ОбъектБДМетоды));
Если ОбъектМД.Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить Тогда
ирОбщий.ЗаписатьОбъектЛкс(ОбъектБДМетоды, , РежимЗаписиДокумента.ОтменаПроведения);
КонецЕсли;
КонецПроцедуры
Процедура ОчиститьДвиженияДокументов_ОбработатьОбъект(Знач Объект, Знач КоллекцияСтрок = Неопределено, Знач ОбъектБДДанные = Неопределено, Знач ПараметрыОбработки = Неопределено, Знач ОбъектБДМетоды = Неопределено, выхПринудительнаяЗапись = Ложь) Экспорт
Регистратор = Объект.Ссылка;
Если Не ЗначениеЗаполнено(Регистратор) Тогда
// Битая ссылка
Регистратор = ОбъектБДМетоды.ПолучитьСсылкуНового();
КонецЕсли;
ирОбщий.ОчиститьДвиженияДокументаЛкс(Регистратор);
КонецПроцедуры
Процедура ИзменитьПометкуНаУдаление_ОбработатьОбъект(Знач Объект, Знач КоллекцияСтрок = Неопределено, Знач ОбъектБДДанные = Неопределено, Знач ПараметрыОбработки = Неопределено, Знач ОбъектБДМетоды = Неопределено, выхПринудительнаяЗапись = Ложь) Экспорт
ирОбщий.УстановитьПометкуУдаленияОбъектаЛкс(ОбъектБДМетоды, , ПараметрыОбработки.НовоеЗначениеПометки);
КонецПроцедуры
Процедура Записать_ОбработатьОбъект(Знач Объект, Знач КоллекцияСтрок = Неопределено, Знач ОбъектБДДанные = Неопределено, Знач ПараметрыОбработки = Неопределено, Знач ОбъектБДМетоды = Неопределено, выхПринудительнаяЗапись = Ложь) Экспорт
выхПринудительнаяЗапись = Истина;
КонецПроцедуры
Процедура ЗаписатьВерсию_ОбработатьОбъект(Знач Объект, Знач КоллекцияСтрок = Неопределено, Знач ОбъектБДДанные = Неопределено, Знач ПараметрыОбработки = Неопределено, Знач ОбъектБДМетоды = Неопределено, выхПринудительнаяЗапись = Ложь) Экспорт
ИсторияДанныхМоя = ирОбщий.ИсторияДанныхЛкс();
#Если Сервер И Не Сервер Тогда
ИсторияДанныхМоя = ИсторияДанных;
#КонецЕсли
ИсторияДанныхМоя.ЗаписатьВерсию(Объект, ПараметрыОбработки.Дата, ПараметрыОбработки.ПользовательИдентификатор, ПараметрыОбработки.ПользовательИмя, ПараметрыОбработки.ПользовательПолноеИмя,
ВидИзмененияДанных.Изменение, ПараметрыОбработки.Комментарий, , ПараметрыОбработки.Узел);
КонецПроцедуры
Процедура ЗагрузитьИзВерсии_ОбработатьОбъект(Знач Объект, Знач КоллекцияСтрок = Неопределено, Знач ОбъектБДДанные = Неопределено, Знач ПараметрыОбработки = Неопределено, Знач ОбъектБДМетоды = Неопределено, выхПринудительнаяЗапись = Ложь) Экспорт
ИсторияДанныхМоя = ирОбщий.ИсторияДанныхЛкс();
#Если Сервер И Не Сервер Тогда
ИсторияДанныхМоя = ИсторияДанных;
#КонецЕсли
НовыйОбъект = ИсторияДанныхМоя.СформироватьПоВерсии(Объект.Ссылка, ПараметрыОбработки.СтрокаПараметров[ПараметрыОбработки.КолонкаНомераВерсии]);
ирОбщий.ЗаписатьОбъектЛкс(НовыйОбъект);
КонецПроцедуры
Процедура ВыгрузкаВФайл_ПередОбработкойВсех(ПараметрыОбработки, Отказ) Экспорт
ВыгрузкаЗагрузкаДанныхЧерезФайл = ирОбщий.СоздатьОбъектПоИмениМетаданныхЛкс("Обработка.ирВыгрузкаЗагрузкаДанныхЧерезФайл");
ПараметрыОбработки.Вставить("ВыгрузкаЗагрузкаДанныхЧерезФайл", ВыгрузкаЗагрузкаДанныхЧерезФайл);
ВыгрузкаЗагрузкаДанныхЧерезФайл.ПередВыгрузкойВсех(ПараметрыОбработки);
КонецПроцедуры
Процедура ВыгрузкаВФайл_ОбработатьОбъект(Знач Объект, Знач КоллекцияСтрок = Неопределено, Знач ОбъектБДДанные = Неопределено, Знач ПараметрыОбработки = Неопределено, Знач ОбъектБДМетоды = Неопределено, выхПринудительнаяЗапись = Ложь) Экспорт
ВыгрузкаЗагрузкаДанныхЧерезФайл = ПараметрыОбработки.ВыгрузкаЗагрузкаДанныхЧерезФайл;
#Если Сервер И Не Сервер Тогда
ВыгрузкаЗагрузкаДанныхЧерезФайл = Обработки.ирВыгрузкаЗагрузкаДанныхЧерезФайл.Создать();
#КонецЕсли
ВыгрузкаЗагрузкаДанныхЧерезФайл.ВыгрузитьОбъектВыборки(ОбъектБДМетоды, ПараметрыОбработки);
КонецПроцедуры
Функция ВыгрузкаВФайл_ПослеОбработкиВсех(ПараметрыОбработки) Экспорт
ВыгрузкаЗагрузкаДанныхЧерезФайл = ПараметрыОбработки.ВыгрузкаЗагрузкаДанныхЧерезФайл;
#Если Сервер И Не Сервер Тогда
ВыгрузкаЗагрузкаДанныхЧерезФайл = Обработки.ирВыгрузкаЗагрузкаДанныхЧерезФайл.Создать();
#КонецЕсли
ДвоичныеДанные = ВыгрузкаЗагрузкаДанныхЧерезФайл.ПослеВыгрузкиВсех(ПараметрыОбработки);
Результат = Новый Структура;
Результат.Вставить("ДвоичныеДанные", ДвоичныеДанные);
Возврат ДвоичныеДанные;
КонецФункции
Процедура УстановитьЗначениеРеквизита(Знач СтруктураОбъекта, Знач НовоеЗначение, Знач ИзменяемыйРеквизит)
СтруктураЗначения = Новый Структура(ИзменяемыйРеквизит, НовоеЗначение);
ЗаполнитьЗначенияСвойств(СтруктураОбъекта.Данные, СтруктураЗначения, ИзменяемыйРеквизит);
КонецПроцедуры
Функция ПеренумерацияОбъектов(Параметры) Экспорт
НастройкаОбработки = Параметры.НастройкаОбработки;
ТипНомера = НастройкаОбработки.ТипНомера;
ДлинаНомера = НастройкаОбработки.ДлинаНомера;
СтрокаПрефикса = НастройкаОбработки.СтрокаПрефикса;
ЗаменяемаяПодстрока = НастройкаОбработки.ЗаменяемаяПодстрока;
НачальныйНомер = НастройкаОбработки.НачальныйНомер;
ИзменяемыйРеквизит = НастройкаОбработки.ИзменяемыйРеквизит;
НеИзменятьЧисловуюНумерацию = НастройкаОбработки.НеИзменятьЧисловуюНумерацию;
СпособОбработкиПрефиксов = НастройкаОбработки.СпособОбработкиПрефиксов;
Шаг = НастройкаОбработки.Шаг;
Если Не НеИзменятьЧисловуюНумерацию Тогда
ЧисловаяЧастьНомера = НачальныйНомер;
КонецЕсли;
НеУникальныеНомера = Новый Соответствие;
МаксимальныйНомер = Число(вДополнитьСтрокуСимволами("", ДлинаНомера, "9"));
СтруктураЗначения = Новый Структура(ИзменяемыйРеквизит);
Если ОбщаяТранзакция Тогда
НачатьТранзакцию();
КонецЕсли;
Попытка
КопияСтрокиДляОбработки = СтрокиДляОбработки.НайтиСтроки(Новый Структура(мИмяКолонкиПометки, Истина));
КоличествоОбъектов = КопияСтрокиДляОбработки.Количество();
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(КоличествоОбъектов);
Для Сч = 0 По КоличествоОбъектов - 1 Цикл
ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
Строка = КопияСтрокиДляОбработки.Получить(Сч);
СтруктураОбъекта = ирОбщий.ОбъектБДПоКлючуЛкс(Строка.Ссылка.Метаданные().ПолноеИмя(), Строка.Ссылка);
Если ВыводитьСообщения Тогда
ирОбщий.СообщитьЛкс("Обработка объекта " + Строка.Ссылка);
КонецЕсли;
//Здесь может быть написан произвольный алгоритм обработки объектов.
Если ТипНомера = Тип("Число") Тогда
Если Не НеИзменятьЧисловуюНумерацию Тогда
УстановитьЗначениеРеквизита(СтруктураОбъекта, ЧисловаяЧастьНомера, ИзменяемыйРеквизит);
Попытка
ирОбщий.ЗаписатьОбъектЛкс(СтруктураОбъекта.Методы);
Исключение
УстановитьЗначениеРеквизита(СтруктураОбъекта, МаксимальныйНомер - Сч, ИзменяемыйРеквизит);
ирОбщий.ЗаписатьОбъектЛкс(СтруктураОбъекта.Методы);
НеУникальныеНомера.Вставить(ЧисловаяЧастьНомера, Строка.Ссылка);
КонецПопытки;
ЧисловаяЧастьНомера = ЧисловаяЧастьНомера + Шаг;
КонецЕсли;
Продолжить;
КонецЕсли;
ЗаполнитьЗначенияСвойств(СтруктураЗначения, СтруктураОбъекта.Данные);
ТекНомер = СтруктураЗначения[ИзменяемыйРеквизит];
Если НеИзменятьЧисловуюНумерацию Тогда
СтроковаяЧастьНомера = вПолучитьПрефиксЧислоНомера(ТекНомер, ЧисловаяЧастьНомера);
Иначе
СтроковаяЧастьНомера = вПолучитьПрефиксЧислоНомера(ТекНомер);
КонецЕсли;
Если СпособОбработкиПрефиксов = 1 Тогда
НовыйНомер = СтроковаяЧастьНомера;
ИначеЕсли СпособОбработкиПрефиксов = 2 Тогда
НовыйНомер = СокрЛП(СтрокаПрефикса);
ИначеЕсли СпособОбработкиПрефиксов = 3 Тогда
НовыйНомер = СокрЛП(СтрокаПрефикса) + СтроковаяЧастьНомера;
ИначеЕсли СпособОбработкиПрефиксов = 4 Тогда
НовыйНомер = СтроковаяЧастьНомера + СокрЛП(СтрокаПрефикса);
ИначеЕсли СпособОбработкиПрефиксов = 5 Тогда
НовыйНомер = СтрЗаменить(СтроковаяЧастьНомера, СокрЛП(ЗаменяемаяПодстрока), СокрЛП(СтрокаПрефикса));
КонецЕсли;
Пока ДлинаНомера - СтрДлина(НовыйНомер) - СтрДлина(Формат(ЧисловаяЧастьНомера,"ЧГ=0")) > 0 Цикл
НовыйНомер = НовыйНомер + "0";
КонецЦикла;
НовыйНомер = НовыйНомер + Формат(ЧисловаяЧастьНомера, "ЧГ=0");
УстановитьЗначениеРеквизита(СтруктураОбъекта, НовыйНомер, ИзменяемыйРеквизит);
Попытка
ирОбщий.ЗаписатьОбъектЛкс(СтруктураОбъекта.Методы);
Исключение
УстановитьЗначениеРеквизита(СтруктураОбъекта, Формат(МаксимальныйНомер - Сч, "ЧГ=0"), ИзменяемыйРеквизит);
ирОбщий.ЗаписатьОбъектЛкс(СтруктураОбъекта.Методы);
НеУникальныеНомера.Вставить(НовыйНомер, Строка.Ссылка);
КонецПопытки;
Если Не НеИзменятьЧисловуюНумерацию Тогда
ЧисловаяЧастьНомера = ЧисловаяЧастьНомера + Шаг;
КонецЕсли;
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс(, Истина);
Для каждого НеуникальныйНомер Из НеУникальныеНомера Цикл
НовыйНомер = НеуникальныйНомер.Ключ;
СтруктураОбъекта = ирОбщий.ОбъектБДПоКлючуЛкс(НеуникальныйНомер.Значение.Метаданные().ПолноеИмя(), НеуникальныйНомер.Значение);
УстановитьЗначениеРеквизита(СтруктураОбъекта, НовыйНомер, ИзменяемыйРеквизит);
Попытка
ирОбщий.ЗаписатьОбъектЛкс(СтруктураОбъекта.Методы);
Исключение
ирОбщий.СообщитьЛкс("Повтор номера: " + НовыйНомер + " за пределами данной выборки!");
КонецПопытки;
КонецЦикла;
Исключение
Если ОбщаяТранзакция Тогда
ОтменитьТранзакцию();
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
Если ОбщаяТранзакция Тогда
ЗафиксироватьТранзакцию();
КонецЕсли;
ЭтотОбъект.мВопросНаОбновлениеСтрокДляОбработкиЗадавался = Ложь;
Результат = Новый Структура(мИменаВозвращаемыхСвойств);
ЗаполнитьЗначенияСвойств(Результат, ЭтотОбъект, мИменаВозвращаемыхСвойств);
Результат.Вставить("Результат", 0);
Результат.Вставить("СтрокиДляОбработки", СтрокиДляОбработки);
Возврат Результат;
КонецФункции
//////////////////////////////////////////////////////////////////////////////////
//// ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ
//ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла);
//ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf";
//ирПортативный #Если Клиент Тогда
//ирПортативный Контейнер = Новый Структура();
//ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер);
//ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
//ирПортативный ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля);
//ирПортативный ирПортативный.Открыть();
//ирПортативный КонецЕсли;
//ирПортативный #Иначе
//ирПортативный ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта
//ирПортативный #КонецЕсли
//ирПортативный ирОбщий = ирПортативный.ОбщийМодульЛкс("ирОбщий");
//ирПортативный ирКэш = ирПортативный.ОбщийМодульЛкс("ирКэш");
//ирПортативный ирСервер = ирПортативный.ОбщийМодульЛкс("ирСервер");
//ирПортативный ирКлиент = ирПортативный.ОбщийМодульЛкс("ирКлиент");
#Если Клиент Тогда
мПлатформа = ирКэш.Получить(); // Используется в форме ПроизвольныйАлгоритм, на сервере отключаем для ускорения многопоточной обработки
#КонецЕсли
ЭтотОбъект.НастройкиКомпоновки = Новый Соответствие;
ЭтотОбъект.АвтовВыбранныеПоляИзОтбора = Истина;
//ЭтотОбъект.ВыводитьСообщения = Истина;
ЭтотОбъект.ПообъектныеТранзакции = Истина;
ЭтотОбъект.ПропускатьОшибки = Истина;
ЭтотОбъект.РежимОбходаДанных = "Строки";
ЭтотОбъект.ОбластьПоиска = "";
ЭтотОбъект.КоличествоПотоков = 1;
ЭтотОбъект.КоличествоОбъектовВПорции = 10;
ЭтотОбъект.ВыполнятьНаСервере = ирОбщий.РежимОбъектыНаСервереПоУмолчаниюЛкс(Ложь);
мИмяКолонкиПометки = "_ПометкаСлужебная" + ирОбщий.СуффиксСлужебногоСвойстваЛкс();
мИмяКолонкиРезультатаОбработки = "_РезультатОбработки" + ирОбщий.СуффиксСлужебногоСвойстваЛкс();
мИмяКолонкиСообщенияОбработки = "_СообщенияОбработки" + ирОбщий.СуффиксСлужебногоСвойстваЛкс();
мИмяКолонкиОтсутствияСтрокиВБД = "_СтрокаОтсутствуетВБД" + ирОбщий.СуффиксСлужебногоСвойстваЛкс();
мИмяКолонкиПолногоИмениТаблицы = "_ПолноеИмяТаблицы" + ирОбщий.СуффиксСлужебногоСвойстваЛкс();
мИмяПоляЧислоДвиженийСкрытое = "_ЧислоДвиженийСкрытое" + ирОбщий.СуффиксСлужебногоСвойстваЛкс();
мВопросНаОбновлениеСтрокДляОбработкиЗадавался = Истина;
мИмяНастройкиПоУмолчанию = "Новая настройка";
мИменаВозвращаемыхСвойств = "мВопросНаОбновлениеСтрокДляОбработкиЗадавался";