наверх
Справка / работа со структурами

Работа со структурами

  • Как создать структуру?
  • Как добавить элементы в структуру?
  • Как обратиться к элементу структуры?
  • Как перебрать элементы структуры?
  • Как удалить элемент структуры?
  • Как в структуре установить значение для элемента с определенным ключом?
  • Как получить в структуру многомерные данные? Как собрать информацию по установленным в форме журнала отборам?
  • Как определить, есть ли в структуре элемент с ключом "Контрагент", и если есть, но содержит пустое значение справочника или Неопределено - удалить это
  • Как из табличной части "Товары" документа получить все строки, где значение реквизита "Цена" равно нулю, а значение реквизита "СтавкаНДС" равно значен
  • Как получить данные о текущей учетной политике бухгалтерского учета организации из периодического регистра сведений на заданную дату?
  • Как сформировать структуру названий реквизитов табличной части произвольного документа?
  • Как получить запросом данные табличной части документа, имея структуру названий реквизитов табличной части?
  • Как сравнить два JSON (соответствия, структуры) и получить описание отличий?
  • Как создать структуру?

    СозданнаяСтруктура = Новый Структура; 
    Оппонент = Новый Структура ("Фамилия, Имя, Отчество, Возраст", "Иванов", "Иван", "Иванович", 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, Истина));
    		Исключение 
    			Результат.Ошибка 	= Истина;
    			Результат.ТекстОшибки 	= ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
    		КонецПопытки;
    	КонецПопытки;
    	
    	Возврат Результат;	
    КонецФункции