Данные совпадают. Сравнивает данные сложной структуры с учетом вложенности.
// Сравнивает данные сложной структуры с учетом вложенности.
//
// Параметры:
// Данные1 - Структура, ФиксированнаяСтруктура,
// Соответствие, ФиксированноеСоответствие,
// Массив, ФиксированныйМассив,
// ХранилищеЗначения, ТаблицаЗначений,
// Строка, Число, Булево - сравниваемые данные.
//
// Данные2 - Произвольный - те же типы, что и для параметра Данные1.
//
// Возвращаемое значение:
// Булево - Истина, если совпадают.
//
Функция ДанныеСовпадают(Данные1, Данные2) Экспорт
Если ТипЗнч(Данные1) <> ТипЗнч(Данные2) Тогда
Возврат Ложь;
КонецЕсли;
Если ТипЗнч(Данные1) = Тип("Структура")
ИЛИ ТипЗнч(Данные1) = Тип("ФиксированнаяСтруктура") Тогда
Если Данные1.Количество() <> Данные2.Количество() Тогда
Возврат Ложь;
КонецЕсли;
Для каждого КлючИЗначение Из Данные1 Цикл
СтароеЗначение = Неопределено;
Если НЕ Данные2.Свойство(КлючИЗначение.Ключ, СтароеЗначение)
ИЛИ НЕ ДанныеСовпадают(КлючИЗначение.Значение, СтароеЗначение) Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
ИначеЕсли ТипЗнч(Данные1) = Тип("Соответствие")
ИЛИ ТипЗнч(Данные1) = Тип("ФиксированноеСоответствие") Тогда
Если Данные1.Количество() <> Данные2.Количество() Тогда
Возврат Ложь;
КонецЕсли;
КлючиНовогоСоответствия = Новый Соответствие;
Для каждого КлючИЗначение Из Данные1 Цикл
КлючиНовогоСоответствия.Вставить(КлючИЗначение.Ключ, Истина);
СтароеЗначение = Данные2.Получить(КлючИЗначение.Ключ);
Если НЕ ДанныеСовпадают(КлючИЗначение.Значение, СтароеЗначение) Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Для каждого КлючИЗначение Из Данные2 Цикл
Если КлючиНовогоСоответствия[КлючИЗначение.Ключ] = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
ИначеЕсли ТипЗнч(Данные1) = Тип("Массив")
ИЛИ ТипЗнч(Данные1) = Тип("ФиксированныйМассив") Тогда
Если Данные1.Количество() <> Данные2.Количество() Тогда
Возврат Ложь;
КонецЕсли;
Индекс = Данные1.Количество()-1;
Пока Индекс >= 0 Цикл
Если НЕ ДанныеСовпадают(Данные1.Получить(Индекс), Данные2.Получить(Индекс)) Тогда
Возврат Ложь;
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
Возврат Истина;
ИначеЕсли ТипЗнч(Данные1) = Тип("ТаблицаЗначений") Тогда
Если Данные1.Количество() <> Данные2.Количество() Тогда
Возврат Ложь;
КонецЕсли;
Если Данные1.Колонки.Количество() <> Данные2.Колонки.Количество() Тогда
Возврат Ложь;
КонецЕсли;
Для каждого Колонка Из Данные1.Колонки Цикл
Если Данные2.Колонки.Найти(Колонка.Имя) = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
Индекс = Данные1.Количество()-1;
Пока Индекс >= 0 Цикл
Если НЕ ДанныеСовпадают(Данные1[Индекс][Колонка.Имя], Данные2[Индекс][Колонка.Имя]) Тогда
Возврат Ложь;
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
КонецЦикла;
Возврат Истина;
ИначеЕсли ТипЗнч(Данные1) = Тип("ХранилищеЗначения") Тогда
Если НЕ ДанныеСовпадают(Данные1.Получить(), Данные2.Получить()) Тогда
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецЕсли;
Возврат Данные1 = Данные2;
КонецФункции
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
МенеджерКриптографииИмяПрограммыСовпадает (БСП)
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)