Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
132 changes: 99 additions & 33 deletions plugins/Данные/Данные/Ext/ObjectModule.bsl
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,14 @@

Функция НачатьСоздание(ИмяМетаданных) Экспорт

ПараметрыМетаданныхСлужебный = ПараметрыМетаданныхИзПолногоИмени(ИмяМетаданных);
НовыйОбъект = ВнешниеОбработки.Создать("Данные");

ИмяМетаданныхСлужебный = ИмяМетаданных;
ПараметрыОбъектаСлужебный = Новый Структура;
НовыйОбъект.ПараметрыМетаданныхСлужебный = ПараметрыМетаданныхИзПолногоИмени(ИмяМетаданных);

Возврат ЭтотОбъект;
НовыйОбъект.ИмяМетаданныхСлужебный = ИмяМетаданных;
НовыйОбъект.ПараметрыОбъектаСлужебный = Новый Структура;

Возврат НовыйОбъект;

КонецФункции

Expand Down Expand Up @@ -73,7 +75,7 @@

Функция ТаблицаЗначений(ИмяТЧ) Экспорт

Если НЕ ПараметрыОбъектаСлужебный.Свойство("ТЧ_"+ИмяТЧ) Тогда
Если НЕ ПараметрыОбъектаСлужебный.Свойство(ИмяРеквизитаТабличнойЧасти(ИмяТЧ)) Тогда
ВызватьИсключение "Не найдена табличная часть "+ИмяТЧ;
КонецЕсли;

Expand All @@ -87,7 +89,7 @@

КонецЦикла;

Для каждого СтрокаТЧ Из ПараметрыОбъектаСлужебный["ТЧ_" + ИмяТЧ] Цикл
Для каждого СтрокаТЧ Из ПараметрыОбъектаСлужебный[ИмяРеквизитаТабличнойЧасти(ИмяТЧ)] Цикл
ЗаполнитьЗначенияСвойств(Результат.Добавить(), СтрокаТЧ);
КонецЦикла;

Expand Down Expand Up @@ -125,7 +127,7 @@

Функция Создать(НеЗаписывать = Ложь) Экспорт

Возврат СоздатьОбъект(Неопределено, ПараметрыОбъектаСлужебный, НеЗаписывать);;
Возврат СоздатьОбъект(Неопределено, ПараметрыОбъектаСлужебный, НеЗаписывать);

КонецФункции

Expand Down Expand Up @@ -237,7 +239,7 @@
,Параметр8 = Неопределено
,Параметр9 = Неопределено) Экспорт

ИмяПараметраТЧ = "ТЧ_"+ИмяТабличнойЧасти;
ИмяПараметраТЧ = ИмяРеквизитаТабличнойЧасти(ИмяТабличнойЧасти);
Если НЕ ПараметрыОбъекта.Свойство(ИмяПараметраТЧ) Тогда
ПараметрыОбъекта.Вставить(ИмяПараметраТЧ, Новый Массив);
КонецЕсли;
Expand Down Expand Up @@ -329,7 +331,7 @@

//{ СлужебныеПроцедурыФункции

Функция СоздатьОбъект(ИмяМетаданных, Параметры = Неопределено, НеЗаписывать)
Функция СоздатьОбъект(ИмяМетаданных, Параметры, НеЗаписывать)

Перем Объект;

Expand All @@ -348,16 +350,15 @@
Объект = СоздатьЭлементСправочникаСлужебный(ИмяМетаданных, Параметры);
ИначеЕсли ТипМетаданных = "Документы" Тогда
Объект = СоздатьДокументСлужебный(ИмяМетаданных, Параметры);
ИначеЕсли ТипМетаданных = "РегистрыНакопления" Тогда
Объект = СоздатьНаборЗаписейСлужебный(ТипМетаданных, ИмяМетаданных, Параметры);
ИначеЕсли ТипМетаданных = "РегистрыСведений" Тогда
ИначеЕсли ТипМетаданных = "РегистрыНакопления"
Или ТипМетаданных = "РегистрыСведений" Тогда
Объект = СоздатьНаборЗаписейСлужебный(ТипМетаданных, ИмяМетаданных, Параметры);
ИначеЕсли ТипМетаданных = "ПланыВидовХарактеристик" Тогда
Объект = СоздатьПланВидовХарактеристикСлужебный(ИмяМетаданных, Параметры);
ИначеЕсли ТипМетаданных = "ТаблицаЗначений" Тогда
Объект = ТаблицаЗначений("");
Иначе
ВызватьИсключение "Тип метаданных " + ТипМетаданных + " не поддреживается";
ВызватьИсключение "Тип метаданных " + ТипМетаданных + " не поддерживается";
КонецЕсли;

Если НЕ НеЗаписывать И ТипМетаданных <> "ТаблицаЗначений" Тогда
Expand Down Expand Up @@ -411,19 +412,42 @@

КонецПроцедуры

Процедура ЗаполнитьТабличнуюЧасть(Документ, ОбработчикиСтрокТЧ, ПараметрыДокумента)
Процедура ЗаполнитьТабличнуюЧасть(Документ, ОбработчикиСтрокТЧ, ПараметрыДокумента, МетаданноеОбъекта)

Перем ИмяТЧ, КлючЗначение, НоваяСтрока, Параметр, ПредставлениеСтроки;

Для каждого Параметр Из ПараметрыДокумента Цикл

Если Лев(Параметр.Ключ, 3) <> "ТЧ_" Тогда
Если Не ЭтоРеквизитТабличнойЧасти(Параметр.Ключ) Тогда
Продолжить;
КонецЕсли;

ИмяТЧ = СтрЗаменить(Параметр.Ключ, "ТЧ_", "");
ИмяТЧ = Сред(Параметр.Ключ, СтрДлина(ПрефиксТабличнойЧастиВИмени()) + 1);
//ИмяТЧ = СтрЗаменить(Параметр.Ключ, ПрефиксТабличнойЧастиВИмени(), "");
Для каждого ПредставлениеСтроки Из ПараметрыДокумента[Параметр.Ключ] Цикл
НоваяСтрока = Документ[ИмяТЧ].Добавить();
МетаТЧ = МетаданноеОбъекта.ТабличныеЧасти.Найти(ИмяТЧ);

Для Каждого КлючЗначение Из ПредставлениеСтроки Цикл

ИмяРеквизитаТЧ = КлючЗначение.Ключ;
Если МетаТЧ.Реквизиты.Найти(ИмяРеквизитаТЧ) <> Неопределено Тогда
Продолжить;
КонецЕсли;
Нашли = Ложь;
Для каждого МетаРеквизит Из МетаТЧ.СтандартныеРеквизиты Цикл
Если МетаРеквизит = ИмяРеквизитаТЧ Тогда
Нашли = Истина;
Прервать;
КонецЕсли;
КонецЦикла;

Если Не Нашли Тогда
ВызватьИсключение СтрШаблон("Поле %2 табличной части %1 объекта не обнаружено", ИмяТЧ, ИмяРеквизитаТЧ);

КонецЕсли;

КонецЦикла;
ЗаполнитьЗначенияСвойств(НоваяСтрока, ПредставлениеСтроки);

Если ОбработчикиСтрокТЧ <> Неопределено Тогда
Expand All @@ -441,32 +465,55 @@

КонецПроцедуры

Процедура ВыполнитьАвтозаполнениеПараметров(Знач ТипОбъекта, ИмяСправочника, ПараметрыЭлемента)
Функция ВыполнитьАвтозаполнениеПараметров(Знач ТипОбъекта, Знач ВидОбъекта, ПараметрыЭлемента)

ТипОбъекта = ИмяМетаданныхПолномеИмя()[ТипОбъекта];

МетаданноеОбъекта = Метаданные[ТипОбъекта][ВидОбъекта];
Реквизиты = МетаданноеОбъекта.Реквизиты;

Для каждого КлючЗначение Из ПараметрыЭлемента Цикл

ИмяРеквизита = КлючЗначение.Ключ;
Если ЭтоРеквизитТабличнойЧасти(ИмяРеквизита) Тогда
Продолжить;
КонецЕсли;

Реквизит = РеквизитМетаданногоПоИмени(Реквизиты, ИмяРеквизита);

Если КлючЗначение.Значение = Неопределено Тогда
ПараметрыЭлемента[КлючЗначение.Ключ] = ЗначениеРеквизитаПоТипу(ТипОбъекта, ИмяСправочника, КлючЗначение.Ключ);
ПараметрыЭлемента[ИмяРеквизита] = ЗначениеРеквизитаПоТипу(Реквизит);
КонецЕсли;
КонецЦикла;

КонецПроцедуры

Функция ЗначениеРеквизитаПоТипу(ТипОбъекта, ИмяОбъекта, ИмяРеквизита)
Возврат МетаданноеОбъекта;
КонецФункции

Реквизиты = Метаданные[ТипОбъекта][ИмяОбъекта].Реквизиты;
Функция РеквизитМетаданногоПоИмени(Знач Реквизиты, Знач ИмяРеквизита)

Перем Реквизит;

Реквизит = Реквизиты.Найти(ИмяРеквизита);
Если Реквизит = Неопределено Тогда
ВызватьИсключение СтрШаблон("Поле объекта не обнаружено (%1)", ИмяРеквизита);
КонецЕсли;

Типы = Реквизиты[ИмяРеквизита].Тип.Типы();
Возврат Реквизит;

КонецФункции

Функция ЗначениеРеквизитаПоТипу(Реквизит)

Типы = Реквизит.Тип.Типы();
Если Типы.Количество() > 1 Тогда
ВызватьИсключение "Автозаполнение не поддерживается в составных типах";
КонецЕсли;

Тип = Метаданные.НайтиПоТипу(Типы[0]).ПолноеИмя();
ЗначениеРеквизита = СоздатьОбъект(Тип,,Ложь);
ЗначениеРеквизита = СоздатьОбъект(Тип, Неопределено, Ложь);
Возврат ЗначениеРеквизита.Ссылка;

КонецФункции
КонецФункции

Функция ИмяМетаданныхПолномеИмя()

Expand Down Expand Up @@ -521,7 +568,8 @@
КонецФункции // Тестирвоание_ВыполнитьМетодМодуля()

// { Helpers
Функция РазложитьСтрокуВМассивПодстрок(Знач Строка, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено, СокращатьНепечатаемыеСимволы = Ложь) Экспорт
Функция РазложитьСтрокуВМассивПодстрок(Знач Строка, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено,
СокращатьНепечатаемыеСимволы = Ложь) Экспорт

Результат = Новый Массив;

Expand Down Expand Up @@ -592,7 +640,7 @@
ПараметрыЭлемента = Новый Структура;
КонецЕсли;

ВыполнитьАвтозаполнениеПараметров("Справочник", ИмяСправочника, ПараметрыЭлемента);
МетаданноеОбъекта = ВыполнитьАвтозаполнениеПараметров("Справочник", ИмяСправочника, ПараметрыЭлемента);

Если ПараметрыЭлемента.Свойство("ЭтоГруппа") И ПараметрыЭлемента.ЭтоГруппа Тогда
Элемент = Справочники[ИмяСправочника].СоздатьГруппу();
Expand All @@ -604,7 +652,7 @@

ЗаполнитьЗначенияСвойств(Элемент, ПараметрыЭлемента);

ЗаполнитьТабличнуюЧасть(Элемент, Неопределено, ПараметрыЭлемента);
ЗаполнитьТабличнуюЧасть(Элемент, Неопределено, ПараметрыЭлемента, МетаданноеОбъекта);

Элемент.ОбменДанными.Загрузка = Истина;
Элемент.УстановитьСсылкуНового(Справочники[ИмяСправочника].ПолучитьСсылку(Новый УникальныйИдентификатор));
Expand All @@ -619,15 +667,15 @@
ПараметрыДокумента = Новый Структура;
КонецЕсли;

ВыполнитьАвтозаполнениеПараметров("Документ", ИмяДокумента, ПараметрыДокумента);
МетаданноеОбъекта = ВыполнитьАвтозаполнениеПараметров("Документ", ИмяДокумента, ПараметрыДокумента);

Документ = Документы[ИмяДокумента].СоздатьДокумент();
Документ.Дата = ТекущаяДата();
Документ.Дата = ТекущаяДатаСеанса();
Документ.УстановитьНовыйНомер();

ЗаполнитьЗначенияСвойств(Документ, ПараметрыДокумента);

ЗаполнитьТабличнуюЧасть(Документ, ОбработчикиСтрокТЧ, ПараметрыДокумента);
ЗаполнитьТабличнуюЧасть(Документ, ОбработчикиСтрокТЧ, ПараметрыДокумента, МетаданноеОбъекта);

Документ.ОбменДанными.Загрузка = Истина;
Документ.УстановитьСсылкуНового(Документы[ИмяДокумента].ПолучитьСсылку(Новый УникальныйИдентификатор));
Expand Down Expand Up @@ -683,7 +731,7 @@
ПараметрыЭлемента = Новый Структура;
КонецЕсли;

ВыполнитьАвтозаполнениеПараметров("ПланВидовХарактеристик", ИмяМетаданных, ПараметрыЭлемента);
МетаданноеОбъекта = ВыполнитьАвтозаполнениеПараметров("ПланВидовХарактеристик", ИмяМетаданных, ПараметрыЭлемента);

Если ПараметрыЭлемента.Свойство("ЭтоГруппа") И ПараметрыЭлемента.ЭтоГруппа Тогда
Элемент = ПланыВидовХарактеристик[ИмяМетаданных].СоздатьГруппу();
Expand All @@ -695,7 +743,7 @@

ЗаполнитьЗначенияСвойств(Элемент, ПараметрыЭлемента);

ЗаполнитьТабличнуюЧасть(Элемент, Неопределено, ПараметрыЭлемента);
ЗаполнитьТабличнуюЧасть(Элемент, Неопределено, ПараметрыЭлемента, МетаданноеОбъекта);

Элемент.ОбменДанными.Загрузка = Истина;
Элемент.УстановитьСсылкуНового(ПланыВидовХарактеристик[ИмяМетаданных].ПолучитьСсылку(Новый УникальныйИдентификатор));
Expand All @@ -713,6 +761,24 @@

КонецПроцедуры

Функция ПрефиксТабличнойЧастиВИмени()

Возврат "ТЧ_";

КонецФункции

Функция ИмяРеквизитаТабличнойЧасти(Знач Имя)

Возврат ПрефиксТабличнойЧастиВИмени() + Имя;

КонецФункции

Функция ЭтоРеквизитТабличнойЧасти(Знач Имя)

Возврат Лев(Имя, 3) = ПрефиксТабличнойЧастиВИмени();
КонецФункции


// } СлужебныеПроцедуры

ИмяМетаданныхСлужебный = "";
Expand Down
Loading