Структура — это особый тип данных в 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” помещаем соответствующие значения искомых ключей и сравниваем их с искомыми значениями:
В результате получаем:
Решение задачи “Поиск минимального и максимального значения в массиве структур”:
Пояснение:
В цикле обходим элементы массива. Во вложенном цикле обходим структуру и сравниваем минимальное значение со значением в текущей итерации.
В результате получаем:
Аналогичным образом ищем максимальное значение:
В результате получаем:
Ссылки для скачивания:
- Поиск элемента массива структур по одному значению;
- Поиск элемента массива структур по двум значениям;
- Поиск минимального значения в массиве структур;
- Поиск максимального значения в массиве структур.
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С программистов и разработчик обновлятора).
Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.
Нажмите одну из кнопок, чтобы поделиться: