Проблема бизнес-процессов в том, что их логика скрыта от глаз и отлаживать сложные процессы проблематично. С проблемой столкнулся не я сам, а мой коллега, он категорически не мог понять почему итератор помещенный в итератор не возвращает разницы массивов. Все просто: потому, что он возвращает совпадения.
Я быстро накидал пример из двух циклов и булевой переменной, проверил пример и сбросил коллеге. Через какое-то время, он сообщил, что несмотря на то, что пример на PHP работает верно, бизнес-процесс Битрикс не работает.
В представленном ниже примере, я продемонстрировал как работать с итераторами.
Увы, хоть это и хороший (на мой взгляд) пример, представленная блок-схема не будет работать с блоком «Согласование документа».Вы не сможете получить список проголосовавших до тех пор, пока работа в блоке не будет завершена.
Такое поведение блока показалось мне странным и я обратился в поддержку Битрикс, вот их ответ:Лично мне это кажется если не багом, то серьезной недоработкой сильно ограничивающей функционал бизнес-процессов Битрикс24. Надеюсь, что разработчики добавят возможность получать эти данные напрямую из бизнес-процессов.
Сравнение массивов довольно простой алгоритм. Всего-то нужно два цикла и пара ПРАВИЛЬНО РАССТАВЛЕННЫХ условий.
Пройдем от простого: найдем совпадения в двух массивах. В первом цикле перебираем длинный массив, во втором массив покороче.
Внутри второго цикла необходимо создать условие, которое при совпадении значений будет выводить совпавшее значение. Выходит, что несовпавшие элементы просто игнорируются, а мы на выходе получаем все совпадения.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php $array_a = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']; $array_b = ['2', '5', '4']; foreach ($array_a as $arr_parent => $value_a) { foreach ($array_b as $children => $value_b){ if ($value_b == $value_a){ echo "<br>" . $value_a . " - значение совпало!"; } } } |
Но что будет если мы попытаемся этим же способом вывести не совпавшие значения? Мы получим каждое несовпадение на каждой итерации обоих циклов. Говоря проще, мы берем одно значение цикла «А» исравниваем его со всеми значениями цикла «B». Понятно, что во втором цикла совпасть может только одно значение, все остальные не совпадут и будут напечатаны.
Выходит, нам необходимо каким-то образом сравнить текущее значение первого цикла со всем списком значений и если оно совпадет хотя бы раз, не выводить его. Мы знаем, что можем легко вычислить совпадения и вывести их во втором цикле, следовательно, мы можем в родительском цикле задать проверку на совпадения и если текущее значение ни разу не совпало, выведем его.
Чтобы следить за тем, имеются ли во втором цикле совпадения, мы введем дополнительную переменную, которую будем изменять при совпадении. Далее, мы будем проверять эту переменную.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php $array_a = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10',]; $array_b = ['2', '5', '4',]; foreach ($array_a as $arr_parent => $value_a) { $controller = false; foreach ($array_b as $children => $value_b){ if ($value_b == $value_a){ $controller = true; echo "<br>" . $value_a . " - значение совпало!"; } } if ($controller == false){ echo "<br>" . $value_a . " - значение не совпало!"; } } |
Реализация в Битрикс24
А вот так выглядит блок-схема бизнес процесса в Битрикс24:
В этом бизнес процессе я попробовал отправлять уведомления только тем пользователям, которые не проголосовали. По умолчанию Битрикс24 позволяет выбрать тех кто проголосовал «За» или «Против». Данную схему можно применять в любых бизнес процессах, в которых вам требуется найти разницу между двумя (массивами данных) множественными переменными.
Для реализации понадобятся три переменные: GROUP
, GROUP_VOTES
, GROUP_RECEPIENTS
и BOOL
.
Присвоим значения переменным.
Переменная GROUP_VOTES
инициализируется со значениями:
1 |
= merge({=A27388_1723_2178_88316:UserApprovers},{=A27388_1723_2178_88316:UserRejecters}) |
Которые в данном примере взяты из «Дополнительные результаты» -> «Утвердили пользователи» и «Отклонили пользователи».
Здесь мы используем функцию слияния массивов доступную в Битрикс24: array_marge. Объединение массивов, это единственная функция работы с массивами, которая упоминается в официальной документации. Обратите внимание, что если вы просто добавите два значения, окно закроется, но значения не сохраняться. Повторно открыв окно редактирования переменных, вы обнаружите пустое поле.
Все потому, что в бизнес процессах Битрикс24 нет проверки условий. Точнее она есть, но об ошибке вы узнаете лишь заново раскрыв окно, ошибочные значения не сохраняются.
Далее все довольно просто, сравниваем значения массивов, при совпадении меняем значение переменной BOOL
на true
в первом цикле проверяем менялось ли значение переменной, если не менялось, то пишем текущее значение итератора в переменную GROUP_RECEPIENTS
.
В результате, мы должны были получить массив из пользователей, которые не голосовали. Создаем новый итератор для массива GROUP_RECEPIENTS
, внутри него создаем уведомление, получателем указываем текущее значение итератора.
Вывод: сегодня мы разобрались как пользоваться итераторами для сравнения массивов данных в Битрикс24, а так же выяснили, что получить данные в реальном времени для блоков голосования Битрикс24 невозможно.