RDT1C/DataProcessors/ирПодборИОбработкаОбъектов/Ext/ObjectModule.bsl
Администратор 35d9c2c450 Консоль кода
*Исправлено обновление генерируемой внешней обработки на сервере на 8.3.11+
        +Добавлено игнорирование мутабельных значений параметров выхода в режиме выполнения через внешнюю обработку
    Подбор и обработка объектов
        +Реализована поддержка флажка "Выполнять на сервере" для обработки выгрузки данных
    Выгрузка/загрузка данных через файл
        +Добавлен флажок "Выполнять на сервере"
    Форма просмотра текста
        +Добавлена команда "Открыть через JSON"
    Редактор изменений на узлах
        +В команде добавления регистрации выборочных объектов метаданных ввод списка объектов переделан на собственную форму списка значений
    Управление COM классами 1С
        +Добавлен флажок "Показывать результаты" для отображения окон результатов регистрации
        *Исправлена некорректное выполнение регистрации radmin.dll
    Консоль заданий
        *Исправлена некритичная ошибка обновления списка фоновых заданий в процессе редактирования расписания регламентного задания
        +Реализовано автоматическое отключение автоматического обновления списка регламентных заданий при низкой производительности
2019-05-05 21:25:02 +03:00

1060 lines
81 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

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

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