[spoiler]
Обновлено в 2021 году: Мы разработали и выпустили в релиз готовый модуль , благодаря которому вы можете работать с контрагентами по их индивидуальных соглашениям на сайте. Модуль входит бесплатно в поставку наших готовых решений для B2B: и . |
| Проблема. |
| План действий. |

| 1. Постановка задачи. |
Но мы быстро смекнули, что все данные будут выгружаться на сайт из 1С, а, значит, в качестве идентификатора уместнее взять XML_ID (внешний код) товара и пользователя. Ну а после уже добавить еще одну переменную, которая могла бы влиять на цену товара – внешний код склада.
Стоит отметить, что бывают такие магазины, у которых нет склада. И мы не можем их игнорировать. Но об этом моменте мы расскажем чуть позднее, когда пойдет речь о настройках модуля.
| 2. Почему нельзя сделать все на стандартах 1С-Битрикс? |
| Причина первая. |
Самое очевидное – создать для каждого пользователя свою группу и, соответственно, для каждой из них выставить отдельный тип цены. Звучит совсем несложно. Если только вы не разработчик. Потому что только они за этой парой предложений видят реальные масштабы и проблемы этого действа.
Только представьте, что у вас на сайте 100 пользователей (смешная цифра для современного бизнеса, конечно, но тем наглядней будет пример). Берем и создаем для них 100 групп. Даже руками – это не так уж и сложно, конечно, и – дешевле, чем какой-то модуль в Маркетплейсе, само собой. Поскольку групп у нас 100 (по числу пользователей), это значит, что нужно назначить 100 типов цен.
На этом моменте некоторые из вас уже могут призадуматься – а стоит ли возиться, но большинство все же будут стоять на своем. И делать все руками. Итак, в нашей формуле не хватает еще одной переменной – количество товаров. Просто предположим, что у вас их 300.

- посвятить всю свою жизнь редактированию цен;
- нанять специалиста, который захочет за скромную плату (вы же экономить собираетесь!) потратить свою жизнь на редактирование цен товаров вашего магазина;
- нанять разработчика (фрилансера), что бы тот написал скриптов (обработчиков) под ваши нужды, которые будут все это делать за вас – добавлять и обновлять цены;
- все-таки купить готовое решение.
По итогу мы пришли к следующему. Каталог работает только с группами пользователей, но никак не с самими пользователями, а тем более не с их профилями. А это идет в разрез с поставленной задачей. Кроме этого, стандартный каталог не может изменять цены в зависимости от выбранного склада, что нас тоже не устраивает.
| Причина вторая. |
| 3. Какие варианты решения вообще могут быть. |
Но свежи были еще воспоминания о написании модуля «», где пришлось не раз столкнуться с любимым ответом облака «too many requests». Сюда же присовокупился опыт работы с сайтами, где эта фраза возникала с завидной периодичностью и без дополнительных запросов. Поэтому использование ajax для обновления цен было отвергнуто. Хотя позже мы узнали, что кто-то уже попытался реализовать подобную задачу, используя ajax.
Идея вторая – отложенные функции. Как вы понимаете, этот вариант нас тоже не устроил. И причина на это одна, но весомая. Суть в том, что отложенные функции не работают в кеше, а мы уже решили, что без кеша решение – не решение. Кеш должен работать, а шоу – продолжаться.
И вот мы вплотную подошли к тому варианту, на котором и остановились. В двух словах суть идеи следующая – ставим метку, а после собираем все метки и делаем всего один запрос к базе, чтобы заменить метки на цены. Но ведь нам неинтересно в двух словах, правда? Поэтому дальше будет более подробный рассказ.
| 4. Как мы все это делали. |
- Для магазина с большим каталогом и большим количеством пользователей количество записей в таблице тоже будет немаленьким. Тогда как долго будет происходить выборка?
- Как поставить метку?
- Когда производить замену цен?
| Время выборки. |
В итоге выборка по ключевым полям производилась за 0,1 сек., но если в выборку добавлять неключевое поле, то окончания выборки дождаться не удавалось. По итогу мы пришли к более или менее разумному времени выборки – меньше 0,04 сек., что совсем не отражается на загрузке страницы, а для кеширования запросов использовали ядро D7.
| Каким образом ставить метку? |

| Когда производить замену меток? |
И мы подумали еще немного. И пришли к выводу, что нужно добавить обработку события «OnEndBufferContent» модуля «main». В данном событии у нас находится весь html страницы со всеми нашими метками, и уже не важно, из какого компонента они были поставлены.
Собрать все метки не составило особого труда и вот уже у нас готовый и красивый список идентификаторов товаров. Для запроса нам не хватает только идентификатора профиля пользователя. В одном из наших модулей sotbit.client была уже реализована возможность выборки профиля, после чего идентификатор профиля записывается в сессию. Получить его в модуле также не составляет труда.
Не забыли мы и про то, что в исходной задаче у нас что-то говорилось про необходимость учитывать склад. Его идентификатор мы берем также из сессии, куда он попадает при выборе местоположения.
Делаем запрос. Собираем массив типа array (<метка> => <цена> ) . Если в запросе заполнили не все метки, то дополняем их ценами из шаблона. Заменяем метки на цены и отдаем html на экран. Максимальное время выполнения всей это процедуры 0,04 сек. А если в ход идет кеширование запросов – то время измеряется в тысячных частях секунды и даже меньше!
А тем, кто не верит, вот вам вырезка из логов. Количество записей в таблице 7000+.

- 1С выгружает цены в xml файлы на сервер;
- В конце выгрузки 1С отправляет запрос на api, в котором сообщает нашему модулю «», что все готово;
- И дальше наш «» обновляет цены в таблице. В настройках модуля вынесен выбор hl-блока, где хранятся цены с настройкой ключевых колонок. Если в складе поставить пустое значение (...), то склад в выборке участвовать не будет соответственно.

| 5. Заключение. |
Оригинал статьи вы можете найти на нашем .
Получить консультацию можно любым удобным для вас способом:


с помощью соц. сетей, мессенджеров, либо онлайн-чата на нашем сайте