Перейти к основному содержимому

Идиомы

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

Идиомы — это общепринятые способы написания кода, которые поддерживают принципы языка и являются его лучшими практиками. Они включают примеры решения распространенных задач, низкоуровневые шаблоны проектирования, записи алгоритмов и структуры данных. Использование идиом позволяет избежать распространенных ошибок и улучшить понимание кода.

В данной статье представлены наиболее часто используемые в языке «1С:Элемент» идиомы.

Общие действия

Указание значений по умолчанию для параметров метода

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

метод РассчитатьЦенуСоСкидкой(Цена: Число, Скидка: Число = 10): Число
возврат Цена - Цена * Скидка / 100
;

метод РассчитатьСтоимость()
// Цена рассчитывается со скидкой по умолчанию — 10 %
знч ФинальнаяЦена = РассчитатьЦенуСоСкидкой(Цена = 1000) // 900
// ...
;

Вызов цепочки методов

Вы можете использовать цепочки методов, чтобы упростить чтение кода. Каждый метод в цепочке возвращает текущий объект, который затем используется для вызова следующего метода. Это позволяет вызывать несколько методов последовательно, один за другим, как если бы это был один оператор.

метод НайтиФайлы(Каталог: Строка): ЧитаемыйМассив<Файл>
знч НастройкиПоиска = новый НастройкиПоискаФайлов()
.ИсключитьКаталоги(Истина)
.ИсключитьСсылки(Истина)
.ИмяСодержит("xml")
возврат Файлы.Найти(Каталог, НастройкиПоиска)
;

Интерполяция строк

Чтобы вставить значение переменной в строку, используйте следующий синтаксис:

  • %имя-переменной или $имя-переменной,
  • %{выражение} или ${выражение},
  • ${выражение|формат}.
знч НомерЗаказа = 753
знч Дата = Дата{2025-06-25}
знч Количество = 10
знч Цена = 5000
знч Сообщение = "Заказ №$НомерЗаказа от ${Дата|дд ММММ гггг} г. на сумму ${Количество * Цена} руб."
// Результат: "Заказ №753 от 25 июня 2025 г. на сумму 50 000 руб."

Обработка исключений

Для обработки исключений используйте конструкцию попытка-поймать.

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

метод ЗаписатьВФайл(Содержимое: Строка)
попытка
пер Файл = Файлы.Создать("C:\\Temp\\test.txt")
исп ПотокЗаписи = Файл.ОткрытьПотокЗаписи()
ПотокЗаписи.Записать(Содержимое)

поймать ИсключениеЗаписи: Исключение
// Получение информации об ошибке
знч Ошибка = ИсключениеЗаписи.Описание
// Обработка исключения...
// Здесь поток записи уже закрыт
;
;

Операции

Проверка типа значения

С помощью операции это вы можете проверить, что тип выражения в левой части операции совместим с типом или списком типов справа.

метод НайтиТовар(Запрос: Строка|Число|?, Товары: Соответствие<Число, Строка>)
если Запрос это Число
// Выполнить поиск по ключу — артикулу товара
иначе если Запрос это Строка
// Выполнить поиск по значению — названию товара
иначе
выбросить новый ИсключениеНедопустимыйАргумент("Для поиска укажите название или артикул товара.")
;
;

Работа с «Неопределено»

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

знч Артикулы =<Число>[]
знч Артикул = Артикулы.ПервыйИлиНеопределено()?.ВСтроку() // Неопределено

Используйте оператор ??, чтобы установить значение по умолчанию для объектов, допускающих значение Неопределено. Если слева от ?? значение равно Неопределено, то в качестве результата возвращается значение по умолчанию, указанное справа от ??.

знч Артикулы =<Число>[]
знч Артикул = Артикулы.ПервыйИлиНеопределено()?.ВСтроку() ?? "" // Пустая строка

Инструкции

Итерация по диапазону

Цикл для по выполняет действия, указанные в теле цикла, заданное число раз. Количество итераций определяется с помощью счетчика цикла, для которого указываются начальное и конечное значения, а также шаг изменения.

Простой цикл
знч Числа = <Число>[]
для Индекс = 1 по 10
Числа.Добавить(Индекс)
;
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Цикл с указанием шага
знч Числа = <Число>[]
для Индекс = 1 по 10 шаг 2
Числа.Добавить(Индекс)
;
// [1, 3, 5, 7, 9]
Цикл с указанием шага и направления обхода
знч Числа = <Число>[]
для Индекс = 10 вниз по 1 шаг 2
Числа.Добавить(Индекс)
;
// [10, 8, 6, 4, 2]

Инструкция «если»

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

метод РассчитатьЦенуСоСкидкой(Цена: Число, Скидка: Число): Число
если Скидка < 0
выбросить новый ИсключениеНедопустимыйАргумент("Скидка должна быть больше 0.")
иначе если Скидка > 100
выбросить новый ИсключениеНедопустимыйАргумент("Скидка должна быть меньше 100 %.")
;
возврат Цена - Цена * Скидка / 100
;

Инструкция «выбор»

Инструкция выбор позволяет выбирать для выполнения один из нескольких блоков кода в зависимости от значения выражения. Является альтернативой инструкции если-иначе если.

перечисление ВидОперации
Сложение,
Вычитание,
Умножение,
Деление
;

метод ВыполнитьОперацию(Операция: ВидОперации, Операнд1: Число, Операнд2: Число): Число
выбор Операция
когда Сложение
возврат Операнд1 + Операнд2
когда Вычитание
возврат Операнд1 - Операнд2
когда Умножение
возврат Операнд1 * Операнд2
когда Деление
если Операнд2 != 0
возврат Операнд1 / Операнд2
иначе
выбросить новый ИсключениеНедопустимыйАргумент("Деление на ноль запрещено.")
;
иначе
выбросить новый ИсключениеНедопустимыйАргумент("Неподдерживаемая операция.")
;
;

Собственные типы

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

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

Пример объявления структуры:

структура Товар
обз знч Наименование: Строка
обз знч Артикул: Число
обз пер Цена: Число
пер Описание: Строка
;

Создание экземпляров структуры:

// Инициализация структуры с передачей значений по позиции
знч Холодильник = новый Товар("Холодильник", 1877210255, 52900)
// Инициализация структуры с передачей значений по имени
знч Телевизор = новый Товар(Наименование = "Телевизор", Цена = 34500, Артикул = 1805231477)
// Инициализация структуры с последующим изменением значения поля.
// Изменять можно только значения полей с модификатором "пер"
знч СтиральнаяМашина = новый Товар("Стиральная машина", 1813134690, 41800)
СтиральнаяМашина.Описание = "Узкая стиральная машина с сушкой"

Коллекции

Создание коллекций

Ниже приведены примеры создания изменяемых и неизменяемых массивов, множеств и соответствий:

Массивы
// Массив строк.
// Значения можно добавлять, изменять или удалять
знч СписокТоваров = ["Холодильник", "Телевизор", "Стиральная машина"]
// Массив строк, доступный только для чтения
знч СписокТоваровЧтение: ЧитаемыйМассив<Строка> = ["Холодильник", "Телевизор", "Стиральная машина"]
Множества
// Множество чисел.
// Можно добавлять и удалять значения,
// а также выполнять операции над множествами
знч Артикулы = {1877210255, 1805231477, 1813134690}
// Множество чисел, доступное только для чтения
знч АртикулыЧтение: ЧитаемоеМножество<Число> = {1877210255, 1805231477, 1813134690}
Соответствия
// Соответствие, где ключ — это артикул (число),
// а значение — наименование товара (строка).
// Значения можно добавлять, изменять или удалять
знч Товары = {
1877210255: "Холодильник",
1805231477: "Телевизор",
1813134690: "Стиральная машина"
}
// Соответствие, доступное только для чтения
знч ТоварыЧтение: ЧитаемоеСоответствие<Число, Строка> = {
1877210255: "Холодильник",
1805231477: "Телевизор",
1813134690: "Стиральная машина"
}

Создание соответствия из массива

Используйте методы ВСоответствие(), ВСоответствиеСКлючами() и ВСоответствиеСоЗначениями() для преобразования массивов данных в соответствия.

структура Товар
обз знч Наименование: Строка
обз знч Артикул: Число
;

метод ЗаполнитьТовары()
знч Товары = <Товар>[]
Товары.Добавить(новый Товар("Холодильник", 1877210255))
Товары.Добавить(новый Товар("Телевизор", 1805231477))
Товары.Добавить(новый Товар("Стиральная машина", 1813134690))

// Преобразовать массив в соответствие
знч ТоварыСоответствие = ПреобразоватьВСоответствие(Товары)
;

метод ПреобразоватьВСоответствие(Товары: Массив<Товар>): Соответствие<Число, Строка>
возврат Товары.ВСоответствие(Элемент -> Элемент.Артикул, Элемент -> Элемент.Наименование)
;

В результате работы метода ПреобразоватьВСоответствие() будет создано соответствие, содержащее следующие элементы:

ТоварыСоответствие: {1877210255: Холодильник, 1805231477: Телевизор, 1813134690: Стиральная машина}

Доступ к элементу соответствия

Для обращения к элементу соответствия используйте операцию доступа по ключу [] или один из следующих методов:

  • Получить() — возвращает значение по указанному ключу. Если соответствие не содержит заданный ключ, выбрасывается исключение.
  • ПолучитьИлиНеопределено() — возвращает значение по указанному ключу или Неопределено, если соответствие не содержит заданный ключ.
  • ПолучитьИлиУмолчание() — возвращает значение по указанному ключу. Если соответствие не содержит заданный ключ, возвращается значение по умолчанию.
знч Товары = {
1877210255: "Холодильник",
1805231477: "Телевизор",
1813134690: "Стиральная машина"
}

знч Артикул = 1877210255
// Получение товара по артикулу (ключу соответствия)
знч Результат1 = Товары[Артикул] // Холодильник
знч Результат2 = Товары.ПолучитьИлиНеопределено(Артикул)
знч Результат3 = Товары.ПолучитьИлиУмолчание<Строка>(Артикул,
() -> "Товар с артикулом %{Артикул} не найден.")

Проверка наличия элемента в коллекции

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

метод НайтиТовар(Артикул: Число, Товары: Соответствие<Число, Строка>): Строка
// Возвращает наименование товара по артикулу
если Товары.СодержитКлюч(Артикул)
возврат Товары.Получить(Артикул)
;
// Если товар не найден, выбрасывается исключение
выбросить новый ИсключениеНедопустимыйАргумент("Товар с артикулом %{Артикул} не найден.")
;

Получение первого элемента коллекции

Используйте следующие методы для получения первого элемента в коллекции:

  • Первый() — возвращает первый элемент коллекции. Если коллекция не содержит элементов, выбрасывается исключение.
  • ПервыйИлиНеопределено() — возвращает первый элемент коллекции или Неопределено, если элементов нет.
  • ПервыйИлиУмолчание() — возвращает первый элемент коллекции или значение по умолчанию, если элементов нет.
пер СписокТоваров = ["Холодильник", "Телевизор", "Стиральная машина"]
знч Результат1 = СписокТоваров.Первый() // Холодильник
СписокТоваров = []
знч Результат2 = СписокТоваров.ПервыйИлиНеопределено() // Неопределено
знч Результат3 = СписокТоваров.ПервыйИлиУмолчание("Список товаров пуст.") // Список товаров пуст.

Обход элементов соответствия

Для обхода элементов соответствия используйте цикл для Элемент из Соответствие Каждый элемент имеет тип КлючИЗначение, позволяющий получить доступ к ключу и значению соответствия.

метод ПолучитьСписокТоваров(Товары: Соответствие<Число, Строка>): Массив<Строка>
знч СписокТоваров: Массив<Строка> = []
для Товар из Товары
СписокТоваров.Добавить("Артикул: %{Товар.Ключ}, Наименование: %{Товар.Значение}")
;
возврат СписокТоваров
;

В результате работы метода вернется массив, содержащий следующие элементы:

[0]: Артикул: 1877210255, Наименование: Холодильник
[1]: Артикул: 1805231477, Наименование: Телевизор
[2]: Артикул: 1813134690, Наименование: Стиральная машина

Фильтрация элементов коллекции

Используйте метод Фильтровать(), чтобы отфильтровать элементы коллекции по заданному условию:

знч Числа = [-15, -10, 0, 10, 15]
знч Положительные = Числа.Фильтровать(Элемент -> Элемент > 0) // [10, 15]

Потоковая обработка данных

Тип Последовательность позволяет работать с коллекциями в функциональном стиле. При выполнении операций над коллекциями вместо циклов и условных операторов для обработки данных используется последовательный вызов цепочки методов, что позволяет ускорить и упростить написание кода. Реальные вычисления выполняются только при вызове терминального метода.

знч СписокТоваров = ["Холодильник", "Телевизор", "Стиральная машина"].КакПоследовательность()
знч ОтсортированныйСписок = СписокТоваров
.Сортировать(Направление = НаправлениеСортировки.ПоВозрастанию)
.Преобразовать(Элемент -> Элемент.ВВерхнийРегистр())
.ВМассив() // Терминальный метод, все вычисления выполняются только здесь

В результате работы метода вернется массив, содержащий следующие элементы:

ОтсортированныйСписок: [СТИРАЛЬНАЯ МАШИНА, ТЕЛЕВИЗОР, ХОЛОДИЛЬНИК]