Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,18 @@
- `ПроверитьРавенствоТабличныхДокументовТолькоПоЗначениям( ТаблицаОжиданий, ТаблицаРезультатов, ФлагУчитыватьТолькоВидимыеКолонкиИлиДопСообщениеОшибки = Истина, Знач ДопСообщениеОшибки = "" )`
- Параметры:
- **ФлагУчитыватьТолькоВидимыеКолонкиИлиДопСообщениеОшибки**- если строка, то используется как строка с ожидаемым исключением. Иначе это флаг/булево для учета только видимых колонок

- `ПроверитьРавенствоТабличныхДокументовТолькоПоЗначениям( ТаблицаОжиданий, ТаблицаРезультатов, ЭлементыПроверить = Неопределено)`
- Параметры:
- **ЭлементыПроверить**- Массив элементов для проверки. Если не заполнен, то проверка идет только по значениям как и ПроверитьРавенствоТабличныхДокументовТолькоПоЗначениям.

```bsl
ЭлементыПроверить = Новый Массив;
// по значению
ЭлементыПроверить.Добавить("Текст");
// оформление
ЭлементыПроверить.Добавить("РазмещениеТекста");
ЭлементыПроверить.Добавить("ЦветФона");
ЭлементыПроверить.Добавить("ЦветТекста");
ЭлементыПроверить.Добавить("Шрифт");
```
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,11 @@
Для Каждого КлючЗначение Из РезультатыСравненияТаблиц Цикл
ИменаРезультатов.Вставить(КлючЗначение.Значение, КлючЗначение.Ключ);
КонецЦикла;

СтрокаОшибок = "Различия в таблицах:" + Символы.ПС;
СтрокаОшибок = СтрокаОшибок + "Ожидали статус <" + ИменаРезультатов[РезультатыСравненияТаблиц.ТаблицыСовпадают] + ">, а получили <" + ИменаРезультатов[РезультатСравнения] + ">" + Символы.ПС;
Для Каждого Строка Из Различия Цикл
СтрокаОшибок = СтрокаОшибок + "Значение [" + Строка.Колонка + ":" + Строка.Строка + "]. Ожидали <" + Строка.Ожидание + ">, а получили <" + Строка.Результат + ">" + Символы.ПС;
СтрокаОшибок = СтрокаОшибок + "Значение [" + Строка.Колонка + ":" + Строка.Строка + "]. Ожидали <" + Строка.Ожидание + ">, а получили <" + Строка.Результат + ">" + Символы.ПС;
КонецЦикла;

ВызватьОшибкуПроверки("Таблицы должны совпадать, а они различны" + Символы.ПС + СтрокаОшибок + Символы.ПС + ДопСообщениеОшибки);
Expand Down Expand Up @@ -440,10 +441,182 @@
Возврат Новый ФиксированнаяСтруктура(СтатусыРезультатаТестирования);
КонецФункции

// По умолчанию проверяет как и ПроверитьРавенствоТабличныхДокументовТолькоПоЗначениям - по значениям.
//
// Параметры:
// ТабДок1 - ТабличныйДокумент - Первый сравниваемый документ
// ТабДок2 - ТабличныйДокумент - Второй сравниваемый документ
// ЭлементыПроверить - Массив - Элементы для проверки.
// Пример:
// ЭлементыПроверить = Новый Массив;
// // по значению
// ЭлементыПроверить.Добавить("Текст");
// // оформление
// ЭлементыПроверить.Добавить("РазмещениеТекста");
// ЭлементыПроверить.Добавить("ЦветФона");
// ЭлементыПроверить.Добавить("ЦветТекста");
//
Процедура ПроверитьРавенствоТабличныхДокументовПоЭлементам(ТабДок1, ТабДок2, ЭлементыПроверить = Неопределено,
УчитыватьТолькоВидимыеКолонкиИлиДопСообщениеОшибки = Ложь, УчитыватьТолькоВидимыеСтрокиИлиДопСообщениеОшибки = Ложь,
Знач ДопСообщениеОшибки = "", Знач ДопПараметры = Неопределено) Экспорт

Если ТипЗнч(ТабДок1) <> Тип("ТабличныйДокумент") Тогда
ВызватьИсключение "ПроверитьРавенствоТабличныхДокументовТолькоПоЗначениям: Первый параметр-таблица не является табличным документов";
КонецЕсли;
Если ТипЗнч(ТабДок2) <> Тип("ТабличныйДокумент") Тогда
ВызватьИсключение "ПроверитьРавенствоТабличныхДокументовТолькоПоЗначениям: Второй параметр-таблица не является табличным документов";
КонецЕсли;
Если ЭлементыПроверить <> Неопределено И ТипЗнч(ЭлементыПроверить) <> Тип("Массив") Тогда
ВызватьИсключение "ПроверитьРавенствоТабличныхДокументовТолькоПоЗначениям: Третий параметр-массив не является табличным массивом";
КонецЕсли;

УчитыватьТолькоВидимыеКолонки = Ложь;
Если ТипЗнч(УчитыватьТолькоВидимыеКолонкиИлиДопСообщениеОшибки) = Тип("Булево") Тогда
УчитыватьТолькоВидимыеКолонки = УчитыватьТолькоВидимыеКолонкиИлиДопСообщениеОшибки;
ИначеЕсли ТипЗнч(УчитыватьТолькоВидимыеКолонкиИлиДопСообщениеОшибки) = Тип("Строка") Тогда
ДопСообщениеОшибки = УчитыватьТолькоВидимыеКолонкиИлиДопСообщениеОшибки;
КонецЕсли;
УчитыватьТолькоВидимыеСтроки = Ложь;
Если ТипЗнч(УчитыватьТолькоВидимыеСтрокиИлиДопСообщениеОшибки) = Тип("Булево") Тогда
УчитыватьТолькоВидимыеСтроки = УчитыватьТолькоВидимыеСтрокиИлиДопСообщениеОшибки;
ИначеЕсли ТипЗнч(УчитыватьТолькоВидимыеСтрокиИлиДопСообщениеОшибки) = Тип("Строка") Тогда
ДопСообщениеОшибки = УчитыватьТолькоВидимыеСтрокиИлиДопСообщениеОшибки;
КонецЕсли;

Элементы = ЭлементыОформленияДляПроверки(ЭлементыПроверить);

КешТаб1 = Новый Соответствие;
КешТаб2 = Новый Соответствие;
Для Каждого Элемент Из Элементы Цикл

Таб1 = ПолучитьТаблицуЗначенийИзТабличногоДокументаСОформлением(ТабДок1, УчитыватьТолькоВидимыеКолонки, УчитыватьТолькоВидимыеСтроки, Элемент, КешТаб1);
Таб2 = ПолучитьТаблицуЗначенийИзТабличногоДокументаСОформлением(ТабДок2, УчитыватьТолькоВидимыеКолонки, УчитыватьТолькоВидимыеСтроки, Элемент, КешТаб2);

ПроверитьРавенствоТаблиц(Таб1, Таб2, ДопСообщениеОшибки, ДопПараметры);

КонецЦикла;

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

Функция ЭлементыОформленияДляПроверки(Элементы)

Если Элементы = Неопределено Тогда
Элементы = Новый Массив;
КонецЕсли;
Если Элементы.Количество() = 0 Тогда
Элементы.Добавить("Текст"); // умолчание - по значению =)
КонецЕсли;

Возврат Элементы;

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

// вынесен кусок кода в ПодготовитьТаблицуЗначенийИзТабличногоДокумента
Функция ПолучитьТаблицуЗначенийИзТабличногоДокументаСОформлением(ТабличныйДокумент, УчитыватьТолькоВидимыеКолонки = Ложь, УчитыватьТолькоВидимыеСтроки = Ложь,
Знач ЭлементОформления, КешОбластей) Экспорт

ТипТабличногоДокумента = ТипЗнч(ТабличныйДокумент);
Если ТипТабличногоДокумента <> Тип("ТабличныйДокумент") И ТипТабличногоДокумента <> Тип("ПолеТабличногоДокумента") Тогда
ВызватьИсключение "ПолучитьТаблицуЗначенийИзТабличногоДокументаСОформлением: Требуется тип ТабличныйДокумент или ПолеТабличногоДокумента";
КонецЕсли;

НомерПоследнейКолонки = ТабличныйДокумент.ШиринаТаблицы;
НомерПоследнейСтроки = ТабличныйДокумент.ВысотаТаблицы;

НоваяТаблицаЗначений = Неопределено;
УчитываемыеКолонки = Неопределено;

ПодготовитьТаблицуЗначенийИзТабличногоДокумента(НоваяТаблицаЗначений, УчитываемыеКолонки, НомерПоследнейКолонки, ТабличныйДокумент, УчитыватьТолькоВидимыеКолонки);

ГраницаКолонок = УчитываемыеКолонки.ВГраница();
Для НомерСтроки = 1 По НомерПоследнейСтроки Цикл

Если УчитыватьТолькоВидимыеСтроки И Не ТабличныйДокумент.Область(НомерСтроки, , НомерСтроки).Видимость Тогда
Продолжить;
КонецЕсли;

НоваяСтрока = НоваяТаблицаЗначений.Добавить();

Для Индекс = 0 По ГраницаКолонок Цикл
НомерКолонки = УчитываемыеКолонки[Индекс];
Ключ = КлючОбласти(НомерСтроки, НомерКолонки, ГраницаКолонок + 1);
Область = КешОбластей.Получить(Ключ);
Если Область = Неопределено Тогда
Область = ТабличныйДокумент.Область(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки);
КешОбластей.Вставить(Ключ, Область);
КонецЕсли;

ДобавитьДанныеОбласти(НоваяСтрока, Индекс, Область, ЭлементОформления);

КонецЦикла;
КонецЦикла;

Возврат НоваяТаблицаЗначений;

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

// Функция - Уникальный ключ области из расчета до 500 колонок в таблице
//
Функция КлючОбласти(НомерСтроки, НомерКолонки, МаксКолонок = 500)
Ключ = (НомерСтроки -1) * МаксКолонок + НомерКолонки;
Возврат Ключ;
КонецФункции

// можно использовать в ПолучитьТаблицуЗначенийИзТабличногоДокумента
Процедура ПодготовитьТаблицуЗначенийИзТабличногоДокумента(НоваяТаблицаЗначений, УчитываемыеКолонки, Знач НомерПоследнейКолонки, Знач ТабличныйДокумент, Знач УчитыватьТолькоВидимыеКолонки)

Перем ИмяКолонки, Колонки, НомерКолонки, ОбластьКолонки, ТипСтрока, УчитыватьКолонку, ШиринаКолонки;

НоваяТаблицаЗначений = Новый ТаблицаЗначений;
Колонки = НоваяТаблицаЗначений.Колонки;
ТипСтрока = Новый ОписаниеТипов("Строка");

// TODO При определении видимости не учитывается наличие нескольких форматов строк, сейчас видимоcть колонки определяется по формату первой строки
УчитываемыеКолонки = Новый Массив;
Для НомерКолонки = 1 По НомерПоследнейКолонки Цикл
ОбластьКолонки = ТабличныйДокумент.Область(0, НомерКолонки, 1, НомерКолонки);

УчитыватьКолонку = Не УчитыватьТолькоВидимыеКолонки Или ОбластьКолонки.Видимость;
Если УчитыватьКолонку Тогда
УчитываемыеКолонки.Добавить(НомерКолонки);
ШиринаКолонки = ОбластьКолонки.ШиринаКолонки;
Если ШиринаКолонки <= 1 Тогда
ШиринаКолонки = 1;
КонецЕсли;
ИмяКолонки = "К" + Формат(Колонки.Количество() + 1, "ЧН=; ЧГ=0");
Колонки.Добавить(ИмяКолонки, ТипСтрока, ИмяКолонки, ШиринаКолонки);
КонецЕсли;
КонецЦикла;

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

Процедура ДобавитьДанныеОбласти(НоваяСтрока, Индекс, Знач Область, Знач ЭлементОформления)

Значение = Неопределено;
Реквизит = "";
Элемент = ЭлементОформления;
Реквизиты = СтрРазделить(Элемент, ".");
Вложенность = Реквизиты.Количество();
Если Вложенность = 0 Тогда
Возврат;
КонецЕсли;
Разделитель = "=";
Если Вложенность = 1 Тогда
Значение = ЭлементОформления + Разделитель + Строка(Область[Реквизиты[0]]);
ИначеЕсли Вложенность = 2 Тогда
Значение = ЭлементОформления + Разделитель + Строка(Область[Реквизиты[0]][Реквизиты[1]]);
Иначе
ВызватьОшибкуПроверки("Необрабатываемый реквизит : "+ ЭлементОформления);
КонецЕсли;

НоваяСтрока[Индекс] = Значение;

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

РезультатыСравненияТаблиц = Новый Структура;
РезультатыСравненияТаблиц.Вставить("ТаблицыСовпадают", 0);
РезультатыСравненияТаблиц.Вставить("НеСовпадаютЗначенияВЯчейкеТаблицы", 1);
РезультатыСравненияТаблиц.Вставить("РазноеКоличествоСтрок", 2);
РезультатыСравненияТаблиц.Вставить("РазличаютсяКолонки", 3);
РезультатыСравненияТаблиц = Новый ФиксированнаяСтруктура(РезультатыСравненияТаблиц);
ЭтоLinux = Ложь;
ЭтоLinux = Ложь;
Loading