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