Первый шаг в 1С — абсолютно бесплатно.
Структура определение и примеры Структура в 1С 8.3 — это объект встроенного языка, представляющий собой именованную коллекцию значений. Она состоит из пар Ключ и Значение. * Ключ — это уникальное имя свойства (всегда имеет тип Строка, причем строка должна соответствовать правилам именования переменных: без пробелов, спецсимволов и не начинаться с цифры). * Значение — данные, которые хранятся под этим ключом (абсолютно любой тип: число, строка, дата, ссылка на справочник, массив или даже другая структура).
Аналогия для статьи: Представьте комод, где на каждом ящике наклеена уникальная бирка («Имя», «Возраст», «Должность»). Вы не знаете точный порядковый номер ящика, но можете мгновенно достать вещь, просто прочитав название на бирке. |
Создание структуры Существует два основных способа инициализации структуры: Способ 1: Создание пустой структуры ДанныеСотрудника = Новый Структура; Способ 2: Создание с одновременным заполнением Ключи и значения передаются перечислением через запятую: сначала все ключи одной строкой (через запятую), а затем соответствующие им значения. ДанныеСотрудника = Новый Структура("Имя, Возраст, Оклад", "Иванов", 35, 75000); ⚠️ Важно для статьи (Стандарты 1С): Согласно стандартам разработки «1С», в конструктор структуры не рекомендуется передавать более 3-х ключей, так как такой код становится трудночитаемым. Если ключей больше, лучше создавать пустую структуру и заполнять её методом Вставить(). |
Как вставить и добавить элемент Для добавления новых элементов или изменения существующих используется метод Вставить(). // Добавление нового свойства ДанныеСотрудника.Вставить("Должность", "Программист"); // Изменение значения существующего свойства (перезапись) ДанныеСотрудника.Вставить("Оклад", 85000); Также изменить значение существующего ключа можно с помощью прямого обращения через точку или квадратные скобки (но только если этот ключ точно существует в структуре, иначе система выдаст ошибку): ДанныеСотрудника.Имя = "Петров"; ДанныеСотрудника["Возраст"] = 36; |
Как узнать количество элементов Для определения общего числа пар Ключ/Значение используется метод Количество(). ВсегоСвойств = ДанныеСотрудника.Количество(); // Возвратит число, например: 4 |
Как обойти в цикле все элементы Так как структура — это коллекция, ее можно перебрать с помощью цикла Для Каждого. При каждом шаге цикла система возвращает специальный объект типа КлючИЗначение, у которого есть два свойства: .Ключ и .Значение. Для Каждого Элемент Из ДанныеСотрудника Цикл Сообщить("Свойство: " + Элемент.Ключ + ", Значение: " + Элемент.Значение); КонецЦикла; |
Как удалить элемент Для удаления конкретного свойства по его имени используется метод Удалить(). В параметр передается строка с именем ключа. ДанныеСотрудника.Удалить("Оклад"); // Ключ "Оклад" и его значение стерты из структуры |
Как очистить структуру Если нужно полностью освободить структуру от всех элементов, не удаляя сам объект из памяти, применяется метод Очистить(). После этого структура становится пустой (количество элементов равно 0). ДанныеСотрудника.Oчистить();
|
Как проверить, есть ли ключ в структуре (Метод Свойство) Прямое обращение к несуществующему ключу (например, ДанныеСотрудника.Адрес) вызовет критическую ошибку программы. Чтобы этого избежать, используют метод Свойство(). Он проверяет наличие ключа и, если тот найден, может сразу записать его значение в переменную. // Просто проверка наличия Если ДанныеСотрудника.Свойство("Телефон") Тогда Сообщить("Телефон указан!"); КонецЕсли; // Проверка с одновременным получением значения в переменную "НомерТелефона" НомерТелефона = ""; Если ДанныеСотрудника.Свойство("Телефон", НомерТелефона) Тогда Сообщить("Звоним на номер: " + НомерТелефона); КонецЕсли; |
Разница между обращением через Точку и через Квадратные скобки * Через точку (Структура.ИмяКлюча): Используется, когда имя ключа известно заранее на этапе написания кода. * Через квадратные скобки (Структура[ИмяПеременной]): Незаменимо, когда имя ключа динамически вычисляется в коде или хранится в другой переменной. ИмяПоля = "Оклад"; ЗначениеПоля = ДанныеСотрудника[ИмяПоля]; // Динамическое получение |
Копирование структур (Нюанс с передачей по ссылке) В 1С структуры передаются по ссылке. Если вы напишете НоваяСтруктура = СтараяСтруктура;, то изменение Новой изменит и Старую. Чтобы сделать независимую копию, используют метод ЗаполнитьЗначенияСвойств(): КопияСтруктуры = Новый Структура; ЗаполнитьЗначенияСвойств(КопияСтруктуры, ДанныеСотрудника); |
Определение соответствия и примеры Соответствие в 1С 8.3 — это встроенный объект-коллекция, предназначенный для хранения пар «Ключ — Значение».Его главное отличие от Структуры заключается в том, что в качестве ключа можно использовать любой тип данных (число, ссылку, дату, массив), а не только строку, удовлетворяющую правилам идентификатора. Ниже приведены подробные примеры и все стандартные методы работы с этой коллекцией. |
Как создать соответствие Для создания объекта используется конструктор Новый: // Создание пустого соответствия МоеСоответствие = Новый Соответствие; |
Как добавить элементы Для добавления элементов используется метод Вставить(Ключ, Значение). // Ключами могут быть элементы разных типов МоеСоответствие.Вставить(1, "Первый"); МоеСоответствие.Вставить(ТекущаяДата(), "Сегодняшняя дата"); МоеСоответствие.Вставить(Справочники.Номенклатура.ПустаяСсылка(), "Пустая номенклатура"); |
Как изменить значение ключа Метод Вставить() работает по принципу «добавить или заменить». Если ключ уже существует в коллекции, его значение перезапишется. // Изменение значения для существующего ключа МоеСоответствие.Вставить(1, "Новое значение для единицы"); |
Как получить значение по ключу Получить значение можно с помощью квадратных скобок [] или метода Получить(Ключ). // Вариант 1: Через квадратные скобки ИскомоеЗначение = МоеСоответствие[1]; // Вариант 2: Через метод Получить() ИскомоеЗначение = МоеСоответствие.Получить(1); |
Как узнать, есть ли соответствие (Проверить наличие ключа) Если ключа в коллекции нет, 1С вернет значение Неопределено. Однако, если само значение ключа было Неопределено, этот способ не подойдет. Для точной проверки существует специальный метод Свойство(Ключ, НайденноеЗначение). // Метод возвращает Истина, если ключ найден ПеременнаяДляЗначения = Неопределено; Если МоеСоответствие.Свойство(1, ПеременнаяДляЗначения) Тогда Сообщить("Ключ найден! Значение: " + ПеременнаяДляЗначения); Иначе Сообщить("Ключ не найден."); КонецЕсли; |
Как узнать количество элементов Количество элементов (пар) в коллекции возвращает метод Количество(). ВсегоЭлементов = МоеСоответствие.Количество(); |
Как перебрать (обойти) все элементы Для перебора коллекции используется цикл Для каждого. На каждой итерации система возвращает объект типа КлючИЗначение, у которого есть свойства Ключ и Значение. Для Каждого Элемент Из МоеСоответствие Цикл Сообщить("Ключ: " + Элемент.Ключ + " --> Значение: " + Элемент.Значение); КонецЦикла; |
Как удалить элемент Для удаления конкретной пары по её ключу используется метод Удалить(Ключ). // Удалит элемент, где ключ равен 1 МоеСоответствие.Удалить(1); |
Как очистить все элементы Чтобы полностью опустошить коллекцию, сохранив сам объект, вызывают метод МоеСоответствие.Очистить(); // Теперь Количество() вернет 0 |
💡 Что еще важно знать о Соответствии (Нюансы для статьи) * Поиск по ключу регистрозависим: Если ключом является строка, то "Ключ" и "ключ" — это два разных ключа. * Сериализация (передача между сервером и клиентом): Соответствие можно без проблем передавать с сервера на клиент и обратно. * Ключом может быть ссылка: Это критически полезно при оптимизации кода, когда нужно быстро сопоставить, например, ДокументСсылка и Сумму без обращения к базе данных в цикле. Сравнение со Структурой: У Структуры ключ — только строка (без пробелов и спецсимволов). К её свойствам можно обращаться через точку: Структура.Имя. У Соответствия ключ — любой тип. Обращаться через точку нельзя: Соответствие.Ключ вызовет ошибку, нужно писать только Соответствие[Ключ]. |
📌 Памятка для начинающих: когда выбирать Структуру, а когда Соответствие? Чтобы у новичков не путались эти две коллекции, можно добавить в статью простую шпаргалку: Выбирайте СТРУКТУРУ, если вам нужно передать набор параметров, где имена параметров фиксированы и вы точно знаете их по именам (например: ПараметрыОтбора = Новый Структура("Организация, Склад");). К ним удобно обращаться через точку: ПараметрыОтбора.Склад. Выбирайте СООТВЕТСТВИЕ, если ключ заранее неизвестен, им является объект (товар, контрагент, документ, число) и вам нужно быстро находить связанные с ним данные без циклов. |
Практический пример: Быстрое заполнение цен в документе Представьте задачу: у нас есть массив товаров, и нам нужно проставить для каждого актуальную цену из регистра. ❌ Как делать НЕ надо (Типичная ошибка новичка):Искать цену запросом или методом Найти() в цикле. Из-за этого программа будет постоянно обращаться к базе данных или перебирать всю таблицу заново, что приведет к сильным зависаниям. Для Каждого СтрокаТовара Из ТоварыДокумента Цикл // Плохо: запрос или поиск в цикле работает очень медленно! СтрокаТовара.Цена = Справочники.Номенклатура.НайтиЦену(СтрокаТовара.Товар); КонецЦикла;
Как сделать правильно с помощью Соответствия: * Мы одним запросом выбираем все нужные цены. * Выгружаем их в Соответствие, где Ключом будет сам товар (ссылка), а Значением — его цена. * В цикле моментально получаем цену по ключу. // 1. Создаем соответствие для кэширования цен ЦеныТоваров = Новый Соответствие; // 2. Допустим, мы получили данные из запроса и заполняем коллекцию Пока ВыборкаЗапроса.Следующий() Цикл // Ключ — Ссылка на Номенклатуру, Значение — Число (Цена) ЦеныТоваров.Вставить(ВыборкаЗапроса.Товар, ВыборкаЗапроса.Цена); КонецЦикла; // 3. Быстро и без лишних обращений к базе заполняем документ Для Каждого СтрокаДокумента Из ТЧТовары Цикл
// Пытаемся получить цену из нашего соответствия АктуальнаяЦена = ЦеныТоваров[СтрокаДокумента.Товар];
Если цена для этого товара нашлась, записываем её Если АктуальнаяЦена <> Неопределено Тогда СтрокаДокумента.Цена = АктуальнаяЦена; КонецЕсли;
КонецЦикла; |