Работа с массивом в функциональном стиле

20.06.19

Разработка - Инструментарий разработчика

Разработка предоставляет программный интерфейс для манипулирования массивом, используя который вы получите возможность альтернативной записи кода для традиционных и новых возможностей. Например так: ФасадМассива.НовыйМассив().Добавить(Элемент1).ПолучитьМассив();

Скачать файлы

Наименование Файл Версия Размер
Работа с массивом в функциональном стиле:
.cf 15,25Kb
1
.cf 15,25Kb 1 Скачать

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

Не вот так вот:

Результат = Новый Массив();

Результат.Добавить(ЧтоТоОдно);
Результат.Добавить(ЧтоТоДругое);

Возврат Результат;

А так:

Возврат ФасадМассива.МассивИзЭлементов(ЧтоТоОдно, ЧтоТоДругое).ПолучитьМассив();

Такое иногда называют функциональным стилем.

Бонусы при этом следующие:

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

Ключевые моменты

  1. Работает все это исключительно в рамках встроенного языка и не лезет во внешние по отношению к платформе среды.
  2. Общий модуль помечен как Клиент и Сервер, но на клиенте модуль будет генерировать серверный вызов на каждом шагу.
  3. Код фактически исполняется в момент вызова, т.е. если "остановить" программу между двумя вызавами "Добавить(...)" - первый фактически будет выполнен, второй - нет.

Использование

Операции над массивом всегда начинаются с ключевого слова ФасадМассива, далее должна быть стартовая функция, указывающая на массив, с которым будем совершать дейтсвия, далее промежуточные функции (одна и более или может даже ни одной), далее может следовать (а может и нет) финишная функция, которая будет возвращать результат действий

Стартовые функции

  • НовыйМассив - указыват, что нужно создать новый массив для дальнейших операций. Например: ФасадМассива.НовыйМассив()...
  • МассивИзЭлементов - принимает от 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. Код полностью открыт.

Для тех, кто дочитал до этого места в попытках понять "как, чёрт возьми, работает вся эта чёрная магия???" и не хочет качать конфу - отвечаю: ФасадМассива - это общий модуль. НовыйМассив, УстановитьМассив, Добавить и т.п. - это функции этого общего модуля. "Вытянуть" все функции в одну строчку можно благодара тому, что каждая функция (кроме финишных) возвращает ссылку на свой собственный общий модуль (Возврат Вычислить("ФасадМассива")). А контекст между функциями гуляет через ПараметрыСеанса, закэшированные через повторноиспользуемый модуль (отсюда и хождения на сервер при работе на клиенте).

Удачи!

См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    122171    670    389    

714

SALE! 25%

Infostart PrintWizard

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

18000 15300 руб.

06.10.2023    7294    21    6    

39

SALE! 20%

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

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

10000 8000 руб.

10.11.2023    3541    11    1    

34

SALE! 30%

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

3600 2520 руб.

14.01.2013    177753    1073    0    

849

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99347    239    97    

296

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    18116    6    8    

39

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28110    3    10    

15

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

В процессе работы в 1С часто возникает потребность получить данные из другой базы.  Обычно это делается через COM-соединение, и время выполнения запроса при этом оставляет желать лучшего. В данной публикации представлено универсальное решение, позволяющее практически моментально выполнить произвольный код или запрос с параметрами в другой информационной базе через Web-сервис.

2400 руб.

24.09.2019    23604    15    15    

32
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Dmitrij-2 45 20.06.19 20:17 Сейчас в теме
2. spacecraft 20.06.19 21:05 Сейчас в теме
Идея не нова и имеет право на жизнь.
Только вот, "Такое иногда называю функциональным стилем.", кто fluent стиль называет функциональным?
3. m-rv 962 20.06.19 22:13 Сейчас в теме
(2) спасибо что обратили внимание, там опечатка, по задумке должно было быть "Такое иногда называюТ функциональным стилем"
Идея не нова в разработке вообще или на 1Се кто-то такое уже пилил?
5. spacecraft 21.06.19 07:37 Сейчас в теме
(3) и на 1С тоже пилили. Даже попытки использовать ООП в 1С делали. А уж паттерны использовали неоднократно. На этом же сайте есть статьи.
7. cool99 21.06.19 11:12 Сейчас в теме
(2)
кто fluent стиль называет функциональным

Ты это расскажи тем, кто разработал Linq... лично я в EF предпочитаю именно флюент синтаксис вместо запросного. ИМХО он более нагляден, т.к. действия разбиты на последовательность, что легче читать. Тем более, что само выражение в linq to sql в итоге равно IQuerable, т.е. сам запрос формируется при непосредственном получении данных уже в IEnumerable. Да и с самими коллекциями он используется чаще.
8. spacecraft 21.06.19 12:03 Сейчас в теме
(7) еще раз прочти. Речь про "Функциональный стиль", а не функциональность. Ничего против Fluent interface не имею и он меня устраивает.
4. nicxxx 254 20.06.19 22:21 Сейчас в теме
Плагины для xUnitFor1C посмотрите. Ожидаем.что(переменная).не_().равно(23);
It-developer; +1 Ответить
6. m-rv 962 21.06.19 08:42 Сейчас в теме
(4) ага, крутая штука, спасибо. Все это, как я понимаю, аналог джавовского assert, а я отталкивался от stream, так что можно сказать родственные разработки )
It-developer; +1 Ответить
9. neikist 21.06.19 13:52 Сейчас в теме
Тоже для себя такое писал когда задолбался от неудобства стандартных методов. Но без функций первого класса и замыканий до функциональщины тут как до луны((
10. kote 536 21.06.19 20:42 Сейчас в теме
(9) (6) функции первого класса
у меня получилось реализовать на 1С
как то) но реакция сообщества как то вселило тоску..

Пишу с телефона, ссылку не скину. Но посмотрите в публикациях, тут есть.
11. neikist 21.06.19 22:23 Сейчас в теме
(10)
Я в итоге решил что проще не мучаться а свалить на язык который все это из коробки поддерживает. Я работаю ради удовольствия а не для того чтобы задолбываться и мучаться.
12. kote 536 22.06.19 19:39 Сейчас в теме
(0) Хождение через ПараметрыСеанста контекста - вот тут я бы уже бросил разработку по избранному Вами пути, т.к. в серьёзном проекте это будет источником постоянных проблем..

Параметры сеанса - это глобальные переменные. Как только возникнет ситуация параллельного использования написанного таким образом кода - в параметре сеанса окажется непредсказуемое значение (какая из параллельно работающих функций туда сохранила значение?).

Но это только первая проблема. Вторая - то, что обращение к одному и тому же параметру (если мы решим "пометить" каждый контекст и хранить его под разными ключами в одном параметре и лочить сам параметр) из одновременных потоков приведет к ожиданиям потоков друг друга, т.к. это будет один совместно используемый ресурс. В итоге - все превращается в тыкву..

Контекст должен быть.. не вот так -> ДОЛЖЕН БЫТЬ изолированным у каждой функции. Никаких совместно используемых параметров сеанса для функционирования всего этого быть не должно.

--
Поэтому я запретил своим ребятам использование Вашей разработки..
Но дайте знать, как решите эту проблему.
13. m-rv 962 24.06.19 14:31 Сейчас в теме
(12)
я может не понимаю сути проблемы.. что значит "параллельное использование кода"? если речь о разных сеансах - то и параметры сеанса будут разные. в одном сеансе мне не известно способов затавить работать два потока исполнения
14. spacecraft 24.06.19 15:32 Сейчас в теме
16. m-rv 962 24.06.19 17:16 Сейчас в теме
(14) фоновое задание - это отдельный сеанс
18. spacecraft 24.06.19 18:59 Сейчас в теме
(16) в том-то все и дело. Перенесли часть кода, где использовались параметры сеанса, в фоновые задания и все полетело.
19. kote 536 27.06.19 20:00 Сейчас в теме
(13) (14)не, в фоновых все будет изолировано. Там это будет работать.
Но если использовать оповещения и ассинхронный вызов процедур, то получите в параметре сеанса непредсказуемое значение
21. m-rv 962 28.06.19 09:24 Сейчас в теме
(19) имеете ввиду ОписаниеОповещения? там код будет тоже синхронно выполняться. Что такое асинхронный вызов, не теоретически, а практически как его сделать, кроме фонового задания?
15. ImHunter 312 24.06.19 16:34 Сейчас в теме
(0) Ну хз. В текучих утверждениях BDD - да, в таком стиле писать красиво и приятно.
Но вот в реализации для массивов - это как-то слишком мелко (для ФП). Мне кажется, букв меньше не становится.
17. m-rv 962 24.06.19 17:19 Сейчас в теме
(15)
была идея стримы полностью запилить, решил забросить "пробный шар" с массивами. но по реакции сообщества понимаю, что стримы 1Су не нужны (
20. kote 536 27.06.19 20:03 Сейчас в теме
(17) вы не так поняли. То что вы сделали нужно. Но реализация должна быть иной.
Оставьте свое сообщение