Идея фасада в том, чтобы можно было совершать действия с массивом "пачкой", не размазывая простую по сути операцию на кучу строк.
Не вот так вот:
Результат = Новый Массив();
Результат.Добавить(ЧтоТоОдно);
Результат.Добавить(ЧтоТоДругое);
Возврат Результат;
А так:
Возврат ФасадМассива.МассивИзЭлементов(ЧтоТоОдно, ЧтоТоДругое).ПолучитьМассив();
Такое иногда называют функциональным стилем.
Бонусы при этом следующие:
- уменьшается количество кода, убираются паразитные повторы имени массива
- повышается читаемость, лаконичность
- добавляются возможности не предусмотренные платформой
Ключевые моменты
- Работает все это исключительно в рамках встроенного языка и не лезет во внешние по отношению к платформе среды.
- Общий модуль помечен как Клиент и Сервер, но на клиенте модуль будет генерировать серверный вызов на каждом шагу.
- Код фактически исполняется в момент вызова, т.е. если "остановить" программу между двумя вызавами "Добавить(...)" - первый фактически будет выполнен, второй - нет.
Использование
Операции над массивом всегда начинаются с ключевого слова ФасадМассива, далее должна быть стартовая функция, указывающая на массив, с которым будем совершать дейтсвия, далее промежуточные функции (одна и более или может даже ни одной), далее может следовать (а может и нет) финишная функция, которая будет возвращать результат действий
Стартовые функции
- НовыйМассив - указыват, что нужно создать новый массив для дальнейших операций. Например: ФасадМассива.НовыйМассив()...
- МассивИзЭлементов - принимает от 1 до 10 параметров и делает из них массив для дальнейших операций. Например: ФасадМассива.МассивИзЭлементов(Перечисления.СтавкиНДС.НДС0, Перечисления.СтавкиНДС.НДС10, Перечисления.СтавкиНДС.НДС20)...
- УстановитьМассив - устанавливает существующий массив для дальнейших операций, например: ФасадМассива.УстановитьМассив(ДопустимыеСтавкиНДС)...
Промежуточные функции
- Добавить - добавляет элемент в конец массива. Например: ФасадМассива.НовыйМассив().Добавить("строка1")...
- ДобавитьВсе - принимает на вход массив элементов и добавляет все его элементы в конец своего массива. Например: ФасадМассива.УстановитьМассив(ДопустимыеСтавкиНДС).ДобавитьВсе(ДополнительныеСтавки)...
- Вставить - вставляет элемент в указанную позицию (сдвигает существующие элементы вправо). Например: ФасадМассива.НовыйМассив().Добавить("строка1").Вставить(0,"строка2")...
- Установить - вставляет элемент в указанную позицию (перезаписывает элемент на указанной позиции). Например: ФасадМассива.НовыйМассив().Добавить("строка 1").Установить(0,"новый текст строки 1")...
- ДляКаждого - выполняет операцию для каждого элемента массива. Например: ФасадМассива.УстановитьМассив(МассивНовыхОбъектов).ДляКаждого("Элемент.Записать()");
- Отображение - выполняет операцию для каждого элемента массива, записывая результат операции на место исходного элемента. Фактически, так можно "перейти" от массива одних элементов к массиву других, соответствующих им элементов. Например: ФасадМассива.УстановитьМассив(ЗарплатыСНДФЛ).Отображение("Элемент * 0,87");
- Удалить - удаляет элемент массива с соответствующим индексом. Например: ФасадМассива.УстановитьМассив(МассивНовыхОбъектов).Удалить(0)...
- Подмассив - получает массив, эквивалентный указанному диапазону исходного массива. Например: ФасадМассива.УстановитьМассив(МассивНовыхОбъектов).Подмассив(0, 1)...
- Различные - удаляет из массива дублирующие элементы. Например: ФасадМассива.УстановитьМассив(МассивНоменклатуры).Отображение("Элемент.СтавкаНДС").Различные()...
Финишные функции
- ПолучитьМассив - возвращает массив, полученный в результате выполненных операций. Например: ФасадМассива.МассивИзЭлементов(Перечисления.СтавкиНДС.НДС0, Перечисления.СтавкиНДС.НДС10, Перечисления.СтавкиНДС.НДС20).ПолучитьМассив();
- ПолучитьЭлемент - возвращает элемент с указанным индексом. Например, ФасадМассива.УстановитьМассив(МассивНовыхОбъектов).ПолучитьЭлемент(0);
- ПолучитьЭлементИлиЗначениеПоУмолчанию - возвращает элемент с указанным индексом или, если элемента с таким индексом нет - значение по умолчанию. Позволяет задать поведение на случай, если элементов не нашлось. Например: ФасадМассива.УстановитьМассив(СтавкиНДС).ПолучитьЭлементИлиЗначениеПоУмолчанию(0, Перечисления.СтавкиНДС.НДС20)
- ПолучитьЭлементИлиВызватьИсключение - возвращает элемент с указанным индексом или, если элемента с таким индексом нет - вызвает исключение. Если заведомо известно, что отсутствие элементов - исключительная ситуация - позволяет не проверять наличие элемента отдельно. Например: ФасадМассива.УстановитьМассив(СтавкиНДС).ПолучитьЭлементИлиВызватьИсключение(0, "Ставки НДС не найдены, обратитесь к администратору")
Как уже упоминалось, в базовом варианте, Фасад используется так:
[стартовая функция].[промежуточные функции].[финишная функция]
Например:
ФасадМассива.НовыйМассив().Добавить("строка1").ПолучитьМассив()
Но может иметь смысл и использование фасада без промежуточных функций:
ФасадМассива.МассивИзЭлементов(Перечисления.СтавкиНДС.НДС10, Перечисления.СтавкиНДС.НДС20).ПолучитьМассив();
Также, может иметь смысл фасад без финишной функции:
ФасадМассива.УстановитьМассив(МассивНовыхОбъектов).ДляКаждого("Элемент.Записать()");
Способ записи
Записывать код можно двумя способами, в одну строку:
Результат = ФасадМассива.НовыйМассив().Добавить(Перечисления.СтавкиНДС.НДС20).ПолучитьМассив();
или, если операций много, в несколько строк:
Результат = ФасадМассива.НовыйМассив()
.Добавить(Перечисления.СтавкиНДС.НДС0)
.Добавить(Перечисления.СтавкиНДС.НДС10)
.Добавить(Перечисления.СтавкиНДС.НДС20)
.ПолучитьМассив();
В прилагаемой концигурации, кроме основной функциональности, присутствует общий модуль ФасадМассиваТест, содержащий функции, тестирующие все функции. Платформа 8.3.9.2233. Навскидку, ничто не мешает даунгрейду хоть до 8.0. Код полностью открыт.
Для тех, кто дочитал до этого места в попытках понять "как, чёрт возьми, работает вся эта чёрная магия???" и не хочет качать конфу - отвечаю: ФасадМассива - это общий модуль. НовыйМассив, УстановитьМассив, Добавить и т.п. - это функции этого общего модуля. "Вытянуть" все функции в одну строчку можно благодара тому, что каждая функция (кроме финишных) возвращает ссылку на свой собственный общий модуль (Возврат Вычислить("ФасадМассива")). А контекст между функциями гуляет через ПараметрыСеанса, закэшированные через повторноиспользуемый модуль (отсюда и хождения на сервер при работе на клиенте).
Удачи!