1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2025-02-13 19:42:02 +02:00

Поддержка клиента

Удалил лишнее
This commit is contained in:
alkoleft 2023-08-14 01:58:05 +03:00
parent cb3b8e04f7
commit c837d71da2
9 changed files with 256 additions and 970 deletions

View File

@ -34,59 +34,6 @@
КонецФункции
// Читает табличный документ в массив структур
//
// Параметры:
// ТабличныйДокумент - ТабличныйДокумент - Исходный табличный документ
// НомерКолонки - Число - Номер строки таблицы, с которой следует начать считывание
// НомерСтроки - Число - Номер колонки таблицы, с которой следует начать считывание
// Возвращаемое значение:
// Массив из Структура - Данные табличного документа
Функция СтруктурыТабличногоДокумента(ТабличныйДокумент, Знач НомерКолонки = 1, Знач НомерСтроки = 1) Экспорт
МассивДанных = Новый Массив;
СведенияКолонок = Новый Массив;
ЗаменяемыеСтроки = ЮТТестовыеДанныеСлужебный.ПодстрокиДляЗаменыВИменахСвойств();
ЗначениеКолонки = ТабличныйДокумент.Область(НомерСтроки, НомерКолонки).Текст;
Пока ЗначениеЗаполнено(ЗначениеКолонки) Цикл
Для Каждого Замена Из ЗаменяемыеСтроки Цикл
ПодстрокаПоиска = Замена.Ключ;
ПодстрокаЗамены = Замена.Значение;
ИмяКолонки = СтрЗаменить(ЗначениеКолонки, ПодстрокаПоиска, ПодстрокаЗамены);
КонецЦикла;
Сведения = Новый Структура("НомерКолонки, ИмяКолонки", НомерКолонки, ИмяКолонки);
СведенияКолонок.Добавить(Сведения);
НомерКолонки = НомерКолонки + 1;
ЗначениеКолонки = ТабличныйДокумент.Область(НомерСтроки, НомерКолонки).Текст;
КонецЦикла;
НомерСтроки = НомерСтроки + 1;
Пока ЕстьЗначенияВСтроке(ТабличныйДокумент, НомерСтроки, СведенияКолонок) Цикл
Структура = Новый Структура;
Для Каждого Сведения Из СведенияКолонок Цикл
Значение = СокрЛП(ТабличныйДокумент.Область(НомерСтроки, Сведения.НомерКолонки).Текст);
Структура.Вставить(Сведения.ИмяКолонки, Значение);
КонецЦикла;
МассивДанных.Добавить(Структура);
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
Возврат МассивДанных;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции

View File

@ -500,7 +500,9 @@
// Возвращаемое значение:
// ОбщийМодуль - Подражатель
Функция Подражатель() Экспорт
Возврат ЮТПодражательСлужебный.Инициализировать();
КонецФункции
// Возвращает таблицу значений из табличного документа
@ -514,17 +516,24 @@
// * ОбменДаннымиЗагрузка - Булево - По умолчанию - Истина
// Возвращаемое значение:
// см. ЮТТестовыеДанные_ТаблицыЗначений.ТипизированнаяТаблицаЗначений
Функция ТаблицаЗначенийИзТабличногоДокумента(ТабличныйДокумент,
Функция ТипизированныеДанныеТабличногоДокумента(ТабличныйДокумент,
ОписанияТипов,
КэшЗначений = Неопределено,
ЗаменяемыеЗначения = Неопределено,
ПараметрыСозданияОбъектов = Неопределено) Экспорт
Возврат ЮТТестовыеДанныеСлужебный.ТаблицаЗначенийИзТабличногоДокумента(ТабличныйДокумент,
ОписанияТипов,
КэшЗначений,
ЗаменяемыеЗначения,
ПараметрыСозданияОбъектов);
#Если Сервер Тогда
ТаблицаЗначений = Истина;
#Иначе
ТаблицаЗначений = Ложь;
#КонецЕсли
Возврат ЮТТестовыеДанныеСлужебный.ТипизированныеДанныеТабличногоДокумента(ТабличныйДокумент,
ОписанияТипов,
КэшЗначений,
ЗаменяемыеЗначения,
ПараметрыСозданияОбъектов,
ТаблицаЗначений);
КонецФункции

View File

@ -18,111 +18,36 @@
#Область СлужебныйПрограммныйИнтерфейс
// Возвращает таблицу значений, заполненную из массива структур
//
// Параметры:
// Данные - Массив из Структура - Значения для преобразования в таблицу
// ОписанияТипов - Соответствие из Строка - Соответствие имен колонок таблицы к типам значений
// КэшЗначений - Соответствие из Произвольный - Соответствие для хранения создаваемых значений
// ЗаменяемыеЗначения - Соответствие из Строка - Значения, использующиеся для замены
// Параметры - см. ЮТТестовыеДанные_ТаблицыЗначений.ПараметрыЗаполненияТаблицыЗначений
// Возвращаемое значение:
// ТаблицаЗначений
Функция ТипизированнаяТаблицаЗначений(Данные,
ОписанияТипов,
КэшЗначений = Неопределено,
ЗаменяемыеЗначения = Неопределено,
Параметры = Неопределено) Экспорт
Функция ТипизированныеДанныеТабличногоДокумента(ТабличныйДокумент, ОписанияТипов, КэшЗначений, ЗаменяемыеЗначения, ПараметрыЗаполнения) Экспорт
Если Не ЗначениеЗаполнено(Данные) Тогда
Возврат Новый ТаблицаЗначений;
КонецЕсли;
ТабличныйДокумент = ТабличныйДокумент(ТабличныйДокумент);
ИменаКолонок = ЮТОбщий.ВыгрузитьЗначения(Данные[0], "Ключ");
Колонки = ОписаниеКолонок(ТабличныйДокумент, ОписанияТипов);
НедостающиеКолонки = НедостающиеКолонкиДанных(ИменаКолонок, ОписанияТипов);
Если ЗначениеЗаполнено(НедостающиеКолонки) Тогда
ТекстИсключения = "Отсутствуют данные для ожидаемых колонок: " + СтрСоединить(НедостающиеКолонки, ",");
ВызватьИсключение ТекстИсключения;
КонецЕсли;
ТаблицаЗначений = Новый ТаблицаЗначений();
Для Каждого ОписаниеКолонки Из Колонки Цикл
ТаблицаЗначений.Колонки.Добавить(ОписаниеКолонки.Имя, ОписаниеКолонки.ОписаниеТипа);
КонецЦикла;
Если ЗаменяемыеЗначения = Неопределено Тогда
ЗаменяемыеЗначения = Новый Соответствие;
КонецЕсли;
ПодготовитьПараметрыЗаполненияТаблицы(КэшЗначений, ЗаменяемыеЗначения, ПараметрыЗаполнения, Колонки);
ПараметрыСоздания = ПараметрыЗаполнения.СозданиеОбъектовМетаданных;
Если Параметры = Неопределено Тогда
Параметры = ПараметрыЗаполненияТаблицыЗначений();
КонецЕсли;
Выборка = ЮТПреобразованияСервер.ВыборкаИзТабличногоДокумента(ТабличныйДокумент);
ПараметрыСозданияОбъектовМетаданных = Параметры.СозданиеОбъектовМетаданных;
СведенияОбъектовМетаданных = СведенияОбъектовМетаданныхИзОписанийТипов(ИменаКолонок, ОписанияТипов);
СведенияОРеквизитахОбъектов = СведенияРеквизитовОбъектовМетаданных(ИменаКолонок, СведенияОбъектовМетаданных);
ТаблицаЗначений = ИнициализированнаяТаблицаЗначений(ИменаКолонок, ОписанияТипов);
ИнициализироватьКэшЗначенийОбъектовМетаданных(КэшЗначений, ИменаКолонок, СведенияОбъектовМетаданных);
Для Каждого Источник Из Данные Цикл
Пока Выборка.Следующий() Цикл
НоваяСтрока = ТаблицаЗначений.Добавить();
Строка = ТаблицаЗначений.Добавить();
Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
Для Каждого ОписаниеКолонки Из Колонки Цикл
ИмяКолонки = Колонка.Имя;
ОписаниеТипа = Колонка.ТипЗначения;
ЗначениеПредставления = Выборка[ОписаниеКолонки.Индекс];
ЗначениеИсточника = Источник[ИмяКолонки];
Если Не ЗначениеЗаполнено(ЗначениеИсточника) Тогда
Если ПустаяСтрока(ЗначениеПредставления) Тогда
Продолжить;
КонецЕсли;
СведенияОбъекта = СведенияОбъектовМетаданных.Получить(ИмяКолонки);
ЗаменяемоеЗначение = ЗаменяемыеЗначения.Получить(ЗначениеИсточника);
Если ЗаменяемоеЗначение <> Неопределено Тогда
ЗначениеТаблицы = ЗаменяемоеЗначение;
ИначеЕсли СведенияОбъекта <> Неопределено Тогда
Менеджер = СведенияОбъекта.Менеджер;
ОписаниеОбъектаМетаданных = СведенияОбъекта.ОписаниеОбъектаМетаданных;
ЗначениеТаблицы = КэшЗначений[Менеджер].Получить(ЗначениеИсточника);
Если ЗначениеТаблицы = Неопределено Тогда
ЗначенияРеквизитовОбъекта = ПолучитьЗначенияРеквизитовПоУмолчанию(ОписаниеОбъектаМетаданных, ЗначениеИсточника);
СведенияРеквизитовОбъекта = СведенияОРеквизитахОбъектов.Получить(ИмяКолонки);
Если СведенияРеквизитовОбъекта <> Неопределено Тогда
ДополнитьЗначенияРеквизитовОбъекта(ЗначенияРеквизитовОбъекта,
СведенияРеквизитовОбъекта,
Источник,
КэшЗначений,
ЗаменяемыеЗначения,
ПараметрыСозданияОбъектовМетаданных);
КонецЕсли;
ЗначениеТаблицы = ЗначениеОбъектаМетаданных(ОписаниеОбъектаМетаданных,
Менеджер,
ЗначенияРеквизитовОбъекта,
ПараметрыСозданияОбъектовМетаданных);
КэшЗначений[Менеджер].Вставить(ЗначениеИсточника, ЗначениеТаблицы);
КонецЕсли;
Иначе
ЗначениеТаблицы = ПривестиЗначение(ОписаниеТипа, ЗначениеИсточника);
КонецЕсли;
НоваяСтрока[ИмяКолонки] = ЗначениеТаблицы;
Значение = ЗачениеЯчейки(Выборка, ЗначениеПредставления, ОписаниеКолонки, ЗаменяемыеЗначения, КэшЗначений, ПараметрыСоздания);
Строка[ОписаниеКолонки.Имя] = Значение;
КонецЦикла;
@ -132,413 +57,242 @@
КонецФункции
// Возвращает фиксированную структуру параметров для заполнения таблицы значений
// Параметры:
// СозданиеОбъектовМетаданных - Структура:
// * ФикцияОбязательныхПолей - Булево
// * ОбменДаннымиЗагрузка - Булево
// Возвращаемое значение:
// ФиксированнаяСтруктура:
// * СозданиеОбъектовМетаданных - ФиксированнаяСтруктура:
// * ФикцияОбязательныхПолей - Булево
// * ОбменДаннымиЗагрузка - Булево
Функция ПараметрыЗаполненияТаблицыЗначений(СозданиеОбъектовМетаданных = Неопределено) Экспорт
ФикцияОбязательныхПолей = Ложь;
ОбменДаннымиЗагрузка = Истина;
Если ТипЗнч(СозданиеОбъектовМетаданных) = Тип("Структура") Тогда
ФикцияОбязательныхПолей = ЮТОбщий.ЗначениеСтруктуры(СозданиеОбъектовМетаданных, "ФикцияОбязательныхПолей", ФикцияОбязательныхПолей);
ОбменДаннымиЗагрузка = ЮТОбщий.ЗначениеСтруктуры(СозданиеОбъектовМетаданных, "ОбменДаннымиЗагрузка", ОбменДаннымиЗагрузка);
КонецЕсли;
СозданиеОбъектовМетаданных = Новый Структура;
СозданиеОбъектовМетаданных.Вставить("ФикцияОбязательныхПолей", ФикцияОбязательныхПолей);
СозданиеОбъектовМетаданных.Вставить("ОбменДаннымиЗагрузка", ОбменДаннымиЗагрузка);
Параметры = Новый Структура;
Параметры.Вставить("СозданиеОбъектовМетаданных", СозданиеОбъектовМетаданных);
Возврат Новый ФиксированнаяСтруктура(Параметры);
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция НедостающиеКолонкиДанных(ИменаКолонок, ОписанияТипов)
Функция ТабличныйДокумент(Знач ТабличныйДокумент)
НедостающиеКолонки = Новый Массив;
ОжидаемыеКолонки = ЮТОбщий.ВыгрузитьЗначения(ОписанияТипов, "Ключ");
Для Каждого ИмяКолонки Из ОжидаемыеКолонки Цикл
Если ИменаКолонок.Найти(ИмяКолонки) = Неопределено Тогда
НедостающиеКолонки.Добавить(ИмяКолонки);
КонецЕсли;
КонецЦикла;
ТипПараметра = ТипЗнч(ТабличныйДокумент);
Возврат НедостающиеКолонки;
КонецФункции
Функция СведенияОбъектовМетаданныхИзОписанийТипов(ИменаКолонок, ОписанияТипов)
МенеджерыЗначений = Новый Соответствие;
Для Каждого ИмяКолонки Из ИменаКолонок Цикл
ОписаниеТипа = ОписанияТипов.Получить(ИмяКолонки);
ОписаниеОбъектаМетаданных = ОписаниеОбъектаМетаданныхПоОписаниюТипа(ОписаниеТипа);
Если ОписаниеОбъектаМетаданных = Неопределено Тогда
Продолжить;
КонецЕсли;
Менеджер = МенеджерОбъектаИзОписанияОбъектаМетаданных(ОписаниеОбъектаМетаданных);
Сведения = Новый Структура;
Сведения.Вставить("Менеджер", Менеджер);
Сведения.Вставить("ОписаниеОбъектаМетаданных", ОписаниеОбъектаМетаданных);
МенеджерыЗначений.Вставить(ИмяКолонки, Сведения);
КонецЦикла;
Возврат МенеджерыЗначений;
КонецФункции
Функция ОписаниеОбъектаМетаданныхПоОписаниюТипа(ОписаниеТипа)
ОписаниеОбъектаМетаданных = Неопределено;
Тип = ТипИзОписанияТипа(ОписаниеТипа);
Если Тип = Неопределено Тогда
Возврат ОписаниеОбъектаМетаданных;
КонецЕсли;
ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип);
Если ОбъектМетаданных = Неопределено Тогда
Возврат ОписаниеОбъектаМетаданных;
КонецЕсли;
Если Метаданные.Перечисления.Содержит(ОбъектМетаданных) Тогда
ОписаниеОбъектаМетаданных = Новый Структура;
ОписаниеОбъектаМетаданных.Вставить("Имя", ОбъектМетаданных.Имя);
Если ТипПараметра = Тип("ТабличныйДокумент") Тогда
Возврат ТабличныйДокумент;
ИначеЕсли ТипПараметра = Тип("Строка") Тогда
Возврат ЮТОбщийВызовСервера.Макет(ТабличныйДокумент);
Иначе
ОписаниеОбъектаМетаданных = ЮтМетаданные.ОписаниеОбъектаМетаданных(ОбъектМетаданных.ПолноеИмя());
ВызватьИсключение ЮТОбщий.НеподдерживаемыйПараметрМетода("ЮТТестовыеДанныеВызовСервера.ТабличныйДокумент", ТабличныйДокумент);
КонецЕсли;
Возврат ОписаниеОбъектаМетаданных;
КонецФункции
Функция ТипИзОписанияТипа(ОписаниеТипа)
Функция ОписаниеКолонок(ТабличныйДокумент, ОписанияТипов)
Если ОписаниеТипа = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Колонки = Новый Массив();
ВсеКолонки = Новый Массив();
Если ТипЗнч(ОписаниеТипа) <> Тип("ОписаниеТипов") Или Не ЗначениеЗаполнено(ОписаниеТипа.Типы()) Тогда
ВызватьИсключение ЮТОбщий.НеподдерживаемыйПараметрМетода("ЮТТестовыеДанные_ТаблицыЗначений.ТипИзОписанияТипа", ОписаниеТипа);
КонецЕсли;
ОсновныеКолонки = Новый Структура();
Возврат ОписаниеТипа.Типы()[0];
КонецФункции
Функция МенеджерОбъектаИзОписанияОбъектаМетаданных(ОписаниеОбъектаМетаданных)
Если Метаданные.Перечисления.Найти(ОписаниеОбъектаМетаданных.Имя) <> Неопределено Тогда
Для Инд = 1 По ТабличныйДокумент.ШиринаТаблицы Цикл
Менеджер = Новый ("ПеречислениеМенеджер." + ОписаниеОбъектаМетаданных.Имя);
ИмяКолонки = ТабличныйДокумент.Область(1, Инд).Текст;
Иначе
Если ПустаяСтрока(ИмяКолонки) Тогда
Прервать;
КонецЕсли;
ОписаниеТипа = ОписаниеОбъектаМетаданных.ОписаниеТипа;
ЧастиИмени = СтрРазделить(ИмяКолонки, ".");
ИмяТипаМенеджера = СтрШаблон("%1Менеджер.%2", ОписаниеТипа.Имя, ОписаниеОбъектаМетаданных.Имя);
Менеджер = Новый (ИмяТипаМенеджера);
КонецЕсли;
Возврат Менеджер;
КонецФункции
Функция СведенияРеквизитовОбъектовМетаданных(ИменаКолонок, СведенияОбъектовМетаданных)
ПодстрокиДляЗамены = ЮТТестовыеДанныеСлужебный.ПодстрокиДляЗаменыВИменахСвойств();
ПодстрокаЗаменыТочки = ПодстрокиДляЗамены.Получить(".");
СведенияРеквизитовОбъекта = Новый Соответствие;
Для Каждого ИмяКолонкиОбъекта Из ИменаКолонок Цикл
СведенияОбъектаМетаданных = СведенияОбъектовМетаданных.Получить(ИмяКолонкиОбъекта);
Если СведенияОбъектаМетаданных = Неопределено Тогда
Если ОписанияТипов[ЧастиИмени[0]] = Неопределено Тогда
Продолжить;
КонецЕсли;
ОписаниеОбъектаМетаданных = СведенияОбъектаМетаданных.ОписаниеОбъектаМетаданных;
ЭтоВложенныйРеквизит = ЧастиИмени.Количество() = 2;
ЭтоОсновнойРеквизит = ЧастиИмени.Количество() = 1;
МассивСведений = Новый Массив;
ОписаниеКолонки = Новый Структура;
ОписаниеКолонки.Вставить("Индекс", Инд - 1);
Для Каждого ИмяКолонки Из ИменаКолонок Цикл
Если ЭтоОсновнойРеквизит Тогда
ОписаниеКолонки.Вставить("Имя", ИмяКолонки);
Иначе
ОписаниеКолонки.Вставить("Имя", ЧастиИмени[1]);
КонецЕсли;
ОписаниеКолонки.Вставить("ОписаниеТипа", ОписанияТипов[ИмяКолонки]);
Если ОписаниеКолонки.ОписаниеТипа = Неопределено И ЭтоВложенныйРеквизит Тогда
Если СтрНайти(ИмяКолонки, ИмяКолонкиОбъекта) = 0 Или СтрНайти(ИмяКолонки, ПодстрокаЗаменыТочки) = 0 Тогда
Продолжить;
КонецЕсли;
Родитель = ОсновныеКолонки[ЧастиИмени[0]];
Реквизиты = Родитель.ОписаниеОбъектаМетаданных.Реквизиты;
Массив = СтрРазделить(ИмяКолонки, ПодстрокаЗаменыТочки, Ложь);
Если Массив.Количество() <> 2 Тогда
Продолжить;
Если Реквизиты.Свойство(ЧастиИмени[1]) Тогда
ОписаниеКолонки.ОписаниеТипа = Реквизиты[ЧастиИмени[1]].Тип;
Иначе
РеквизитОбъекта = Неопределено;
ОписаниеОбъектаМетаданных.Реквизиты.Свойство(Массив[1], РеквизитОбъекта);
Если РеквизитОбъекта <> Неопределено Тогда
Сведения = Новый Структура;
Сведения.Вставить("Идентификатор", ИмяКолонки);
Сведения.Вставить("ИмяРеквизита", РеквизитОбъекта.Имя);
Сведения.Вставить("ОписаниеТипа", РеквизитОбъекта.Тип);
МассивСведений.Добавить(Сведения);
КонецЕсли;
Продолжить; // TODO
КонецЕсли;
КонецЦикла;
Если ЗначениеЗаполнено(МассивСведений) Тогда
СведенияРеквизитовОбъекта.Вставить(ИмяКолонкиОбъекта, МассивСведений);
КонецЕсли;
КонецЦикла;
Возврат СведенияРеквизитовОбъекта;
КонецФункции
Функция ИнициализированнаяТаблицаЗначений(ИменаКолонок, ОписанияТипов)
ТаблицаЗначений = Новый ТаблицаЗначений;
Для Каждого ИмяКолонки Из ИменаКолонок Цикл
ОписаниеКолонки.Вставить("ТипЗначения", ОписаниеКолонки.ОписаниеТипа.Типы()[0]);
ОписаниеКолонки.Вставить("Ссылочный", ЮТТипыДанныхСлужебный.ЭтоСсылочныйТип(ОписаниеКолонки.ТипЗначения));
ОписаниеКолонки.Вставить("ДополнительныеРеквизиты", Новый Массив());
ОписаниеКолонки.Вставить("Составное", Ложь);
ОписаниеКолонки.Вставить("Менеджер", Неопределено);
ОписаниеКолонки.Вставить("ОписаниеОбъектаМетаданных", Неопределено);
ОписаниеКолонки.Вставить("ЭтоПеречисление", Ложь);
ОписаниеКолонки.Вставить("ЭтоЧисло", ОписаниеКолонки.ТипЗначения = Тип("Число"));
ОписаниеКолонки.Вставить("ЭтоДата", ОписаниеКолонки.ТипЗначения = Тип("Дата"));
ОписаниеТипаКолонки = ОписанияТипов.Получить(ИмяКолонки);
Если ОписаниеТипаКолонки = Неопределено Тогда
Продолжить;
Если ОписаниеКолонки.Ссылочный Тогда
ОписаниеКолонки.ОписаниеОбъектаМетаданных = ЮТМетаданные.ОписаниеОбъектаМетаданных(ОписаниеКолонки.ТипЗначения);
ОписаниеКолонки.ЭтоПеречисление = СтрСравнить(ОписаниеКолонки.ОписаниеОбъектаМетаданных.ОписаниеТипа.Имя, "Перечисление") = 0; // TODO
ОписаниеКолонки.Менеджер = ЮТОбщий.Менеджер(ОписаниеКолонки.ТипЗначения);
КонецЕсли;
ТаблицаЗначений.Колонки.Добавить(ИмяКолонки, ОписаниеТипаКолонки);
ВсеКолонки.Добавить(ОписаниеКолонки);
КонецЦикла;
Возврат ТаблицаЗначений;
КонецФункции
Процедура ИнициализироватьКэшЗначенийОбъектовМетаданных(КэшЗначений, ИменаКолонок, СведенияОбъектовМетаданных)
Если Не ЗначениеЗаполнено(КэшЗначений) Тогда
КэшЗначений = Новый Соответствие;
КонецЕсли;
Для Каждого ИмяКолонки Из ИменаКолонок Цикл
СведенияОбъекта = СведенияОбъектовМетаданных.Получить(ИмяКолонки);
Если СведенияОбъекта = Неопределено Тогда
Продолжить;
КонецЕсли;
Менеджер = СведенияОбъекта.Менеджер;
Если КэшЗначений.Получить(Менеджер) = Неопределено Тогда
КэшЗначений.Вставить(Менеджер, Новый Соответствие);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ПолучитьЗначенияРеквизитовПоУмолчанию(ОписаниеОбъектаМетаданных, Значение)
ЗначенияРеквизитовПоУмолчанию = Новый Структура;
Если Метаданные.Перечисления.Найти(ОписаниеОбъектаМетаданных.Имя) <> Неопределено Тогда
ЗначенияРеквизитовПоУмолчанию.Вставить("Значение", Значение);
ИначеЕсли ОписаниеОбъектаМетаданных.ОписаниеТипа.Имя = "Справочник" Тогда
ИмяРеквизита = "Наименование";
Если ОписаниеОбъектаМетаданных.Реквизиты.Свойство(ИмяРеквизита) = Неопределено Тогда
ИмяРеквизита = "Код";
КонецЕсли;
ЗначенияРеквизитовПоУмолчанию.Вставить(ИмяРеквизита, Значение);
КонецЕсли;
Возврат ЗначенияРеквизитовПоУмолчанию;
КонецФункции
Функция ДополнитьЗначенияРеквизитовОбъекта(Результат,
СведенияРеквизитов,
Источник,
КешЗначений,
ЗаменяемыеЗначения,
ПараметрыСозданияОбъектовМетаданных)
Для Каждого Сведения Из СведенияРеквизитов Цикл
ЗначениеИсточника = Источник[Сведения.Идентификатор];
Если ЗначениеЗаполнено(ЗначениеИсточника) Тогда
Если ЧастиИмени.Количество() = 1 Тогда
ЗаменяемоеЗначение = ЗаменяемыеЗначения.Получить(ЗначениеИсточника);
ОписаниеОбъектаМетаданных = ОписаниеОбъектаМетаданныхПоОписаниюТипа(Сведения.ОписаниеТипа);
Колонки.Добавить(ОписаниеКолонки);
ОсновныеКолонки.Вставить(ИмяКолонки, ОписаниеКолонки);
Если ЗаменяемоеЗначение <> Неопределено Тогда
ЗначениеРеквизита = ЗаменяемоеЗначение;
ИначеЕсли ОписаниеОбъектаМетаданных = Неопределено Тогда
ЗначениеРеквизита = Сведения.ОписаниеТипа.ПривестиЗначение(ЗначениеИсточника);
Иначе
Менеджер = МенеджерОбъектаИзОписанияОбъектаМетаданных(ОписаниеОбъектаМетаданных);
ЗначенияМенеджера = КешЗначений[Менеджер];
Если ЗначенияМенеджера = Неопределено Тогда
ЗначенияМенеджера = Новый Соответствие;
КешЗначений.Вставить(Менеджер, ЗначенияМенеджера);
КонецЕсли;
ЗначениеРеквизита = ЗначенияМенеджера.Получить(ЗначениеИсточника);
Если ЗначениеРеквизита = Неопределено Тогда
ЗначенияРеквизитовОбъекта = ПолучитьЗначенияРеквизитовПоУмолчанию(
ОписаниеОбъектаМетаданных,
ЗначениеИсточника
);
ЗначениеРеквизита = ЗначениеОбъектаМетаданных(
ОписаниеОбъектаМетаданных,
Менеджер,
ЗначенияРеквизитовОбъекта,
ПараметрыСозданияОбъектовМетаданных
);
КешЗначений[Менеджер].Вставить(ЗначениеИсточника, ЗначениеРеквизита);
КонецЕсли;
КонецЕсли;
ИначеЕсли ЭтоВложенныйРеквизит Тогда
Родитель = ОсновныеКолонки[ЧастиИмени[0]];
Родитель.ДополнительныеРеквизиты.Добавить(ОписаниеКолонки);
Иначе
ЗначениеРеквизита = Неопределено;
ВызватьИсключение СтрШаблон("Недопустимо использовать несколько точек в имени колонки, `%1`", ИмяКолонки);
КонецЕсли;
Результат.Вставить(Сведения.ИмяРеквизита, ЗначениеРеквизита);
КонецЦикла;
Возврат Результат;
Для Каждого ОписаниеКолонки Из ВсеКолонки Цикл
ОписаниеКолонки.Составное = ЗначениеЗаполнено(ОписаниеКолонки.ДополнительныеРеквизиты);
КонецЦикла;
Возврат Колонки;
КонецФункции
Функция ЗначениеОбъектаМетаданных(ОписаниеОбъектаМетаданных, Менеджер, ЗначенияРеквизитов, Параметры)
Функция ЗачениеЯчейки(СтрокаДанных, ЗначениеПредставления, ОписаниеКолонки, ЗаменяемыеЗначения, КэшЗначений, ПараметрыСоздания)
Если Метаданные.Перечисления.Найти(ОписаниеОбъектаМетаданных.Имя) <> Неопределено Тогда
Значение = Менеджер[ЗначенияРеквизитов.Значение];
Иначе
КонструкторОбъекта = ЮТест.Данные().КонструкторОбъекта(Менеджер);
Для Каждого ДанныеЗначения Из ЗначенияРеквизитов Цикл
КонструкторОбъекта.Установить(ДанныеЗначения.Ключ, ДанныеЗначения.Значение);
КонецЦикла;
Если Параметры.ФикцияОбязательныхПолей Тогда
КонструкторОбъекта.ФикцияОбязательныхПолей();
Значение = ЗаменяемыеЗначения[ЗначениеПредставления];
КэшироватьЗначение = Значение = Неопределено И ОписаниеКолонки.Менеджер <> Неопределено;
Если КэшироватьЗначение Тогда
Если КэшЗначений[ОписаниеКолонки.Менеджер] = Неопределено Тогда
КэшЗначений.Вставить(ОписаниеКолонки.Менеджер, Новый Соответствие());
Иначе
Значение = КэшЗначений[ОписаниеКолонки.Менеджер][ЗначениеПредставления];
КонецЕсли;
Значение = КонструкторОбъекта.Записать(, Параметры.ОбменДаннымиЗагрузка);
КонецЕсли;
Если Значение <> Неопределено Тогда
Возврат Значение;
КонецЕсли;
Если ОписаниеКолонки.Составное Тогда
ЗначенияРеквизитов = ЗначенияРеквизитов(СтрокаДанных, ОписаниеКолонки, ЗаменяемыеЗначения, КэшЗначений, ПараметрыСоздания);
Значение = ПривестиЗначениеКолонки(ОписаниеКолонки, ЗначениеПредставления, ЗначенияРеквизитов, ПараметрыСоздания);
Иначе
Значение = ПривестиЗначениеКолонки(ОписаниеКолонки, ЗначениеПредставления, Неопределено, ПараметрыСоздания);
КонецЕсли;
Если КэшироватьЗначение Тогда
КэшЗначений[ОписаниеКолонки.Менеджер].Вставить(ЗначениеПредставления, Значение);
КонецЕсли;
Возврат Значение;
КонецФункции
Функция ПривестиЗначение(ОписаниеТипа, Значение)
Процедура ПодготовитьПараметрыЗаполненияТаблицы(КэшЗначений, ЗаменяемыеЗначения, ПараметрыЗаполнения, Колонки)
Если ОписаниеТипа.СодержитТип(Тип("Дата")) Тогда
Результат = ПривестиЗначениеКДате(ОписаниеТипа, Значение);
ИначеЕсли ОписаниеТипа.СодержитТип(Тип("Число")) Тогда
Результат = ПривестиЗначениеКЧислу(ОписаниеТипа, Значение);
Иначе
Результат = ОписаниеТипа.ПривестиЗначение(Значение);
Если ЗаменяемыеЗначения = Неопределено Тогда
ЗаменяемыеЗначения = Новый Соответствие;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ПривестиЗначениеКДате(ОписаниеТипа, Знач Значение)
Результат = ОписаниеТипа.ПривестиЗначение(Значение);
Если ЗначениеЗаполнено(Результат) Тогда
Возврат Результат;
Если Не ЗначениеЗаполнено(КэшЗначений) Тогда
КэшЗначений = Новый Соответствие;
КонецЕсли;
МассивРазделителей = Новый Массив;
МассивРазделителей.Добавить(".");
МассивРазделителей.Добавить("/");
МассивРазделителей.Добавить("-");
СтрокаДаты = Неопределено;
Для Каждого Разделитель Из МассивРазделителей Цикл
Для Каждого Колонка Из Колонки Цикл
Если ЗначениеЗаполнено(СтрокаДаты) Тогда
Прервать;
Если НЕ Колонка.Ссылочный Тогда
Продолжить;
КонецЕсли;
МассивЧастейДат = СтрРазделить(Значение, Разделитель);
Если МассивЧастейДат.Количество() = 3 Тогда
Если СтрДлина(МассивЧастейДат[2]) = 4 Тогда
СтрокаДаты = МассивЧастейДат[2] + МассивЧастейДат[1] + МассивЧастейДат[0];
ИначеЕсли СтрДлина(МассивЧастейДат[0]) = 4 Тогда
СтрокаДаты = МассивЧастейДат[0] + МассивЧастейДат[1] + МассивЧастейДат[2];
Иначе
СтрокаДаты = "20" + МассивЧастейДат[2] + МассивЧастейДат[1] + МассивЧастейДат[0];
КонецЕсли;
Если КэшЗначений[Колонка.Менеджер] = Неопределено Тогда
КэшЗначений.Вставить(Колонка.Менеджер, Новый Соответствие);
КонецЕсли;
КонецЦикла;
Результат = ОписаниеТипа.ПривестиЗначение(СтрокаДаты);
КонецПроцедуры
Функция ЗначенияРеквизитов(СтрокаТаблицы, ОписаниеКолонки, ЗаменяемыеЗначения, КэшЗначений, Параметры)
Возврат Результат;
ЗначенияРеквизитов = Новый Структура();
Для Каждого ОписаниеВложеннойКолонки Из ОписаниеКолонки.ДополнительныеРеквизиты Цикл
ПредставлениеЗначения = СтрокаТаблицы[ОписаниеВложеннойКолонки.Индекс];
Если ПустаяСтрока(ПредставлениеЗначения) Тогда
Продолжить;
КонецЕсли;
Значение = ЗачениеЯчейки(СтрокаТаблицы,
ПредставлениеЗначения,
ОписаниеВложеннойКолонки,
ЗаменяемыеЗначения,
КэшЗначений,
Параметры);
ЗначенияРеквизитов.Вставить(ОписаниеВложеннойКолонки.Имя, Значение);
КонецЦикла;
ОписаниеОбъектаМетаданных = ОписаниеКолонки.ОписаниеОбъектаМетаданных;
Если ОписаниеОбъектаМетаданных.ОписаниеТипа.Имя = "Справочник" Тогда
ИмяРеквизита = "Наименование";
Если ОписаниеОбъектаМетаданных.Реквизиты.Свойство(ИмяРеквизита) = Неопределено Тогда
ИмяРеквизита = "Код";
КонецЕсли;
ЗначенияРеквизитов.Вставить(ИмяРеквизита, СтрокаТаблицы[ОписаниеКолонки.Индекс]);
КонецЕсли;
Возврат ЗначенияРеквизитов;
КонецФункции
Функция ПривестиЗначениеКЧислу(ОписаниеТипа, Знач Значение)
Функция ПривестиЗначениеКолонки(ОписаниеКолонки, ЗначениеПредставления, ЗначенияРеквизитов, ПараметрыЗаписи)
Результат = ОписаниеТипа.ПривестиЗначение(Значение);
Если ЗначениеЗаполнено(Результат) Тогда
Возврат Результат;
Если ОписаниеКолонки.ЭтоПеречисление Тогда
Значение = ОписаниеКолонки.Менеджер[ЗначениеПредставления];
ИначеЕсли ОписаниеКолонки.Ссылочный Тогда
Значение = СоздатьНовуюЗапись(ОписаниеКолонки, ЗначенияРеквизитов, ПараметрыЗаписи);
ИначеЕсли ОписаниеКолонки.ЭтоДата Тогда
Значение = ЮТПреобразования.ПривестиЗначениеКДате(ОписаниеКолонки.ОписаниеТипа, ЗначениеПредставления);
ИначеЕсли ОписаниеКолонки.ЭтоЧисло Тогда
Значение = ЮТПреобразования.ПривестиЗначениеКЧислу(ОписаниеКолонки.ОписаниеТипа, ЗначениеПредставления);
Иначе
Значение = ОписаниеКолонки.ОписаниеТипа.ПривестиЗначение(ЗначениеПредставления);
КонецЕсли;
Значение = СтрЗаменить(Значение, " ", "");
Результат = ОписаниеТипа.ПривестиЗначение(Значение);
Возврат Результат;
Возврат Значение;
КонецФункции
Функция СоздатьНовуюЗапись(ОписаниеКолонки, ЗначенияРеквизитов, ПараметрыЗаписи)
Конструктор = ЮТТестовыеДанные.КонструкторОбъекта(ОписаниеКолонки.Менеджер);
Если ЗначениеЗаполнено(ЗначенияРеквизитов) Тогда
Для Каждого ДанныеЗначения Из ЗначенияРеквизитов Цикл
Конструктор.Установить(ДанныеЗначения.Ключ, ДанныеЗначения.Значение);
КонецЦикла;
КонецЕсли;
Если ПараметрыЗаписи.ФикцияОбязательныхПолей Тогда
Конструктор.ФикцияОбязательныхПолей();
КонецЕсли;
Возврат Конструктор.Записать(, ПараметрыЗаписи.ПараметрыЗаписи.ОбменДаннымиЗагрузка);
КонецФункции
#КонецОбласти

View File

@ -170,122 +170,35 @@
КонецФункции
Функция ТаблицаЗначенийИзТабличногоДокумента(Знач ТабличныйДокумент,
Знач ОписанияТипов,
Знач КэшЗначений,
Знач ЗаменяемыеЗначения,
Знач ПараметрыЗаполнения) Экспорт
Функция ТипизированныеДанныеТабличногоДокумента(Знач ТабличныйДокумент,
Знач ОписанияТипов,
Знач КэшЗначений,
Знач ЗаменяемыеЗначения,
Знач ПараметрыЗаполнения,
Знач ТаблицаЗначений) Экспорт
ТабличныйДокумент = ТабличныйДокумент(ТабличныйДокумент);
Таблица = ЮТТестовыеДанные_ТаблицыЗначений.ТипизированныеДанныеТабличногоДокумента(ТабличныйДокумент,
ОписанияТипов,
КэшЗначений,
ЗаменяемыеЗначения,
ПараметрыЗаполнения);
Колонки = ОписаниеКолонок(ТабличныйДокумент, ОписанияТипов);
ТаблицаЗначений = Новый ТаблицаЗначений();
Для Каждого ОписаниеКолонки Из Колонки Цикл
ТаблицаЗначений.Колонки.Добавить(ОписаниеКолонки.Имя, ОписаниеКолонки.ОписаниеТипа);
КонецЦикла;
ПодготовитьПараметрыЗаполненияТаблицы(КэшЗначений, ЗаменяемыеЗначения, ПараметрыЗаполнения, Колонки);
ПараметрыСоздания = ПараметрыЗаполнения.СозданиеОбъектовМетаданных;
Выборка = ЮТПреобразованияСервер.ВыборкаИзТабличногоДокумента(ТабличныйДокумент);
Пока Выборка.Следующий() Цикл
Строка = ТаблицаЗначений.Добавить();
Для Каждого ОписаниеКолонки Из Колонки Цикл
ЗначениеПредставления = Выборка[ОписаниеКолонки.Индекс];
Если ПустаяСтрока(ЗначениеПредставления) Тогда
Продолжить;
КонецЕсли;
Значение = ЗаменяемыеЗначения[ЗначениеПредставления];
КэшироватьЗначение = Значение = Неопределено И ОписаниеКолонки.Менеджер <> Неопределено;
Если КэшироватьЗначение Тогда
Значение = КэшЗначений[ОписаниеКолонки.Менеджер][ЗначениеПредставления];
КэшироватьЗначение = Значение <> Неопределено;
КонецЕсли;
Если ОписаниеКолонки.Составное Тогда
ЗначенияРеквизитов = ЗначенияРеквизитов(Выборка, ОписаниеКолонки, ПараметрыСоздания);
Значение = ПривестиЗначениеКолонки(ОписаниеКолонки, ЗначениеПредставления, ЗначенияРеквизитов, ПараметрыСоздания);
Иначе
Значение = ПривестиЗначениеКолонки(ОписаниеКолонки, ЗначениеПредставления, Неопределено, ПараметрыСоздания);
КонецЕсли;
Если КэшироватьЗначение Тогда
КэшЗначений[ОписаниеКолонки.Менеджер].Вставить(ЗначениеПредставления, Значение);
КонецЕсли;
Строка[ОписаниеКолонки.Имя] = Значение;
КонецЦикла;
КонецЦикла;
// ИсточникДанных = СтруктурыТабличногоДокумента(ТабличныйДокумент);
// ТаблицаЗначений = ЮТТестовыеДанные_ТаблицыЗначений.ТипизированнаяТаблицаЗначений(ИсточникДанных,
// ОписанияТипов,
// КэшЗначений,
// ЗаменяемыеЗначения,
// ПараметрыЗаполнения);
//
Возврат ТаблицаЗначений;
КонецФункции
Функция ЗачениеЯчейки(Параметры)
Значение = ЗаменяемыеЗначения[ЗначениеПредставления];
КэшироватьЗначение = Значение = Неопределено И ОписаниеКолонки.Менеджер <> Неопределено;
Если КэшироватьЗначение Тогда
Значение = КэшЗначений[ОписаниеКолонки.Менеджер][ЗначениеПредставления];
КэшироватьЗначение = Значение <> Неопределено;
КонецЕсли;
Если ОписаниеКолонки.Составное Тогда
ЗначенияРеквизитов = ЗначенияРеквизитов(Выборка, ОписаниеКолонки, ПараметрыСоздания);
Значение = ПривестиЗначениеКолонки(ОписаниеКолонки, ЗначениеПредставления, ЗначенияРеквизитов, ПараметрыСоздания);
Иначе
Значение = ПривестиЗначениеКолонки(ОписаниеКолонки, ЗначениеПредставления, Неопределено, ПараметрыСоздания);
КонецЕсли;
Если КэшироватьЗначение Тогда
КэшЗначений[ОписаниеКолонки.Менеджер].Вставить(ЗначениеПредставления, Значение);
КонецЕсли;
КонецФункции
Процедура ПодготовитьПараметрыЗаполненияТаблицы(КэшЗначений, ЗаменяемыеЗначения, ПараметрыЗаполнения, Колонки)
Если ЗаменяемыеЗначения = Неопределено Тогда
ЗаменяемыеЗначения = Новый Соответствие;
Если ТаблицаЗначений Тогда
Возврат Таблица;
КонецЕсли;
Если Не ЗначениеЗаполнено(КэшЗначений) Тогда
КэшЗначений = Новый Соответствие;
КонецЕсли;
Реквизиты = СтрСоединить(ЮТОбщий.ВыгрузитьЗначения(Таблица.Колонки, "Имя"), ",");
Результат = Новый Массив(Таблица.Количество());
Для Каждого Колонка Из Колонки Цикл
Если НЕ Колонка.Ссылочный Тогда
Продолжить;
КонецЕсли;
Если КэшЗначений[Колонка.Менеджер] = Неопределено Тогда
КэшЗначений.Вставить(Колонка.Менеджер, Новый Соответствие);
КонецЕсли;
Для Инд = 0 По Таблица.Количество() - 1 Цикл
Запись = Новый Структура(Реквизиты);
ЗаполнитьЗначенияСвойств(Запись, Таблица[Инд]);
Результат[Инд] = Запись
КонецЦикла;
КонецПроцедуры
Возврат Результат;
КонецФункции
#КонецОбласти
@ -427,163 +340,4 @@
КонецФункции
Функция ТабличныйДокумент(Знач ТабличныйДокумент)
ТипПараметра = ТипЗнч(ТабличныйДокумент);
Если ТипПараметра = Тип("ТабличныйДокумент") Тогда
Возврат ТабличныйДокумент;
ИначеЕсли ТипПараметра = Тип("Строка") Тогда
Возврат ЮТОбщийВызовСервера.Макет(ТабличныйДокумент);
Иначе
ВызватьИсключение ЮТОбщий.НеподдерживаемыйПараметрМетода("ЮТТестовыеДанныеВызовСервера.ТабличныйДокумент", ТабличныйДокумент);
КонецЕсли;
КонецФункции
Функция ОписаниеКолонок(ТабличныйДокумент, ОписанияТипов)
Колонки = Новый Массив();
ВсеКолонки = Новый Массив();
ОсновныеКолонки = Новый Структура();
Для Инд = 1 По ТабличныйДокумент.ШиринаТаблицы Цикл
ИмяКолонки = ТабличныйДокумент.Область(1, Инд).Текст;
Если ПустаяСтрока(ИмяКолонки) Тогда
Прервать;
КонецЕсли;
ЧастиИмени = СтрРазделить(ИмяКолонки, ".");
Если ОписанияТипов[ЧастиИмени[0]] = Неопределено Тогда
Продолжить;
КонецЕсли;
ЭтоВложенныйРеквизит = ЧастиИмени.Количество() = 2;
ОписаниеКолонки = Новый Структура;
ОписаниеКолонки.Вставить("Индекс", Инд - 1);
ОписаниеКолонки.Вставить("Имя", ИмяКолонки);
ОписаниеКолонки.Вставить("ОписаниеТипа", ОписанияТипов[ИмяКолонки]);
Если ОписаниеКолонки.ОписаниеТипа = Неопределено И ЭтоВложенныйРеквизит Тогда
Родитель = ОсновныеКолонки[ЧастиИмени[0]];
Реквизиты = Родитель.ОписаниеОбъектаМетаданных.Реквизиты;
Если Реквизиты.Свойство(ЧастиИмени[1]) Тогда
ОписаниеКолонки.ОписаниеТипа = Реквизиты[ЧастиИмени[1]].Тип;
Иначе
Продолжить; // TODO
КонецЕсли;
КонецЕсли;
ОписаниеКолонки.Вставить("ТипЗначения", ОписаниеКолонки.ОписаниеТипа.Типы()[0]);
ОписаниеКолонки.Вставить("Ссылочный", ЮТТипыДанныхСлужебный.ЭтоСсылочныйТип(ОписаниеКолонки.ТипЗначения));
ОписаниеКолонки.Вставить("ДополнительныеРеквизиты", Новый Массив());
ОписаниеКолонки.Вставить("Составное", Ложь);
ОписаниеКолонки.Вставить("Менеджер", Неопределено);
ОписаниеКолонки.Вставить("ОписаниеОбъектаМетаданных", Неопределено);
ОписаниеКолонки.Вставить("ЭтоПеречисление", Ложь);
ОписаниеКолонки.Вставить("ЭтоЧисло", ОписаниеКолонки.ТипЗначения = Тип("Число"));
ОписаниеКолонки.Вставить("ЭтоДата", ОписаниеКолонки.ТипЗначения = Тип("Дата"));
Если ОписаниеКолонки.Ссылочный Тогда
ОписаниеКолонки.ОписаниеОбъектаМетаданных = ЮТМетаданные.ОписаниеОбъектаМетаданных(ОписаниеКолонки.ТипЗначения);
ОписаниеКолонки.ЭтоПеречисление = СтрСравнить(ОписаниеКолонки.ОписаниеОбъектаМетаданных.ОписаниеТипа.Имя, "Перечисление") = 0; // TODO
ОписаниеКолонки.Менеджер = ЮТОбщий.Менеджер(ОписаниеКолонки.ТипЗначения);
КонецЕсли;
ВсеКолонки.Добавить(ОписаниеКолонки);
Если ЧастиИмени.Количество() = 1 Тогда
Колонки.Добавить(ОписаниеКолонки);
ОсновныеКолонки.Вставить(ИмяКолонки, ОписаниеКолонки);
ИначеЕсли ЭтоВложенныйРеквизит Тогда
ОписаниеКолонки = ОсновныеКолонки[ЧастиИмени[0]];
ОписаниеКолонки.ДополнительныеРеквизиты.Добавить(ОписаниеКолонки);
Иначе
ВызватьИсключение СтрШаблон("Недопустимо использовать несколько точек в имени колонки, `%1`", ИмяКолонки);
КонецЕсли;
КонецЦикла;
Для Каждого ОписаниеКолонки Из ВсеКолонки Цикл
ОписаниеКолонки.Составное = ЗначениеЗаполнено(ОписаниеКолонки.ДополнительныеРеквизиты);
КонецЦикла;
Возврат Колонки;
КонецФункции
Функция ЗначенияРеквизитов(СтрокаТаблицы, ОписаниеКолонки, Параметры)
ЗначенияРеквизитов = Новый Структура();
Для Каждого ОписаниеВложеннойКолонки Из ОписаниеКолонки.ДополнительныеРеквизиты Цикл
Значение = ПривестиЗначениеКолонки(ОписаниеВложеннойКолонки, СтрокаТаблицы[ОписаниеВложеннойКолонки.Индекс], Неопределено, Параметры);
ЗначенияРеквизитов.Вставить(ОписаниеВложеннойКолонки.Имя, Значение);
КонецЦикла;
ОписаниеОбъектаМетаданных = ОписаниеКолонки.ОписаниеОбъектаМетаданных;
Если ОписаниеОбъектаМетаданных.ОписаниеТипа.Имя = "Справочник" Тогда
ИмяРеквизита = "Наименование";
Если ОписаниеОбъектаМетаданных.Реквизиты.Свойство(ИмяРеквизита) = Неопределено Тогда
ИмяРеквизита = "Код";
КонецЕсли;
ЗначенияРеквизитов.Вставить(ИмяРеквизита, СтрокаТаблицы[ОписаниеКолонки.Индекс]);
КонецЕсли;
Возврат ЗначенияРеквизитов;
КонецФункции
Функция ПривестиЗначениеКолонки(ОписаниеКолонки, ЗначениеПредставления, ЗначенияРеквизитов, ПараметрыЗаписи)
Если ОписаниеКолонки.ЭтоПеречисление Тогда
Значение = ОписаниеКолонки.Менеджер[ЗначенияРеквизитов.Значение];
ИначеЕсли ОписаниеКолонки.Ссылочный Тогда
Значение = СоздатьНовуюЗапись(ОписаниеКолонки, ЗначенияРеквизитов, ПараметрыЗаписи);
ИначеЕсли ОписаниеКолонки.ЭтоДата Тогда
Значение = ЮТПреобразования.ПривестиЗначениеКДате(ОписаниеКолонки.ОписаниеТипа, ЗначениеПредставления);
ИначеЕсли ОписаниеКолонки.ЭтоЧисло Тогда
Значение = ЮТПреобразования.ПривестиЗначениеКЧислу(ОписаниеКолонки.ОписаниеТипа, ЗначениеПредставления);
Иначе
Значение = ОписаниеКолонки.ОписаниеТипа.ПривестиЗначение(ЗначениеПредставления);
КонецЕсли;
Возврат Значение;
КонецФункции
Функция СоздатьНовуюЗапись(ОписаниеКолонки, ЗначенияРеквизитов, ПараметрыЗаписи)
Конструктор = ЮТТестовыеДанные.КонструкторОбъекта(ОписаниеКолонки.Менеджер);
Если ЗначениеЗаполнено(ЗначенияРеквизитов) Тогда
Для Каждого ДанныеЗначения Из ЗначенияРеквизитов Цикл
Конструктор.Установить(ДанныеЗначения.Ключ, ДанныеЗначения.Значение);
КонецЦикла;
КонецЕсли;
Если ПараметрыЗаписи.ФикцияОбязательныхПолей Тогда
Конструктор.ФикцияОбязательныхПолей();
КонецЕсли;
Возврат Конструктор.Записать(, ПараметрыЗаписи.ПараметрыЗаписи.ОбменДаннымиЗагрузка);
КонецФункции
#КонецОбласти

View File

@ -150,19 +150,21 @@
#КонецОбласти
Функция ТаблицаЗначенийИзТабличногоДокумента(ТабличныйДокумент,
ОписанияТипов,
КэшЗначений = Неопределено,
ЗаменяемыеЗначения = Неопределено,
ПараметрыСозданияОбъектов = Неопределено) Экспорт
Функция ТипизированныеДанныеТабличногоДокумента(ТабличныйДокумент,
ОписанияТипов,
КэшЗначений,
ЗаменяемыеЗначения,
ПараметрыСозданияОбъектов,
ТаблицаЗначений) Экспорт
ПараметрыЗаполнения = ЮТФабрика.ПараметрыЗаполненияТаблицыЗначений(ПараметрыСозданияОбъектов);
Возврат ЮТТестовыеДанныеВызовСервера.ТаблицаЗначенийИзТабличногоДокумента(ТабличныйДокумент,
ОписанияТипов,
КэшЗначений,
ЗаменяемыеЗначения,
ПараметрыЗаполнения);
Возврат ЮТТестовыеДанныеВызовСервера.ТипизированныеДанныеТабличногоДокумента(ТабличныйДокумент,
ОписанияТипов,
КэшЗначений,
ЗаменяемыеЗначения,
ПараметрыЗаполнения,
ТаблицаЗначений);
КонецФункции

View File

@ -26,8 +26,7 @@
// .ДобавитьТест("Удалить")
// .ДобавитьТест("ВариантыПараметров")
// .ДобавитьТест("СоздатьГруппу")
.ДобавитьСерверныйТест("СтруктурыТабличногоДокумента")
.ДобавитьСерверныйТест("ТаблицаЗначенийИзТабличногоДокумента")
.ДобавитьТест("ТаблицаЗначенийИзТабличногоДокумента")
// .ДобавитьСерверныйТест("ТаблицаЗначенийИзТаблицыMarkDown")
.ДобавитьТест("СлучайныйИдентификатор")
;
@ -108,57 +107,24 @@
КонецПроцедуры
#Если Сервер Тогда
Процедура СтруктурыТабличногоДокумента() Экспорт
ТабличныйДокумент = ПолучитьОбщийМакет("ЮТ_МакетТестовыхДанных");
МассивДанных = ЮТПреобразованияСервер.СтруктурыТабличногоДокумента(ТабличныйДокумент, 1, 8);
Ютест.ОжидаетЧто(МассивДанных.Количество()).Равно(3);
// ЮТест.ОжидаетЧто(МассивДанных)
// .ИмеетДлину(3)
// .Свойство("[0]").ИмеетТип("Структура")
// .Свойство("[1]").ИмеетТип("Структура")
// .Свойство("[2]").ИмеетТип("Структура")
// .Свойство("[0].Товар").Равно("Товар 1")
// .Свойство("[0].Цена").Равно("100.55")
// .Свойство("[0].Количество").Равно("1")
// .Свойство("[0].Сумма").Равно("100.55")
// .Свойство("[1].Товар").Равно("Товар 2")
// .Свойство("[1].Цена").Равно("1500.2")
// .Свойство("[1].Количество").Равно("1")
// .Свойство("[1].Сумма").Равно("1500.2")
// .Свойство("[2].Товар").Равно("Услуга")
// .Свойство("[2].Цена").Равно("1000000")
// .Свойство("[2].Количество").Равно("1")
// .Свойство("[2].Сумма").Равно("1000000")
// ;
//
КонецПроцедуры
Процедура ТаблицаЗначенийИзТабличногоДокумента() Экспорт
// Подготовка тестового окружения
ТабличныйДокумент = ПолучитьОбщийМакет("ЮТ_МакетТестовыхДанных");
ОписанияТипов = Новый Соответствие;
ОписанияТипов.Вставить("Период", Новый ОписаниеТипов("Дата"));
ОписанияТипов.Вставить("Товар", Новый ОписаниеТипов("СправочникСсылка.Товары"));
ОписанияТипов.Вставить("Цена", Новый ОписаниеТипов("Число"));
ОписанияТипов.Вставить("Количество", Новый ОписаниеТипов("Число"));
КэшЗначений = Неопределено;
Поставщик = ЮТест.Данные().СоздатьЭлемент(Справочники.Контрагенты, "Поставщик");
Поставщик = ЮТест.Данные().СоздатьЭлемент("Справочники.Контрагенты", "Поставщик");
ЗаменяемыеЗначения = Новый Соответствие;
ЗаменяемыеЗначения.Вставить("Поставщик 1", Поставщик);
// Вызов тестируемого сценария
ТаблицаРезультатов = ЮТест.Данные().ТаблицаЗначенийИзТабличногоДокумента("ОбщийМакет.ЮТ_МакетТестовыхДанных.R2C1:R5C11",
ТаблицаРезультатов = ЮТест.Данные().ТипизированныеДанныеТабличногоДокумента("ОбщийМакет.ЮТ_МакетТестовыхДанных.R2C1:R5C11",
ОписанияТипов,
КэшЗначений,
ЗаменяемыеЗначения
@ -166,31 +132,52 @@
// Проверка поведения и результатов
#Если Сервер Тогда
Ютест.ОжидаетЧто(ТаблицаРезультатов)
.ИмеетТип("ТаблицаЗначений")
.ИмеетДлину(3)
.Свойство("[0].Товар.Поставщик").Равно(Поставщик)
.Свойство("[0].Товар.Артикул").Равно("Артикул 1")
.Свойство("[0].Товар.Вид").Равно(Перечисления.ВидыТоваров.Товар)
.Свойство("[0].Товар.Вид").Равно(ПредопределенноеЗначение("Перечисление.ВидыТоваров.Товар"))
.Свойство("[0].Товар.Описание").Заполнено()
.Свойство("[0].Количество").Равно(1)
.Свойство("[0].Цена").Равно(100.55)
.Свойство("[1].Товар.Поставщик").Заполнено().НеРавно(Поставщик)
.Свойство("[1].Товар.Артикул").Равно("Артикул 2")
.Свойство("[1].Товар.Вид").Равно(Перечисления.ВидыТоваров.Товар)
.Свойство("[1].Товар.Вид").Равно(ПредопределенноеЗначение("Перечисление.ВидыТоваров.Товар"))
.Свойство("[1].Товар.Описание").НеЗаполнено()
.Свойство("[1].Количество").Равно(1)
.Свойство("[1].Цена").Равно(1500.2)
.Свойство("[2].Товар.Поставщик").НеЗаполнено()
.Свойство("[2].Товар.Артикул").Равно("Артикул 3")
.Свойство("[2].Товар.Вид").Равно(Перечисления.ВидыТоваров.Услуга)
.Свойство("[2].Товар.Вид").Равно(ПредопределенноеЗначение("Перечисление.ВидыТоваров.Услуга"))
.Свойство("[2].Товар.Описание").Заполнено()
.Свойство("[2].Количество").Равно(1)
.Свойство("[2].Цена").Равно(1000000)
;
#Иначе
Ютест.ОжидаетЧто(ТаблицаРезультатов)
.ИмеетТип("Массив")
.ИмеетДлину(3)
.КаждыйЭлементСоответствуетПредикату(ЮТест.Предикат()
.Реквизит("Товар").Заполнено().ИмеетТип("СправочникСсылка.Товары")
.Реквизит("Период").Заполнено().ИмеетТип("Дата")
.Реквизит("Количество").Заполнено().ИмеетТип("Число")
.Реквизит("Цена").Заполнено().ИмеетТип("Число")
)
.Свойство("[0].Количество").Равно(1)
.Свойство("[0].Цена").Равно(100.55)
.Свойство("[1].Количество").Равно(1)
.Свойство("[1].Цена").Равно(1500.2)
.Свойство("[2].Количество").Равно(1)
.Свойство("[2].Цена").Равно(1000000)
;
#КонецЕсли
КонецПроцедуры
#Если Сервер Тогда
Процедура ТаблицаЗначенийИзТаблицыMarkDown() Экспорт
// Подготовка тестового окружения

View File

@ -1,156 +0,0 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
#Область СлужебныйПрограммныйИнтерфейс
Процедура ИсполняемыеСценарии() Экспорт
ЮТТесты
.ВТранзакции()
.УдалениеТестовыхДанных()
.ДобавитьТестовыйНабор("ТипизированнаяТаблицаЗначений")
.ДобавитьТест("ЗаполнитьТипизированнуюТаблицуЗначений")
.ДобавитьТест("ВызватьИсключениеПриНехваткеДанных");
КонецПроцедуры
#Область События
Процедура ПередВсемиТестами() Экспорт
КонецПроцедуры
Процедура ПередКаждымТестом() Экспорт
КонецПроцедуры
Процедура ПослеКаждогоТеста() Экспорт
КонецПроцедуры
Процедура ПослеВсехТестов() Экспорт
КонецПроцедуры
#КонецОбласти
Процедура ЗаполнитьТипизированнуюТаблицуЗначений() Экспорт
// Подготовка тестового окружения
ТабличныйДокумент = ПолучитьОбщийМакет("ЮТ_МакетТестовыхДанных");
ИсходныеДанные = ТабличныйДокумент.ПолучитьОбласть(2, 1, 5, 11);
МассивСтруктур = ЮТест.Данные().СтруктурыТабличногоДокумента(ИсходныеДанные);
ОписанияТипов = Новый Соответствие;
ОписанияТипов.Вставить("Период", Новый ОписаниеТипов("Дата"));
ОписанияТипов.Вставить("Активность", Новый ОписаниеТипов("Булево"));
ОписанияТипов.Вставить("Товар", Новый ОписаниеТипов("СправочникСсылка.Товары"));
ОписанияТипов.Вставить("Цена", Новый ОписаниеТипов("Число"));
ОписанияТипов.Вставить("Количество", Новый ОписаниеТипов("Число"));
ОписанияТипов.Вставить("Сумма", Новый ОписаниеТипов("Число"));
КэшЗначений = Новый Соответствие;
КоличествоСтрок = МассивСтруктур.Количество();
ОжидаемыйПериод = Дата(2023, 01, 01);
// Вызов тестируемого сценария
ТаблицаЗначений = ЮТТестовыеДанные_ТаблицыЗначений.ТипизированнаяТаблицаЗначений(
МассивСтруктур,
ОписанияТипов,
КэшЗначений
);
// Проверка поведения и результатов
Ютест.ОжидаетЧто(ТаблицаЗначений)
.ИмеетТип("ТаблицаЗначений")
.ИмеетДлину(КоличествоСтрок)
.КаждыйЭлементСодержитСвойство("Период")
.КаждыйЭлементСодержитСвойство("Активность")
.КаждыйЭлементСодержитСвойство("Товар")
.КаждыйЭлементСодержитСвойство("Цена")
.КаждыйЭлементСодержитСвойство("Количество")
.КаждыйЭлементСодержитСвойство("Сумма")
.Свойство("[0].Период").Равно(ОжидаемыйПериод)
.Свойство("[0].Активность").Равно(Истина)
.Свойство("[0].Товар.Наименование").Равно("Товар 1")
.Свойство("[0].Товар.Вид").Равно(Перечисления.ВидыТоваров.Товар)
.Свойство("[0].Товар.Поставщик").Заполнено()
.Свойство("[0].Количество").Равно(1)
.Свойство("[0].Цена").Равно(100.55)
.Свойство("[0].Сумма").Равно(100.55)
.Свойство("[1].Период").Равно(ОжидаемыйПериод)
.Свойство("[1].Активность").Равно(Истина)
.Свойство("[1].Товар.Наименование").Равно("Товар 2")
.Свойство("[1].Товар.Вид").Равно(Перечисления.ВидыТоваров.Товар)
.Свойство("[1].Товар.Поставщик").Заполнено()
.Свойство("[1].Количество").Равно(1)
.Свойство("[1].Цена").Равно(1500.2)
.Свойство("[1].Сумма").Равно(1500.2)
.Свойство("[2].Период").Равно(ОжидаемыйПериод)
.Свойство("[2].Активность").Равно(Ложь)
.Свойство("[2].Товар.Наименование").Равно("Услуга")
.Свойство("[2].Товар.Вид").Равно(Перечисления.ВидыТоваров.Услуга)
.Свойство("[2].Товар.Поставщик").НеЗаполнено()
.Свойство("[2].Количество").Равно(1)
.Свойство("[2].Цена").Равно(1000000)
.Свойство("[2].Сумма").Равно(1000000);
Ютест.ОжидаетЧто(ТаблицаЗначений.Колонки.Количество()).Равно(ОписанияТипов.Количество());
Ютест.ОжидаетЧто(КэшЗначений)
.ИмеетДлину(3)
.Свойство(Справочники.Товары).ИмеетДлину(3)
.Свойство(Справочники.Контрагенты).ИмеетДлину(2)
.Свойство(Перечисления.ВидыТоваров).ИмеетДлину(2);
КонецПроцедуры
Процедура ВызватьИсключениеПриНехваткеДанных() Экспорт
// Подготовка тестового окружения
Данные = "
|| Товар | Цена | Количество |
||---------|-------|------------|
|| Товар 1 | 100 | 1 |
|| Товар 2 | 2 000 | 1 |
|| Услуга | 300,5 | 1 |
|";
ИсходныеДанные = ЮТест.Данные().ТаблицаMarkdown(Данные);
ОписанияТипов = Новый Соответствие;
ОписанияТипов.Вставить("Товар", Новый ОписаниеТипов("СправочникСсылка.Товары"));
ОписанияТипов.Вставить("Цена", Новый ОписаниеТипов("Число"));
ОписанияТипов.Вставить("Количество", Новый ОписаниеТипов("Число"));
ОписанияТипов.Вставить("Сумма", Новый ОписаниеТипов("Число"));
// Проверка поведения и результатов
ЮТУтверждения.Что(ЮТТестовыеДанные_ТаблицыЗначений)
.Метод("ТипизированнаяТаблицаЗначений", Мокито.МассивПараметров(ИсходныеДанные, ОписанияТипов))
.ВыбрасываетИсключение("Отсутствуют данные для ожидаемых колонок: Сумма");
КонецПроцедуры
#КонецОбласти

View File

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="30b469d3-34e0-4b23-9959-1a890e5f3fd9">
<name>ОМ_ЮТТестовыеДанные_ТаблицыЗначений</name>
<synonym>
<key>ru</key>
<value>О м ЮТТестовые данные таблицы значений</value>
</synonym>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -40,7 +40,6 @@
<commonModules>CommonModule.ОМ_ЮТПредикатыКлиентСервер</commonModules>
<commonModules>CommonModule.ОМ_ЮТСравнениеКлиентСервер</commonModules>
<commonModules>CommonModule.ОМ_ЮТТестовыеДанные</commonModules>
<commonModules>CommonModule.ОМ_ЮТТестовыеДанные_ТаблицыЗначений</commonModules>
<commonModules>CommonModule.ОМ_ЮТТестовыеДанныеСлужебный</commonModules>
<commonModules>CommonModule.ОМ_ЮТТесты</commonModules>
<commonModules>CommonModule.ОМ_ЮТТипыДанныхСлужебный</commonModules>