# Цифровизатор > Блог Максима о Битрикс24, вайбкодинге, управлении и сервисной модели: практика, разборы и выводы. Личный блог Максима. У каждой статьи есть markdown-версия: адрес статьи + `index.md`. Полный текст всех статей — в [llms-full.txt](https://dgtor.blog/llms-full.txt). ## Авторство - [human] — текст написал Максим; ИИ исправил только ошибки. - [co] — идея и тезисы Максима, текст ИИ-автора; имя автора — в данных статьи. - [ai] — текст ИИ-автора, редактура Максима; имя автора — в данных статьи. --- # Перенести базу знаний Битрикс24: 5 часов с нуля, полчаса по инструкции > Пять ловушек, шесть шагов, промт и схема кода: как перенести базу знаний в Битрикс24. Пять часов — в основном борьба с инструментом, по инструкции — полчаса. - Авторство: Идея и тезисы: Максим · Текст: BitrixGPT (ИИ) [co] - Идея, вводные и ключевые тезисы — Максим. Текст по ним написал BitrixGPT (ИИ), Максим проверил его перед публикацией. - Опубликовано: 2026-11-06 - Теги: Битрикс24, ИИ, вайбкодинг - Адрес: https://dgtor.blog/posts/bitrix24-knowledge-base-migration-ai/ Старые базы знаний неудобны для ИИ — это первая причина, по которой я взялся за перенос. Новые базы мы и так пишем с помощью ИИ: даём контекст, агент дописывает. [«База знаний 2.0»](https://helpdesk.bitrix24.ru/open/28444346/) Битрикс24 (модуль `note`) работает с Markdown — такой текст агент нормально читает и дописывает, а первое поколение баз для этого не приспособлено. Вторая причина — Битрикс24 развивает ИИ-инструменты помощи для сотрудников и внешних заказчиков. Уже можно подключить бота, который по базе знаний подсказывает сотрудникам и отвечает клиентам. Но работает он только с базой знаний 2.0: первое поколение так не умеет. Получается, перенос — не разовая уборка. Дальше эти базы будут актуализироваться с помощью ИИ, а не вручную, как пришлось бы в первой версии. С нуля перенос занял у меня пять часов. Не потому что столько работы: на другом портале ту же операцию я делал с помощью Claude примерно за 15 минут на базу и начинал с ожиданием «две базы — полчаса-час». Пять часов съела не база знаний, а инструмент: - агент долго искал, где в портале лежат базы знаний, хотя я подсказывал; - в Коворке задача не пошла — пришлось перейти в режим Код; - в Коде агент свернул не туда, путь мы правили вместе; - часть ошибок была уже в самом инструменте, их тоже пришлось обходить. Инструкция и промт ниже — чтобы вам не пришлось повторять мой путь: по правильному маршруту две базы переносятся за полчаса. В этом кейсе перенос сделал ИИ-агент [«Битрикс24 Коворк/Код»](https://helpdesk.bitrix24.ru/open/28844790/): прочитал исходный сайт, выгрузил статьи и структуру, создал новую базу и перенёс всё с сохранением вложенности. Две базы знаний, 43 статьи, 75 изображений и 39 видео — без ручного копирования и без потерь. Дальше — что предстояло сделать, на чём такие переносы обычно ломаются, как выстроить работу, готовый промт для агента и схема кода. ## Что было и что хотели получить **Что было.** База знаний компании жила в старом формате: страницы-лендинги, где меню и содержимое собраны из визуальных блоков. Формально это «сайт со статьями», фактически — вики, которую легко читать и почти невозможно поддерживать. **Что хотели получить.** Единую базу в модуле [«База знаний»](https://helpdesk.bitrix24.ru/open/28247830/) Битрикс24: статьи с нормальным деревом разделов, встроенными картинками и видео, поиском и правами доступа — место, куда сотрудник идёт за инструкцией, а не блуждает по страницам сайта. **Что нужно было сохранить.** Тексты — без потерь и без «пересочинения». Структуру: раздел → подраздел → статья. Вложения: изображения остаются внутри статей, видео — доступными. Исходный сайт — не трогать вообще: он остаётся рабочей копией на время проверки. ## Масштаб: две базы, 43 статьи | Показатель | «Системная работа» | «Техподдержка» | Итого | | ------------------------ | ------------------ | -------------- | ------------------- | | Статей | 34 | 9 | **43** | | Разделов верхнего уровня | 16 | 4 | 20 | | Изображений | 68 | 7 | **75** | | Видео | 39 | 0 | **39** | | Объём текста | ~121 000 знаков | ~11 000 знаков | **~132 000 знаков** | Страниц в исходном сайте первой базы было 40, а в дерево новой базы вошло 34: шесть страниц оказались служебными и в перенос не поехали. Это не потеря, а часть методики — почему, разберём ниже. ## Почему это задача для агента Работа большая, но однообразная: 43 страницы, у каждой — набор блоков, часть из них текст, часть — картинки и видео. Человек на такой рутине ошибается предсказуемо: пропускает вложенный раздел, теряет картинку, копирует служебную страницу. Агент делает это одинаково на первой и на сорок третьей статье — и, что важнее, повторяемо: если что-то пошло не так, прогон можно повторить, а не восстанавливать вручную. ## На чём такие переносы ломаются Перенос базы знаний выглядит как «скопируй текст в новое место». На практике ломается в пяти местах — и каждое стоит либо потерянного контента, либо вечера ручной сверки. ### Дерево не переносится плоским списком Главная ловушка. В исходном сайте вложенность живёт в меню: раздел «Продажи» содержит «Воронки», «Договора», «Счета», «Акты» и ещё шесть подразделов; «Интеграции заявок» — пять инструкций по подключению. Если перенести статьи списком, все они станут равноправными, и база превратится в свалку: раздел и его содержимое визуально не отличаются. Хуже того, порядок создания важен: у статьи нельзя указать родителя, которого ещё не существует. Значит, нельзя «сначала все статьи, потом разложить» — создавать надо строго сверху вниз, иначе подраздел уедет в корень и вложенность придётся восстанавливать вручную. ### Служебные страницы шаблона уезжают в новую базу В исходном сайте есть страницы, которые не являются знаниями: главная страница шаблона, страница результатов поиска, сайдбар с меню, «Article example». Формально это те же страницы, и агент по умолчанию потащит их в новую базу. В результате в чистой базе знаний появляются пустые и технические статьи — и первое впечатление у сотрудника испорчено. В этом кейсе из 40 страниц первой базы в перенос не пошли 6: «Стартовая», «Результаты поиска», «Сайдбар», «Страница категории», «Страница статьи» и устаревшая версия «BI Отчётов». Их надо распознавать по признакам шаблона (служебная страница, код шаблона вида `wiki-light/main`) и исключать осознанно — с записью причины, а не «на глаз». ### Не-текстовые блоки: пустая статья или потерянный контент Страница собрана из блоков: заголовок, текст, картинка, видео, разделитель, карта, соцкнопки. Если читать «весь HTML страницы», в статью приедет мусор из вёрстки. Если читать только текстовые блоки — потеряются картинки и видео, а статья с инструкцией «нажмите кнопку на скриншоте» станет бесполезной. Правильный путь: обходить блоки по порядку, текст конвертировать в разметку, а на месте картинки оставлять маркер и заменять его на реальное изображение после загрузки файла. Тогда картинка остаётся там, где была в тексте, а не «где-то в конце статьи». ### Ссылки меню могут вести в никуда Меню — это ссылки. В нём встречаются пункты, которые указывают на отсутствующие или удалённые страницы, а одна и та же страница может быть указана дважды (например, «BI Отчёты» отдельным пунктом и внутри другого раздела). Если идти по меню вслепую, агент либо упадёт на 404, либо создаст дубль статьи. Поэтому дерево строится не «по ссылкам», а по факту существования страницы, с журналом решений: какие пункты пропущены и почему, какие страницы в меню не упомянуты и остались неперенесёнными. ### Портал отвечает медленно — это норма В этом кейсе запросы к порталу шли через прокси приложения: на портальных путях они занимают десятки секунд, и ответ в 70–100 секунд — штатное поведение, а не авария. Отсюда два следствия. Первое: таймаут на такие вызовы надо ставить в минутах. Обрыв на 30–60 секундах выбрасывает ответ, который уже был в пути, и перенос «падает» на здоровом портале. Второе: если перенос идёт на сервере приложения, нельзя ходить в портал внутри запроса посетителя — дашборд, который делает десять последовательных чтений в обработчике, не ответит вообще. Данные собираются фоном и отдаются из памяти, с честной подписью «обновлено N минут назад». ### Чего ещё стоит ждать - **Санитайзер портала.** Встречается текст, похожий на HTML (`» (id сайта ). Цель: новая коллекция «<имя новой базы>» в модуле «База знаний». Правила работы: 1. Источник только читай. Ничего в нём не меняй, не удаляй и не переименовывай. 2. Сначала выгрузи всё локально в файлы: дерево разделов (JSON) и текст каждой статьи (Markdown по папкам). Локальные файлы — источник истины для переноса. 3. Служебные и шаблонные страницы (главная, поиск, сайдбар, примеры статей) в перенос не включай. Для каждой исключённой страницы запиши причину. 4. Создай коллекцию с указанным именем. Если она уже существует — используй её, дубль не создавай. 5. Переноси строго в порядке «родитель раньше детей»: сначала раздел, затем его подразделы с указанием родителя. Вложенность должна совпасть с исходной. 6. Изображения переноси внутрь статьи, сохраняя место в тексте. Видео — ссылкой на источник. Текстовые блоки конвертируй в Markdown, не-текстовые (разделители, карты, соцкнопки) пропускай. 7. Перенос сделай идемпотентным: веди журнал «страница источника → статья в новой базе», чтобы повторный запуск не создавал дубли. 8. В конце сверь результат с локальным деревом: число статей, совпадение родителей, непустые тексты, число картинок. Отчитайся таблицей: сколько статей, разделов, картинок и видео перенесено, что исключено и почему, какие расхождения нашла сверка. Если что-то в источнике неоднозначно (пункт меню ведёт на отсутствующую страницу, одна страница указана дважды, статья практически пустая) — не угадывай: прими решение, запиши его в отчёт отдельным пунктом и продолжай. ``` **Что уточнить под себя.** Название сайта и его id — из адреса или карточки сайта. Имя новой базы — так, как её будут искать сотрудники. Если в базе есть разделы, которые переносить не нужно (архив, черновики), допишите их списком исключений в правиле 3. **Чего в промте нет и почему.** В нём нет ни ключей, ни адресов прокси, ни упоминания конкретного инструмента: доступ к порталу уже настроен в окружении, а способ вызова агент выбирает сам. Промт описывает результат и ограничения, а не пошаговые команды — так он остаётся рабочим, даже если внутренняя механика изменится. ## Пример кода Если хотите не «попросить агента», а сделать перенос сами (или дать агенту каркас), вот схема вызовов. Она намеренно короткая: чтение источника, создание коллекции, обход дерева, сверка. Ключ и базовый адрес берутся из окружения — в коде их быть не должно. ```js // Ключ и адрес — из окружения приложения, никогда не в коде и не в браузере. const BASE = process.env.BITRIX_API_BASE_URL; const KEY = process.env.BITRIX_API_KEY; async function api(method, path, body) { const res = await fetch(BASE + path, { method, headers: { "X-Api-Key": KEY, "Content-Type": "application/json" }, body: body ? JSON.stringify(body) : undefined, // Портал отвечает десятками секунд — таймаут в минутах, а не в секундах. signal: AbortSignal.timeout(180_000), }); const json = await res.json(); if (!res.ok || json.error) { throw new Error( `${json.error?.code ?? res.status}: ${json.error?.message ?? "request failed"}` ); } // Ответ прокси может быть обёрнут: разворачиваем data.data либо data. return json.data?.data ?? json.data ?? json; } // 1. Чтение источника: страницы и блоки. Только чтение. const pages = await api("GET", "/pages?scope=KNOWLEDGE&limit=500"); const blocks = await api("GET", `/pages/${pageId}/blocks?scope=KNOWLEDGE`); const content = await api( "GET", `/pages/${pageId}/blocks/${blockId}/content?scope=KNOWLEDGE` ); // -> { html } // 2. Дерево: разбираем блок меню в «раздел → подраздел → статья». // Служебные страницы помечаем excluded с причиной, ссылки на несуществующие // страницы пропускаем. Результат сохраняем локально в tree.json. // 3. Целевая коллекция. Существует — используем, нет — создаём. const collection = await api("POST", "/note/collections", { name: "База знаний компании", }); // 4. Перенос: строго сверху вниз, родитель до детей. async function transfer(node, parentId) { const markdown = renderMarkdown(node); // блоки -> Markdown, картинки -> маркеры const doc = await api("POST", "/note/documents", { collectionId: collection.id, title: node.title, markdown, ...(parentId ? { parentId } : {}), // родитель уже создан — вложенность сохранится }); ledger.set(node.pageId, doc.id); // журнал: повторный прогон не создаст дубль for (const file of node.images) { // картинки — после текста, с заменой маркеров await api("POST", `/note/documents/${doc.id}/files`, { fileName: file.name, fileContent: file.base64, // base64 читает скрипт с диска, не модель }); } for (const child of node.children ?? []) await transfer(child, doc.id); } for (const root of tree.root) await transfer(root, null); // 5. Сверка: дерево в базе против локального дерева. const remote = await api("GET", `/note/collections/${collection.id}/documents`); // Проверяем: число статей совпадает, у каждого документа тот же родитель, // тексты непустые, маркеров не осталось, число картинок равно источнику. ``` **Три вещи, на которые стоит посмотреть в этом коде.** `AbortSignal.timeout(180_000)` — не перестраховка. Портал на портальных путях отвечает 70–100 секунд; таймаут в 30 секунд «уронит» перенос на полностью здоровом портале. `json.data?.data ?? json.data ?? json` — разворачивание ответа. Ровно на этом месте в реальном переносе появились 34 пустых дубля: скрипт читал идентификатор не из того уровня вложенности, получал `undefined` и создавал статью заново вместо того, чтобы заполнить существующую. Дубли удалили, разбор ответа исправили. `ledger.set(node.pageId, doc.id)` — журнал переноса. Он защищает от дублей при повторном прогоне и потом используется для сверки вложений: списка файлов у статьи в API нет, поэтому сверять приходится по сохранённым идентификаторам. ## Что в итоге Перенос, который вручную занял бы дни, агент выполнил за два сеанса — по одному на базу. Почти всё время ушло на ошибки инструмента, а не на статьи: 43 статьи, 75 изображений, 39 видео перенесены, вложенность сохранена и проверена скриптом. Исходный сайт остался нетронутым — его можно сравнить или держать как архив. Главный вывод не про инструменты, а про порядок: **сначала выгрузить всё в файлы, потом строить**. Дерево — сверху вниз. Служебные страницы — исключать осознанно. Результат — сверять, а не «вроде выглядит нормально». Эти четыре правила делают перенос базы знаний повторяемой операцией, а не разовым подвигом. ## Если перенос упал на середине 1. Откройте журнал: в нём видно, какие страницы уже получили идентификатор в новой базе. Повторный прогон продолжит с этого места, а не создаст всё заново. 2. Проверьте статьи из журнала: убедитесь, что текст непустой, маркеров вроде `` не осталось, а картинки на месте. Пустой текст обычно означает, что страницу прочитали только по текстовым блокам, а маркер — что не отработал шаг с файлами. 3. Сверьте число статей, разделов и картинок с локальным деревом и только потом отключайте старый сайт. Пока он на месте, любое расхождение можно проверить по исходнику. Если хотите повторить — возьмите промт из раздела «Промт для агента», подставьте название и id своего сайта и попросите агента отчитаться таблицей: по числам сразу видно, всё ли доехало. --- # Почему я ушёл с Дзена в свой блог, а не в Telegram > Чем не устроили Дзен, vc.ru, Хабр и Пикабу, почему статьи не живут в Telegram и ВК, зачем блогу подписи «кто писал» и почему он сделан и для ИИ тоже. - Авторство: Идея и тезисы: Максим · Текст: Claude (ИИ) [co] - Идея, вводные и ключевые тезисы — Максим. Текст по ним написал Claude (ИИ), Максим проверил его перед публикацией. - Опубликовано: 2026-10-16 - Теги: блог, ИИ, вайбкодинг - Адрес: https://dgtor.blog/posts/why-own-blog/ Несколько лет я писал о Битрикс24, менеджменте и о том, что заботит в бизнесе, — на Дзене, а до этого во ВКонтакте. Теперь эти статьи переехали сюда, на dgtor.blog, а на Дзене их больше нет. Ниже — почему я завёл свой блог, а не ушёл на другую площадку с трафиком или в Telegram, и как в нём устроена работа с ИИ. ## Что не так с Дзеном Дзен с самого начала не был площадкой, где удобно публиковать код. Код в моих статьях приходилось оформлять цитатами. Со временем стало хуже: Дзен превратился в рекламную помойку, которая к тому же плохо индексируется. Открываешь статью с телефона — полэкрана занято рекламой. С компьютера не лучше: баннеры висят сбоку и вклиниваются прямо в текст. Человек пришёл за пользой, а его всё время отвлекают. Нормально читать так невозможно, и это стало последней каплей. ## Почему не другая площадка с трафиком - **vc.ru** — помойка ещё больше, туда подключена куча рекламных сетей. Находиться там — всё равно что себя не уважать. - **Хабр** — нормальная ИТ-площадка с трафиком. Она даёт доверие к автору и бренду, коллеги туда стараются попасть и пишут. Но мне хотелось свободы: на технической площадке не напишешь о личном, а этот блог — обо всём. - **Пикабу** — площадка для развлечений. Почитать шуточки — да, писать статьи о работе — нет. - **Teletype** я не пробовал, поэтому ничего о нём сказать не могу. ## Почему не Telegram, MAX и ВК Я хочу, чтобы от текстов была польза. А польза должна индексироваться: другой человек должен найти статью поиском, когда столкнётся с той же задачей. Особенно раздражают каналы, где «бесплатное, но закрытое — вступите, там подробности». Telegram поисковики почти не индексируют, а закрытые каналы — совсем, так что такой текст никто не найдёт. Это переливание из пустого в порожнее. Если хочешь поделиться с миром, делись максимально публично, чтобы это можно было нагуглить. Мессенджеры вообще не для вдумчивого чтения. Каналы в Telegram и MAX, группы в ВК — это то, чем раньше были подписки, RSS и email-рассылки: быстро донести контент. Дайджест, ссылки, голосовое, кружочек, короткий текст в духе старого Твиттера. Всё, что умещается в один экран телефона. Нормальный код там не разместить, а у ВК разметка ещё хуже, чем у Telegram. Источником глубокого текста эти площадки быть не могут. Поэтому роли такие: **блог — для статей и объёмных вещей, [канал в Telegram](https://t.me/+Nlk2TsNhzI83NGFi) — для анонсов и быстрых заметок.** ## Почему свой блог, а не готовая платформа Сейчас с ИИ поднять блог — это два-три вечера. Точка входа стала намного ниже, чем раньше. Поэтому и появился отдельный сайт, а не очередная страница на чужой платформе. > **Примечание Claude.** Этот блог поднимали восемь вечеров. Автор отвлекался, хотел собственный дизайн, а шрифты мы подбирали два вечера. Так что два-три вечера — это если не хотеть своих шрифтов. ## Как я пишу с ИИ ИИ я применяю для текстов с тех пор, как он появился. Пользуюсь им на трёх уровнях. 1. **Редактор.** Пишу я не особо грамотно, поэтому редактор нужен обязательно. 2. **Соавтор.** У меня есть мысли — не очень структурированные, но, мне кажется, полезные. ИИ помогает их приземлить, выстроить и добрать фактуры. С этим справится любая современная модель, даже не самая сильная. 3. **Автор.** Мы вместе сделали какую-то работу, и я понимаю, что надо поделиться: кто-то пойдёт по тем же граблям, и статья сэкономит ему время. Тогда текст целиком пишет ИИ, а я читаю и проверяю, что всё адекватно. Эти уровни видны и в блоге. Под заголовком каждой статьи написано, кто её писал: «Автор: Максим», «Идея и тезисы: Максим · Текст: Claude (ИИ)» или «Текст: Claude (ИИ) · Редактура: Максим». Мне важно не притворяться человеком, который всё написал сам. Где писал я, а где Claude, должно быть видно сразу. Эта статья, кстати, второго уровня. Я надиктовал ответы голосом на прогулке, Claude собрал из них текст, а я вычитал. Когда мы проектировали блог, то разбирали, чем грозит честная пометка. Ответ: в поиске такие статьи могут проиграть. Google, скорее всего, не покажет ИИ автором статьи, а как Яндекс относится к ИИ-текстам, официально не сказано. Так тому и быть. Возможно, со временем появятся другие поиски, или ИИ вообще будут искать по-другому. ## Блог и для ИИ тоже Этот блог сделан не только для людей. Его специально проектировали так, чтобы его было удобно читать ИИ: - [`/llms.txt`](/llms.txt) — оглавление сайта для языковых моделей, [`/llms-full.txt`](/llms-full.txt) — все статьи одним файлом; - у каждой статьи есть markdown-версия: адрес статьи плюс `index.md`; - в разметке страниц указано, кто автор и какой режим авторства. Зачем? Во-первых, ИИ-агенты ищут информацию, чтобы что-то сделать. Если агент найдёт статью здесь и быстрее справится с задачей — это хорошо. Во-вторых, я думаю, что скоро и новости нам будет подбирать ИИ. Поэтому площадке важно быть дружелюбной не только к людям, но и к ИИ. ## Чего я жду от блога - **Структуры в собственных мыслях.** Чтобы написать, приходится разложить по полочкам. - **Пользы другим** — разработчикам, предпринимателям, энтузиастам. Если что-то пригодится хотя бы одному человеку, уже хорошо. - **Сообщества.** Надеюсь, когда-нибудь здесь появятся комментарии, и статьи будут не только читать, но и обсуждать. Недавний пример, ради чего это всё. Я выложил в Telegram пост о том, как сделать свой транскрибатор. В комментариях меня поправили и подсказали модель GigaAM, и с ней расшифровка стала лучше. Это и есть сила сообщества — разработчиков и вообще любого: тебе корректно показывают точку роста. А ответы для этой статьи расшифровал тот самый транскрибатор, уже на GigaAM. --- # Telegram не показывает превью ссылки: три ложных следа и кэш > Сайт открывается, Open Graph на месте, а Telegram не строит карточку ссылки. Мы подозревали CDN, Cloudflare и gzip, а виноват оказался кэш самого Telegram. - Авторство: Текст: Claude (ИИ) · Редактура: Максим [ai] - Текст полностью написал Claude (ИИ). Максим отредактировал его и отвечает за публикацию. - Опубликовано: 2026-10-16 - Теги: вайбкодинг, блог, Telegram - Адрес: https://dgtor.blog/posts/telegram-link-preview-cache/ 9 октября на dgtor.blog вышла первая статья. Ссылка на неё в Telegram пришла голой строкой: ни заголовка, ни описания, ни картинки. При этом сайт открывался, а Open Graph — мета-теги, из которых мессенджеры собирают карточку, — был на месте. Этот блог мы с Максимом делаем в Claude Code. Я выполнял команды и читал ответы серверов, Максим проверял превью в своём Telegram. Причину искали пять дней и за это время сменили три версии. Ниже — все три ложных следа и что оказалось на самом деле. Если у вас та же беда, раздел «Как проверить» — в конце. ## Коротко Telegram запомнил неудачу. Когда он впервые пришёл за страницей, его DNS-серверы ещё вели в старую зону домена на Cloudflare, а там сайт отвечал 404. Telegram сохранил «превью нет» и с тех пор этот адрес не перепроверяет. Та же страница по адресу с `?v=3` сразу дала нормальную карточку. CDN, Cloudflare как прокси и gzip к проблеме отношения не имели. ## Как был устроен сайт - Сайт статический, файлы лежат в бакете Яндекс Облака (Object Storage с хостингом сайта). - Перед бакетом стоял Yandex EdgeCDN с HTTPS. - Домен dgtor.blog куплен на рег.ру. До запуска его NS-серверы смотрели на Cloudflare: там осталась зона от старого эксперимента Максима, и она отвечала 404. В день запуска мы перенесли NS в Yandex Cloud DNS. Последний пункт и оказался разгадкой, но поняли мы это только на пятый день. ## След первый: CDN Перед публикацией я проверил, что боты мессенджеров получают страницу. Для этого `curl` с их User-Agent: ```bash curl -I -A "TelegramBot (like TwitterBot)" https://dgtor.blog/posts/<статья>/ curl -I -A "vkShare; +http://vk.com/dev/Share" https://dgtor.blog/posts/<статья>/ ``` Оба ответа — `200` без редиректов, с правильным `Content-Type`. Но @WebpageBot, официальный бот Telegram для проверки превью, карточку не строил. Не помог и новый адрес с `?v=1`. Зато та же страница по техническому адресу бакета `https://dgtor-blog.website.yandexcloud.net/…` дала превью сразу. Разница одна — CDN. Сертификат и разметку мы исключили: цепочка Let's Encrypt такая же, как у сайтов, где превью работает, а HTML тот же самый. Нашлась и правдоподобная теория: на российских сетях фильтруют трафик к зарубежным IP соцсетей, и путь от серверов Telegram до узлов CDN может резаться. Мы убрали CDN и стали отдавать сайт прямо из бакета, с HTTPS через Certificate Manager. Превью не появилось. ## След второй: старая зона в Cloudflare Тогда я посмотрел, куда на самом деле ведёт домен. Зона dgtor.blog в аккаунте Cloudflare всё ещё была активна и отвечала 404. Реестр `.blog` до утра отдавал NS Cloudflare с TTL 86 400 секунд, то есть сутки. Публичные DNS-резолверы — Google, Cloudflare, Quad9, OpenDNS — уже видели NS Яндекса. Резолверы Telegram, по всей видимости, нет: они держали старую делегацию и ходили в Cloudflare за 404. Эта версия объясняла и «неудачу CDN». Адрес `*.website.yandexcloud.net` работал не потому, что в нём нет CDN, а потому, что это другой домен, к старой зоне он отношения не имеет. Новый `?v=1` не помогал по той же причине: любой адрес на dgtor.blog вёл в Cloudflare. Мы решили подождать сутки, пока истечёт TTL. Но и 14 октября превью по-прежнему не было. Версия выглядела опровергнутой. ## След третий: gzip 14 октября нашлась новая странность. Бакет отдавал HTML сжатым gzip на любой запрос, даже с заголовком `Accept-Encoding: identity`, то есть «не сжимай». Причина — в нашем скрипте выкладки: он сжимает файлы заранее, а Object Storage не согласует сжатие с клиентом. Что загружено сжатым, то и получают все. Если краулер Telegram не умеет gzip, карточки не будет. Проверили экспериментом: выложили две копии статьи — сжатую (`/_preview-test/gz/`) и обычную (`/_preview-test/plain/`). @WebpageBot построил превью для обеих. Gzip оказался ни при чём. ## Разгадка В том же эксперименте Максим проверил саму статью по новому адресу `…/xerox-b215-mac-printing/?v=3`. Превью появилось сразу. Сервер отдавал её байт в байт так же, как тестовые копии. Пазл сложился. Вторая версия была верной с самого начала: 1. 9 октября Telegram впервые пришёл за статьёй. Его резолверы вели в зону Cloudflare, сайт ответил 404. 2. Telegram закешировал неудачу для этого адреса. 3. Через сутки DNS у Telegram обновился, но за этим адресом он больше не ходит. Отдаёт сохранённое «превью нет». 4. Любой адрес, которого Telegram ещё не видел, работает. CDN тоже был ни при чём: его «неудача» — тот же кэш и та же зона Cloudflare. Возвращать CDN мы не стали, сайт и сейчас отдаётся из бакета. У основного адреса той статьи превью нет до сих пор: кнопка «Update preview again» в @WebpageBot кэш не сбросила. ## Чему научились - **Неудача кэшируется.** Проверять превью нужно на адресе, который Telegram ещё не видел: добавить `?v=N` и увеличивать N с каждой попыткой. Иначе вы проверяете не сайт, а кэш Telegram. - **Не отправлять ссылку в Telegram, пока домен не отвечает правильно отовсюду.** После переноса NS это может занять сутки и больше: смотрите TTL у старых записей. - **При переносе NS сразу удалять зону у старого DNS-провайдера** или хотя бы чистить её, а не оставлять отвечать. - **`curl` с User-Agent бота проверяет только ваш сервер.** Он не показывает, дойдёт ли до сервера сам мессенджер и по какому адресу пойдёт. Последнее слово — за @WebpageBot. ## Как проверить превью своей страницы 1. Проверьте, что страница отдаёт Open Graph без JavaScript: ```bash curl -s https://<ваш-сайт>/<страница>/ | grep -o '` — ответ `200` без редиректа, верный `Content-Type`. 3. Проверьте NS домена у публичных резолверов и у реестра. Если домен недавно переезжал, а старая зона ещё жива, — удалите её и подождите TTL. ```bash dig NS <ваш-сайт> @8.8.8.8 dig NS <ваш-сайт> +trace ``` 4. Отправьте @WebpageBot адрес с `?v=1`. Если превью есть, сайт в порядке, а у основного адреса — старый кэш. Если с новым адресом превью тоже нет, дело в самой странице. Обычные причины — картинка тяжелее ~300 КБ, картинка в SVG, относительный адрес в `og:image` или редирект по пути. Теперь это правило блога: новую статью сначала проверяем в @WebpageBot на адресе с `?v=`, и только потом отправляем основной адрес людям. --- # Права в Битрикс24: администраторы, наследование и передача учётки > Три ошибки с правами в Битрикс24, из-за которых компании теряют базу и доступ к порталу: лишние администраторы, наследование прав и передача учётки. - Авторство: Идея и тезисы: Максим · Текст: Claude (ИИ) [co] - Идея, вводные и ключевые тезисы — Максим. Текст по ним написал Claude (ИИ), Максим проверил его перед публикацией. - Опубликовано: 2026-10-16 - Теги: Битрикс24, безопасность - Адрес: https://dgtor.blog/posts/bitrix24-access-rights-security/ Большинство неприятностей с безопасностью в Битрикс24 начинаются не со взлома, а с прав, которые выдали «на всякий случай». Ниже три типичные ошибки из практики Максима: что происходит и как этого не допустить. ## Ошибка 1. Лишние администраторы ### Как это бывает Вы дали сотруднику права администратора, чтобы он точно видел свои лиды. Сотрудник оказался нечист на руку и неглуп. Он начал вручную выгружать базу и стирать историю своих действий, чтобы потом не осталось концов. Вы уехали на пару дней на конференцию. Хотите похвастаться перед коллегами, как у вас всё хорошо настроено в Битрикс24, но войти не можете: ваш пользователь удалён. Сотрудники не берут трубку. Настоящий государственный переворот. А всё потому, что у сотрудника были права администратора, и он просто уволил вас. Пока вы через техподдержку возвращаете себе доступ, всё уже будет сделано. ### Что делать Чем меньше администраторов на портале, тем лучше. Всегда давайте сотрудникам минимум прав, без которых нельзя работать. - Подчинённым права администратора точно не нужны: Битрикс24 достаточно гибко настраивается и без них. - Родственникам и соучредителям тоже не стоит. Плохого они, может, и не хотят, но по простоте или незнанию могут натворить дел. Ещё два правила на случай, если доступ всё-таки придётся возвращать: - Платите интегратору за лицензию через расчётный счёт и всегда с одной компании. Если что-то случится, так легче доказать, что владелец — вы. - Когда лицензию регистрируют в кабинете партнёра, просите указать фамилию, имя и почту основного администратора. [Видео: Сколько должно быть администраторов в Битрикс24](https://vkvideo.ru/video-170024218_456239220) ## Ошибка 2. Пересечение и наследование прав ### Как это бывает **Сотрудник без отдела.** Вы наняли сотрудника, не указали ему отдел и права отдельно не выдавали. В Битрикс24 стоят какие-то преднастроенные права, остальным их хватает, и новому хватит: свои лиды он видит. А то, что он видит и может править всю остальную CRM, вас не заботит. Пока он не начинает сливать заявки коллег конкурентам. **Урезанные права у руководителя.** Вася Петров в подчинении у Оли Болтушкиной. Оля под подозрением, и на время проверки вы решили сильно урезать ей права: выдали отдельные права в CRM, но место в структуре компании не поменяли. Почувствует ли Оля изменения? Лишь отчасти. Права в Битрикс24 наследуются от сотрудника к руководителю, поэтому у Оли останутся как минимум те же права, что и у Васи. ### Что делать - Правильно выстраивайте структуру компании. - Проверяйте права у каждого нового сотрудника. - Настраивая права, учитывайте наследование от подчинённых к руководителю. Полезно почитать: - [Структура компании](https://helpdesk.bitrix24.ru/open/23039004/) - [Ролевая модель прав в CRM](https://helpdesk.bitrix24.ru/open/23240636/) [Видео: Две основные ошибки в настройке прав Битрикс24 CRM](https://vkvideo.ru/video-170024218_456239221) ## Ошибка 3. Передача учётной записи ### Как это бывает **Учётка уволенного переходит новичку.** Вы увольняете Петю и берёте Васю. Нового пользователя для Васи не создаёте: он переименовывает учётку Пети на себя. Так не нужно переводить на нового сотрудника сделки, лиды, дела и задачи, и старые чаты остаются под рукой. - Пароль не сменили. Тогда Петя может зайти под старой учёткой с домашнего компьютера, всё видеть и, возможно, навредить. - Пароль сменили, но не удалили ключи доступа для приложений и календаря. С компьютера Петя уже не зайдёт, но через приложение по-прежнему видит всё и остаётся в курсе дел бывшего работодателя. **Учётка у подрядчика.** Вы дали подрядчику свой логин и пароль от Битрикс24 для работ. Работы закончились, а пароль не сменили. Подрядчик может заходить под вами и делать что захочет. ### Что делать - Передаёте учётную запись от увольняемого сотрудника новому — обязательно смените пароли на почте и в Битрикс24 и отключите все старые интеграции увольняемого. - Увольняйте сотрудника через «Штрафбат» — так Максим называет отдел, в который переводят сотрудников перед увольнением. Это позволяет без риска перенести всё с увольняемого на нового сотрудника. - Включите двухэтапную авторизацию на портале для себя и для сотрудников. Полезно почитать: - [Пароли приложений](https://helpdesk.bitrix24.ru/open/27600210/) - [Как защитить вход в Битрикс24 одноразовым кодом](https://helpdesk.bitrix24.ru/open/19503644/) [Видео: Создание отдела и настройка прав CRM в Битрикс24](https://vkvideo.ru/video-170024218_456239222) [Видео: Правильное увольнение сотрудника из Битрикс24 с передачей дел новому сотруднику](https://vkvideo.ru/video-170024218_456239223) [Видео: Как безопасно передать учётку новому сотруднику](https://vkvideo.ru/video-170024218_456239224) ## Коротко - Администраторов — минимум. Подчинённым, родственникам и соучредителям права администратора не нужны. - Лицензию оплачивайте с одного расчётного счёта, основного администратора указывайте в кабинете партнёра. - Каждого сотрудника — в нужный отдел; помните, что права подчинённых наследует руководитель. - Передали учётку или дали доступ подрядчику — смените пароли, удалите пароли приложений и включите двухэтапную авторизацию. --- # Телефония для Битрикс24: оператор, АТС, номер и мессенджеры > Какого оператора подключить к Битрикс24, чья АТС удобнее, какой номер взять и как его проверить, можно ли сохранить старый номер и завести на нём мессенджеры. - Авторство: Идея и тезисы: Максим · Текст: Claude (ИИ) [co] - Идея, вводные и ключевые тезисы — Максим. Текст по ним написал Claude (ИИ), Максим проверил его перед публикацией. - Опубликовано: 2026-10-16 - Теги: Битрикс24, телефония - Адрес: https://dgtor.blog/posts/bitrix24-telephony-choice/ Когда компания подключает телефонию к Битрикс24, вопросы почти всегда одни и те же. Какого оператора выбрать? Чья АТС удобнее? Какой номер брать? Можно ли оставить старый? Получится ли завести на виртуальный номер WhatsApp и Telegram? Ниже ответы на всё по порядку. Они собраны из практики внедрений Максима. Названия операторов и их условия здесь актуальны на осень 2024 года. Тарифы и сервисы меняются, поэтому перед подключением сверьте их у оператора. ## Шаг 1. Где работают сотрудники Первый вопрос: как сотрудники работают с точки зрения локации, в офисе или в разъездах? ### Сотрудники работают в офисе Им подходит виртуальная телефония. Выбирать стоит из трёх вариантов: 1. **Стандартная телефония Битрикс24.** Быстрый старт, есть номера в разных городах, тарификация поминутная. 2. **Novofon.** Самая дешёвая аренда номеров, тарификация посекундная. Чтобы зарегистрироваться, понадобится УКЭП (усиленная квалифицированная электронная подпись). Техническая поддержка медленная. 3. **МТТ.** Оператор с самой большой ёмкостью номеров, тарификация посекундная, техническая поддержка по телефону 24/7. Цена за минуту во всех трёх вариантах примерно одинаковая. ### Сотрудники работают «в поле» Если работа разъездная и нужна мобильная связь, вариантов два: 1. **Мегафон** — рекомендуем. Лучше всех работает с Битрикс24, у него хорошая встроенная АТС и нормальная поддержка. 2. **Билайн.** Для нормальной работы с Битрикс24 понадобится дополнительная платная прослойка — СимХаб. Как подключить Билайн без неё, через SIP-коннектор, — в статье «[Подключение Билайн к Битрикс24 через SIP-коннектор](/posts/beeline-sip-connector/)». Других мобильных операторов не рассматриваем: у них плохо работают интеграции с Битрикс24, неудобные АТС и проблемная поддержка. ## Шаг 2. Сколько звонков в месяц Если вы только начинаете и исходящих звонков меньше 1000 минут в месяц, берите телефонию Битрикс24. Если исходящих больше 1000 минут или много коротких звонков, меньше минуты, нужна посекундная тарификация. Выбирайте между Novofon и МТТ: - Novofon — дёшево и сердито; - МТТ — дороже, зато поддержка отличная. ## Шаг 3. Особые случаи Колл-центрам иногда нужна карусель номеров. Вы покупаете пакет из 50, 100 или 200 номеров, и при каждом наборе клиент видит один из номеров пакета. Карусель есть у МТТ и Билайна. Оба оператора подключаются к Битрикс24 через SIP-коннектор: звонить удобно из Битрикс24, а сама карусель работает на стороне оператора. Подробнее — в статье «[Карусель номеров в Битрикс24](/posts/bitrix24-number-carousel/)». ### А как же Манго и UIS? Mango Office, UIS и похожие сервисы часто советуют за партнёрское вознаграждение. Фишек много, хвалят их со всех сторон, но на практике малому и среднему бизнесу эти фишки не нужны. ## Какую АТС использовать - С мобильным оператором — АТС оператора. - С виртуальной телефонией — по возможности встроенную АТС Битрикс24. Чем удобна АТС Битрикс24: - записи звонков сохраняются на Битрикс24.Диске; - по записям работает CoPilot: он извлекает суть разговора и сам заполняет карточку; - работает встроенная автоматизация по звонкам — обратный и информационный звонок; - доступны встроенные отчёты по телефонии: статистика по сотрудникам, оценка, сравнение периодов и другие; - все настройки — на стороне Битрикс24, и это сильно облегчает жизнь. Уволили сотрудника — он сразу пропал из очереди распределения звонков. Перевели сотрудника в юридический отдел — ему сразу стали доступны номера юристов. **Пример.** Вы выбрали Novofon. Подключайте его к Битрикс24 не стандартным приложением из Маркета, а через SIP-коннектор. Номера и трафик Novofon вместе с АТС Битрикс24 дадут дешёвые номера, посекундную тарификацию и простоту в эксплуатации. ## Какой номер взять Большинство выбирает номер по красоте и запоминаемости. Но номерная ёмкость не бесконечна: номер, который вам понравился, мог раньше принадлежать кому-то другому, и этот кто-то мог оказаться «редиской». Под разные задачи нужны разные номера: - **Красивый, запоминающийся номер** — для документов и визиток, чтобы клиенты, которые уже с вами работают, могли на него позвонить. У интеграторов такой номер называют «органикой». - **Запоминающийся городской или 8-800** — для рекламы на баннерах и радио: по нему видно, сколько заявок дал источник. - **Мобильный номер** — чтобы дозваниваться до клиентов. При быстром повторном наборе мобильный номер обходит режим «Не беспокоить» на современных смартфонах. - Для остальных целей подойдёт любой номер. Значит, минимум номеров — два: городской для «органики» и мобильный, чтобы лучше дозваниваться. ## Как проверить номер на «редиску» Выбрали номер — не спешите его арендовать. Сначала проверьте, нет ли его в базах как «мошенник», «коллекторы» или что похуже: 1. Поищите номер в Google. 2. Поищите номер в Яндексе. 3. Установите на смартфон приложение Яндекса и разрешите ему доступ к звонкам. Наберите выбранный номер: этого хватит, чтобы Яндекс показал, что о нём известно. 4. Установите GetContact и проверьте номер по его базе. Не ленитесь пройти все четыре проверки. Иначе потом будете гадать, почему клиенты не берут трубку или почему вам звонят пенсионеры по поводу пенсии. Проверяйте свои номера и дальше: - раз в квартал, а также после негативных отзывов о компании: плохое могли написать и про номер. Нашли негатив — меняйте номер; - следите за процентом дозвона. Пошёл тренд на снижение — меняйте номер. ## Можно ли оставить старый номер Главное слово здесь — SIP, интернет-протокол для передачи голоса и данных телефонии. Если у номера есть доступ по SIP, его точно можно оставить. - **Виртуальная телефония.** Скорее всего, старый номер оставить получится. Узнайте у оператора, дают ли доступ к номеру по SIP. - **Мобильная связь.** Зависит от оператора: с Мегафоном и Билайном проблем не будет, с остальными сложнее. - **«Медные линии»** — стационарный одноканальный телефон, подключённый проводом. В практике Максима такой случай был один: за две недели переписки с оператором номер удалось перевести в виртуальный и получить доступ по SIP. ## Мессенджеры на виртуальном номере | Мессенджер | Мобильная связь | Виртуальный номер | | --------------------- | :-------------: | :---------------: | | WhatsApp на номер | да | нет | | WhatsApp Business API | да | да | | Telegram | да | нет | С виртуальной телефонией мессенджеры подключить сложно. Поэтому заказчикам мы советуем такую схему: 1. Купите на компанию одну сим-карту Мегафона и вставьте её в смартфон на Android. Подойдёт старый. 2. Зарегистрируйте на этот номер WhatsApp и/или Telegram и подключите их к Битрикс24 через коннекторы открытых линий. 3. Раз это Android, на него можно поставить «СМС-Банан» для отправки СМС и «Мои Звонки» для записи разговоров. 4. Если нужно хорошее качество записи и звонки прямо из Битрикс24, подключите у Мегафона услугу «МультиФон». ## Коротко - Офис — телефония Битрикс24, Novofon или МТТ. Разъезды — Мегафон, Билайн. - До 1000 исходящих минут в месяц — Битрикс24, больше — посекундная тарификация у Novofon или МТТ. - С виртуальной телефонией — АТС Битрикс24 через SIP-коннектор. - Минимум два номера: городской для «органики» и мобильный для обзвона. Каждый номер проверяйте до аренды и раз в квартал. - Старый номер можно оставить, если у него есть доступ по SIP. - Мессенджеры — на отдельную сим-карту Мегафона в Android-смартфоне. Какой телефон или гарнитуру купить для звонков из Битрикс24, — в [отдельной статье](/posts/bitrix24-call-headset/). --- # Лиды из ВКонтакте в Битрикс24: VK Реклама по API и формы сообществ > Два способа получать заявки из ВКонтакте в Битрикс24 без стандартных CRM-форм: подписка на лид-формы VK Рекламы по API и Callback API сообществ. - Авторство: Идея и тезисы: Максим · Текст: Claude (ИИ) [co] - Идея, вводные и ключевые тезисы — Максим. Текст по ним написал Claude (ИИ), Максим проверил его перед публикацией. - Опубликовано: 2026-10-16 - Теги: Битрикс24, REST API, вебхуки - Адрес: https://dgtor.blog/posts/vk-leads-to-bitrix24/ Стандартное подключение ВКонтакте через CRM-формы Битрикс24 подходит не всегда. Например, когда групп несколько или заявки идут из лид-форм рекламного кабинета. Тогда остаётся код: небольшой PHP-скрипт на своём сервере принимает заявку от ВК и создаёт лид в Битрикс24 через входящий вебхук. Ниже два способа, которые Максим использовал в 2024 году: 1. Лид-формы **VK Рекламы** (ads.vk.com) — подписка на заявки через API рекламного кабинета. 2. Лид-формы **сообществ ВКонтакте** — Callback API группы. Подходит, когда к Битрикс24 нужно подключить несколько групп. В обоих случаях понадобятся: - свой сервер с PHP и SSL-сертификатом; - входящий вебхук Битрикс24 с правами на CRM; - ID источника, с которым будут создаваться лиды; - минимальные знания PHP. ## Как узнать ID источника В Битрикс24 откройте «Настройки» → «Настройки CRM» → «Справочники» → «Источники». Нажмите правой кнопкой мыши на нужном источнике и выберите «Проверить объект» (инструменты разработчика браузера). ID — в атрибуте `value` у поля `STATUS_ID`. ![Справочник источников в Битрикс24 и инструменты разработчика браузера: у источника «Веб-сайт» значение STATUS_ID равно WEB](./source-id.jpg) Другой способ — запросить список источников через вебхук методом `crm.status.list`. Он описан в статье «[Получение источника через вебхук в Битрикс24](/posts/webhook-lead-source-id/)». ## Способ 1. VK Реклама по API Документация VK Рекламы: - [Быстрый старт](https://ads.vk.ru/doc/api/info/Быстрый%20старт) — как получить токен; - [Подписки](https://ads.vk.ru/doc/api/resource/Subscriptions) — как подписаться на заявки. Для проверки запросов пригодятся [Postman](https://www.postman.com) и [Webhook.site](https://webhook.site/). ### Получите доступ к API 1. Зайдите в рекламный кабинет VK. 2. В левом меню выберите «Настройки». 3. Скопируйте `client_id`. 4. Запросите дополнительный доступ к API. 5. Авторизуйтесь. 6. Скопируйте `client_secret`. Он **показывается только 10 минут**. 7. Сохраните полученные данные в надёжном месте. ### Оформите подписку на заявки через Postman 1. Получите токен доступа по инструкции из «[Быстрого старта](https://ads.vk.ru/doc/api/info/Быстрый%20старт)». 2. Создайте запрос с методом POST на адрес `https://ads.vk.com/api/v3/subscription.json`. 3. На вкладке Authorization выберите тип Bearer Token и вставьте токен из пункта 1. 4. На вкладке Headers добавьте ключ `Content-Type` со значением `application/json`. 5. На вкладке Body выберите `raw`, формат JSON, и вставьте: ```json { "resource": "LEAD", "callback_url": "https://<адрес обработчика>" } ``` 6. Отправьте запрос. После этого появится подписка, и VK будет отправлять обработчику данные заполненных лид-форм. От заполнения формы до прихода данных может пройти до 15 минут. ![Запрос в Postman: метод POST на ads.vk.com/api/v3/subscription.json, авторизация Bearer Token](./ads-subscription.jpg) ### Обработчик: заявка → лид в Битрикс24 Скрипт принимает заявку от VK и создаёт лид методом `crm.lead.add`. В начале скрипта укажите адрес своего вебхука и ID источника. Разработка — Александр Белокуров. ```php .bitrix24.ru/rest//<код вебхука>/'; // Тут вебхук с правами CRM $sourceId = 'web'; // Тут ID источника $title = 'Новый лид от VK'; // Убираем сломанную строку $cleanedJson = preg_replace('/,\s*"created_at":\s*"[^"]+"\s*/', '', $jsondata); // Преобразование JSON в ассоциативный массив $data = json_decode($cleanedJson); // Записываем переменные $name = $data->data->contact_info->first_name; $phone = $data->data->contact_info->phone; $email = $data->data->contact_info->email; // Записываем ответы для комментария $comm = ''; $questionNumber = 1; foreach ($data->data->answers as $answer) { $comm .= 'Вопрос ' . $questionNumber . ': ' . $answer->answer_text . '
'; $questionNumber++; } // Убираем последний перенос строки в комментарии $comm = preg_replace('/
$/', '', $comm); // Формируем данные для REST $queryUrl = $url . 'crm.lead.add'; $leadData = array( 'fields' => array( 'TITLE' => $title, 'NAME' => $name, 'PHONE' => array(array('VALUE' => $phone, 'VALUE_TYPE' => 'WORK')), 'EMAIL' => array(array('VALUE' => $email, 'VALUE_TYPE' => 'WORK')), "COMMENTS" => $comm, "STATUS_ID" => "NEW", "OPENED" => "Y", "SOURCE_ID" => $sourceId, "ASSIGNED_BY_ID" => 1, // Добавьте другие необходимые поля для лида ) ); // Преобразование данных в формат JSON $jsonData = json_encode($leadData); // Отправляем REST $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_SSL_VERIFYPEER => 0, CURLOPT_POST => 1, CURLOPT_HEADER => 0, CURLOPT_RETURNTRANSFER => 1, CURLOPT_URL => $queryUrl, CURLOPT_POSTFIELDS => $jsonData, CURLOPT_HTTPHEADER => array( 'Content-Type: application/json', 'Content-Length: ' . strlen($jsonData) ) )); $result = curl_exec($curl); $error = curl_error($curl); curl_close($curl); // Логируем результат if ($result === false) { file_put_contents('errors.txt', PHP_EOL . date("Y-m-d H:i:s") . PHP_EOL . 'Ошибка при выполнении запроса curl: ' . $error, FILE_APPEND); } else { file_put_contents('logs.txt', PHP_EOL . date("Y-m-d H:i:s") . PHP_EOL . 'Ответ от сервера Bitrix24: ' . $result, FILE_APPEND); } } ``` ## Способ 2. Лид-формы сообществ через Callback API Этот способ нужен, когда к Битрикс24 подключают несколько групп ВКонтакте. Скрипт обработчика ниже — честная сборка из нескольких источников. Настройка занимает минут десять. Скрипт проверяет секретный ключ, отвечает ВК строкой подтверждения, ищет контакт с тем же телефоном и создаёт лид методом `crm.lead.add` с ответами формы в комментарии. Настройки — в начале файла: вебхук, ID источника, UTM-метка, строка подтверждения, секретный ключ и номера форм (`all` — все формы сообщества). ```php .bitrix24.ru/rest//<код вебхука>/'; //Вебхук $sourceId = "WEB"; //ID Источника $utm_source = "vk"; //UTM Source $confirmation_token = '<строка подтверждения>'; // Строка, которую должен вернуть сервер $secret = '<секретный ключ>'; //Секретный ключ $formId = array("all"); //Если all, то передавать все формы, если цифры, то конкретную 15 if ($_SERVER['REQUEST_METHOD'] === 'GET') { echo "Нет таких тут!"; } else{ $token = ' '; //Ключ доступа сообщества /* $file = 'log.txt'; //Если нужны логи, то раскомментировать $current = file_get_contents($file); file_put_contents($file, print_r("php://input", true), FILE_APPEND); */ $data = json_decode(file_get_contents('php://input')); //Получаем и декодируем уведомление //Проверяем секретный код if ($data->secret !== $secret) { return; } //Проверяем, что находится в поле "type" switch ($data->type) { case 'confirmation': //Если это уведомление для подтверждения адреса... echo $confirmation_token; //...отправляем строку для подтверждения break; //Блок обработки лидформы case 'lead_forms_new': echo('ok'); //Возвращаем "ok" серверу Callback API $lead_id = $data->object->lead_id; $vk_id = $data->object->user_id; // ID пользователя, отправившего заявку $form_name = $data->object->form_name; // Название формы $form_id = $data->object->form_id; $adid = $data->object->ad_id; // ID рекламного объявления, с которого пришла заявка if((in_array($form_id, $formId)) || (in_array("all", $formId))) { if($data->object->answers) { foreach ($data->object->answers as $answer) { $ansvers[$answer->key]["question"] = $answer->question; $ansvers[$answer->key]["answer"] = $answer->answer; $pos = strpos($answer->key, "custom"); if ($pos !== false) { $customs[$answer->key]["question"] = $answer->question; $customs[$answer->key]["answer"] = $answer->answer; } } } $name = $ansvers["first_name"]["answer"]; // Имя $secname = $ansvers["patronymic_name"]["answer"]; // Отчество $surname = $ansvers["last_name"]["answer"]; // Фамилия $email = $ansvers["email"]["answer"]; // Email $phone = $ansvers["phone_number"]["answer"]; // Телефон основной $birth = $ansvers["birthday"]["answer"]; // День рождения $adres = $ansvers["location"]["answer"]; // Адрес //$phoneH = $ansvers["custom_1"]["answer"]; // Телефон домашний $comments = "" . $ansvers["age"]["question"] . ": " . $ansvers["age"]["answer"] . ";
"; if($customs) { foreach ($customs as $custom) { $comments .= "" . $custom["question"] . ": " . $custom["answer"] . ";
"; } } // Запишем данные для Б24 $vk_id = "id" . $vk_id; //Разделение адреса -- ОК $exadres = explode(", ", $adres); $country = $exadres[0]; $city = $exadres[1]; $queryUrl = $url . 'crm.lead.add'; //Проверим $queryUrlC = $url . 'crm.duplicate.findbycomm?'; $queryDataC = http_build_query( array( 'entity_type' => "CONTACT", 'type' => "PHONE", 'values' => array($phone) ) ); $curlC = curl_init(); curl_setopt_array($curlC, array( CURLOPT_SSL_VERIFYPEER => 0, CURLOPT_POST => 1, CURLOPT_HEADER => 0, CURLOPT_RETURNTRANSFER => 1, CURLOPT_URL => $queryUrlC, CURLOPT_POSTFIELDS => $queryDataC, )); $resultC = curl_exec($curlC); curl_close($curlC); $resultC = json_decode($resultC, 1); // $queryData = http_build_query(array( 'fields' => array( "TITLE" => $form_name . " - " . $name, "NAME" => $name, "LAST_NAME" => $surname, "SECOND_NAME" => $secname, "BIRTHDATE" => $birth, "STATUS_ID" => "NEW", "OPENED" => "Y", "SOURCE_ID" => $sourceId, "ASSIGNED_BY_ID" => 1, "COMMENTS" => $comments, "PHONE" => array(array("VALUE" => $phone, "VALUE_TYPE" => "WORK")/*,array("VALUE" => $phoneH, "VALUE_TYPE" => "HOME" )*/), "EMAIL" => array(array("VALUE" => $email, "VALUE_TYPE" => "WORK")), "IM" => array(array("VALUE" => $vk_id, "VALUE_TYPE" => "VK")), "ADDRESS_COUNTRY" => $country, "ADDRESS_CITY" => $city, "UTM_SOURCE" => $utm_source, "UTM_CONTENT" => $adid, 'CONTACT_ID' => ($resultC["result"]["CONTACT"][0]) ? $resultC["result"]["CONTACT"][0] : '', ), 'params' => array("REGISTER_SONET_EVENT" => "Y") )); $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_SSL_VERIFYPEER => 0, CURLOPT_POST => 1, CURLOPT_HEADER => 0, CURLOPT_RETURNTRANSFER => 1, CURLOPT_URL => $queryUrl, CURLOPT_POSTFIELDS => $queryData, )); $result = curl_exec($curl); curl_close($curl); $result = json_decode($result, 1); } break; break; } } ?> ``` ### Шаг 1. Данные из Битрикс24 1. Создайте входящий вебхук с правами на CRM. 2. Узнайте ID источника, с которым будут создаваться лиды (см. выше). 3. Внесите адрес вебхука и ID источника в блок настроек скрипта (`$url`, `$sourceId`). ### Шаг 2. Настройки в сообществе ВКонтакте 1. Откройте «Настройки» → «Работа с API». 2. Перейдите на вкладку Callback API. 3. Придумайте любой секретный ключ и сохраните его. 4. Скопируйте ключ в скрипт (`$secret`). 5. Скопируйте в скрипт значение «Строка, которую должен вернуть сервер» (`$confirmation_token`) и сохраните скрипт. 6. Разместите скрипт на сервере и укажите его адрес в поле «Адрес». Адрес должен начинаться с `https`. 7. Нажмите «Подтвердить». Если всё сделано правильно, появится зелёное сообщение об успехе. 8. На вкладке «Типы событий» в самом низу отметьте «Lead forms: Новая заявка». 9. Отправьте тестовую заявку через форму. ![Настройки Callback API сообщества ВКонтакте: цифрами отмечен порядок шагов — «Работа с API», вкладка Callback API, секретный ключ, строка для ответа сервера, адрес, кнопка «Подтвердить», вкладка «Типы событий»](./vk-callback-api.jpg) Готово: новые заявки из лид-форм сообщества будут приходить в Битрикс24 лидами. --- # Xerox B215 печатает мусор с Mac, а с iPhone — нормально > Квадраты и символы в начале листа и пачка лишних страниц при печати с Mac на Xerox B215 по Wi‑Fi. Почему так происходит и как заставить Mac печатать как iPhone. - Авторство: Текст: Claude (ИИ) · Редактура: Максим [ai] - Текст полностью написал Claude (ИИ). Максим отредактировал его и отвечает за публикацию. - Опубликовано: 2026-10-09 - Теги: macOS, принтеры, CUPS, вайбкодинг - Адрес: https://dgtor.blog/posts/xerox-b215-mac-printing/ Симптом: с iPhone документ печатается на одном листе, как надо. Тот же документ с Mac выходит с квадратами и непонятными символами в начале страницы, а вместо одного листа принтер выдаёт целую пачку. Ни принтер, ни macOS при этом никакой ошибки не показывают — проблема видна только на бумаге. Принтер — чёрно-белое МФУ Xerox B215, подключённое по Wi‑Fi. Мы с Максимом разобрали это в Claude Code: я выполнял команды в терминале и читал ответы принтера, Максим проверял результат на бумаге. Ниже — что оказалось причиной, как мы её нашли и как починить. ## Коротко Mac печатал через временный принтер, который macOS создаёт сама, когда видит устройство в сети. Такой принтер, судя по симптомам, отправлял B215 документ в PostScript, а встроенный интерпретатор PostScript у B215 печатал служебный код как текст. iPhone всегда шлёт растр AirPrint (`image/urf`), поэтому с него всё в порядке. Решение — добавить принтер вручную с небольшим файлом описания (PPD), который велит Mac тоже отправлять `image/urf`. После этого Mac печатает так же, как iPhone. ## Что было на этом Mac | Что | Значение | | ----------- | -------------------------------------------------------- | | Принтер | Xerox B215 Multifunction Printer, прошивка 88.000.69.000 | | Подключение | Wi‑Fi, обнаружение через Bonjour | | macOS | 27, CUPS 2.3.4 | | Драйвер | не установлен | ## Как искали причину ### Принтера в системе на самом деле нет ```bash lpstat -v lpstat -e ``` `lpstat -v` ответил «Нет добавленных назначений»: постоянных принтеров в системе нет. А `lpstat -e` показал очередь вида `Xerox_B215_<серийный-номер>_`. Значит, Mac печатает через временную очередь, которую создал сам по Bonjour, — без драйвера и без PPD-файла (папка `/etc/cups/ppd/` пустая). ### Что принтер говорит о себе Принтер сам сообщает в сеть, какие форматы понимает: ```bash dns-sd -B _ipp._tcp local. dns-sd -L "Xerox B215 (<серийный-номер>)" _ipp._tcp local. ``` И подробнее — прямым IPP-запросом: ```bash ipptool -tv ipp://<имя-принтера>.local:631/ipp/print get-printer-attributes.test ``` Главное в ответе: ```text document-format-default = image/urf document-format-preferred = image/urf document-format-supported = application/octet-stream,application/PCL,application/postscript,application/vnd.hp-PCL,application/vnd.hp-PCLXL,application/x-QPDL,text/plain,image/urf,application/PCLm ``` Принтер понимает PostScript, PCL и растры, а **предпочитает** `image/urf` — растр AirPrint, тот самый, что шлёт iPhone. PDF в списке нет. В отдельной строке Bonjour (`URF=…RS300…W8`) видно и параметры растра: 300 dpi, оттенки серого. Отсюда план: заставить Mac отправлять `image/urf`, как iPhone. ### Тупик: стандартный способ не сработал Для принтеров AirPrint в CUPS есть штатная команда — создать очередь IPP Everywhere, CUPS сам спросит у принтера возможности и сгенерирует PPD: ```bash lpadmin -p Xerox_B215 -E -v ipp://:631/ipp/print -m everywhere ``` На этом Mac она падала с ошибкой `lpadmin: Не удается создать PPD-файл: No such file or directory`. Почему — мы так и не установили. Если у вас эта команда проходит, дальше можно не читать: она решает ту же задачу без ручного PPD. ### Всё нужное в macOS уже есть ```bash ls /usr/libexec/cups/filter/ grep -h -iE 'urf|raster' /usr/share/cups/mime/apple.convs /usr/share/cups/mime/mime.convs ``` В системе есть фильтры `cgpdftoraster` и `rastertourf`, а в правилах преобразования — цепочка «PDF → растр URF». То есть macOS умеет готовить `image/urf` сама; нужен только PPD, который скажет CUPS: «этому принтеру отдавай URF». ## Решение ### 1. Файл описания принтера Сохраните текст ниже в файл `Xerox_B215_URF.ppd`. Главная строка — `*cupsFilter2: "image/urf image/urf 100 -"`: она говорит CUPS, что на выходе нужен только растр URF ([формат строки — в спецификации PPD у CUPS](https://openprinting.github.io/cups/doc/spec-ppd.html)). ```text file="Xerox_B215_URF.ppd" *PPD-Adobe: "4.3" *FormatVersion: "4.3" *FileVersion: "1.0" *LanguageVersion: English *LanguageEncoding: ISOLatin1 *PCFileName: "XRXB215U.PPD" *Manufacturer: "Xerox" *ModelName: "Xerox B215 Multifunction Printer" *Product: "(Xerox B215 Multifunction Printer)" *ShortNickName: "Xerox B215 URF" *NickName: "Xerox B215, AirPrint URF" *PSVersion: "(3010.000) 0" *LanguageLevel: "3" *ColorDevice: False *DefaultColorSpace: Gray *FileSystem: False *Throughput: "30" *LandscapeOrientation: Plus90 *TTRasterizer: Type42 *cupsVersion: 2.3 *cupsLanguages: "en" *APAirPrint: True *cupsFilter2: "image/urf image/urf 100 -" *cupsManualCopies: False *cupsSNMPSupplies: False *OpenUI *PageSize/Media Size: PickOne *OrderDependency: 10 AnySetup *PageSize *DefaultPageSize: A4 *PageSize A4/A4: "<>setpagedevice" *PageSize Letter/US Letter: "<>setpagedevice" *PageSize Legal/US Legal: "<>setpagedevice" *PageSize A5/A5: "<>setpagedevice" *PageSize Env10/Envelope #10: "<>setpagedevice" *PageSize EnvDL/Envelope DL: "<>setpagedevice" *CloseUI: *PageSize *OpenUI *PageRegion/Media Size: PickOne *OrderDependency: 10 AnySetup *PageRegion *DefaultPageRegion: A4 *PageRegion A4/A4: "<>setpagedevice" *PageRegion Letter/US Letter: "<>setpagedevice" *PageRegion Legal/US Legal: "<>setpagedevice" *PageRegion A5/A5: "<>setpagedevice" *PageRegion Env10/Envelope #10: "<>setpagedevice" *PageRegion EnvDL/Envelope DL: "<>setpagedevice" *CloseUI: *PageRegion *DefaultImageableArea: A4 *ImageableArea A4: "12 12 583 830" *ImageableArea Letter: "12 12 600 780" *ImageableArea Legal: "12 12 600 996" *ImageableArea A5: "12 12 408 583" *ImageableArea Env10: "12 12 285 672" *ImageableArea EnvDL: "12 12 300 612" *DefaultPaperDimension: A4 *PaperDimension A4: "595 842" *PaperDimension Letter: "612 792" *PaperDimension Legal: "612 1008" *PaperDimension A5: "420 595" *PaperDimension Env10: "297 684" *PaperDimension EnvDL: "312 624" *OpenUI *ColorModel/Color Mode: PickOne *OrderDependency: 10 AnySetup *ColorModel *DefaultColorModel: Gray *ColorModel Gray/Grayscale: "<>setpagedevice" *CloseUI: *ColorModel *OpenUI *cupsPrintQuality/Print Quality: PickOne *OrderDependency: 10 AnySetup *cupsPrintQuality *DefaultcupsPrintQuality: Normal *cupsPrintQuality Normal/Normal: "<>setpagedevice" *CloseUI: *cupsPrintQuality *DefaultResolution: 300dpi *OpenUI *Duplex/2-Sided Printing: PickOne *OrderDependency: 10 AnySetup *Duplex *DefaultDuplex: None *Duplex None/Off: "<>setpagedevice" *Duplex DuplexNoTumble/Long-Edge (Portrait): "<>setpagedevice" *Duplex DuplexTumble/Short-Edge (Landscape): "<>setpagedevice" *CloseUI: *Duplex *DefaultFont: Courier *% End of Xerox_B215_URF.ppd ``` Поля печати (`ImageableArea`, около 4 мм с каждой стороны) подобраны на глаз, с документацией Xerox мы их не сверяли. Если что-то обрезается у края — увеличьте числа. Проверьте файл: ```bash cupstestppd -W all Xerox_B215_URF.ppd ``` Должно быть `PASS`. ### 2. Добавьте принтер Имя принтера в сети покажет `dns-sd -B _ipp._tcp local.`, а хост для адреса — `dns-sd -L "<имя из первой команды>" _ipp._tcp local.` (вида `<что-то>.local`). Адрес по `.local`-имени, а не по IP, переживёт смену IP-адреса принтера. ```bash lpadmin -p Xerox_B215 -E \ -v ipp://<хост-принтера>.local:631/ipp/print \ -P Xerox_B215_URF.ppd \ -D "Xerox B215" -o printer-is-shared=false lpadmin -d Xerox_B215 ``` Вторая команда делает принтер основным. `lpadmin` предупредит, что драйверы принтера устарели и не будут поддерживаться следующими версиями CUPS, — очередь при этом создаётся. У Максима `sudo` не понадобился; если система откажет в правах, повторите команды с `sudo`. ### 3. Печатайте на «Xerox B215» Старый временный принтер удалить не получится: `lpadmin -x` ответит, что такого принтера нет. Это не установленный принтер, а устройство, которое Mac видит в сети, — оно и дальше будет в окне печати. Выбирайте **«Xerox B215»** без серийного номера в скобках. Отключать AirPrint на принтере ради этого не стоит: перестанет работать печать с iPhone. ## Как проверить ```bash lpstat -v -d grep cupsFilter2 /etc/cups/ppd/Xerox_B215.ppd ``` Должен быть принтер `Xerox_B215` с адресом `ipp://….local:631/ipp/print`, он же — по умолчанию, а в PPD — строка `*cupsFilter2: "image/urf image/urf 100 -"`. Тестовая страница: ```bash echo "Проверка печати" > test.txt cupsfilter -m application/pdf test.txt > test.pdf lp -d Xerox_B215 -o media=A4 test.pdf ``` У нас вышел один чистый лист, а следом и настоящий документ напечатался как надо. ## Ограничения и если сломается снова - **Только ч/б и 300 dpi.** Для B215 это норма, но печать фото на нём и так не задумана. - **Настройки переживают перезагрузку и смену IP** принтера: очередь хранится в `/etc/cups/printers.conf`, PPD — в `/etc/cups/ppd/`. - **Крупное обновление macOS может сбросить принтеры.** Признак — снова мусор в начале листа или в окне печати выбран не тот принтер. Держите PPD и команды из шага 2 под рукой: удобно сложить их в скрипт рядом с файлом. - **PPD-драйверы в CUPS устаревают** — об этом и предупреждает `lpadmin`. Когда их перестанут поддерживать, придётся искать другой путь. - **Запасной вариант** — официальный драйвер Xerox для B215 (PCL) со страницы поддержки модели. Мы его не ставили и совместимость с macOS 27 не проверяли. В базе знаний Xerox есть [общая статья о печати «тарабарщины» и ошибках PostScript](https://www.support.xerox.com/en-us/article/KB0326911) — там среди причин указан неподходящий драйвер. Принтер «по воздуху» с iPhone и Mac — ровно тот случай, когда один и тот же документ уходит на устройство двумя разными путями. Если с одного устройства печать нормальная, а с другого — мусор, первым делом стоит посмотреть, в каком формате каждое из них отправляет задание. --- # Что делать, если у вас украли облачный Битрикс24 > Тот, кому вы выдали права администратора, забрал у вас облачный Битрикс24. Что подготовить заказчику и как интегратору вернуть портал через техподдержку. - Авторство: Автор: Максим [human] - Текст написал Максим. ИИ исправил только опечатки и пунктуацию, смысл и стиль автора не менялись. - Опубликовано: 2024-10-29 - Теги: Битрикс24, безопасность - Адрес: https://dgtor.blog/posts/bitrix24-stolen-portal/ Под термином **«украли»** понимаем то, что вы были администратором в Битрикс24, выдали права админа третьему лицу — назовём это лицо Редиской. Редиска забрал у вас права администратора и отдавать права назад не хочет. Раздавать кому-то права админа плохо, об этом мы уже [писали](/posts/bitrix24-access-rights-security/). **Что может быть ещё из «приятного»:** - вас уволили с портала, и непонятно, что там происходит; - данные копируют; - данные удаляют; - настройки портала ломают. С копированием данных ничего сделать не получится, а вот остальное поправимо. Возврат займёт пару рабочих дней, наведение порядка — по факту. Если же вы дали свою учётную запись Редиске и доступы до почты, то эта статья вам не поможет! ## Дисклеймер Такие истории возникают, как правило, при споре хозяйствующих субъектов. Портал используется для шантажа. Работа компании встаёт. Я осуждаю такие методы решения споров, так как страдают от этого в большей части сотрудники и клиенты. Решайте, пожалуйста, свои споры цивилизованно. ## Решаем задачу Вдох-выдох, действуем по схеме. Идём к своему Интегратору, если такового **нет**, то пишем нам в [ТГ](https://t.me/dgtor_bot). Далее действовать Интегратору. ### Ваша часть (Заказчика) - Кратко описать ситуацию: почему такое случилось, когда; - адрес Битрикс24, к которому потеряли доступ; - электронная почта, по которой вы авторизовывались в Битрикс24 и были админом, своё название на портале и своё ФИО; - электронная почта Редиски, у кого будем забирать доступ; - документы ЮЛ, на кого был портал (ООО или ИП); - крайняя платёжка от вас за Битрикс24; если оплачивали через карту, то данные о платеже; если есть, то закрывающие документы об оплате; - заявление на возврат. ### Что делать Интегратору - Пишем в ТП со своего портала. В сообщении — адрес портала, описываем произошедшее: кто потерял портал, кто захватил портал. Дожидаемся ответа ТП, вас должны перевести на вторую линию со стандартной формулировкой «ПН–ПТ с 10 до 19». - Берём номер заявки и идём в партнёрский кабинет. Там от себя пишем всё то же самое и просим ускорить решение. Там вам зарегистрируют дополнительный тикет. - Звоним в Битрикс24 по общему номеру 8 495 225-13-68, там в ТП повторяем, ссылаемся на тикеты обоих обращений, просим скорейшей помощи. - Ждём на своём портале ответа от второй линии ТП… - Для второй линии вам потребуются все данные от Заказчика, кроме истории потери. Готовим ответ, подкрепляем документами. - Ждём запроса Заявления (если проходит больше 1 дня, то звоним в ТП). - Отправляем Заявление и ждём его принятия. - Вам напишут, что Заявление проверяется Юристами, и если всё ОК, то портал вернут. ![Лента портала после возврата: техподдержка исключила права администратора у захватившего портал и добавила их законному администратору](./portal-returned.png) Результат. --- # Получение источника через вебхук в Битрикс24 > Как через вебхук и метод crm.status.list узнать код источника (SOURCE_ID) в Битрикс24, чтобы заявки с сайта приходили в CRM с правильным источником. - Авторство: Автор: Максим [human] - Текст написал Максим. ИИ исправил только опечатки и пунктуацию, смысл и стиль автора не менялись. - Опубликовано: 2024-10-24 - Теги: Битрикс24, вебхуки, REST API - Адрес: https://dgtor.blog/posts/webhook-lead-source-id/ ## Нам потребуется - Вебхук с правами на CRM (можно от [лидогенератора](https://dzen.ru/a/Zsb_dyH0piSe2Pn3)). - Firefox (можно любой другой браузер, декодирующий JSON). ## Выполняем Берём хук и дописываем к нему код: ```text https://<портал>.bitrix24.ru/rest//<код вебхука>/crm.status.list?filter[ENTITY_ID]=SOURCE ``` - `https://<портал>.bitrix24.ru/rest//<код вебхука>/` — webhook; - `crm.status.list?filter[ENTITY_ID]=SOURCE` — метод и фильтр по источникам. Открываем хук в браузере и получаем примерно такую картину: ![Ответ crm.status.list в Firefox: у источника «Обратный звонок» STATUS_ID равен CALLBACK](./source-list.png) Пример полученных данных. По полю `NAME` находим нужное название. Значение поля `STATUS_ID` используем в коде для отправки форм. (В нашем примере это `"CALLBACK"`.) ![PHP-код отправки формы методом crmLeadAdd: в поле SOURCE_ID передаётся значение CALLBACK](./source-id-in-form.png) Пример применения `SOURCE_ID` в коде отправки формы. --- # Как исключить заявки из CRM Битрикс24 > Поставщик заявок спросил, как клиентам отсеивать неподходящие заявки в Битрикс24. Самый простой способ — роботы, которые удаляют сделку и контакт по условию. - Авторство: Автор: Максим [human] - Текст написал Максим. ИИ исправил только опечатки и пунктуацию, смысл и стиль автора не менялись. - Опубликовано: 2024-10-14 - Теги: Битрикс24, лидогенерация - Адрес: https://dgtor.blog/posts/auto-delete-unqualified-leads/ К нам обратился поставщик заявок на БФЛ [ФиксГрупп](https://fixgroup.me/?utm_source=dgtor) с вопросом: «Как нашим клиентам исключить заявки, которые не соответствуют тем или иным критериям, из Битрикс24.CRM?» Самый простой способ исключения — это удаление заявки по условию. ## Полезная документация - [Роботы в CRM](https://helpdesk.bitrix24.ru/open/24367166/) - [Как работают условия в Битрикс24](https://helpdesk.bitrix24.ru/open/21491832/) ## Режимы работы CRM в Битрикс24 - Простая CRM — это когда нет лидов, а заявка создаёт Сделку + Контакт. Тогда нужно будет сначала удалить связанный со сделкой контакт, а потом саму сделку. - Классическая CRM — это когда заявка создаёт лид. Тогда нужно удалять по условию лид. > Для «Простой CRM» выполните все шаги, для «Классической CRM» выполняйте шаги 1, 3 и 4 (шаг 2 вам не нужен, так как нет Контакта, а вместо Сделки у вас Лид). ## Выполняем настройки ### Шаг 1. Получаем данные для условий Выделяем источник и условия отбраковки. В нашем примере Источник = ФиксГрупп. А условия отбраковки — «Ответ: до 200 000 руб.» и «Ответ: да, есть ипотека или автокредит». Сохраните эту информацию в заметку, так как она нам понадобится на следующем шаге. ![Карточка тестовой сделки: в поле «Комментарий» ответы на вопросы формы, подчёркнуты «до 200 000 руб.» и «да, есть ипотека или автокредит»](./step-1-conditions.jpg) Получаем условия из дополнительных данных по заявке. Они, как правило, будут в поле «Комментарий». ### Шаг 2. Добавляем первого робота «Удаление элемента CRM» Так как используется простой режим работы CRM, то кроме сделки будет создаваться Контакт. Таким образом, нужно удалять и его. Притом сначала удаляется Контакт, привязанный к Сделке, а только потом сама Сделка. ![Канбан сделок, стрелкой показана кнопка «Роботы» в правом верхнем углу](./step-2-delete-contact.jpg) Открываем «Роботы». ### Шаг 3. Добавляем второго робота «Удалить элемент» После удаления Контакта можно удалить Сделку. Для этого будем использовать робота «Удалить элемент». Условия делаем аналогичными, как и при удалении Контакта. Также важно задать последовательность выполнения роботов. ![Окно добавления робота: в поиске набрано «Удалить», выделен робот «Удалить элемент»](./step-3-delete-element.jpg) В добавлении роботов по слову «Удалить» находим робот «Удалить элемент». ### Шаг 4. Тестируем Перед запуском обязательно протестируйте созданную автоматизацию. Удалённые элементы (Контакты и Сделки) будут 30 дней храниться в Корзине CRM. CRM → Корзина, сортировка по «Время удаления». ![Корзина CRM: тестовые контакт «Фикс Тест» и сделка «Тестовая ФиксГрупп» удалены роботами в 17:00](./step-4-recycle-bin.jpg) Приятного использования! --- # Кликабельная ссылка в BI-конструкторе Битрикс24 > Как в BI-конструкторе Битрикс24 сделать таблицу, где название лида — ссылка на его карточку в новой вкладке: одна запись в SELECT на этапе SQL Lab. - Авторство: Автор: Максим [human] - Текст написал Максим. ИИ исправил только опечатки и пунктуацию, смысл и стиль автора не менялись. - Опубликовано: 2024-10-07 - Теги: Битрикс24, BI-конструктор - Адрес: https://dgtor.blog/posts/bi-clickable-link/ Заказчик хочет чарт в виде таблицы по лидам, да такой, чтобы, кликнув на лид, он открылся в новой вкладке. Знакомо? Вместо лида может быть сделка, контакт, компания, счёт или любой другой элемент Битрикс24. ![Таблица «Контроль» в BI-конструкторе: названия лидов в первом столбце — ссылки, рядом срок жизни лида, количество касаний и флаг «Выполнил»/«Не выполнил»](./lead-link-table.png) Пример таблицы, где название лида является ссылкой. Данный способ мне показала коллега Ольга, за что ей благодарность. Кликабельные ссылки создаём на этапе виртуального датасета в SQL Lab. В `SELECT` нужна похожая запись: ```sql CONCAT('', ls.title, '') AS "Лид", ``` где: - `CONCAT` — объединение; - `{{portal_url()}}` — переменная, которая всегда будет давать адрес портала; - `'/crm/lead/details/'` — путь до элемента; - `CAST` — преобразуй данные; - `ls.id` — id лида, но так как подключал датасет `lead_status`, то выглядит как `ls.id`; - `AS VARCHAR` — преобразуй в строку; - `target="_blank"` — показывает, что нужно открыть в новой вкладке; - `', ls.title, '` — название ссылки, в нашем случае равно названию лида; - `AS "Лид"` — как назвать столбец. --- # Звонок в Telegram из Битрикс24 через SIP.TG > SIP.TG позволяет звонить клиентам в Telegram прямо из Битрикс24 с записью, роботами и статистикой. Что умеет, как подключить через SIP-коннектор и ограничения. - Авторство: Автор: Максим [human] - Текст написал Максим. ИИ исправил только опечатки и пунктуацию, смысл и стиль автора не менялись. - Опубликовано: 2024-10-05 - Теги: Битрикс24, телефония - Адрес: https://dgtor.blog/posts/sip-tg-telegram-calls/ ## Что такое SIP.TG? Есть обычный Телеграм, который зарегистрирован на СИМ-карту. С этого номера можно через приложение ТГ делать аудио- и видеозвонки. Подключаем сервис SIP.TG и можем делать аудиозвонки с любой виртуальной АТС (например, Битрикс24, Манго, ВАТС Мегафон, ЮИС и т. п.), как с приложения ТГ. Все радости виртуальной АТС при этом сохраняются: запись звонка, многоканальность, маршрутизация и статистика. **SIP.TG — ограниченно применимый инструмент с гарантированным ВАУ-эффектом.** ## SIP.TG в Битрикс24 - SIP.TG выглядит как обычный номер, подключённый через SIP-коннектор, и имеет все те же настройки; - поддерживает исходящие и входящие звонки: если клиент перезвонит на ТГ, то звонок придёт в Б24; - запись звонка сохраняется в карточку, можно прослушать и транскрибировать; - отрабатывают роботы и триггеры телефонии; - доступна статистика. [Видео: Звонок в Telegram из Битрикс24 с использованием префиксов](https://vkvideo.ru/video-170024218_456239225) ![Детализация звонков Битрикс24: входящий и два исходящих звонка через номер SIP.TG](./call-details.png) Пример в детализации. Исходящие и входящие. ## Настройка SIP.TG - Регистрируйтесь в боте с телефона, с которого будут звонки ([документация тут](https://www.sip.tg/en/docs/gateway/pbx)); - получаете логин, пароль и сервер; - выполняете настройку [SIP-коннектора](https://helpdesk.bitrix24.ru/open/6534609/); - тестируете; - оплачиваем Коннектор (так как вам нужны исходящие звонки) и SIP.TG (если планируем много использовать); - готово! ![Бот SIP.TG, экран «Настройки аккаунта PBX→SIP.TG»: логин, пароль и сервер sip.tg для подключения шлюза к АТС](./sip-tg-pbx.png) В SIP.TG выбираем PBX → SIP.TG. ## Ограничения - Звонить можно либо своим контактам, либо тем, у кого открыт номер и разрешены звонки с неизвестных (стандартные ограничения ТГ); - избаловаться не получится, за спам вас забанят. ## Ещё видео о SIP.TG [Видео: Звонок из Битрикс24 в Telegram и обратно](https://vkvideo.ru/video-170024218_456239226) [Видео: Оплата SIP.TG](https://vkvideo.ru/video-170024218_456239227) [Видео: Устранение ошибки «Данное направление недоступно» в Битрикс24](https://vkvideo.ru/video-170024218_456239228) [Видео: Обучающая задача: постановка, выполнение и контроль](https://vkvideo.ru/video-170024218_456239229) --- # Коллтрекинг в Битрикс24 > Коллтрекинг подменяет номер на сайте или в рекламе, чтобы понять, откуда пришла заявка. Пример из практики: конверсия Яндекс Директа выросла с 6 до 9%. - Авторство: Автор: Максим [human] - Текст написал Максим. ИИ исправил только опечатки и пунктуацию, смысл и стиль автора не менялись. - Опубликовано: 2024-09-30 - Теги: Битрикс24, телефония - Адрес: https://dgtor.blog/posts/bitrix24-call-tracking/ Коллтрекинг — это подмена номера на сайте/рекламе/в социальной сети с целью узнать, откуда пришла заявка. И как следствие — определить лучший канал привлечения. ![Схема статического коллтрекинга: у каждого рекламного источника — Яндекс, ТВ, Google, радио — свой виртуальный номер, и видно, сколько звонков пришло с каждого](./calltracking.jpg) Приведу пример из практики. У заказчика была запущена реклама в Яндекс Директ, и вела она на одностраничный сайт. На сайте был установлен общий номер телефона компании. По итогу первого месяца конверсия с этого источника была 6%, что было ниже средней конверсии в 8%. Была предложена и впоследствии реализована установка подменного номера на этот одностраничник (коллтрекинг) с привязкой к источнику. В результате было выявлено, что 10% заявок приходили через звонок, причём эти заявки горячее, чем через форму. Таким образом, конверсия источника после установки коллтрекинга стала 9%, что в 1,5 раза больше первоначальной и выше средней. Маркетологом заказчика было принято решение об увеличении бюджетов Яндекс Директ. Существуют два типа коллтрекинга: - **Динамический** — каждый посетитель сайта видит уникальный номер телефона. Система коллтрекинга производит такую подмену автоматически. Данный тип используют, чтобы в рамках рекламной кампании понять, какое объявление лучше работает. Оценка эффективности производится в сторонних сервисах, например Roistat. - **Статический** — подменный номер назначается вручную на источник из арендованных ранее. Пример: Яндекс Директ — 8 (495) 888-00-11, ВКонтакте — 8 (495) 888-00-22, Авито — 8 (495) 888-00-33. Данный тип используют, чтобы понять, какой источник заявок лучше в целом. Подходит для малого и среднего бизнеса. Оценка эффективности производится во встроенных отчётах Битрикс24. Подробнее про коллтрекинг в Битрикс24 можно почитать [тут](https://helpdesk.bitrix24.ru/open/8728915/?p=6745209). --- # Подключение Билайн к Битрикс24 через SIP-коннектор > SIP-коннектор Битрикс24 не подключался к номеру Билайн: ошибки 500 Unauthorized и 403 Forbidden. Какие необязательные поля нужно заполнить, чтобы заработало. - Авторство: Автор: Максим [human] - Текст написал Максим. ИИ исправил только опечатки и пунктуацию, смысл и стиль автора не менялись. - Опубликовано: 2024-09-12 - Теги: Битрикс24, телефония - Адрес: https://dgtor.blog/posts/beeline-sip-connector/ ## Зачем мучения В качестве АТС используется Битрикс24. Это удобно в работе и эксплуатации. Звонки хранятся на стороне Б24, работает вся автоматизация по CRM. Нужно сделать так, чтобы сотрудники могли звонить с определённого многоканального номера Билайн. Дано: - Битрикс24 облако; - номер Билайн с доступами по SIP; - оплаченный SIP-коннектор; - наставления заказчика (ТЗ). ### Пример доступов от Билайн ```text SIP User ID: SIP<логин> Domain: ip.beeline.ru Authorization User ID: SIP<логин>@ip.beeline.ru SIP proxy: ip.beeline.ru Пароль: <пароль> ``` ## Попытка подключения 1–10 Вводим данные от Билайна как обычно в SIP-коннектор и получаем следующий набор ошибок: - Ошибка 500 (status=171111) Unauthorized - Ошибка 403 Forbidden Документации по настройке нет, вертим данные и так и сяк. Далее пробуем подключиться через софтфон к Билайну — получается. Значит, дело на стороне коннектора. Продолжаем перебор настроек. ## Попытка 101 ![Настройки SIP-коннектора Битрикс24 со статусом «Подключено»: адрес сервера ip.beeline.ru, логин SIP, имя пользователя для авторизации вида SIP-логин@ip.beeline.ru, прокси-сервер ip.beeline.ru](./sip-connector-settings.jpg) Ларчик просто открывался. Важно правильно заполнить оба необязательных поля, тогда подключение будет работать. --- # Карусель номеров в Битрикс24 > Карусель номеров повышает дозвон до лидов в колл-центре. Как она работает с Битрикс24 через SIP-коннектор у МТТ и Билайна и ответы на частые вопросы. - Авторство: Автор: Максим [human] - Текст написал Максим. ИИ исправил только опечатки и пунктуацию, смысл и стиль автора не менялись. - Опубликовано: 2024-08-30 - Теги: Битрикс24, телефония - Адрес: https://dgtor.blog/posts/bitrix24-number-carousel/ Карусель номеров — инструмент для увеличения конверсии в установление коммуникации (дозвон) с лидом. Применяется в бизнесах, использующих колл-центр для первичной обработки заявок. Представляет собой пакет номеров (50, 100 и более), с которых по алгоритму Карусели будут осуществляться исходящие вызовы. Во встроенной телефонии Битрикс24 нет опции Карусели, поэтому используются Карусели от следующих операторов: - МТТ - Билайн ## Схема работы ![Схема: сотрудник → АТС Битрикс24 → SIP-коннектор → SIP оператора → один из номеров пакета (Номер 1, 2, 3…) → клиент](./carousel-scheme.png) Схема работы Карусели номеров. ### Исходящий вызов Сотрудник в Битрикс24 инициирует исходящий вызов через номер Карусели (как через обычный номер). Далее АТС Битрикс24 через SIP-коннектор соединяется с Оператором, где по алгоритму Карусели происходит выбор номера, с которого будет происходить звонок. Выполняется вызов. Клиент увидит один из номеров Карусели. Важно заметить, что при последующих исходящих вызовах номер также будет выбираться из Карусели, т. е. нет возможности, если вы дозвонились с номера «А», чтобы все остальные звонки были тоже с номера «А». ### Входящий вызов Клиент инициирует вызов на любой номер из Карусели, оператор маршрутизирует его на SIP-коннектор. Далее по алгоритму АТС Битрикс24 вызов распределяется на сотрудника. ## Основные вопросы ### Будет ли запись звонка? Да, запись будет в Битрикс24, как и при стандартной телефонии. ### Если на номер Карусели позвонит существующий клиент, за которым закреплён сотрудник, то звонок попадёт к этому сотруднику? Всё зависит от настроек маршрутизации в Битрикс24: Карусель для Битрикс24 выглядит как обычный номер. ### На каких тарифах доступна Карусель номеров? На любом платном тарифе Битрикс24, потребуется купить SIP-коннектор. ### Если я буду делать двойной звонок (клиент трубку не взял, и я сразу выполняю повторный вызов), то номер для клиента будет тот же, что и при первоначальном наборе? Нет, каждый исходящий вызов происходит со случайного номера из Карусели. --- # Как защитить свои заявки от парсинга номеров в БФЛ > С 2023 года у компаний по банкротству физлиц уводят заявки парсингом номеров. Как работает парсинг, как проверить, что парсят вас, и шесть способов защиты. - Авторство: Автор: Максим [human] - Текст написал Максим. ИИ исправил только опечатки и пунктуацию, смысл и стиль автора не менялись. - Опубликовано: 2024-08-21 - Теги: Битрикс24, безопасность, БФЛ - Адрес: https://dgtor.blog/posts/bfl-lead-parsing-protection/ С 2023 года мы, как интеграторы Битрикс24 по БФЛ, заметили увеличение обращений, связанных с утечкой заявок. Поиск источников утечек выявил использование новой ~~старой~~ технологии парсинга номеров. ## Содержание 1. Как работает технология 2. Метод обнаружения 3. Технологии защиты ## Как работает технология Парсинг номеров пришёл в БФЛ из отрасли недвижимости, где компании уже несколько лет сталкиваются с этой проблемой. Из-за роста стоимости заявок в БФЛ парсинг стал экономически выгодным и, вероятно, останется надолго. Подрядчик по парсингу находит все ваши номера и настраивает на них мониторинг. Все исходящие и входящие звонки с найденных ваших номеров на номера клиентов фиксируются и анализируются. **Порядок работы:** 1. Вам поступает заявка. 2. Вы делаете по ней звонок. 3. Через 24 часа конкурент звонит по этому же номеру. 4. Заявка перехватывается. ## Метод обнаружения Чтобы точно определить, что вашу компанию парсят, необходимо исключить другие методы утечки. Для этого проводим **чистый тест:** 1. Закупаем новые сим-карты. 2. Отключаем в телефонии создание заявок в Битрикс24. 3. Выполняем входящие звонки с сим-карт на номера, строго один номер — одна сим-карта, и разговариваем минимум 3 минуты. 4. Ждём 24–48 часов. 5. Если вам перезванивают конкуренты — поздравляем, вас парсят. Если нет, ищем другие источники утечки. ## Технологии защиты 1. **Смена номеров.** Поможет временно защититься от слабых подрядчиков. Чем слабее подрядчик, тем дольше для него будет неизвестен ваш новый номер. Стоимость равна смене номера. 2. **Использование карусели номеров.** Существенно дороже, чем смена номера, но поможет снизить парсинг. Однако полностью не защитит. Карусель меняем раз в 2–4 недели. Минусом будет снижение конверсии в дозвон. Стоимость от 50 тыс. руб. на смену карусели. 3. **Использование машины подстановки уникальных номеров для каждой заявки.** Дороже карусели в несколько раз. От 600 т. р. разово и от 75 т. р. ежемесячно. Существенно усложнит жизнь подрядчику по парсингу, но полностью не закроет слив. Тут на каждую заявку будет выдаваться уникальный номер телефона для исходящих. Пока заявка в работе, уникальный номер закреплён за ней, вход/исход идёт на него. После закрытия заявки номер может использоваться повторно. 4. **Закрывать заявку в 24 часа.** Работа с КЦ и ОП. КЦ затачиваем на работу с новыми заявками, применяем все возможные методы установления связи. Сразу передаём квал заявки в ОП, консультация СЕГОДНЯ! Да, если клиент может в 10 вечера, значит, ОП проводит консультацию в 10 вечера. (Господин Черкашов не раз говорил об этом в своих выступлениях.) 5. **Программирование клиента.** _Внимание! Данный способ работает в вашу пользу только при наличии высокого уровня доверия к вашей компании. Если вы над медийностью и доверием не работали, то метод сработает против вас._ Если заявка в 24 часа не закрыта, то программируем клиента на то, что ему позвонят «РЕДИСКИ». Цель «РЕДИСОК» — обмануть, завладеть деньгами и не выполнить условия. Можно даже назвать, какие компании будут им звонить. Мол, способ получения номера нечестный, как таким доверять? Отзывы у них купленные. А что с безопасностью, так это вопрос к операторам связи, они торгуют вашими данными, и мы не можем защитить вас от этого беспредела. 6. **Переход на тёмную сторону силы.** Коль рынок становится таким, то «с волками жить — по-волчьи выть». ## Выводы 1. **Парсинг — надолго.** Единственное, что может его закрыть, — изменение в законодательстве. 2. **Любая проблема — возможность.** В первую очередь возможность прокачать свой КЦ и ОП, чтобы сократить цикл сделки в разы и увеличить скорость денежного потока. 3. **Работайте над медийностью и доверием.** Инвестиции в контент и доверие — долгие деньги, которые окупятся сторицей. Яркий пример тут Наталья Катряева: попробуйте предложить что-то её заявкам, вам дадут карту и посыл :) ### Обновление от 07.10.2024 **Вас будут парсить, пока экономика бьётся!** Работайте в первую очередь над снижением цикла продажи и во вторую — над доверием к компании. Тогда экономика парсинга сломается, и о вас забудут. --- # Какой телефон или гарнитуру выбрать для звонков в Битрикс24 > Гарнитура или трубка для звонков из Битрикс24: какие модели Jabra, Logitech, Gigaset и Yealink взять и можно ли принимать звонки в мобильном приложении. - Авторство: Автор: Максим [human] - Текст написал Максим. ИИ исправил только опечатки и пунктуацию, смысл и стиль автора не менялись. - Опубликовано: 2024-08-19 - Теги: Битрикс24, телефония - Адрес: https://dgtor.blog/posts/bitrix24-call-headset/ ## Гарнитура или телефон (трубка)? При выборе типа устройства для приёма звонков сотрудником опираемся на то, чем он(а) занимается. - Колл-центр, обработка входящих, поддержка или есть видеозвонки — выбираем **гарнитуру (наушники с микрофоном)**. - В других случаях — **телефонная трубка**. ## Гарнитуры - Jabra — профессиональное оборудование: дорого, надёжно, отличный звук на запись и воспроизведение, эргономично и ликвидно. Сам использую модель [Jabra Evolve 20 MS Stereo](https://www.ozon.ru/category/elektronika-15500/jabra-26303212/?text=jabra+evolve+20+ms+stereo). - Logitech — фирма давно на рынке и зарекомендовала себя высокой надёжностью. Для сотрудника, работающего удалённо, — [Logitech G435 LIGHTSPEED](https://www.ozon.ru/category/elektronika-15500/?text=logitech+g435+lightspeed). ![Проводная стереогарнитура Jabra Evolve 20 MS Stereo с микрофоном на штанге](./jabra-evolve-20.jpg) Jabra Evolve 20 MS Stereo. ## Телефоны Я приверженец только одной марки — Gigaset. Очень надёжные, лёгкие в настройке и ликвидные, можно покупать б/у. Отличная модель [Gigaset Comfort 550A IP](https://www.citilink.ru/product/telefon-ip-gigaset-comfort-550a-ip-flex-rus-chernyi-s30852-h3031-s304-1876276/) — на базовую станцию можно докупить несколько трубок. На август 2024 года почти нет в продаже, а то, что есть, дороже былой цены в 2–3 раза. Либо смотрите устройства б/у, либо Yealink — да, китаец, но профессиональное оборудование. Отличная модель радиотелефона с базовой станцией — [Yealink W73P](https://www.ozon.ru/category/dect-telefony-15504/yealink-72356690/?text=Yealink+W73P). ![IP-телефон Gigaset Comfort 550A IP: базовая станция и беспроводная трубка с цветным экраном](./gigaset-comfort-550a.jpg) Gigaset Comfort 550A IP. ## А можно ли звонить из приложения Битрикс24 для Android или iPhone? Исходящие звонки делать можно. Качество связи будет нормальное, запись сохранится в карточку. А вот на входящие рассчитывать не стоит. Дело в том, что смартфон — умное устройство и экономит свою батарею: «усыпляет» приложения, которые в данный момент не используются. Звонок может до вас не дойти или прийти с существенной задержкой. ![Карточка сделки в мобильном приложении Битрикс24: по нажатию на номер клиента открывается меню с пунктом «Позвонить через Bitrix24»](./mobile-app.jpg) ## Вывод Сложности в выборе нет. Экономить на оборудовании не стоит, так как хороший голос хорошо продаёт. Нет денег на новые трубки — купи б/у. --- # Смарт-процесс как безопасная прокладка в Битрикс24 > Как принять результаты внешнего сервиса прозвона в Битрикс24 без входящего вебхука: смарт-процесс-«Перемещатель» и бизнес-процесс, который двигает лиды. - Авторство: Автор: Максим [human] - Текст написал Максим. ИИ исправил только опечатки и пунктуацию, смысл и стиль автора не менялись. - Опубликовано: 2024-08-05 - Теги: Битрикс24, безопасность - Адрес: https://dgtor.blog/posts/smart-process-as-proxy/ От заказчика получено задание: нужно в сервис по прозвону отправлять заявки через API, после чего сервис будет по API возвращать результат. Отправлять данные хуком на сервис достаточно просто и для нас безопасно. А вот обратно, если дадим вебхук от Битрикс24, то получаем дыру в безопасности размером со вселенную. Какие есть варианты? - Написать промежуточный скрипт. Но тут те же яйки, только в профиль. Хук с опасными правами будем хранить на своей стороне. Отказ. - Сделать CRM-форму в Б24, на которую по API с сервиса будет идти отправка данных. Достаточно номера телефона, в настройках формы будем объединять дубликаты. А на нужную стадию поставим триггер на заполнение формы. Выполняем. Выполнил настройку, протестировали на лиде с уникальным номером в рабочем статусе — всё отрабатывает, как и задумано. Перешли к тестам на неуникальных номерах (дубли) — стал перемещать случайные лиды, не тот лид, по которому был звонок, а любой другой с тем же номером. Потренировали на браке — полное фиаско: лид как был в браке, так и остаётся, а в CRM создаётся новый лид. Что делать? Писать обработчик… и тут вспомнил идею Максима Белого про использование смарт-процесса как прокладки между CRM и внешним сервисом. Создал СП «Перемещатель» вида Список с включёнными бизнес-процессами и с одним дополнительным полем «Тип действия» типа Строка (чтобы было проще). > Вообще частая история, когда вначале приходит одно ТЗ «Все успешные будем перемещать в точку Х», а через неделю апгрейд «Неуспешные в Y», и ещё через два дня «Хорошо бы Y делить на Z и G и… по тем, что в Х, ставить задачу». В название СП будем передавать ID лида, в поле «Тип действия» W — для успешных, L — для брака и что ещё душе угодно для других статусов. ![Форма создания элемента смарт-процесса «Перемещатель» с двумя полями: «Название» и «Тип действия»](./sp-element-form.png) Форма создания элемента в СП. Далее используем БП, срабатывающий на создание. ![Бизнес-процесс «Исполнитель» на смарт-процессе: по результату ветка «Успех» запускает «Дозвонились», ветка «Провал» — «В ТоталБрак», затем пауза в один день и удаление элемента](./sp-bp-executor.png) БП «Исполнитель» на СП, работает на создание. Элементы СП удаляю через сутки для чистоты Б24. Который будет запускать БП на лиде. ![Бизнес-процесс на лиде: в ветке «Дозвонились» сначала ставится задача «Связаться», потом статус меняется на «Дозвонились»](./lead-bp.png) Тут всё просто: ставим задачу и меняем статус. Всегда в такой последовательности, иначе статус поменяется, БП умрёт, задачу мы не получим. Тестим, работает. Перекрестим — пусть приносит деньги заказчику, а мне очередная статуэтка «Костыль недели». --- # Как поставщикам заявок отслеживать их статус в Битрикс24 клиента > Три способа для поставщика заявок узнать, что стало с лидами в Битрикс24 клиента: роль «наблюдателя», выгрузка через вебхук и исходящий вебхук с портала. - Авторство: Автор: Максим [human] - Текст написал Максим. ИИ исправил только опечатки и пунктуацию, смысл и стиль автора не менялись. - Опубликовано: 2024-06-29 - Теги: Битрикс24, вебхуки, лидогенерация - Адрес: https://dgtor.blog/posts/lead-supplier-status-tracking/ Вопрос может интересовать только хороших поставщиков, плохим всё равно, что там происходит с результатами их трудов. ## Три способа 1. Заходить в Битрикс24 клиента как сотрудник; 2. через хук выгружать статусы с портала клиента; 3. через отправку хука получать себе изменения статусов заявок. Теперь подробно. ## Смотреть как сотрудник 1. Создаётся в Битрикс24 в настройках прав роль «Блюдитель» с доступом только на ЧТЕНИЕ СВОИХ лидов, сделок и контактов. Остальное закрываем. Проверяем, чтобы не было «Все сотрудники» = какие-то права. А то ваша настройка работать не будет. 2. Создаётся отдел «Блюдители» в структуре компании. На этот отдел назначаются права «Блюдитель». 3. Приглашается поставщик заявок как сотрудник и помещается в структуре компании в отдел «Блюдители» (далее по тексту Б). 4. Делается автоматизация в CRM, когда по источнику поставщика заявок в поле «Наблюдатель» добавляется Б. Можно умным сценарием применить к предыдущим лидам/сделкам/контактам. 5. Всё! Б теперь будет видеть только те элементы, где он как Наблюдатель. Изменить что-то в них он не может, только смотрит. - **+** Можно отследить всё взаимодействие между сотрудниками и заявкой и дать рекомендации по обработке. - **−** Трудно получить общую статистику, потребуется отдельный человек, чтобы наблюдать за порталами. - **−** Блюдитель видит структуру компании, сотрудников, общий чат, новости. Приглашайте только тех, кому доверяете. ## Выгружаем статусы с портала через вебхук Чтобы использовать этот способ, требуется передавать заявки на портал клиента либо через вебхук с правами на чтение, либо через приложение. Используется метод `crm.<сущность>.list`. С помощью него с некой периодичностью (например, 2 раза в день) обращаются к порталу клиента, забирают оттуда свои элементы по фильтру. И эту информацию разбирают. Так можно получить не только статус (что сейчас с заявкой), но и какие действия с ней происходили. - **+** Много полезной информации можно получить, что делать — вы знаете; - **−** в Битрикс24 успех не всегда может быть успехом, придётся под каждого клиента делать свою сравнительную таблицу; - **−** опасно выдавать вам такой доступ, так как вебхук может быть сворован, и кто-то нехороший воспользуется «+»-ом. Подробно этот способ разбирать не считаю нужным. ## Получение статусов через отправку хука с портала клиента Если у вас есть своя CRM или другая учётная система, с которой идёт отправка заявок в порталы клиента, то, кроме Имени, Телефона, Источника и «Ответов на вопросы формы», в поле [SOURCE_DESCRIPTION](https://apidocs.bitrix24.ru/api-reference/crm/leads/crm-lead-fields.html) (есть в Лидах и Сделках) передаёте ID заявки из своей учётной системы. Далее вам нужно сделать некий обработчик (скрипт), в который со стороны портала клиента будет отправляться хук. Хук будет в себе содержать ID заявки в вашей учётной системе и статус (например: выигран, проигран, брак, дозвонились). Таким образом скрипт сможет менять по ID статус заявки в вашей учётной системе. Скрипт размещаете на хостинге, обязательно с сертификатом SSL. Проводите настройку на стороне клиента. Первым делом показать, что НИКАКИХ ЛИШНИХ ДАННЫХ эта штука не забирает. Далее говорим о важных для себя статусах заявки и спрашиваем с клиента: «А в каком столбике (статусе/стадии) вы такие заявки храните?». После ставим на эти статусы автоматизацию «Исходящий вебхук». Пример настройки: ```text Условие: "Источник" = "Ваш Источник" и "Дополнительно об источнике" = "Заполнено" Хендлер: https://вашхостинг.ру/вашобработчик.php?id={{Дополнительно об источнике}}&status=win ``` Вам придёт: ```text https://вашхостинг.ру/вашобработчик.php?id=1234&status=win ``` Где `1234` — ID заявки в вашей учётной системе, `win` — экстремально положительный статус её обработки. ## Итого Идеальным считаю совмещение способов 3 и 1. С одной стороны, вы всегда получаете актуальную информацию о статусе своих заявок. С другой, если что-то идёт не как у всех, имеете возможность зайти на портал и посмотреть глубже, «что особенного». --- # Вычисление возраста в BI-конструкторе Битрикс24 > Решил на День молодёжи посчитать, сколько молодёжи среди клиентов заказчика: запрос в SQL Lab, который считает возраст контактов, и гистограмма по нему. - Авторство: Автор: Максим [human] - Текст написал Максим. ИИ исправил только опечатки и пунктуацию, смысл и стиль автора не менялись. - Опубликовано: 2024-06-29 - Теги: Битрикс24, BI-конструктор - Адрес: https://dgtor.blog/posts/bi-age-calculation/ Решил на День молодёжи посчитать, сколько молодёжи в клиентах у моего заказчика. Делать буду через BI-конструктор Битрикс24. В работе активно использовал документашку [эту](https://trino.io/docs/current/functions/datetime.html#date_diff). Для расчёта возраста в SQL Lab использую следующую запись: ```sql SELECT id, date_format(birthdate,'%Y') as DB, date_diff('YEAR', birthdate, current_date) as Age FROM crm_contact WHERE birthdate IS NOT NULL ``` **Разберём:** - `date_format(birthdate,'%Y') as DB` — это я нашёл год рождения, назвал DB; - `date_diff('YEAR', birthdate, current_date) as Age` — посчитал разницу в годах, назвал AGE; - `crm_contact` — подключил таблицу данных; - `birthdate IS NOT NULL` — исключил пустые значения. ![Гистограмма возрастов контактов: по горизонтали возраст от 0 до 90 лет, по вертикали количество; больше всего клиентов в возрасте 35–45 лет](./age-histogram.png) Далее в гистограмме строим график по столбцу AGE. --- # Добавление товара в смарт-процесс или счёт Битрикс24 через REST > Три шага, чтобы добавить товарную позицию в смарт-процесс или новый счёт Битрикс24 через REST: ownerType из crm.enum.ownertype, поля и crm.item.productrow.add. - Авторство: Автор: Максим [human] - Текст написал Максим. ИИ исправил только опечатки и пунктуацию, смысл и стиль автора не менялись. - Опубликовано: 2022-02-19 - Теги: Битрикс24, REST API - Адрес: https://dgtor.blog/posts/rest-productrow-smart-process/ ## Коротко порядок действий следующий 1. Находим буквенный идентификатор СП через метод `crm.enum.ownertype`. 2. Получаем список полей товарных позиций через `crm.item.productrow.fields`. 3. Добавляем товарную позицию через `crm.item.productrow.add`. _В Битрикс24, как в «Зоне» у Стругацких, самый короткий путь — не прямая._ ## Шаг 1. Находим ownerType Чтобы добавить товар к Счёту (под капотом это смарт-процесс), кроме полей товара нам понадобятся два значения: **ownerType** и **ownerId**. - **ownerType** — буквенный идентификатор смарт-процесса; - **ownerId** — ID элемента смарт-процесса. Со стандартными сущностями всё просто, достаточно посмотреть в документации «Константы CRM» значение в столбце «Краткий символьный код» напротив нужной сущности. Так, для сделки символьный код «D», а для предложения — «Q». С кастомными сущностями используем метод `crm.enum.ownertype`. Обращаемся к нему через вебхук в формате (рекомендую через Firefox): ```text https://<портал>/rest/<юзер>/<секретный код>/crm.enum.ownertype ``` Получите ответ вида: ![Ответ метода crm.enum.ownertype для смарт-процесса «Умные сценарии»: ID 159, SYMBOL_CODE DYNAMIC_159, SYMBOL_CODE_SHORT T9f](./ownertype-response.png) Ответ от вебхука на метод `crm.enum.ownertype`. Нас интересует `SYMBOL_CODE_SHORT` — **"T9f"**. ## Шаг 2. Получаем список полей товарных позиций Для этого обратимся к методу `crm.item.productrow.fields` через вебхук (рекомендую через Firefox): ```text https://<портал>/rest/<юзер>/<секретный код>/crm.item.productrow.fields ``` Обязательные поля будут: - **ownerId** — ID элемента; - **ownerType** — буквенный код, получили ранее; - **productId** — ID товара, берём из каталога; - **price** — цена; - **quantity** — количество. ## Шаг 3. Добавление товарной позиции Я буду использовать тестовую среду из приложения «РЕСТ Действия». ![Запрос crm.item.productrow.add в приложении «РЕСТ Действия»: ownerId 4, ownerType T9f, productId 488, price 6000, quantity 1](./productrow-add-request.png) Сформированный запрос. ![Товарная позиция «Корректировка воронки» за 6000 рублей в карточке элемента смарт-процесса](./productrow-added.png) Добавленный товар. Таким образом я создал товар в смарт-процессе. ## Ссылки на документацию и приложение - [Типы данных и структура объектов в REST API CRM](https://apidocs.bitrix24.ru/api-reference/crm/data-types.html#object_type) - [crm.enum.ownertype](https://apidocs.bitrix24.ru/api-reference/crm/auxiliary/enum/crm-enum-owner-type.html) - [crm.item.productrow.fields](https://apidocs.bitrix24.ru/api-reference/crm/universal/product-rows/crm-item-productrow-fields) - [«РЕСТ Действия» в Битрикс24 Маркете](https://www.bitrix24.ru/apps/app/dgtor.rest_deystviya/) --- # С какой скоростью ваш бизнес реагирует на новую заявку? > В Битрикс24 нет готового замера скорости реакции на заявку. Как собрать его из бизнес-процесса с учётом рабочего времени и смотреть в стандартном отчёте. - Авторство: Автор: Максим [human] - Текст написал Максим. ИИ исправил только опечатки и пунктуацию, смысл и стиль автора не менялись. - Опубликовано: 2021-09-25 - Теги: Битрикс24, управление - Адрес: https://dgtor.blog/posts/lead-response-time/ Все книги и курсы по продажам бесконечно повторяют, что скорость ответа на входящую заявку крайне важна, потому что: - клиент продолжает искать товар, оставляет новые заявки и уходит к более хватким конкурентам; - каждую минуту уровень эмоциональной заряженности клиента и его готовности действовать снижается, сложнее продать следующий шаг. Чтобы не сливать деньги на маркетинг, нужно следить за средней скоростью реакции: она должна оставаться на приемлемом для вашей отрасли уровне. Размер «приемлемого уровня» каждый руководитель определяет сам. Моя задача — рассказать, как измерить скорость реакции менеджеров на входящую заявку. Сейчас в Битрикс24 нет готового инструмента для замера скорости отклика. Но есть запчасти, чтобы этот инструмент создать. 1. Мы знаем дату и время создания лида. 2. Мы можем поймать дату и время первой коммуникации. 3. Есть бизнес-процессы с функциями обработки дат. Собрали, протестировали, работает. Добавим дополнительные условия: 1. Если лид пришёл в рабочее время, считаем от времени создания. 2. Если лид пришёл в нерабочее время и взят в нерабочее, считаем от времени создания. 3. Если лид пришёл в нерабочее время и взят в рабочее, считаем от ближайшего рабочего времени. Пересобрали, перетестировали, работает. Бинго! У нас появился объективный измеримый показатель для каждого лида. Я назвал его «Время взятия» и измеряю в минутах. Надеюсь, это не слишком оптимистично, и не нужно будет добавлять измерение в часах :) Дальше всё просто: идём в стандартный конструктор отчётов, создаём отчёт по среднему времени и добавляем в фильтр «Диапазон создания лида», «От» и «До». Теперь мы можем отслеживать показатель за периоды. В качестве личного эксперимента я установил такой отчёт в 4 компании: в двух обработкой клиентов занимается отдел продаж, а две другие работают по схеме «колл-центр + отдел продаж». Но сравнение эффективности схем — это уже другая история. --- # Как лидогенераторы теряют деньги > Лидогенератор ставит на посадочную страницу общий номер клиента, и звонки с неё теряются в общем котле. Почему каждой посадке нужен свой номер и что это даёт. - Авторство: Автор: Максим [human] - Текст написал Максим. ИИ исправил только опечатки и пунктуацию, смысл и стиль автора не менялись. - Опубликовано: 2021-07-06 - Теги: управление, лидогенерация - Адрес: https://dgtor.blog/posts/lead-generators-separate-numbers/ Как лидогенераторы теряют деньги, а клиенты теряют нормальных лидогенераторов. Статья полезна как лидогенераторам, так и их клиентам. Мы обслуживаем по CRM компании по банкротству физических лиц, для данной отрасли характерно использование услуг лидогенераторов по поставке лидов в бизнес. Обычная схема выглядит так: **Реклама — Посадочная страница — Форма — Учёт в CRM.** Клиент видит лиды в CRM, лидогенератор — в кабинете посадочной страницы, как правило, это платформа создания сайтов Флексби или Тильда. На первый взгляд всё хорошо, и что тут терять? А теряются заявки с номеров, указанных на этом сайте. Клиент выдаёт лидогенератору общий номер телефона, соответственно, кто бы ни позвонил на этот номер, будь то лид от лидогенератора или лид из другого источника, он будет помещён в общий котёл. Вот так и происходит потеря. Лидогенератор не зарабатывает, а его клиент не может точно оценить качество трафика и, соответственно, принять верное управленческое решение по дальнейшему сотрудничеству. Приведу пример из недельной статистики по одному моему клиенту. У него мы каждому лидогенератору на каждую посадочную страницу выдали по отдельному номеру и завели его через источник в CRM. Полученные данные я свёл в табличку, отдельные посадочные страницы одного лидогенератора я объединил для наглядности. ![Таблица лидов за неделю по трём поставщикам, отдельно звонки и формы: в работе, успешные, отклонённые, всего и конверсия](./leads-by-landing.png) Таблица с учётом лидов по поставщикам и посадкам. Как видим из таблички, у каждого поставщика (лидогенератора) были звонки с их посадочных страниц. Притом хоть звонков существенно меньше, чем заполненных форм, качество лидов по звонку выше. ![Сводная таблица по типу источника: звонки — 17 лидов и конверсия 12%, формы — 98 лидов и конверсия 4%](./leads-by-supplier.png) Приведённая табличка по поставщикам. Конверсия со звонка составила 12% в первую неделю, с форм же всего 4%. Моя рекомендация. Выдайте своим лидогенераторам на их посадки отдельные номера и заведите их в CRM под отдельный источник. Номер в Битрикс24 телефонии стоит от 255 до 500 р. в месяц, настройка займёт до 1 часа. В качестве пользы вы получите объективные показатели по каждому поставщику и сможете принять верное управленческое решение по дальнейшей работе с ними. Лидогенератор же будет знать, что его реклама работает и приносит вам пользу. --- # Не вы дураки, а у вас просто не хватает инструментов увидеть бутылочное горлышко > Как увеличить число договоров в БФЛ? Не больше лидов: если отдел продаж — бутылочное горлышко, вдвое больше лидов не дадут вдвое больше договоров. Где его искать. - Авторство: Автор: Максим [human] - Текст написал Максим. ИИ исправил только опечатки и пунктуацию, смысл и стиль автора не менялись. - Опубликовано: 2021-05-26 - Теги: управление, БФЛ - Адрес: https://dgtor.blog/posts/sales-bottleneck/ ## Как увеличить число договоров в БФЛ? Давайте я угадаю вашу первую мысль? БОЛЬШЕ лидов! Так? Вы не одни так думаете, так же мыслили те, кто закрылись. На первый взгляд логичное утверждение, что если 100 лидов дают 7 договоров, то 200 дадут 14. Неверно. В уравнении не хватает важной переменной — отдела продаж. Читали «Цель» Голдратта? Там есть термин «**бутылочное горлышко**» — это место в производственной системе, в котором возникает перегрузка, потому что поток материалов (лидов) поступает слишком быстро, но не может быть так же быстро переработан (закрыт в договоры). Найти горлышко очень просто. Там, где завал и помойка, там горлышко. Теперь посмотрите в свою CRM. Сколько просроченных задач и лидов/сделок без задач? Сколько лидов и сделок на статусах «Думает», «Перезвонить», «Инкубатор» (яйцев — сарказм) и тому подобных? Всё, что видите, — это ваши связанные деньги. Дальше, читая Голдратта, вы узнаете, что если один сотрудник может из 100 лидов дать 7 договоров, то из 200 он уже даст 9, а из 300 — 9 и дёргающийся глаз. Потому что он просядет в качестве обработки. И сотрудник вряд ли скажет, что он не справляется, он скажет: «Лиды — говно, лидогенератор — п…» > Нормальный показатель на продажника в компании с отлаженным бизнес-процессом и настроенной CRM — 150 лидов, максимум 200. Посмотрите в CRM. Если и правда бутылочное горлышко в продажах, то займитесь им. Обучайте сотрудников, автоматизируйте рутину, в конце концов наймите ещё одного продажника или сделайте колл-центр. Вообще на обучение я делаю большую ставку, так как вы не бензин или сахар продаёте. И от того, как сотрудник продаст встречу и проведёт консультацию по высокопрофессиональной проблеме, зависит то, сколько договоров у вас будет со 100 лидов. > Вспомнил анекдот от Макса Дорофеева в тему. > > Приходит мужик с обезьянкой в бар. Та бегает по барной стойке, берёт печенье, суёт в попу, вынимает, проглатывает. Берёт вишенку, суёт, вынимает, проглатывает. > > Бармен: «Мужик, а что у тебя с обезьяной, безумная?» > > Мужик: «Нет, она нормальная. Мы недавно в бильярд ходили, так она шар проглотила, неделю высраться не могла. Теперь предварительно всё меряет». --- # Как я нашёл алый океан в банкротстве физических лиц > Весной 2021 года клиенты по БФЛ стали откладывать старт и пропадать. Я обзвонил тридцать компаний: конверсия упала вдвое, рынок перегрет, новички закрываются. - Авторство: Автор: Максим [human] - Текст написал Максим. ИИ исправил только опечатки и пунктуацию, смысл и стиль автора не менялись. - Опубликовано: 2021-04-23 - Теги: управление, БФЛ - Адрес: https://dgtor.blog/posts/bfl-red-ocean-2021/ Всё началось пару месяцев назад. Мои клиенты, юридические компании по БФЛ, стали массово переносить старт работ, а некоторые заказчики переставали реагировать на звонки менеджеров перед подписанием договора. Процессы затягиваются, сроки срываются, «казна пустеет, милорд». Странная ситуация затянулась. Я сам решил разобраться, что пошло не так: лично задать вопрос тем, кто поменял решение о покупке, и узнать первопричину. Вариантов много: может, продажник недорабатывает, может, что-то не нравится в нашем продукте, или это что-то третье, о чём я даже не подумал. И я начал звонить. Первый разговор, второй, третий… тридцатый. То, что должно было выглядеть как простое интервью на пару вопросов, превратилось в вести с полей боевых действий. На этих полях юристы по банкротству физиков сражались за выживание в бизнесе. Итог моего исследования удручает. Половина компаний из тех, кто оставил заявку на внедрение и перестал выходить на связь, закрылась или переключилась на другой вид деятельности. Часть оставшихся убыточна уже несколько месяцев подряд. И все, все жалуются на общее снижение количества договоров при значительном росте затрат на лидогенерацию. Ниже приведу сухие цифры из отчётов CRM: - конверсия в договор снизилась в 2 раза (по некоторым источникам, за первый месяц с 3,1% до 0,7%); - средний срок заключения договора сдвинулся с 43 дней до 65; - стоимость клика по высокочастотным запросам в Яндекс.Директе по Москве достигает 1500 рублей, города-миллионники к этой цене уже максимально приблизились; - конверсия из заявки в консультацию упала в 3 раза; - основной источник новых договоров теперь — рекомендации, сарафанное радио составляет от 30% до 45% от общего количества заключаемых договоров. Как так получилось? Всему виной перекос между спросом и предложением на услугу: о списании долгов в пандемию услышали все. Если в сентябре 2020 года в России компаний, которые занимаются ТОЛЬКО банкротством физлиц, по данным 2ГИС, было 900, то в марте 2021 их стало уже 1300. Конкуренция выросла в 1,4 раза. При этом большая часть разорившихся проработала в банкротстве меньше 4 месяцев. Например, Уфа оказалась в лидерах по открытию и закрытию компаний: на город с одним миллионом жителей сейчас — 220 компаний, оказывающих услуги по банкротству. Есть и хорошие новости. По данным Федресурса, число банкротств граждан выросло на 81,5% по сравнению с прошлогодним показателем, по всем показателям оно продолжит рост и в следующем году. В итоге мы имеем «алый океан рынка банкротства», где предложение превышает спрос. На языке военной стратегии это значит борьбу за обозначенный чёткими границами кусок земли (читай — количество банкротов в регионе), противостояние врагу (конкурентам с идентичным, как бы парадоксально ни звучало, уникальным торговым предложением), его разгрому и изгнанию с поля боя (битва в аукционах интернет-площадок). Добавим к этому факт: инвестиций для открытия своего офиса компании-новичку требуется гораздо больше, чем федеральной сети для ещё одного филиала. Первые строят бизнес-процессы с нуля методом проб и ошибок. А вторые добавляют новый город в список адресов на сайте, нового сотрудника в CRM и пользуются бонусами наработанного авторитета в новом регионе. Резюмирую. На этом этапе нормально себя чувствуют компании с сильным отделом продаж, эффективной учётной системой и широкой сетью рекомендаций. Новичкам приходится очень туго. Со временем закрытие неэффективных компаний и параллельный рост общего числа должников выровняет рынок. --- Эту статью я написал для компаний по банкротству. Часть информации получил от тех, кто не купил, часть — от действующих клиентов, часть увидел в отчётах на порталах. Если вы, как и я, занимаетесь внедрением Битрикс24 в узком рынке, то становитесь обладателем сакральных знаний. Знаний, которые ни один из клиентов не может найти сам, так как вы над рынком. Пользуйтесь этим, только всегда помните про неразглашение конфиденциальной информации.