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