Как в структуре найти значение по ключу

Структура — это особый тип данных в 1С, который можно представить в виде таблицы из двух колонок. Первая колонка называется Ключ, вторая — Значение. Ключ всегда является строкой и должен удовлетворять требованиям, предъявляемым к именованию переменных встроенного языка, значение может быть разных типов.

КЛЮЧ ЗНАЧЕНИЕ
«Имя» «Иван»
«Фамилия» «Иванов»
«Возраст» 25

Как создать переменную с типом Структура

Создать переменную с типом Структура можно двумя способами. Рассмотрим создание структуры, описанной в таблице выше.

П1 = новый Структура (“Имя, Фамилия, Возраст”, “Иван”, “Иванов”, 25);

или

П1 = новый Структура;
П1.Вставить(“Имя”, “Иван”);
П1.Вставить(“Фамилия”, “Иванов”);
П1.Вставить(“Возраст”, 25);

Как добавить новый элемент в структуру

Для добавления нового элемента в структуру используется функция Вставить(Ключ, Значение). Пример использования этой функции смотрите в предыдущем разделе.

Как получить значение элемента структуры по имени ключа

Фамилия = П1.Фамилия; //переменной Фамилия будет присвоено значение “Иванов”
Возраст = П1.Возраст; //переменной Возраст будет присвоено значение 25

Как изменить значение элемента структуры по имени ключа

Если известно имя ключа структуры, то изменить значение можно двумя способами.

П1.Возраст=26; // Значение изменено на 26

П1.Вставить(“Возраст”,26); // Значение изменено на 26

Как узнать количество элементов структуры

Колич = П1.Количество(); // 3

Как проверить, есть ли в структуре ключ с определенным именем

Для этого существует функция Свойство (Ключ, НайденноеЗначение). Первый параметр Ключ — обязательный. Сюда нужно передать имя искомого ключа структуры. Второй параметр — переменная, в которую нужно поместить значение, если ключ будет найден. Этот параметр не обязателен. А сама функция возвращает значение Истина, если ключ найден, или Ложь, если не найден.

Найдено = П1.Свойство(“Отчество”); // Найдено = Ложь

Перем Имя;
Найдено = П1.Свойство(“Имя”, Имя);

//Имя = “Иван”, Найдено = Истина

Как удалить элемент структуры

Как удалить все элементы, очистить структуру

Как обойти в цикле все элементы структуры

Для обхода структуры используется цикл Для каждого.

Для каждого Элемент из П1 Цикл
Сообщить(Элемент.Ключ + ” – “ + Элемент.Значение);
КонецЦикла;

//Результат:
//Имя – Иван
//Фамилия – Иванов
//Возраст – 25

Структура в 1С 8.3 это динамический набор данных (коллекция значений), каждый элемент которой состоит из пары «Ключ» и «Значение». Ключи структуры уникальны, поэтому ими можно идентифицировать значения. Ключ структуры должен иметь строковый тип данных и отвечать требованиям к именам переменных. К значениям структуры можно обращаться как к свойствам объекта, при этом ключ используется как имя свойства.

Содержание

  • Создание структуры
  • Добавление элементов, установка значений
  • Как узнать количество элементов структуры
  • Обход элементов структуры
  • Проверить ключ структуры на существование
  • Получить значение элемента структуры по ключу
  • Удалить элемент структуры
  • Удалить все элементы структуры
  • Пример преобразования структуры в таблицу значений
  • Как скопировать структуру
    • Пример №1
    •  Пример №2
    •  Пример №3

Создание структуры

Автомобиль = Новый Структура("Марка,ДатаВыпуска,ПробегКМ","BMW",Дата('20190101'),25000);

Результат:

Добавление элементов, установка значений

Метод Вставить() устанавливает значение элемента структуры по ключу. Если элемент с переданным значением ключа существует, то его значение заменяется, в противном случае добавляется новый элемент.

Автомобиль.Вставить("Цвет","Белый");//Добавили ключ и значение.
Автомобиль.Вставить("Цвет","Чёрный");// Т.к. ключ "Цвет" уже существует, произошла замена значения.

//Другие способы для установки значений
Автомобиль.Цвет = "Белый";//Для ключа "Цвет" установили значение "Белый"
Автомобиль["Цвет"] = "Чёрный";//Для ключа "Цвет" установили значение "Чёрный"

Как узнать количество элементов структуры

КоличествоЭлементов = Автомобиль.Количество();

Обход элементов структуры

Для Каждого Элемент Из Автомобиль Цикл
Ключ = Элемент.Ключ;
Значение = Элемент.Значение;
Сообщить(Ключ + " - " + Значение);
КонецЦикла;

Проверить ключ структуры на существование

// Если ключ существует, выражение вернёт "ИСТИНА" иначе вернёт "ЛОЖЬ"
Автомобиль.Свойство("Марка");

Получить значение элемента структуры по ключу

ЗначениеЭлемента = Неопределено;
Автомобиль.Свойство("Марка ",ЗначениеЭлемента);

Удалить элемент структуры

Автомобиль.Удалить("Цвет ");

Удалить все элементы структуры

Автомобиль.Очистить();

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

&НаКлиенте
Процедура СтруктураВТЗ(Команда)
РасписаниеДня = Новый Структура();
РасписаниеДня.Вставить("Начало","08:00");
РасписаниеДня.Вставить("Обед","12:00");
РасписаниеДня.Вставить("Конец","17:00");
ТаблицаЗнач = СтруктураВТЗНаСервере(РасписаниеДня);
КонецПроцедуры

&НаСервере
Функция СтруктураВТЗНаСервере(РасписаниеДня)

ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Период");
ТЗ.Колонки.Добавить("Время");

Для Каждого КлючИЗначение из РасписаниеДня Цикл
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Период = КлючИЗначение.Ключ;
НоваяСтрока.Время = КлючИЗначение.Значение;
КонецЦикла;
Возврат ТЗ;

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

Наша команда предоставляет услуги по консультированию, настройке и внедрению 1С.

Связаться с нами можно по телефону +7 499 350 29 00.

Услуги и цены можно увидеть по ссылке.

Будем рады помочь Вам!

Результат:

Как скопировать структуру

Пример №1

&НаКлиенте
Процедура СкопироватьСтруктуру(Команда)

Структура = Новый Структура();
Структура.Вставить("Фамилия","Петров");
Структура.Вставить("Имя","Пётр");
Структура.Вставить("Отчество","Петрович");

КопияСтруктуры= Новый Структура();
Для Каждого КлючИЗначение Из Структура Цикл
КопияСтруктуры.Вставить(КлючИЗначение.Ключ,КлючИЗначение.Значение);
КонецЦикла;

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

 Пример №2

Способ работает в рамках одной информационной базы.

&НаКлиенте
Процедура СкопироватьСтруктуру2(Команда)
Структура = Новый Структура();
Структура.Вставить("Фамилия","Петров");
Структура.Вставить("Имя","Пётр");
Структура.Вставить("Отчество","Петрович");
КопияСтруктуры = СкопироватьСтруктуруНаСервере(Структура);
КонецПроцедуры

&НаСервере
Функция СкопироватьСтруктуруНаСервере(Структура)
КопияСтруктуры = ЗначениеИзСтрокиВнутр(ЗначениеВСтрокуВнутр(Структура));
Возврат КопияСтруктуры;
КонецФункции

 Пример №3

&НаКлиенте
Процедура СкопироватьСтруктуру3(Команда)
Структура = Новый Структура();
Структура.Вставить("Фамилия","Петров");
Структура.Вставить("Имя","Пётр");
Структура.Вставить("Отчество","Петрович");
КопияСтруктуры = Новый ФиксированнаяСтруктура(Структура);
КонецПроцедуры

В примере №3 структура будет скопирована в неизменную (фиксированную) структуру.  Для такого вида структур не доступны методы Вставить(), Удалить(), Очистить().  Если требуется изменить фиксированную структуру, её необходимо скопировать в обычную.

ОбычнаяСтруктура = Новый Структура(ФиксированнаяСтруктура);

  • АКТУАЛЬНЫЕ РЕЛИЗЫ 1С
  • ПРИМЕРЫ КОДА НА ПЛАТФОРМЕ 1С
Работа со структурами в 1С 8.x
  • Как создать структуру?
  • Как добавить элементы в структуру?
  • Как обратиться к элементу структуры?
  • Как перебрать элементы структуры?
  • Как удалить элемент структуры?
  • Как в структуре установить значение для элемента с определенным ключом?
  • Как получить в структуру многомерные данные? Как собрать информацию по установленным в форме журнала отборам?
  • Как определить, есть ли в структуре элемент с ключом “Контрагент”, и если есть, но содержит пустое значение справочника или Неопределено – удалить этот элемент?
  • Как из табличной части “Товары” документа получить все строки, где значение реквизита “Цена” равно нулю, а значение реквизита “СтавкаНДС” равно значению “НДС18” перечисления “СтавкиНДС”?
  • Как получить данные о текущей учетной политике бухгалтерского учета организации из периодического регистра сведений на заданную дату?
  • Как сформировать структуру названий реквизитов табличной части произвольного документа?
  • Как получить запросом данные табличной части документа, имея структуру названий реквизитов табличной части?

Как создать структуру?

СозданнаяСтруктура = Новый Структура; 
Оппонент = Новый Структура ("Фамилия, Имя, Отчество, Возраст", "Иванов", "Иван", "Иванович", 7);          
Как добавить элементы в структуру?

Оппонент = Новый Структура ("Фамилия, Имя, Отчество, Возраст", "Иванов", "Иван", "Иванович", 7); 
Оппонент.Вставить("Обращение", "Господин"); 
Оппонент.Вставить("Возраст", 25);          
Как обратиться к элементу структуры?

ТекущийВозраст = Оппонет.Возраст;

КлючСтруктуры = "Возраст"; 
ТекущийВозраст = Оппонет[КлючСтруктуры];

ТекущийВозраст = Неопределено; 

Оппонет.Свойство("Возраст", ТекущийВозраст);

Оппонет.Возраст = 32; 

Оппонет["Возраст"] = 32; 

Оппонент.Вставить("Возраст", 32);          
Как перебрать элементы структуры?

Для Каждого Элемент из СтруктураПараметров Цикл 
	Сообщить(Элемент.Ключ + ": " + Элемент.Значение); 
КонецЦикла;          
Как удалить элемент структуры?

СтруктураПараметров.Удалить("Номенклатура"); 

СтруктураПараметров. Очистить();          
Как в структуре установить значение для элемента с определенным ключом?

Структура = Новый Структура; 

// Добавить новый элемент. 
Структура.Вставить("Цвет", WebЦвета.Белый); 

// Установить значение для элемента с ключом "Цвет". 
Структура.Вставить("Цвет", WebЦвета.Синий);           
Как получить в структуру многомерные данные? Как собрать информацию по установленным в форме журнала отборам?

СтруктураОтборов = Новый Структура; 
СтруктураПараметровОтбора = Новый Структура; 

Для Каждого ЭлементОтбора из ЖурналДокументовСписок.Отбор Цикл 
	Если ЭлементОтбора.Использование Тогда 
		СтруктураПараметровОтбора.Очистить(); 
		СтруктураПараметровОтбора.Вставить("Имя", ЭлементОтбора.Имя); 
		СтруктураПараметровОтбора.Вставить("ВидСравнения", ЭлементОтбора.ВидСравнения); 
		СтруктураПараметровОтбора.Вставить("Значение", ЭлементОтбора.Значение); 
		СтруктураПараметровОтбора.Вставить("ЗначениеПо", ЭлементОтбора.ЗначениеПо); 
		СтруктураПараметровОтбора.Вставить("ЗначениеС", ЭлементОтбора.ЗначениеС); 
		СтруктураПараметровОтбора.Вставить("Представление", ЭлементОтбора.Представление); 
		СтруктураПараметровОтбора.Вставить("ПутьКДанным", ЭлементОтбора.ПутьКДанным); 
		СтруктураПараметровОтбора.Вставить("ТипЗначения", ЭлементОтбора.ТипЗначения); 

		СтруктураОтборов.Вставить(ЭлементОтбора.Имя, СтруктураПараметровОтбора); 
	КонецЕсли; 
КонецЦикла;           
Как определить, есть ли в структуре элемент с ключом “Контрагент”, и если есть, но содержит пустое значение справочника или Неопределено – удалить этот элемент?

Если Структура.Свойство("Контрагент", ЗначениеЭлемента) Тогда 
	Если ЗначениеЭлемента = Неопределено ИЛИ ЗначениеЭлемента.Пустая() Тогда 
		Структура.Удалить("Контрагент"); 
	КонецЕсли; 
КонецЕсли; 

Структура.Контрагент 

Структура["Контрагент"]          
Как из табличной части “Товары” документа получить все строки, где значение реквизита “Цена” равно нулю, а значение реквизита “СтавкаНДС” равно значению “НДС18” перечисления “СтавкиНДС”?

СтруктураДляПоиска = Новый Структура("Цена, СтавкаНДС", 0, Перечисления.СтавкиНДС.НДС18); 
МассивСтрок = Товары.НайтиСтроки(СтруктураДляПоиска);          
Как получить данные о текущей учетной политике бухгалтерского учета организации из периодического регистра сведений на заданную дату?

// Подготовить отбор по измерению "Организация". 
СтруктураОтбора = Новый Структура("Организация", ЮрЛицо); 

// Получить данные, актуальные на указанную дату. 
СтруктураДанных = РегистрыСведений.УчетнаяПолитикаБухгалтерскийУчет.ПолучитьПоследнее(ДатаПолучения, СтруктураОтбора); 

// Прочитать данные из структуры данных. 
СпособОценкиМпзЮрЛица = СтруктураДанных.СпособОценкиМПЗ; 
ДиректКостингЮрЛица = СтруктураДанных.ДиректКостинг;          
Как сформировать структуру названий реквизитов табличной части произвольного документа?

Функция СформироватьСтруктуруТабличнойЧастиДокумента(Документ, ИмяТабличнойЧасти) 

	СтруктураТабличнойЧастиДокумента = Новый Структура; 
	Для Каждого Реквизит из Документ.Метаданные().ТабличныеЧасти[ИмяТабличнойЧасти].Реквизиты Цикл 
		СтруктураТабличнойЧастиДокумента.Вставить(Реквизит.Имя, Реквизит.Имя); 
	КонецЦикла; 

	Возврат СтруктураТабличнойЧастиДокумента; 

КонецФункции          
Как получить запросом данные табличной части документа, имея структуру названий реквизитов табличной части?

Функция СформироватьЗапросПоТабличнойЧасти(Документ, ИмяТабличнойЧасти, СтруктураПолей) Экспорт 

	ПоляРеквизитов = ""; 
	Для Каждого Реквизит Из СтруктураПолей Цикл 
		ПоляРеквизитов = ПоляРеквизитов + ", Док." + Реквизит.Значение + 
		?(ЗначениеНеЗаполнено(Реквизит.Ключ), "", " КАК " + СокрЛП(Реквизит.Ключ)); 
	КонецЦикла; 

	Запрос = Новый Запрос; 
	Запрос.Текст = "ВЫБРАТЬ 
		|	Док.НомерСтроки " + ПоляРеквизитов + " 
		|ИЗ 
		|	Документ." + Документ.Метаданные().Имя + "." + СокрЛП(ИмяТабличнойЧасти) + " КАК Док 
		|ГДЕ 
		|	Док.Ссылка = &ДокументСсылка"; 

	// Установить параметры запроса. 
	Запрос.УстановитьПараметр("ДокументСсылка", Документ.Ссылка); 

	Возврат Запрос.Выполнить(); 

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

Задайте вопрос программисту 1С

Постановка задачи:

На практике часто бывает нужно работать с массивом, каждый элемент которого содержит структуру. При этом было бы хорошо иметь несколько универсальных функций, которые могли бы решать следующие задачи:
1) Поиск элемента массива структур по одному значению;
2) Поиск элемента массива структур по двум значениям;
3) Поиск минимального и максимального значения в массиве структур.

С подобной задачей можно столкнуться, например, когда мы запросом получаем информацию из базы данных, и хотим вернуть ее на клиент в виде таблицы значений. Но с таблицей значений на момент написания статьи в тонком клиенте работать нельзя. Поэтому, чтобы вернуть таблицу значений на клиент можем использовать функцию БСП “ТаблицаЗначенийВМассив”:


В результате на клиенте получаем массив, каждый элемент которого содержит структуру:
Исходные данные:

1. Учебная конфигурация;
2. Платформа 8.3.19.1150.

Решение задачи “Поиск элемента массива структур по одному значению”:


Пояснение:

В цикле обходим каждый элемент массива структур:


Во вложенном цикле обходим структуру, где “Ключ” это наименование столбца в запросе, а “Значение” его значение:

Далее проверяем, если “Ключ” равен ключу, который мы ищем, и значение равно значению, которое мы ищем, фиксирует результат и прерываем цикл.

В результате получаем:


Решение задачи “Поиск элемента массива структур по двум значениям”:
Пояснение:

В цикле обходим каждый элемент массива структур.

Если второй ключ для поиска не указан, обходим структуру текущего элемента массива и проверяем, есть ли в ней нужное значение.

Если второй ключ для поиска указан, в переменные “ЗначениеСтруктуры” и “ЗначениеСтруктуры2” помещаем соответствующие значения искомых ключей и сравниваем их с искомыми значениями:




В результате получаем:
Решение задачи “Поиск минимального и максимального значения в массиве структур”:
Пояснение:

В цикле обходим элементы массива. Во вложенном цикле обходим структуру и сравниваем минимальное значение со значением в текущей итерации.

В результате получаем:


Аналогичным образом ищем максимальное значение:
В результате получаем:
Ссылки для скачивания:

  1. Поиск элемента массива структур по одному значению;
  2. Поиск элемента массива структур по двум значениям;
  3. Поиск минимального значения в массиве структур;
  4. Поиск максимального значения в массиве структур.


2022-05-23 11:58

Программирование

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

2017-12-18T22:28:48+00:00Дата Если Массивы Математика Процедуры Строки Циклы
Диалоги ОписаниеТипов ОперационнаяСистема Приложение Соответствие
СписокЗначений Структура ТаблицаЗначений ФайловаяСистема Формат

ОбщиеОбъекты Запросы ПрикладныеОбъекты УниверсальныеФункции

См. урок для начинающих по типу Структура в 1С
Скачать эти примеры в виде тестовой базы (как загрузить, как исследовать)

Полный синтаксис (нажмите, чтобы раскрыть)

Оглавление (нажмите, чтобы раскрыть)

&НаКлиенте
Процедура ВыполнитьКод(Команда)
 
    /// Как создать структуру (способ 1) в 1с 8.3, 8.2
 
    ЛичныеДанные = Новый Структура;
    // пара ключ (имя переменной) - значение (произв. типа)
    ЛичныеДанные.Вставить("Фамилия", "Иванов");
    ЛичныеДанные.Вставить("Имя", "Иван");
    ЛичныеДанные.Вставить("ДатаРождения", '19800802');
 
    Сообщить(
        ЛичныеДанные.Имя + " " + ЛичныеДанные.Фамилия +
        " родился " + ЛичныеДанные.ДатаРождения
    );
 
    /// Как создать структуру (способ 2) в 1с 8.3, 8.2
 
    Время = Новый Структура("Часы,Минуты,Секунды", 12, 45, 33);
    Сообщить(
        "Время " + Время.Часы + ":" + Время.Минуты + ":" +
        Время.Секунды
    );
 
    /// Как изменить значение поля созданной структуры (способ 1)
    /// в 1с 8.3, 8.2
 
    ЛичныеДанные.Вставить("Фамилия", "Сидоров");
 
    /// Как изменить значение поля созданной структуры (способ 2)
    /// в 1с 8.3, 8.2
 
    Время.Часы = 13;
 
    /// Как узнать количество элементов структуры в 1с 8.3, 8.2
 
    Сообщить(Время.Количество());
 
    /// Как обойти все элементы структуры в 1с 8.3, 8.2
 
    Для Каждого Элемент Из ЛичныеДанные Цикл
        Сообщить(Элемент.Ключ + " " + Элемент.Значение);
    КонецЦикла;
 
    /// Как удалить элемент структуры в 1с 8.3, 8.2
 
    ЛичныеДанные.Удалить("ДатаРождения");
 
    /// Как очистить все элементы структуры в 1с 8.3, 8.2
 
    ЛичныеДанные.Очистить();
 
КонецПроцедуры
 
/// Скачать и выполнить эти примеры на компьютере

Скачать эти примеры в виде тестовой базы (как загрузить, как исследовать)

Тип Структура в языке 1С 8.3, 8.2 (в примерах)

Дата Если Массивы Математика Процедуры Строки Циклы
Диалоги ОписаниеТипов ОперационнаяСистема Приложение Соответствие
СписокЗначений Структура ТаблицаЗначений ФайловаяСистема Формат

ОбщиеОбъекты Запросы ПрикладныеОбъекты УниверсальныеФункции

С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).

Владимир Милькин

Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.

Нажмите одну из кнопок, чтобы поделиться:

Добавить комментарий