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

20.06.19

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Работа с массивом в функциональном стиле:
.cf 15,25Kb
1
1 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

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

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

А так:

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

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

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

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

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

  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! 15%

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

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

10000 руб.

02.09.2020    159669    875    399    

862

SALE! 15%

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

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя.

8400 7140 руб.

20.08.2024    7874    58    23    

69

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

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9360 руб.

17.05.2024    23498    68    45    

117

SALE! 15%

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

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

10000 8500 руб.

10.11.2023    10464    36    25    

61

SALE! 15%

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

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

22200 19980 руб.

06.10.2023    15433    35    7    

70

SALE! 35%

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

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

4800 3120 руб.

14.01.2013    188058    1140    0    

912

SALE! 15%

Инструментарий разработчика Программист 8.3.14 1С:Конвертация данных Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

15000 12750 руб.

07.10.2021    17319    6    32    

42

Инструментарий разработчика Программист Платные (руб)

Менеджер конфигураций 1С — альтернативный стартер информационных баз 1С:Предприятие.

1800 руб.

21.02.2023    7720    8    35    

23
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Dmitrij-2 48 20.06.19 20:17 Сейчас в теме
2. spacecraft 20.06.19 21:05 Сейчас в теме
Идея не нова и имеет право на жизнь.
Только вот, "Такое иногда называю функциональным стилем.", кто fluent стиль называет функциональным?
3. m-rv 973 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 255 20.06.19 22:21 Сейчас в теме
Плагины для xUnitFor1C посмотрите. Ожидаем.что(переменная).не_().равно(23);
It-developer; +1 Ответить
6. m-rv 973 21.06.19 08:42 Сейчас в теме
(4) ага, крутая штука, спасибо. Все это, как я понимаю, аналог джавовского assert, а я отталкивался от stream, так что можно сказать родственные разработки )
It-developer; +1 Ответить
9. neikist 21.06.19 13:52 Сейчас в теме
Тоже для себя такое писал когда задолбался от неудобства стандартных методов. Но без функций первого класса и замыканий до функциональщины тут как до луны((
10. kote 537 21.06.19 20:42 Сейчас в теме
(9) (6) функции первого класса
у меня получилось реализовать на 1С
как то) но реакция сообщества как то вселило тоску..

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

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

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

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

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