1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2025-03-17 20:48:01 +02:00

Добавил функционал получения таблицы значений из различных источников

This commit is contained in:
Любаневич Дмитрий 2023-08-04 14:28:11 +03:00
parent ef17f24237
commit 07d373b4ad
5 changed files with 576 additions and 0 deletions

View File

@ -411,6 +411,59 @@
КонецФункции
// Читает табличный документ в массив структур
//
// Параметры:
// ТабличныйДокумент - ТабличныйДокумент - Исходный табличный документ
// НомерКолонки - Число - Номер строки таблицы, с которой следует начать считывание
// НомерСтроки - Число - Номер колонки таблицы, с которой следует начать считывание
// Возвращаемое значение:
// Массив из Структура - Данные табличного документа
Функция СтруктурыТабличногоДокумента(ТабличныйДокумент, Знач НомерКолонки = 1, Знач НомерСтроки = 1) Экспорт
МассивДанных = Новый Массив;
СведенияКолонок = Новый Массив;
ЗаменяемыеСтроки = ЮТТестовыеДанныеСлужебный.ПодстрокиДляЗаменыВИменахСвойств();
ЗначениеКолонки = ТабличныйДокумент.Область(НомерСтроки, НомерКолонки).Текст;
Пока ЗначениеЗаполнено(ЗначениеКолонки) Цикл
Для Каждого Замена Из ЗаменяемыеСтроки Цикл
ПодстрокаПоиска = Замена.Ключ;
ПодстрокаЗамены = Замена.Значение;
ИмяКолонки = СтрЗаменить(ЗначениеКолонки, ПодстрокаПоиска, ПодстрокаЗамены);
КонецЦикла;
Сведения = Новый Структура("НомерКолонки, ИмяКолонки", НомерКолонки, ИмяКолонки);
СведенияКолонок.Добавить(Сведения);
НомерКолонки = НомерКолонки + 1;
ЗначениеКолонки = ТабличныйДокумент.Область(НомерСтроки, НомерКолонки).Текст;
КонецЦикла;
НомерСтроки = НомерСтроки + 1;
Пока ЕстьЗначенияВСтроке(ТабличныйДокумент, НомерСтроки, СведенияКолонок) Цикл
Структура = Новый Структура;
Для Каждого Сведения Из СведенияКолонок Цикл
Значение = СокрЛП(ТабличныйДокумент.Область(НомерСтроки, Сведения.НомерКолонки).Текст);
Структура.Вставить(Сведения.ИмяКолонки, Значение);
КонецЦикла;
МассивДанных.Добавить(Структура);
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
Возврат МассивДанных;
КонецФункции
// Формирует массив различных комбиначий параметров
//
// Предназначено для формирования таблицы возможных значений параметров для краш теста метода.
@ -493,6 +546,53 @@
Возврат Обработки.ЮТHTTPСервисЗапрос.Создать();
КонецФункции
// Возвращает таблицу значений из табличного документа
// Параметры:
// ТабличныйДокумент - ТабличныйДокумент - Исходный табличный документ
// ОписанияТипов - Соответствие из Строка - Соответствие имен колонок таблицы к типам значений
// КэшЗначений - Соответствие из Произвольный - Соответствие для хранения создаваемых значений
// Параметры - Соответствие из Строка - Соответствие значений в табличном документе значению таблицы
// Возвращаемое значение:
// см. ЮТТестовыеДанные_ТаблицыЗначений.ТаблицаЗначенийИзМассиваСтруктур
Функция ТаблицаЗначенийИзТабличногоДокумента(ТабличныйДокумент, ОписанияТипов, КэшЗначений = Неопределено,
Параметры = Неопределено) Экспорт
ИсточникДанных = СтруктурыТабличногоДокумента(ТабличныйДокумент);
ТаблицаЗначений = ЮТТестовыеДанные_ТаблицыЗначений.ТаблицаЗначенийИзМассиваСтруктур(
ИсточникДанных,
ОписанияТипов,
КэшЗначений,
Параметры
);
Возврат ТаблицаЗначений;
КонецФункции
// Возвращает таблицу значений из таблицы MarkDown
// Параметры:
// Строки - Строка - Таблица markdown
// ОписанияТипов - Соответствие из Строка - Соответствие имен колонок таблицы к типам значений
// КэшЗначений - Соответствие из Произвольный - Соответствие для хранения создаваемых значений
// Параметры - Соответствие из Строка - Соответствие значений в табличном документе значению таблицы
// Возвращаемое значение:
// см. ЮТТестовыеДанные_ТаблицыЗначений.ТаблицаЗначенийИзМассиваСтруктур
Функция ТаблицаЗначенийИзТаблицыMarkDown(Строки, ОписанияТипов, КэшЗначений = Неопределено,
Параметры = Неопределено) Экспорт
ИсточникДанных = ТаблицаMarkDown(Строки);
ТаблицаЗначений = ЮТТестовыеДанные_ТаблицыЗначений.ТаблицаЗначенийИзМассиваСтруктур(
ИсточникДанных,
ОписанияТипов,
КэшЗначений,
Параметры
);
Возврат ТаблицаЗначений;
КонецФункции
#КонецЕсли
#КонецОбласти
@ -518,4 +618,20 @@
КонецПроцедуры
Функция ЕстьЗначенияВСтроке(ТабличныйДокумент, НомерСтроки, СведенияКолонок)
ЕстьЗаполненныеЗначения = Ложь;
Для Каждого Сведения Из СведенияКолонок Цикл
Если ЕстьЗаполненныеЗначения Тогда
Прервать;
КонецЕсли;
НомерКолонки = Сведения.НомерКолонки;
ЕстьЗаполненныеЗначения = ЗначениеЗаполнено(ТабличныйДокумент.Область(НомерСтроки, НомерКолонки).Текст);
КонецЦикла;
Возврат ЕстьЗаполненныеЗначения;
КонецФункции
#КонецОбласти

View File

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

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="18cbfea5-3366-44ec-b0bd-7fd1d933bbf8">
<name>ЮТТестовыеДанные_ТаблицыЗначений</name>
<synonym>
<key>ru</key>
<value>Тестовые данные таблицы значений</value>
</synonym>
<server>true</server>
<externalConnection>true</externalConnection>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -116,6 +116,18 @@
КонецПроцедуры
// Возвращает соответствие с подстроками поиска и замены
// Возвращаемое значение:
// Соответствие из Строка
Функция ПодстрокиДляЗаменыВИменахСвойств() Экспорт
ЗаменяемыеПодстроки = Новый Соответствие;
ЗаменяемыеПодстроки.Вставить(".", ПодстрокаЗаменыТочки());
Возврат ЗаменяемыеПодстроки;
КонецФункции
#Область ОбработчикиСобытий
Процедура ПослеКаждогоТеста(ОписаниеСобытия) Экспорт
@ -229,4 +241,10 @@
КонецФункции
Функция ПодстрокаЗаменыТочки()
Возврат "_tchk_";
КонецФункции
#КонецОбласти

View File

@ -89,6 +89,7 @@
<commonModules>CommonModule.ЮТСравнениеКлиентСервер</commonModules>
<commonModules>CommonModule.ЮТСравнениеСервер</commonModules>
<commonModules>CommonModule.ЮТТестовыеДанные</commonModules>
<commonModules>CommonModule.ЮТТестовыеДанные_ТаблицыЗначений</commonModules>
<commonModules>CommonModule.ЮТТестовыеДанныеВызовСервера</commonModules>
<commonModules>CommonModule.ЮТТестовыеДанныеСлужебный</commonModules>
<commonModules>CommonModule.ЮТТесты</commonModules>