RDT1C/DataProcessors/ирПодборИОбработкаОбъектов/Ext/ObjectModule.bsl
Администратор dcf1ca5dd0 Сравнение таблиц
*Исправлено в некоторых случаях потеря отрицательных чисел в колонках разницы числовых колонок
        *Исправлена ошибка сравнения при наличии колонок с пустым синонимом
        +Добавлен индикатор неуникальных строк для каждой таблицы
        *Оптимизирован алгоритм сравнения таблиц
    Консоль кода
        *Исправлена ошибка вычисления выражений с параметрами командой "Вычислить"
        *Исправлена генерация внешней обработки алгоритма при незаполненной настройке "Каталог объектов для отладки" для выполнения на клиенте в вариантах Расширение и Подсистема
    Табличный документ
        +Добавлена кнопка "Открыть в Excel" позволяющая быстро открыть табличный документ в EXCEL
        +Теперь при сохранении файла с расширением не mxl его сразу предлагается открыть в сопоставленном приложении
        +Добавлен флажок "Устанавливать "Содержит значение"" включенный по умолчанию для борьбы с проблемой обрезания лидирующих нулей при редактировании в EXCEL
    Таблица значений
        +Добавлена кнопка "Неуникальные" для обозначения неуникальных строк
        +Добавлена команда "Передать"/"в таблицу БД"
    Консоль запросов
        +Для табличного поля результата добавлена кнопка "Неуникальные" для обозначения неуникальных строк
        *Исправлена ошибка выполнения пакетного запроса с удалением временной таблицы в режиме дерева запроса
    Динамический список
        *Исправлено позиционирование на нужной строке независимого регистра сведений при открытии с параметрами
        +Добавлены команды "Сравнить" и "Вывести строки"
    Общее
        +Добавлен общий модуль ирИнтерфейсныйДляВстраивания для слабой интеграции с конфигурацией
        *Команда "Вывести в табличный документ" везде переименована в "Вывести строки"
        В команде "Вывести строки"
            +добавлена полная поддержка динамических списков
            *Исправлен вывод идентификаторов без типов
            *Исправлено долгое открытие в портативном варианте
            *Добавлен флажок "В таблицу значений"
        *Исправлена свежая невозможность ввода битых ссылок в полях ввода
    Консоль компоновки
        +В панели настроек компоновки добавлена закладка "Наборы данных" отображающая внешние наборы данных
    Редактор пользователей
        +В форме пользователя для списка ролей добавлена возможность множественного выделения и установки/снятия пометок
    Загрузка табличных данных
        +Добавлены флажки для отключения оперативного вывода ошибок
        +Добавлена команда "Удалить успешные строки из таблицы значений
        *Устранено требование заполненности всех полей ключа при поиске строки БД
        +Реализовано кэширование поисков ссылок при конвертации значений
        +Добавлен индикатор неуникальных строк таблицы значений на закладке "Сопоставление колонок"
        +Добавлены поля количества не успешно и успешно загруженных строк
        *Исправлена загрузка групп
        *Недоступные для изменения поля таблицы БД теперь нельзя помечать
    Адаптация расширения
        *Исправлена некорректное выполнение адаптации
    Редактор объекта БД
        *Исправлено обновление заголовков некоторых страниц основной панели
    Менеджер табличного поля
        +Добавлено много универсальных команд
    Анализ техножурнала
        *Исправлено некорректное чтение свойств lka, lkp, lkpid, lksrc
2017-08-06 17:52:46 +03:00

706 lines
50 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

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

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