Работа со структурамиКак создать структуру?СозданнаяСтруктура = Новый Структура; Оппонент = Новый Структура ("Фамилия, Имя, Отчество, Возраст", "Иванов", "Иван", "Иванович", 7); Как добавить элементы в структуру?Оппонент = Новый Структура ("Фамилия, Имя, Отчество, Возраст", "Иванов", "Иван", "Иванович", 7); Оппонент.Вставить("Обращение", "Господин"); Оппонент.Вставить("Возраст", 25); Как обратиться к элементу структуры?ТекущийВозраст = Оппонет.Возраст; КлючСтруктуры = "Возраст"; ТекущийВозраст = Оппонет[КлючСтруктуры]; ТекущийВозраст = Неопределено; Оппонет.Свойство("Возраст", ТекущийВозраст); Оппонет.Возраст = 32; Оппонет["Возраст"] = 32; Оппонент.Вставить("Возраст", 32); Как перебрать элементы структуры?Для Каждого Элемент из СтруктураПараметров Цикл Сообщить(Элемент.Ключ + ": " + Элемент.Значение); КонецЦикла; Как удалить элемент структуры?СтруктураПараметров.Удалить("Номенклатура"); СтруктураПараметров. Очистить(); Как в структуре установить значение для элемента с определенным ключом?Структура = Новый Структура; // Добавить новый элемент. Структура.Вставить("Цвет", WebЦвета.Белый); // Установить значение для элемента с ключом "Цвет". Структура.Вставить("Цвет", WebЦвета.Синий); Как получить в структуру многомерные данные? Как собрать информацию по установленным в форме журнала отборам?СтруктураОтборов = Новый Структура; СтруктураПараметровОтбора = Новый Структура; Для Каждого ЭлементОтбора из ЖурналДокументовСписок.Отбор Цикл Если ЭлементОтбора.Использование Тогда СтруктураПараметровОтбора.Очистить(); СтруктураПараметровОтбора.Вставить("Имя", ЭлементОтбора.Имя); СтруктураПараметровОтбора.Вставить("ВидСравнения", ЭлементОтбора.ВидСравнения); СтруктураПараметровОтбора.Вставить("Значение", ЭлементОтбора.Значение); СтруктураПараметровОтбора.Вставить("ЗначениеПо", ЭлементОтбора.ЗначениеПо); СтруктураПараметровОтбора.Вставить("ЗначениеС", ЭлементОтбора.ЗначениеС); СтруктураПараметровОтбора.Вставить("Представление", ЭлементОтбора.Представление); СтруктураПараметровОтбора.Вставить("ПутьКДанным", ЭлементОтбора.ПутьКДанным); СтруктураПараметровОтбора.Вставить("ТипЗначения", ЭлементОтбора.ТипЗначения); СтруктураОтборов.Вставить(ЭлементОтбора.Имя, СтруктураПараметровОтбора); КонецЕсли; КонецЦикла; Как определить, есть ли в структуре элемент с ключом "Контрагент", и если есть, но содержит пустое значение справочника или Неопределено - удалить этоЕсли Структура.Свойство("Контрагент", ЗначениеЭлемента) Тогда Если ЗначениеЭлемента = Неопределено ИЛИ ЗначениеЭлемента.Пустая() Тогда Структура.Удалить("Контрагент"); КонецЕсли; КонецЕсли; Структура.Контрагент Структура["Контрагент"] Как из табличной части "Товары" документа получить все строки, где значение реквизита "Цена" равно нулю, а значение реквизита "СтавкаНДС" равно значенСтруктураДляПоиска = Новый Структура("Цена, СтавкаНДС", 0, Перечисления.СтавкиНДС.НДС18); МассивСтрок = Товары.НайтиСтроки(СтруктураДляПоиска); Как получить данные о текущей учетной политике бухгалтерского учета организации из периодического регистра сведений на заданную дату?// Подготовить отбор по измерению "Организация". СтруктураОтбора = Новый Структура("Организация", ЮрЛицо); // Получить данные, актуальные на указанную дату. СтруктураДанных = РегистрыСведений.УчетнаяПолитикаБухгалтерскийУчет.ПолучитьПоследнее(ДатаПолучения, СтруктураОтбора); // Прочитать данные из структуры данных. СпособОценкиМпзЮрЛица = СтруктураДанных.СпособОценкиМПЗ; ДиректКостингЮрЛица = СтруктураДанных.ДиректКостинг; Как сформировать структуру названий реквизитов табличной части произвольного документа?Функция СформироватьСтруктуруТабличнойЧастиДокумента(Документ, ИмяТабличнойЧасти) СтруктураТабличнойЧастиДокумента = Новый Структура; Для Каждого Реквизит из Документ.Метаданные().ТабличныеЧасти[ИмяТабличнойЧасти].Реквизиты Цикл СтруктураТабличнойЧастиДокумента.Вставить(Реквизит.Имя, Реквизит.Имя); КонецЦикла; Возврат СтруктураТабличнойЧастиДокумента; КонецФункции Как получить запросом данные табличной части документа, имея структуру названий реквизитов табличной части?Функция СформироватьЗапросПоТабличнойЧасти(Документ, ИмяТабличнойЧасти, СтруктураПолей) Экспорт ПоляРеквизитов = ""; Для Каждого Реквизит Из СтруктураПолей Цикл ПоляРеквизитов = ПоляРеквизитов + ", Док." + Реквизит.Значение + ?(ЗначениеНеЗаполнено(Реквизит.Ключ), "", " КАК " + СокрЛП(Реквизит.Ключ)); КонецЦикла; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Док.НомерСтроки " + ПоляРеквизитов + " |ИЗ | Документ." + Документ.Метаданные().Имя + "." + СокрЛП(ИмяТабличнойЧасти) + " КАК Док |ГДЕ | Док.Ссылка = &ДокументСсылка"; // Установить параметры запроса. Запрос.УстановитьПараметр("ДокументСсылка", Документ.Ссылка); Возврат Запрос.Выполнить(); КонецФункции Как сравнить два JSON (соответствия, структуры) и получить описание отличий?Функция СравнитьДанные(Знач Данные1, Знач Данные2, АдресСвойстваВJSON = "", Старт = Ложь) Экспорт Разделитель = Символы.ПС + "//----------------------------------------------------------------------------------"+Символы.ПС; СтруктураРазличий = Новый Структура("Отличаются, Описание", Ложь, ""); Если ТипЗнч(Данные1) = Тип("Строка") И ТипЗнч(Данные2) = Тип("Строка") Тогда Если СокрЛП(Данные1) = СокрЛП(Данные2) Тогда Возврат СтруктураРазличий; КонецЕсли; КонецЕсли; Если Старт Тогда Если ТипЗнч(Данные1) = Тип("Строка") Тогда ЧтениеДанных = ЧтениеДанныхИзJSON(Данные1); Если ЧтениеДанных.Ошибка Тогда СтруктураРазличий.Отличаются = Истина; СтруктураРазличий.Описание = "Неверный формат набора данных №1"; Иначе Данные1 = ЧтениеДанных.Данные; КонецЕсли; КонецЕсли; Если Не СтруктураРазличий.Отличаются Тогда Если ТипЗнч(Данные2) = Тип("Строка") Тогда ЧтениеДанных = ЧтениеДанныхИзJSON(Данные2); Если ЧтениеДанных.Ошибка Тогда СтруктураРазличий.Отличаются = Истина; СтруктураРазличий.Описание = "Неверный формат набора данных №2"; Иначе Данные2 = ЧтениеДанных.Данные; КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; Если Не СтруктураРазличий.Отличаются Тогда Если ТипЗнч(Данные1) <> ТипЗнч(Данные2) Тогда СтруктураРазличий.Отличаются = Истина; Если АдресСвойстваВJSON = "" Тогда СтруктураРазличий.Описание = "Тип данных набора №1 отличается от типа данных в наборе №2."; Иначе СтруктураРазличий.Описание = "Тип значения свойства '"+АдресСвойстваВJSON+"' в наборе №1 отличается от типа соответствующего значения в наборе №2."; КонецЕсли; Иначе Если ТипЗнч(Данные1) = Тип("Структура") ИЛИ ТипЗнч(Данные1) = Тип("Соответствие") Тогда МассивСверенныхСвойств = Новый Массив; Для каждого КлючИЗначение Из Данные1 Цикл МассивСверенныхСвойств.Добавить(СокрЛП(КлючИЗначение.Ключ)); АдресТекСвойства = ?(АдресСвойстваВJSON="", СокрЛП(КлючИЗначение.Ключ), АдресСвойстваВJSON+"."+СокрЛП(КлючИЗначение.Ключ)); Значение2 = Неопределено; Если ТипЗнч(Данные1) = Тип("Соответствие") Тогда Значение2 = Данные2.Получить(КлючИЗначение.Ключ); Иначе Данные2.Свойство(КлючИЗначение.Ключ, Значение2) КонецЕсли; ОписаниеРазличий = ""; Если Значение2 = Неопределено Тогда СтруктураРазличий.Отличаются = Истина; ОписаниеРазличий = "В наборе №2 не найдено значение свойства '"+АдресТекСвойства+"': " + Символы.ПС + ДанныеВJSON(КлючИЗначение.Значение); Иначе РезультатСравнения = СравнитьДанные(КлючИЗначение.Значение, Значение2, АдресТекСвойства); Если РезультатСравнения.Отличаются Тогда СтруктураРазличий.Отличаются = Истина; ОписаниеРазличий = СокрЛП(РезультатСравнения.Описание); КонецЕсли; КонецЕсли; Если ОписаниеРазличий<>"" Тогда СтруктураРазличий.Описание = СокрЛП(СтруктураРазличий.Описание) +?(СокрЛП(СтруктураРазличий.Описание)="","",Разделитель) + ОписаниеРазличий; КонецЕсли; КонецЦикла; Для каждого КлючИЗначение Из Данные2 Цикл Если МассивСверенныхСвойств.Найти(СокрЛП(КлючИЗначение.Ключ)) = Неопределено Тогда АдресТекСвойства = ?(АдресСвойстваВJSON="", СокрЛП(КлючИЗначение.Ключ), АдресСвойстваВJSON+"."+СокрЛП(КлючИЗначение.Ключ)); СтруктураРазличий.Отличаются = Истина; ОписаниеРазличий = "В наборе №1 не найдено значение свойства '"+АдресТекСвойства+"': " + Символы.ПС + ДанныеВJSON(КлючИЗначение.Значение); СтруктураРазличий.Описание = СокрЛП(СтруктураРазличий.Описание) + ?(СокрЛП(СтруктураРазличий.Описание)="","",Разделитель) + ОписаниеРазличий; КонецЕсли; КонецЦикла; ИначеЕсли ТипЗнч(Данные1) = Тип("Массив") Тогда Индекс = Данные1.Количество()-1; Пока Индекс >= 0 Цикл ИндексСтр = "["+СокрЛП(Индекс)+"]"; АдресТекСвойства = ?(АдресСвойстваВJSON="", ИндексСтр, АдресСвойстваВJSON+ИндексСтр); Если Индекс > Данные2.Количество()-1 Тогда СтруктураРазличий.Отличаются = Истина; ОписаниеРазличий = "В наборе №2 не найдено значение свойства '"+АдресТекСвойства+"': " + Символы.ПС + ДанныеВJSON(Данные1.Получить(Индекс)); СтруктураРазличий.Описание = ОписаниеРазличий + ?(СокрЛП(СтруктураРазличий.Описание)="","",Разделитель) + СокрЛП(СтруктураРазличий.Описание) ; Иначе Значение1 = Данные1.Получить(Индекс); Значение2 = Данные2.Получить(Индекс); РезультатСравнения = СравнитьДанные(Значение1, Значение2, АдресТекСвойства); Если РезультатСравнения.Отличаются Тогда СтруктураРазличий.Отличаются = Истина; СтруктураРазличий.Описание = СокрЛП(РезультатСравнения.Описание) + ?(СокрЛП(СтруктураРазличий.Описание)="","",Разделитель) + СокрЛП(СтруктураРазличий.Описание); КонецЕсли; КонецЕсли; Индекс = Индекс - 1; КонецЦикла; Если Данные2.Количество()>Данные1.Количество() Тогда СтруктураРазличий.Отличаются = Истина; ОтсутствующиеЭлементы = ""; Индекс = Данные1.Количество(); Пока Индекс < Данные2.Количество() Цикл ОтсутствующиеЭлементы = ОтсутствующиеЭлементы + Символы.ПС + ДанныеВJSON(Данные2.Получить(Индекс)); Индекс = Индекс + 1; КонецЦикла; ТекОтличие = "В наборе №2 в свойстве '"+АдресСвойстваВJSON+"' количество элементов больше, чем в наборе №1."; ТекОтличие = ТекОтличие +Символы.ПС+ "В свойстве '"+АдресСвойстваВJSON+"' набора №1 не найдены данные с индексом >= '"+СокрЛП(Данные1.Количество())+"':" + Символы.ПС + СокрЛП(ОтсутствующиеЭлементы); СтруктураРазличий.Описание = СокрЛП(СтруктураРазличий.Описание) + ?(СокрЛП(СтруктураРазличий.Описание)="","",Разделитель) + ТекОтличие; КонецЕсли; ИначеЕсли Данные1<>Данные2 Тогда СтруктураРазличий.Отличаются = Истина; СтруктураРазличий.Описание = "Отличаются зачения свойства '"+АдресСвойстваВJSON+"': '"+СокрЛП(Данные1)+"' <> '"+СокрЛП(Данные2)+"'."; КонецЕсли; КонецЕсли; КонецЕсли; Возврат СтруктураРазличий; КонецФункции Функция ЧтениеДанныхИзJSON(Знач СтрокаJSON) Экспорт Результат = Новый Структура("Ошибка, ТекстОшибки", Ложь, ""); Попытка ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(СтрокаJSON); Результат.Вставить("Данные", ПрочитатьJSON(ЧтениеJSON)); Исключение Попытка ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(СтрокаJSON); Результат.Вставить("Данные", ПрочитатьJSON(ЧтениеJSON, Истина)); Исключение Результат.Ошибка = Истина; Результат.ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; КонецПопытки; Возврат Результат; КонецФункции |