RDT1C/DataProcessors/ирПодборИОбработкаОбъектов/Ext/ObjectModule.bsl
Администратор b16256e209 .
2020-08-19 01:22:57 +03:00

1113 lines
90 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.

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