mirror of
https://github.com/tormozit/RDT1C.git
synced 2025-12-17 13:14:11 +00:00
Подбор и обработка объектов
+В обработке "Изменить/добавить строку" добавить флажок "Принудительная запись"
*Улучшена обработка недоступных полей и таблиц из-за прав и функциональных опций
*Исправлено свежее воссоздание объектов сразу после удаления в обработке в обработке "Удалить" в непортативных вариантах с включенным флажком "Объекты на сервере"
Сравнение таблиц
+Добавлен флажок "Располагать сравниваемые ячейки вертикально"
Форма выбора метаданных
+Добавлена кнопка "Функциональные опции" для включения и заполнения одноименной колонки
Общее
*Восстановлена совместимость варианта Расширение с 8.3.10 и 8.3.11
*Исправлена свежая ошибка "Не установлен отбор по регистратору" при записи регистров в клиент-серверном режиме в непортативных вариантах с включенном флажком "Объекты на сервере"
*Исправлено открытие лишней пустой формы при выполнении команды "Список инструментов и общие настройки" в управляемом приложении
Конструктор запроса
*Исправлена ошибка при разборе инструкции INSERT
*Исправлено превращение значений параметров некоторых типов в строки
Консоль заданий
+Для списка фоновых заданий добавлена колонка "Ошибки ЖР", отражающая количество ошибок в журнале регистрации, и переключатель для ее заполнения
*Исправлено обнобновление отбора по текущему методу в режиме "По методу" при смене текущего метода
Управление службами серверов 1С
+Добавлена команда запуска консоли серверов с дополнением ее списка серверов
Консоль компоновки
*Исправлена очистка доступных полей компоновщика настроек в некоторых случаях
+Добавлена индикация наличия неактуальных полей в области и отборе строки условного оформления
Редактор объекта БД
*Отключена управляемая форма как менее функциональная, менее быстрая и не привносящая новых возможностей
Консоль запросов
*Исправлены мелкие ошибки в работе с ADODB, включая режим без использования компоненты GameWithFire
*Улучшен поиск итогов по ОБЩИЕ на закладке "Выборки итогов"
Анализ журнала регистрации
*Исправлена очистка не включенных элементов отбора при открытии с передачей отбора
Отложенная отладка
*В команде "Открыть объект для отладки" исправлен поиск объекта, сохраненного под другим пользователем в вариантах кроме Подсистема
367 lines
21 KiB
Plaintext
367 lines
21 KiB
Plaintext
//Перем ДополнительныеСвойства Экспорт;
|
||
//Перем ОбменДанными Экспорт;
|
||
Перем _СчитанныйСнимок Экспорт;
|
||
Перем _Тип Экспорт;
|
||
Перем _СсылкаНового Экспорт;
|
||
|
||
Процедура Конструктор(Объект) Экспорт
|
||
|
||
ЭтотОбъект.ДополнительныеСвойства = Объект.ДополнительныеСвойства;
|
||
ЭтотОбъект.ОбменДанными = ирОбщий.СтруктураОбменаДаннымиОбъектаЛкс(Объект);
|
||
ЭтотОбъект.Ссылка = Объект.Ссылка;
|
||
ЭтотОбъект._Тип = ТипЗнч(Объект);
|
||
Если Объект.Ссылка.Пустая() Тогда
|
||
ЭтотОбъект._СсылкаНового = Объект.ПолучитьСсылкуНового();
|
||
КонецЕсли;
|
||
|
||
ОбъектМД = Объект.Метаданные();
|
||
ЕстьЭтоГруппа = ирОбщий.ЛиМетаданныеОбъектаСГруппамиЛкс(ОбъектМД);
|
||
ПоляТаблицыБД = ирОбщий.ПолучитьПоляТаблицыМДЛкс(ОбъектМД,,,, Ложь);
|
||
Данные = Новый Структура;
|
||
ПоляШапки = Новый Массив;
|
||
|
||
// Пассивный оригинал расположенного ниже однострочного кода. Выполняйте изменения синхронно в обоих вариантах.
|
||
#Если Сервер И Не Сервер Тогда
|
||
Для Каждого СтрокаПоля Из ПоляТаблицыБД Цикл
|
||
Если Истина
|
||
И ЕстьЭтоГруппа
|
||
И СтрокаПоля.Метаданные <> Неопределено
|
||
И ОбъектМД.Реквизиты.Найти(СтрокаПоля.Метаданные.Имя) <> Неопределено
|
||
Тогда
|
||
МетаРеквизит = СтрокаПоля.Метаданные;
|
||
Если Ложь
|
||
Или (Истина
|
||
И Не Объект.ЭтоГруппа
|
||
И МетаРеквизит.Использование = Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляГруппы)
|
||
Или (Истина
|
||
И Объект.ЭтоГруппа
|
||
И МетаРеквизит.Использование = Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляЭлемента)
|
||
Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Данные.Вставить(СтрокаПоля.Имя);
|
||
Если СтрокаПоля.ТипЗначения.СодержитТип(Тип("ТаблицаЗначений")) Тогда
|
||
Данные.Вставить(СтрокаПоля.Имя, Объект[СтрокаПоля.Имя].Выгрузить());
|
||
Иначе
|
||
ПоляШапки.Добавить(СтрокаПоля.Имя);
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
#КонецЕсли
|
||
// Однострочный код использован для ускорения. Выше расположен оригинал. Выполняйте изменения синхронно в обоих вариантах. Преобразовано консолью кода из подсистемы "Инструменты разработчика" (http://devtool1c.ucoz.ru)
|
||
Для Каждого СтрокаПоля Из ПоляТаблицыБД Цикл Если Истина И ЕстьЭтоГруппа И СтрокаПоля.Метаданные <> Неопределено И ОбъектМД.Реквизиты.Найти(СтрокаПоля.Метаданные.Имя) <> Неопределено Тогда МетаРеквизит = СтрокаПоля.Метаданные; Если Ложь Или (Истина И Не Объект.ЭтоГруппа И МетаРеквизит.Использование = Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляГруппы) Или (Истина И Объект.ЭтоГруппа И МетаРеквизит.Использование = Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляЭлемента) Тогда Продолжить; КонецЕсли; КонецЕсли; Данные.Вставить(СтрокаПоля.Имя); Если СтрокаПоля.ТипЗначения.СодержитТип(Тип("ТаблицаЗначений")) Тогда Данные.Вставить(СтрокаПоля.Имя, Объект[СтрокаПоля.Имя].Выгрузить()); Иначе ПоляШапки.Добавить(СтрокаПоля.Имя); КонецЕсли; КонецЦикла;
|
||
|
||
ЗаполнитьЗначенияСвойств(Данные, Объект, ирОбщий.ПолучитьСтрокуСРазделителемИзМассиваЛкс(ПоляШапки));
|
||
ЭтотОбъект.Данные = Данные;
|
||
|
||
Если Не Объект.Модифицированность() И Не Объект.Ссылка.Пустая() Тогда
|
||
ЭтотОбъект._СчитанныйСнимок = Снимок(Истина);
|
||
Иначе
|
||
ЭтотОбъект._СчитанныйСнимок = ""; // Для экономии размера снимка
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
Функция Снимок(ТолькоДанные = Ложь, РезультатВВидеСтроки = Истина) Экспорт
|
||
|
||
СтруктураОбъекта = Новый Структура;
|
||
Если Не ТолькоДанные Тогда
|
||
СтруктураОбъекта.Вставить("ОбменДанными", ОбменДанными);
|
||
СтруктураОбъекта.Вставить("ДополнительныеСвойства", ДополнительныеСвойства);
|
||
СтруктураОбъекта.Вставить("_СчитанныйСнимок", _СчитанныйСнимок);
|
||
КонецЕсли;
|
||
СтруктураОбъекта.Вставить("_Тип", _Тип);
|
||
СтруктураОбъекта.Вставить("Данные", Данные);
|
||
СтруктураОбъекта.Вставить("Ссылка", Ссылка);
|
||
СтруктураОбъекта.Вставить("_СсылкаНового", _СсылкаНового);
|
||
Если РезультатВВидеСтроки Тогда
|
||
ЗаписьXML = ирОбщий.ОптимальныйПотоковыйПисательЛкс();
|
||
#Если Сервер И Не Сервер Тогда
|
||
ЗаписьXML = Новый ЗаписьXML;
|
||
#КонецЕсли
|
||
ЗаписьXML.УстановитьСтроку();
|
||
Попытка
|
||
Если ТипЗнч(ЗаписьXML) = Тип("ЗаписьXML") Тогда
|
||
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, СтруктураОбъекта, НазначениеТипаXML.Явное);
|
||
Иначе
|
||
СериализаторXDTO.ЗаписатьJSON(ЗаписьXML, СтруктураОбъекта, НазначениеТипаXML.Явное);
|
||
КонецЕсли;
|
||
Исключение
|
||
Если Не ТолькоДанные Тогда
|
||
ирОбщий.УдалитьМутабельныеЗначенияВСтруктуреЛкс(СтруктураОбъекта.ДополнительныеСвойства);
|
||
КонецЕсли;
|
||
Если ТипЗнч(ЗаписьXML) = Тип("ЗаписьXML") Тогда
|
||
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, СтруктураОбъекта, НазначениеТипаXML.Явное);
|
||
Иначе
|
||
СериализаторXDTO.ЗаписатьJSON(ЗаписьXML, СтруктураОбъекта, НазначениеТипаXML.Явное);
|
||
КонецЕсли;
|
||
КонецПопытки;
|
||
Результат = ЗаписьXML.Закрыть();
|
||
Иначе
|
||
Если Не ТолькоДанные Тогда
|
||
ирОбщий.УдалитьМутабельныеЗначенияВСтруктуреЛкс(СтруктураОбъекта.ДополнительныеСвойства);
|
||
КонецЕсли;
|
||
Результат = СтруктураОбъекта;
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Процедура ЗагрузитьСнимок(Снимок, ТолькоДанные = Ложь) Экспорт
|
||
|
||
Если ТолькоДанные Тогда
|
||
СтрокаЗагружаемыхСвойств = "_Тип, Ссылка";
|
||
Иначе
|
||
СтрокаЗагружаемыхСвойств = "_Тип, Ссылка, ОбменДанными, ДополнительныеСвойства, _СчитанныйСнимок";
|
||
КонецЕсли;
|
||
Если ТипЗнч(Снимок) = Тип("Строка") Тогда
|
||
ЧтениеXML = ирОбщий.ОптимальныйПотоковыйЧитательЛкс();
|
||
#Если Сервер И Не Сервер Тогда
|
||
ЧтениеXML = Новый ЧтениеXML;
|
||
#КонецЕсли
|
||
ЧтениеXML.УстановитьСтроку(Снимок);
|
||
Если ТипЗнч(ЧтениеXML) = Тип("ЧтениеXML") Тогда
|
||
СтруктураОбъекта = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
|
||
Иначе
|
||
СтруктураОбъекта = СериализаторXDTO.ПрочитатьJSON(ЧтениеXML);
|
||
КонецЕсли;
|
||
ЧтениеXML.Закрыть();
|
||
Иначе
|
||
СтруктураОбъекта = Снимок;
|
||
КонецЕсли;
|
||
ЗаполнитьЗначенияСвойств(ЭтотОбъект, СтруктураОбъекта, СтрокаЗагружаемыхСвойств);
|
||
Если Данные <> Неопределено Тогда
|
||
Данные.Очистить();
|
||
ирОбщий.СкопироватьУниверсальнуюКоллекциюЛкс(СтруктураОбъекта.Данные, Данные);
|
||
Иначе
|
||
ЭтотОбъект.Данные = СтруктураОбъекта.Данные;
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
Функция КлючОбъекта()
|
||
|
||
Результат = Данные.Ссылка;
|
||
Если Истина
|
||
И Не ЗначениеЗаполнено(Результат)
|
||
И Данные.Свойство("ЭтоГруппа")
|
||
И Данные.ЭтоГруппа
|
||
Тогда
|
||
Результат = Истина;
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ОбъектБД(ВосстановитьДанные = Истина) Экспорт
|
||
|
||
КлючОбъекта = КлючОбъекта();
|
||
ПолноеИмяТаблицы = ирОбщий.ПолучитьИмяТаблицыИзМетаданныхЛкс(Метаданные.НайтиПоТипу(_Тип));
|
||
|
||
//Если ВосстановитьДанные И ЗначениеЗаполнено(Ссылка) Тогда
|
||
// // Здесь происходит обращение к БД через ПрочитатьXML() и оно похоже дольше чем ПолучитьОбъект()
|
||
// Результат = ирОбщий.СоздатьСсылочныйОбъектПоМетаданнымЛкс(Метаданные.НайтиПоТипу(_Тип),, Ссылка.УникальныйИдентификатор());
|
||
//Иначе
|
||
// Здесь происходит чтение из БД через ПолучитьОбъект()
|
||
Результат = ирОбщий.ОбъектБДПоКлючуЛкс(ПолноеИмяТаблицы, КлючОбъекта,, Ложь, Ложь).Данные;
|
||
//КонецЕсли;
|
||
|
||
Если ДополнительныеСвойства <> Неопределено Тогда
|
||
ирОбщий.СкопироватьУниверсальнуюКоллекциюЛкс(ДополнительныеСвойства, Результат.ДополнительныеСвойства);
|
||
КонецЕсли;
|
||
ирОбщий.ВосстановитьСтруктуруОбменаДаннымиОбъектаЛкс(Результат, ОбменДанными);
|
||
Если ВосстановитьДанные Тогда
|
||
Если Результат.Ссылка.Пустая() И ЗначениеЗаполнено(_СсылкаНового) Тогда
|
||
Результат.УстановитьСсылкуНового(_СсылкаНового);
|
||
КонецЕсли;
|
||
ЗаполнитьЗначенияСвойств(Результат, Данные);
|
||
СтруктураТЧ = ирОбщий.ПолучитьТабличныеЧастиОбъектаЛкс(Результат);
|
||
Для Каждого КлючИЗначение Из СтруктураТЧ Цикл
|
||
Результат[КлючИЗначение.Ключ].Загрузить(Данные[КлючИЗначение.Ключ]);
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьСсылкуНового() Экспорт
|
||
Возврат _СсылкаНового;
|
||
КонецФункции
|
||
|
||
Функция Модифицированность() Экспорт
|
||
|
||
Результат = _СчитанныйСнимок <> Снимок(Истина);
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ЭтоНовый() Экспорт
|
||
|
||
Результат = Данные.Ссылка.Пустая();
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьКартуМаршрута() Экспорт
|
||
|
||
ОбъектБД = ОбъектБД();
|
||
Результат = ОбъектБД.ПолучитьКартуМаршрута();
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Процедура Прочитать(НаСервере = Истина) Экспорт
|
||
|
||
Если НаСервере Тогда
|
||
Снимок = Снимок(Истина, Ложь);
|
||
ирСервер.ПрочитатьОбъектЧерезИмитаторЛкс(Снимок, ТипЗнч(ЭтотОбъект));
|
||
ЗагрузитьСнимок(Снимок, Истина);
|
||
//ЭтотОбъект._СчитанныйСнимок = Снимок;
|
||
ЭтотОбъект._СчитанныйСнимок = Снимок(Истина);
|
||
Иначе
|
||
ОбъектБД = ОбъектБД();
|
||
ОбъектБД.Прочитать();
|
||
Конструктор(ОбъектБД);
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
Функция Скопировать(НаСервере = Истина) Экспорт
|
||
|
||
Если НаСервере Тогда
|
||
Снимок = Снимок();
|
||
Снимок = ирСервер.СкопироватьОбъектЧерезИмитаторЛкс(Снимок, ТипЗнч(ЭтотОбъект));
|
||
ИмитаторКопия = Новый (ТипЗнч(ЭтотОбъект));
|
||
ИмитаторКопия.ЗагрузитьСнимок(Снимок);
|
||
Результат = Новый Структура;
|
||
Результат.Вставить("Методы", ИмитаторКопия);
|
||
Результат.Вставить("Данные", ИмитаторКопия.Данные);
|
||
Иначе
|
||
ОбъектБД = ОбъектБД();
|
||
ОбъектКопия = ОбъектБД.Скопировать();
|
||
ИмитаторКопия = Новый (ТипЗнч(ЭтотОбъект));
|
||
ИмитаторКопия.Конструктор(ОбъектКопия);
|
||
Результат = ИмитаторКопия;
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ДанныеВСтрокуXMLЧерезXDTO(Знач ИспользоватьXDTO = Истина, ВызыватьИсключение = Истина) Экспорт
|
||
|
||
#Если Не Сервер Тогда
|
||
Снимок = Снимок(Истина);
|
||
Результат = ирСервер.ОбъектБДИзИмитатораВСтрокуXMLЛкс(Снимок, ТипЗнч(ЭтотОбъект), ИспользоватьXDTO, ВызыватьИсключение);
|
||
#Иначе
|
||
ОбъектБД = ОбъектБД();
|
||
Результат = ирОбщий.СохранитьОбъектВВидеСтрокиXMLЛкс(ОбъектБД, ИспользоватьXDTO, , ВызыватьИсключение);
|
||
#КонецЕсли
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Процедура ДанныеИзСтрокиXMLЧерезXDTO(СтрокаXML, Знач ИспользоватьXDTO = Истина, СообщатьОбОшибках = Истина) Экспорт
|
||
|
||
#Если Не Сервер Тогда
|
||
Снимок = ирСервер.ОбъектБДВИмитаторИзСтрокиXML(СтрокаXML, ТипЗнч(ЭтотОбъект), ИспользоватьXDTO, СообщатьОбОшибках);
|
||
ЗагрузитьСнимок(Снимок);
|
||
#Иначе
|
||
ОбъектБД = ирОбщий.ВосстановитьОбъектИзСтрокиXMLЛкс(СтрокаXML,, ИспользоватьXDTO, СообщатьОбОшибках);
|
||
Конструктор(ОбъектБД);
|
||
#КонецЕсли
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура Записать(РежимЗаписи = Неопределено, РежимПроведения = Неопределено) Экспорт
|
||
|
||
#Если Не Сервер Тогда
|
||
Снимок = Снимок(, Ложь);
|
||
ирСервер.ЗаписатьОбъектXMLЛкс(Снимок,, РежимЗаписи, РежимПроведения,,, ТипЗнч(ЭтотОбъект));
|
||
ЗагрузитьСнимок(Снимок);
|
||
#Иначе
|
||
ОбъектБД = ОбъектБД();
|
||
Если РежимЗаписи <> Неопределено Тогда
|
||
ОбъектБД.Записать(РежимЗаписи, РежимПроведения);
|
||
Иначе
|
||
ОбъектБД.Записать();
|
||
КонецЕсли;
|
||
Конструктор(ОбъектБД);
|
||
#КонецЕсли
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура УстановитьПометкуУдаления(НоваяПометка) Экспорт
|
||
|
||
Если НоваяПометка = Данные.ПометкаУдаления Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
#Если Не Сервер Тогда
|
||
Снимок = Снимок();
|
||
ирСервер.ЗаписатьОбъектXMLЛкс(Снимок,, "ПометкаУдаления",,,, ТипЗнч(ЭтотОбъект));
|
||
ЗагрузитьСнимок(Снимок);
|
||
#Иначе
|
||
ОбъектБД = ОбъектБД(Ложь);
|
||
//Если ОбъектБД.Модифицированность() Тогда
|
||
// ОбъектБД.Прочитать(); // Сделать: Надо найти и убрать установку модифированности
|
||
//КонецЕсли;
|
||
ОбъектБД.УстановитьПометкуУдаления(НоваяПометка);
|
||
Конструктор(ОбъектБД);
|
||
#КонецЕсли
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура Удалить() Экспорт
|
||
|
||
#Если Не Сервер Тогда
|
||
Снимок = Снимок();
|
||
ирСервер.УдалитьОбъектXMLЛкс(Снимок,, ТипЗнч(ЭтотОбъект));
|
||
#Иначе
|
||
ОбъектБД = ОбъектБД(Ложь);
|
||
ОбъектБД.Удалить();
|
||
ЭтотОбъект._СчитанныйСнимок = Снимок(Истина); // Сбросим модифицированность
|
||
#КонецЕсли
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
|
||
|
||
ОбъектБД = ОбъектБД();
|
||
Отказ = Не ОбъектБД.ПроверитьЗаполнение();
|
||
Конструктор(ОбъектБД);
|
||
|
||
КонецПроцедуры
|
||
|
||
Функция ЗаменитьИдентификаторОбъекта() Экспорт
|
||
|
||
|
||
|
||
КонецФункции
|
||
|
||
Процедура УстановитьНовыйКод(ПрефиксКода) Экспорт
|
||
|
||
#Если Не Сервер Тогда
|
||
Снимок = Снимок();
|
||
ирСервер.УстановитьНовыйКодXMLЛкс(Снимок, ПрефиксКода, ТипЗнч(ЭтотОбъект));
|
||
ЗагрузитьСнимок(Снимок);
|
||
#Иначе
|
||
ОбъектБД = ОбъектБД();
|
||
ОбъектБД.УстановитьНовыйКод(ПрефиксКода);
|
||
Конструктор(ОбъектБД);
|
||
#КонецЕсли
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура УстановитьНовыйНомер(ПрефиксНомера) Экспорт
|
||
|
||
#Если Не Сервер Тогда
|
||
Снимок = Снимок();
|
||
ирСервер.УстановитьНовыйКодXMLЛкс(Снимок, ПрефиксНомера, ТипЗнч(ЭтотОбъект));
|
||
ЗагрузитьСнимок(Снимок);
|
||
#Иначе
|
||
ОбъектБД = ОбъектБД();
|
||
ОбъектБД.УстановитьНовыйКод(ПрефиксНомера);
|
||
Конструктор(ОбъектБД);
|
||
#КонецЕсли
|
||
|
||
КонецПроцедуры
|