Первый шаг в 1С — абсолютно бесплатно.

📋 Универсальная коллекция - Структура в 1С 8.3

Структура определение и примеры

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

* Ключ — это уникальное имя свойства (всегда имеет тип Строка, причем строка должна соответствовать правилам именования переменных: без пробелов, спецсимволов и не начинаться с цифры).

* Значение — данные, которые хранятся под этим ключом (абсолютно любой тип: число, строка, дата, ссылка на справочник, массив или даже другая структура).

 

Аналогия для статьи: Представьте комод, где на каждом ящике наклеена уникальная бирка («Имя», «Возраст», «Должность»). Вы не знаете точный порядковый номер ящика, но можете мгновенно достать вещь, просто прочитав название на бирке.

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

Существует два основных способа инициализации структуры:

Способ 1: Создание пустой структуры

ДанныеСотрудника = Новый Структура;

Способ 2: Создание с одновременным заполнением

Ключи и значения передаются перечислением через запятую: сначала все ключи одной строкой (через запятую), а затем соответствующие им значения.

ДанныеСотрудника = Новый Структура("Имя, Возраст, Оклад", "Иванов", 35, 75000);

⚠️ Важно для статьи (Стандарты 1С): Согласно стандартам разработки «1С», в конструктор структуры не рекомендуется передавать более 3-х ключей, так как такой код становится трудночитаемым. Если ключей больше, лучше создавать пустую структуру и заполнять её методом Вставить().

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

Для добавления новых элементов или изменения существующих используется метод Вставить().

// Добавление нового свойства

ДанныеСотрудника.Вставить("Должность", "Программист");

// Изменение значения существующего свойства (перезапись)

ДанныеСотрудника.Вставить("Оклад", 85000);

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

ДанныеСотрудника.Имя = "Петров";

ДанныеСотрудника["Возраст"] = 36;

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

Для определения общего числа пар Ключ/Значение используется метод Количество().

ВсегоСвойств = ДанныеСотрудника.Количество();

// Возвратит число, например: 4

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

Так как структура — это коллекция, ее можно перебрать с помощью цикла Для Каждого. При каждом шаге цикла система возвращает специальный объект типа КлючИЗначение, у которого есть два свойства: .Ключ и .Значение.

Для Каждого Элемент Из ДанныеСотрудника Цикл

Сообщить("Свойство: " + Элемент.Ключ + ", Значение: " + Элемент.Значение);

КонецЦикла;

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

Для удаления конкретного свойства по его имени используется метод Удалить(). В параметр передается строка с именем ключа.

ДанныеСотрудника.Удалить("Оклад");

// Ключ "Оклад" и его значение стерты из структуры

Как очистить структуру

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

ДанныеСотрудника.Oчистить();


Как проверить, есть ли ключ в структуре (Метод Свойство)

Прямое обращение к несуществующему ключу (например, ДанныеСотрудника.Адрес) вызовет критическую ошибку программы. Чтобы этого избежать, используют метод Свойство(). Он проверяет наличие ключа и, если тот найден, может сразу записать его значение в переменную.

// Просто проверка наличия

Если ДанныеСотрудника.Свойство("Телефон") Тогда

Сообщить("Телефон указан!");

КонецЕсли;

// Проверка с одновременным получением значения в переменную "НомерТелефона"

НомерТелефона = "";

Если ДанныеСотрудника.Свойство("Телефон", НомерТелефона) Тогда

Сообщить("Звоним на номер: " + НомерТелефона);

КонецЕсли;

Разница между обращением через Точку и через Квадратные скобки

* Через точку (Структура.ИмяКлюча): Используется, когда имя ключа известно заранее на этапе написания кода.

* Через квадратные скобки (Структура[ИмяПеременной]): Незаменимо, когда имя ключа динамически вычисляется в коде или хранится в другой переменной.

ИмяПоля = "Оклад";

ЗначениеПоля = ДанныеСотрудника[ИмяПоля]; // Динамическое получение

Копирование структур (Нюанс с передачей по ссылке)

В 1С структуры передаются по ссылке. Если вы напишете НоваяСтруктура = СтараяСтруктура;, то изменение Новой изменит и Старую. Чтобы сделать независимую копию, используют метод ЗаполнитьЗначенияСвойств():

КопияСтруктуры = Новый Структура;

ЗаполнитьЗначенияСвойств(КопияСтруктуры, ДанныеСотрудника);

📋 Универсальная коллекция - Соответствие в 1С 8.3

Определение соответствия и примеры

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

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

Как создать соответствие

Для создания объекта используется конструктор Новый:

// Создание пустого соответствия

МоеСоответствие = Новый Соответствие;

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

Для добавления элементов используется метод Вставить(Ключ, Значение).

// Ключами могут быть элементы разных типов

МоеСоответствие.Вставить(1, "Первый");

МоеСоответствие.Вставить(ТекущаяДата(), "Сегодняшняя дата");

МоеСоответствие.Вставить(Справочники.Номенклатура.ПустаяСсылка(), "Пустая номенклатура");

Как изменить значение ключа

Метод Вставить() работает по принципу «добавить или заменить». Если ключ уже существует в коллекции, его значение перезапишется.

// Изменение значения для существующего ключа

МоеСоответствие.Вставить(1, "Новое значение для единицы");

Как получить значение по ключу

Получить значение можно с помощью квадратных скобок [] или метода Получить(Ключ).

// Вариант 1: Через квадратные скобки

ИскомоеЗначение = МоеСоответствие[1];

// Вариант 2: Через метод Получить()

ИскомоеЗначение = МоеСоответствие.Получить(1);

Как узнать, есть ли соответствие (Проверить наличие ключа)

Если ключа в коллекции нет, 1С вернет значение Неопределено. Однако, если само значение ключа было Неопределено, этот способ не подойдет. Для точной проверки существует специальный метод Свойство(Ключ, НайденноеЗначение).

// Метод возвращает Истина, если ключ найден

ПеременнаяДляЗначения = Неопределено;

Если МоеСоответствие.Свойство(1, ПеременнаяДляЗначения) Тогда

Сообщить("Ключ найден! Значение: " + ПеременнаяДляЗначения);

Иначе

Сообщить("Ключ не найден.");

КонецЕсли;

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

Количество элементов (пар) в коллекции возвращает метод Количество().

ВсегоЭлементов = МоеСоответствие.Количество();

Как перебрать (обойти) все элементы

Для перебора коллекции используется цикл Для каждого. На каждой итерации система возвращает объект типа КлючИЗначение, у которого есть свойства Ключ и Значение.

Для Каждого Элемент Из МоеСоответствие Цикл

Сообщить("Ключ: " + Элемент.Ключ + " --> Значение: " + Элемент.Значение);

КонецЦикла;

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

Для удаления конкретной пары по её ключу используется метод Удалить(Ключ).

// Удалит элемент, где ключ равен 1

МоеСоответствие.Удалить(1);

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

Чтобы полностью опустошить коллекцию, сохранив сам объект, вызывают метод

МоеСоответствие.Очистить();

// Теперь Количество() вернет 0

💡 Что еще важно знать о Соответствии (Нюансы для статьи)

* Поиск по ключу регистрозависим: Если ключом является строка, то "Ключ" и "ключ" — это два разных ключа.

* Сериализация (передача между сервером и клиентом): Соответствие можно без проблем передавать с сервера на клиент и обратно.

* Ключом может быть ссылка: Это критически полезно при оптимизации кода, когда нужно быстро сопоставить, например, ДокументСсылка и Сумму без обращения к базе данных в цикле.

Сравнение со Структурой:

У Структуры ключ — только строка (без пробелов и спецсимволов). К её свойствам можно обращаться через точку: Структура.Имя.

У Соответствия ключ — любой тип. Обращаться через точку нельзя: Соответствие.Ключ вызовет ошибку, нужно писать только Соответствие[Ключ].

📌 Памятка для начинающих: когда выбирать Структуру, а когда Соответствие?

Чтобы у новичков не путались эти две коллекции, можно добавить в статью простую шпаргалку:

Выбирайте СТРУКТУРУ, если вам нужно передать набор параметров, где имена параметров фиксированы и вы точно знаете их по именам (например: ПараметрыОтбора = Новый Структура("Организация, Склад");). К ним удобно обращаться через точку: ПараметрыОтбора.Склад.

Выбирайте СООТВЕТСТВИЕ, если ключ заранее неизвестен, им является объект (товар, контрагент, документ, число) и вам нужно быстро находить связанные с ним данные без циклов.

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

Представьте задачу: у нас есть массив товаров, и нам нужно проставить для каждого актуальную цену из регистра.

❌ Как делать НЕ надо (Типичная ошибка новичка):Искать цену запросом или методом Найти() в цикле. Из-за этого программа будет постоянно обращаться к базе данных или перебирать всю таблицу заново, что приведет к сильным зависаниям.

Для Каждого СтрокаТовара Из ТоварыДокумента Цикл

// Плохо: запрос или поиск в цикле работает очень медленно!

СтрокаТовара.Цена = Справочники.Номенклатура.НайтиЦену(СтрокаТовара.Товар);

КонецЦикла;

 

Как сделать правильно с помощью Соответствия:

* Мы одним запросом выбираем все нужные цены.

* Выгружаем их в Соответствие, где Ключом будет сам товар (ссылка), а Значением — его цена.

* В цикле моментально получаем цену по ключу.

// 1. Создаем соответствие для кэширования цен

ЦеныТоваров = Новый Соответствие;

// 2. Допустим, мы получили данные из запроса и заполняем коллекцию

Пока ВыборкаЗапроса.Следующий() Цикл

// Ключ — Ссылка на Номенклатуру, Значение — Число (Цена)

ЦеныТоваров.Вставить(ВыборкаЗапроса.Товар, ВыборкаЗапроса.Цена);

КонецЦикла;

// 3. Быстро и без лишних обращений к базе заполняем документ

Для Каждого СтрокаДокумента Из ТЧТовары Цикл

// Пытаемся получить цену из нашего соответствия

АктуальнаяЦена = ЦеныТоваров[СтрокаДокумента.Товар];

Если цена для этого товара нашлась, записываем её

Если АктуальнаяЦена <> Неопределено Тогда

СтрокаДокумента.Цена = АктуальнаяЦена;

КонецЕсли;

КонецЦикла;