0  /  33

ОШИБКИ (баги) приложений 1С Битрикс и Битрикс 24

Содержание

Ошибки (баги) приложений 1С Битрикс и Битрикс 24

Баги scoder.base

Инструменты, коллекции, групповые действия / Перекрестные продажи / Аналогичные товары / Аксессуары


Разработчик

Scoder

Статус: Золотой сертифицированный
Город: Йошкар-Ола
Разработка/доработка сайтов любой сложности. Делаем так, что жалко отдавать.


Страница на битрикс маркетплейс

РЕШЕНО в 1.6.5 Баг активности профиля scoder.base

Галка активности профиля синхронизации не влияет на работу профиля.

Галка активности профиля наводит на мысль, что если ее нет, то модуль никак не работает. Это не верно. Модуль начинает работать сразу после создания профиля, если стоит галка автоматизировать синхронизацию элементов. и галки в свойствах - создание и редактирование.


Синхронизируются не товары, а свойства инфоблоков, выбранных в профиле.

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

Для того, чтобы чтобы модуль не синхронизировал свойства инфблоков - уберите галки указанные на скриншоте ниже  




но стоит галка Автоматизировать синхронизацию элементов:






Для того, чтобы синхронизация свойств в настройках инфоблоков действительно не работала, нужно убрать галки в добавлении и редактировании свойств.

Свойства инфоблока синхронизируются НЕ в момент сохранения профиля синхронизации, а в момент сохранения настроек инфоблока..




РЕШЕНО Нет синхронизации с highload-блоками scoder.base

Есть проблема с привязкой хайлоадблоков, они не подтягиваются в свойства соответствующих полей

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

Баг сортировки свойств scoder.base

Внимание!

При изменении сортировки в базовом инфоблоке - возможно изменение значений свойств дочернего, которые не трогали в базовом - тоже обращайте внимание.


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

Пример:

1. Создаем в Базовом инфоблоке каталог новые свойства типа "Строка":

в это время в дочернем инфоблоке у базового цвета был тип справочник


2. Происходит синхронизация инфоблоков

3. Смотрим что изменилось в дочернем инфоблоке:

    3.1. Создались новые свойства Тест 1 и Тест 2, которые должны быть типа "Строка", но что-то пошло не так:
свойство тест1 стало на второе место и ему присвоился тип свойства базовый цвет, которое до этого было вторым
а свойство базовый цвет вместо справочника стало списком


    3.2. И оказывается что это не единственная проблема - поехали все типы свойств:



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



РЕШЕНО Баг перезаписи значений свойств инфоблоков scoder.base


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



если я меняю в товаре свойства в базовом инфоблоке - происходит синхронизация с дочерним, и в дочернем слетаю настройки инфоблока в частности меняются связки инфоблоков, как на примере

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


Свойства типа привязки указывают на те же инфоблоки или блоки, что и базовый, чтобы значения элементов дочернего элемен6та этих свойств совпадали со значениями эквивалентных элдементов базового инфоблока.
Например, в свойстве типа "Привязка к элементам", привязка осуществляется с помощью ИЛ элементов, если для свойства указать другой инфоблок, там будут другие элементы, соответственно другие ID и значения дочернего элемента не совпадут и будут пусты.

Если нужно отличное, то лучше создать новое свойство, которого нет в базовом, т.е. с отличным символьным кодом.

в свойстве типа "Привязка к элементам", привязка осуществляется с помощью ИЛ элементов, если для свойства указать  
другой инфоблок, там будут другие элементы, соответственно другие ID и значения дочернего элемента не совпадут и будут пусты.

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

Если вам нужно отличное, то лучше создать новое свойство, которого нет в базовом, т.е. с отличным символьным кодом.


Я сделал так - уникализировал все символьные коды совйств инфоблоков, но
синхронизация все равно работает, но теперь она создает бесполезные совйства в дочернем инфобллоке
Например.
Базовый - BRAND_JO
дочерний -BRAND_SE

но после синхронизации модуль создает в дернем еще и BRAND_JO
и свойства становятся
Базовый - BRAND_JO
дочерний -BRAND_SE (ссылается на инфоблок дочернего сайта и все корректно работает)
                 BRAND_JO (ссылается на инфоблок базового сайта и по факту не используется)

то есть получается, что пока нет никакого смысла синхронизировать свойства в которых указывается инфоблок (привязка к разделам, фильтры, и тп), так как это или ломает работу сайта или создает свойства, которые не работают в дочернем сайте.

исключение видимо составляют случаи, когда, оба инфоблока дочерний и базовый находятся на одном сайте

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

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

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


Вывод.

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

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


Итог. Пользуемся как есть, ждем может когда то появится функционал выбора свойств в профиле синхронизации. 
Имеем бесполезные свойства, но хотя бы не вредные)

Проблема с красивым отображением связанных услуг


изменением буквенных кодов свойсв решается проблема их перезаписи, но некоторые коды свойств прописан в шаблоне сайта, например Аспро максимум. 

и при переименовании этих свойств перестают отображаться на странице товара связанные услуги например, так как в шаблоне прописаны символьные коды конкретных свойств и при переименовании шаблон просто не видит свойство, которое выводить




РЕШЕНО Тест scoder.base 1.6.4 (11.05.2022) (beta)

ФИЧА С ГАЛКАМИ.


ФИча. - При нажатии на галку в выбранном свойстве (убирание или добаление)  - автоматом проставляется галка редактирования -добаления всех свойств.



при убирании галок - тоже добавляются галки







БАГ С ДОБАВЛЕНИЕМ ЧЕГО НЕ НАДО


в дочернем этого свойства нет

Автоматом добавилась галка редактирование свойств.

В тоже время у нас нет галок редактирования. на свойсве регион.



В дочернем инфоблоке его нет.


сохраняем профиль


смотрим дойрний.

1. Свойство тестовое добавилось  - это хорошо



2. Сойство регион тоже добавилось, хотя не должно было - это плохо.


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

2. Баг - невозможно синхронизировать новые свойства при сохранении селективности.

Селективность работает если галки убрать.

Ранее и сейчас при таких настройках модуль проверял все свойтва в базовом и сенхронил их с дочерним.



но если настройки такие, то синхронизация новых свойств не работает впринципе.


видимо по тому, что синхронизируется не в момен сохрания профиля синхронизации, а в момент добавления - редактирования дочернего элемента.




Пример

В базовом инфоблоке создаем свойство


сохраняем



смотрим что в профиле синхр видно.

смотрим что в дочернем

ставим галки в профиле


сохраняем
смотрим что в дочернем

сохраяем еще раз инфоблок базовый, смотрим еще раз дочерний

ничего не добавилось

ВОПРОС: как при такой логике добавить в дочений новое свойство из базового?


Вариант1. Настроить селективность при рабочем механизме синхрона создания



Вариант2. Настроить создание при рабочем механизме селективности.
 
Добавляем служебное поле в свойсво инфоблоков (синхронизировать создание)

сохраняем инфоблок при создании свойства.
оно попадает в профиль синхронизации  с уже проставленной галкой синхрон при создании и создается в дочрнем с такой же галкой в настройках свойства.
и в дочернем инфоблоке попадает в профиль синхронизации (*если там есть )

таким образом свойство при создании в 1 инфоблоке создасться во 2-м.   Далее (если есть профиль синхронизации где 2-й инфоблок базовый) - создасться в дочернем 3-м инфоблоке и так далее пока цепочка не преверся. А прервется цепочка, когда в дочрнем инфоблоке уже будет такое свойсво с таким же символьм кодом.

ТАк сейчас работает модуль если синхронизирвать все свойства. То есть по цепочке 1=>2 2=>3 3=>1. 
Но если мы пробуем механизм синхронизации свойств по отдельности, то такая схема явно не работает сейчас. так как новые свойсва не синхронизируются не то чтобы по цепочке, но и в рамках одного профиля синхронизации. 



Итог на 12.05.
1. Если использовать фичу с галками на JS-y , то селективность синхронизации перестает работать, но нет проблемы с добавлением новых
2. Если не использовать фичу - то селективность работает для уже созданных, но проблема с добавлением новых
Вариант1. Настроить селективность при рабочем механизме синхрона создания
Вариант2. Настроить создание при рабочем механизме селективности.






РЕШЕНО Тест scoder.base версии 1.6.5 (16.05.2022)

Тест влияния активности на синхронизацию свойств.

Успешно. Если профиль не активен - синхронизация свойств не работает.


Тест на на работу селективности и синхронизации на создание свойств. Одновременно.

Проверяем, чтобы добавилось новое совйство, но не добавилось свойство, которое не нужно синхронизировать.

УСПЕШНО.

Профиль синхронизации синхронизирует создание нового свойсва, и не синхронизирует текцщие свойсва, которые не отмечены галкой синхрона на создание.


НЮАНС. 

При создании свойства в базовом инфоблоке, оно появляется в профиле синхронизации 
с неактивной галкой снхронизации на создание.


создаем, смотрим профиль, где инфоблок свойста - базовый



НЕТ "ПРОБРОСА" ГЛАКИ СИНХРОН НА СОЗДАНИЕ


То есть на первом шаге синхронизация совойства не происходит. и для этого нужно обратиться в профиль, где проставить галку


тогда в дочернем инфоблоке это свойсво появится. и появится в ДРУГОМ профиле синхронизации (если такой есть), в котором дочерний инфоблок будет базовым.


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

потом зайти во второй профиль и и проставить галки


и так далее.
1-2
1-3
2-1
2-3
3-2
3-1


Для поддержания идентичности ОБЩИХ свойств 11 инфоблоков нужно около 100 профилдей синхронизации.
Это в идеале, чтобы когда мы добляем свойство в любой инфоблок - оно (если общее) синхронилось с остальными 10

при текущей ситуации нужно при добавлении свойства, пересохранять галки в 100 профилях - это не реально.

Вариант 2. 

синхронизировать каждый инфоблок с одним следующим в цепочке по кругу. 
1-2
2-3
3-1

Тут количесво профилей снижается, но от этой схемы отказались, так как на 2-м и третьем шаге переставали синхронизироваться значения свойств типа список. а на первом они синхронизировались. или что то в этом роде


Вариант 3. На мой взгляд самый лучший


Добавляем служебные поле модуля  во все свойсва инфоблоков (синхронизировать создание)
1. Синхронизировать создание
2. Синхронизировать редактирвоание
3. Синхрон сортировки
3. Синхрон названия

сохраняем инфоблок при создании свойства.
оно попадает в профиль синхронизации  с уже проставленной галкой синхрон при создании и создается в дочрнем с такой же галкой в настройках свойства.
и в дочернем инфоблоке попадает в профиль синхронизации (*если там есть )

таким образом свойство при создании в 1 инфоблоке создастся во 2-м.   Далее (если есть профиль синхронизации где 2-й инфоблок базовый) - создасться в дочернем 3-м инфоблоке и так далее пока цепочка не прервется. А прервется цепочка, когда в дочрнем инфоблоке уже будет такое свойсво с таким же символьм кодом.

Таким образом при создании свойства мы выбираем что и как синхронить.

По факту если посмотреть, что при создании свойства в инфоблоке, оно потом попадает в профиль синхронизации, 

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


ну даже можно и не подтягивать реальные значения, а допустим по умолчанию сделать

-если свойсво создается  модулем в инфоблоке, то в профиле синхронизации такого инфоблока ставить дальнейший синхрон всего (создание, редактирование)


ну не знаю, может еще как то вернуть механизм, который работает, при синхронизции на создание всех свойств.(









РЕШЕНО Баг профилей синхронизации scoder.base сохранения.

если профиль не активен - не сохраняются измениия по синхрону товаров






Решение - сначала поставить галку активности, а потом галку убрать


тоже самое при создании профиля при выборе инфоблоков,
если профиль не поставить активным, то сохраняет 
без инфоблоков

это после сохранения с выбранными инфоблоками и без галки активности профиля.



Баг синхронизации смены типа свойства

если у нас есть несколько профилей синхронизации 

1-2
2-3


создаем новое в первом




получаем



второй





смотри профили

1-2

2-3


меняем тип свойства в первом инф


смотрим второй


смотрим третий 



то есть по цепочке по событию ихзменение не произхошло

теперь нажмем на сохранить во втором профиле



смотрим третий инф снова



то есть изменение типа свойства висит только на событии сохранения профиля
синхронизации, а не событии измения свойсва инфоблока.



ЕСЛИ СОЗДАЕМ СПИСОК СРАЗУ С СОЗДАНИЕМ СВОЙСТВА, ТО ОН СОХРАНЯЕТСЯ ВЕЗДЕ




то есть функция то работает но только при создании свойтва - тогда и список синхронится везде при создании


а при добавлении свойства в уже созданное свойство типе список - только на 1 шаг вперед.








ПРОБУЕМ ТОЖЕ САМОЕ ПРИ СТАРЫХ НАСТРЙКАХ





Баг синхронизации списка свойств

добавляем свойсва в список 1 инф


сохраняем перв инф

смотрим 1 инф - свойсва сохранились 


смотрим второй инф



смотрим третий



пересохраняем профиль 2-3

смотрим 3 инф



сохраняем еще раз 2 инф


смотрим 3 инф снова


не работает не на событие сохранения профиля ни на сохраненеие ифн




пробуем добавить свойсво в 1 инеф





в третьем опять ничего





пробуем изменить 2-й инф




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

на пересохранение профилей синхронизации и инфоблоков руками не реагирует
на автоматическое создание (изменение ) тоже не реагирует





Модуль обучения 1с Битрикс

баг - скрытие поля индекс сортировки влияет на сохранен страниц в модуле

если скрыть поле индекс сортировки курса,


то при попытке сохранить изменения после этого в курсе, выдает ошибку

[LearnException] 
EA_PARAMS (8448)
/home/bitrix/www/bitrix/modules/learning/classes/general/clearnlesson.php:1466
#0: CLearnLesson::_EnsureArgsStrictlyCastableToIntegers(NULL)
	/home/bitrix/www/bitrix/modules/learning/classes/general/clearnlesson.php:621
#1: CLearnLesson::_CanonizeAndCheckAdditionalParamsForAddCourse(array, boolean)
	/home/bitrix/www/bitrix/modules/learning/classes/general/clearnlesson.php:744
#2: CLearnLesson::Update(integer, array)
	/home/bitrix/www/bitrix/modules/learning/classes/general/course.php:259
#3: CCourse->Update(integer, array)
	/home/bitrix/www/bitrix/modules/learning/admin/learn_course_edit.php:155
#4: require(string)
	/home/bitrix/www/bitrix/admin/learn_course_edit.php:1
----------

При изменении прав на курс слетает привязка уроков







тоже эта история каким то образом связана с видимыми полями 
если показать в настройках  поля , которые показаны ниже, то ошибка пропадает

Баг назначения прав модуля обучения БУС

Пропадает кнопка создать урок, если в наборе прав убрать галку с правами на удаление уроков
1.
2.
3.
4. 
5. Добавить выглядит так


но не смотря на отсутсвие кнопки  - измения и наличия удаления- удялять не дает пользователю.



но если мы ЗАПРЕТИМ редактирование, а разрешим удаление 


то кнопка выглядит так



Причем редактирование недоступно по факту, хоть кнопка и есть


Баг в том, что кнопки в меню в режиме правки отображаются не те, что должны.

Как превратить файл стилей модуля Обучение в навык, который сам оформляет уроки

Кейс: Битрикс + Codex

Как превратить файл стилей в навык, который сам оформляет уроки

Один раз разбираем реальные возможности шаблона модуля «Обучение», переводим их на понятный для нейросети язык — и получаем не просто текст, а готовые, структурные и визуально выразительные HTML-статьи.

/bitrix/templates/learning_dark/template_styles.css
1файл стилей активного шаблона
10+готовых способов оформить контент
1навык с правилами и каталогом
уроков в едином стиле курса

В чём идея

В CSS-файле уже хранится визуальный язык курса: как выглядят предупреждения, советы, код, спойлеры, ссылки, изображения и служебные сообщения. Но сама нейросеть не знает, какой класс означает «критическая ошибка», а какой — «полезный совет». Навык становится переводчиком между смыслом статьи и возможностями шаблона.

В нашем кейсе используется тёмная тема, поэтому исходной точкой стал файл /bitrix/templates/learning_dark/template_styles.css. У светлой темы есть собственный template_styles.css в папке её шаблона: перед разбором важно проверить, какой шаблон действительно назначен страницам курса.

Главный принцип

Мы не просим нейросеть каждый раз «придумать красивое оформление». Мы один раз объясняем ей реальные правила конкретного шаблона, а затем она выбирает нужный компонент по смыслу материала.

Находим источник

Определяем активный шаблон курса и открываем его template_styles.css.

Составляем каталог

Отделяем классы контента от классов меню, шапки, навигации и служебного интерфейса.

Описываем правила

Фиксируем назначение каждого блока, точную HTML-структуру и ограничения.

Генерируем уроки

Навык превращает исходный текст в готовый фрагмент для поля урока Битрикса.

Что обнаружилось внутри шаблона

Предоставленный файл — это не просто оформление всей страницы. В нём есть отдельный набор классов, которые можно безопасно применять непосредственно в тексте урока.

Класс или элемент Что означает Когда применять
.warning Предупреждение о риске Удаление данных, опасное действие, частая критическая ошибка
.note Важная заметка Обязательное условие, ключевой факт или результат
.tip Практический совет Более быстрый, удобный или надёжный способ
.hint Подсказка Необязательное пояснение, ориентир или расшифровка
pre.syntax Многострочный код HTML, CSS, PHP, команды и конфигурация
table.learning-spoiler Раскрываемый блок Длинный пример, ответ или дополнительная справка
.play / .playdoc Видео или документ Только когда есть реальная ссылка на материал
.leftimg / .rightimg Обтекание изображения Небольшая иллюстрация слева или справа от текста
.errortext / .notetext Статус операции Фактическая ошибка или подтверждение успешного результата
Почему нельзя брать все классы подряд

Большая часть файла управляет интерфейсом курса: шапкой, боковым меню, поиском, навигацией между уроками и журналом оценок. Классы вроде courses-header, courses-left-side или courses-page-link не предназначены для текста статьи.

Как из CSS получается навык

Сам CSS отвечает на вопрос «как выглядит элемент». Навык добавляет ответы ещё на три вопроса: «что он означает», «когда его использовать» и «какая разметка нужна Битриксу».

A

Семантика

warning — только риск, tip — рекомендация, hint — необязательная помощь.

</>

Точная структура

Навык хранит готовые HTML-скелеты, включая особую табличную структуру спойлера.

Ограничения

Не дублировать заголовок урока, не выдумывать ссылки и не смешивать контент с интерфейсом курса.

Минимальная структура навыка может выглядеть так:

write-bitrix-learning-html/
├── SKILL.md
└── references/
    └── style-catalog.md

В основном файле задаётся рабочий процесс:

---
name: write-bitrix-learning-html
description: Создавать HTML-статьи для модуля «Обучение» Битрикс
---

1. Прочитать каталог подтверждённых стилей.
2. Построить структуру урока с h2 и h3.
3. Выбирать warning, note, tip и hint по смыслу.
4. Помещать многострочный код в pre.syntax.
5. Возвращать HTML-фрагмент без html, head и body.

А каталог хранит не только название класса, но и эталон разметки:

<div class="tip">
  <div class="courses-info-title">Совет</div>
  <p>Сначала проверьте оформление на тестовом уроке.</p>
</div>
Хорошая практика

Каталог стилей лучше хранить отдельно от общих инструкций навыка. Тогда при изменении темы достаточно обновить справочник, не переписывая весь сценарий генерации статей.

Что навык делает с обычным запросом

Пользователь пишет: «Подготовь урок о резервном копировании перед обновлением сайта». Навык распознаёт структуру задачи и собирает её из подходящих компонентов:

Используй навык для создания HTML-статьи в модуле «Обучение».
Подготовь урок о резервном копировании перед обновлением сайта.
Добавь предупреждение, контрольную точку, практический совет и пример команды.
Перед обновлением

Создайте резервную копию файлов и базы данных. Не начинайте обновление, пока не убедитесь, что архив можно восстановить.

Контрольная точка

Запишите версию системы и список установленных модулей до начала работ.

Экономим время

Сначала проведите обновление на тестовой копии сайта, а затем повторите проверенный сценарий на рабочем проекте.

Подсказка

Путь к текущему файлу темы удобно выделять так: /bitrix/templates/learning_dark/template_styles.css.

Показать, почему у спойлера именно такая разметка

Скрипт стандартного шаблона ожидает таблицу table.learning-spoiler с секциями thead и tbody. Если заменить её произвольным div, визуальное оформление ещё можно повторить, но штатное раскрытие может перестать работать.

Где заканчивается готовый шаблон

Исходный CSS прекрасно решает базовые задачи, но в нём заметны ограничения своего времени: фиксированная ширина основного контейнера, спрайтовые иконки, старые префиксы и отсутствие адаптивных медиазапросов. Это не повод выбрасывать шаблон — это точка для аккуратного расширения.

Базовый слой

Что уже работает

  • понятные смысловые блоки;
  • заголовки, списки и ссылки;
  • код и штатный спойлер;
  • видео, документы и изображения.
Современный слой

Что можно добавить

  • адаптивные карточки и сетки;
  • CSS-переменные для быстрой смены темы;
  • нативные аккордеоны без JavaScript;
  • доступный фокус и режим без анимации.
Не редактируйте системный шаблон вслепую

Перед изменением файла в /bitrix/templates/ сделайте резервную копию и проверьте, не будет ли активный шаблон заменён при обновлении. Для постоянной кастомизации безопаснее работать с собственной копией шаблона и сначала тестировать изменения на отдельном уроке.

Как сделать модуль обучения «в огне»

Ниже — не абстрактный список идей, а компоненты, которые уже работают в этой статье. Все новые правила находятся в теге style в начале HTML и ограничены единым префиксом learning-fire.

01

Контентные карточки

Этапы, возможности и короткие тезисы легче сканировать, чем длинное полотно текста.

02

Контейнерная адаптивность

Компонент реагирует на ширину области урока, а не только на ширину всего экрана.

03

Нативное раскрытие

details и summary создают доступный аккордеон без отдельного скрипта.

04

Единая палитра

CSS-переменные позволяют перекрасить весь набор компонентов из одного места.

05

Доступность

Заметный :focus-visible помогает проходить урок с клавиатуры.

06

Спокойное движение

prefers-reduced-motion отключает декоративные переходы по настройке системы.

Вариант 1. Оставить новые стили внутри одной статьи

Это удобный режим прототипа: можно быстро проверить карточки, цвета и адаптивность. Поскольку все селекторы начинаются с .learning-fire, оформление не должно затронуть соседние уроки.

Вариант 2. Перенести проверенный CSS в template_styles.css

После тестирования вынесите содержимое тега style в файл активного шаблона. Тогда одни и те же компоненты можно будет применять во всём курсе, а в тексте уроков останется только чистая HTML-разметка.

Вариант 3. Сделать несколько визуальных режимов

Можно добавить модификаторы для разных типов материалов: практикум, инструкция, кейс, контрольный список или обзор. Навык будет выбирать не только смысловой блок, но и общий сценарий оформления статьи.

Как кастомизировать навык дальше

Визуальные компоненты — только первый уровень. Следующий шаг — научить навык собирать разные типы учебного контента по своим сценариям.

Режим навыка Что он добавляет автоматически Подходящий запрос
Пошаговый урок Цель, подготовка, нумерованные шаги, контрольная точка, итог «Объясни, как настроить резервное копирование»
Разбор ошибки Симптом, причина, диагностика, исправление, профилактика «Почему после обновления пропали стили урока»
Кейс Исходная задача, решение, примеры кода, результат, идеи развития «Расскажи, как мы сделали навык из CSS»
Чек-лист Короткие проверяемые пункты и критерий готовности «Проверь HTML-урок перед публикацией»
Микрообучение Одна идея, один пример, одна мини-проверка «Объясни класс warning за две минуты»
Ещё сильнее: добавить бренд-систему

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

Проверка перед публикацией

  • Активный шаблон курса определён правильно
  • Все штатные классы реально есть в CSS
  • Интерфейсные классы не попали в статью
  • Заголовок урока не продублирован через h1
  • HTML внутри примеров экранирован
  • У всех изображений есть осмысленный alt
  • Новые классы имеют уникальный префикс
  • Макет проверен на узком экране
  • Фокус с клавиатуры остаётся заметным
  • После изменения шаблона очищен кеш
Если редактор удаляет тег style

Некоторые настройки фильтрации HTML могут вырезать встроенный CSS при сохранении. В этом случае разметку статьи оставляют без изменений, а весь блок правил переносят в template_styles.css активного шаблона.

Итог: CSS становится не архивом старых правил, а конструктором курса

Мы нашли файл шаблона, превратили его селекторы в понятный каталог, зафиксировали логику в навыке и добавили современный слой оформления. Теперь достаточно описать тему урока — а структура, смысловые акценты и HTML для Битрикса собираются системно.

БУС система баги

Отображение удаленных товаров в админке битрикс управление сайтом

Имеем такое вот товароное предложение


Смотрим товар к корому оно относится



и видим что в товаре есть 2 ТП 

но наше тп в примере имеет 1069989, а такого нет


почему, потому что это тп было в свое время удалено


поищем по тп



пусто


Баги SEO фильтра аспро макс

Баг SEO фильтра при изменении свойства Аспро макс

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

Номер задачи — MAX-3288

Алгоритм действий. 
1. Создаем товар и пишем в свойстве тип строка значение.
2. Создаем правило для сео фильтра с этим свойством, модуль генерирует посадочные.
3. Меняем тип свойства со строки на список. 
4. Задаем значения для товара уже исходя из списка значений, указанных в свойстве.
5. Пробуем сгенерировать посадочные по аналогичному правилу.

не выбираем ничего, но видно, что значений 2, значит посадочных должно быть 2, а гененрируются 4



6. Модуль генерирует посадочные согласно значениям списка и ошибочные адреса посадочных - то есть модуль видит, что у товара есть еще и значения для типа строка, но так как тип свойства поменялся, он не может их использовать и ничего не отображается в значении свойства в ЧПУ правила после генерирования.
Для типа строка - значения пишутся текстом, аналогичным значению. 
Для типа список - id значений из списка в свойстве.



7. Меняем снова тип свойства на строку, снова генерируем посадочные по т ому же праилу и видим, что модуль все таки где то хранит значения товара, которые ранее были прописаны в поле строка и подтягивает эти значения, хотя по факту в товаре казаны id свойств списка.


Если оставить все как есть, то раздел для которого настроено правило сео фильтра выдает 404 ошибку. При удалении ошибочных посадочных  - раздел открывается.

Временное решение
- удалять некорректные строки в ЧПУ правила.
-  попробовать удалить товары и создать их по новой.  
- не менять типы свойств, а удалять свойство и создавать новое с новым типом.

но все же крайне интересно, где и зачем модуль хранит уделенные значения.

Кеш чистился полностью - не помогло.



Баги модуля primepix.propertytoolkit

Модуль массового управления свойствами

от  Праймпикс





Баг из числа в список

При смене из числа в список модуль создает список из одинаковых значений, 
хотя должен создать 1 значение.

Результат списка после преобразования свойства.


временное решение

после смены типа свойства сделать объединение значений, которое удалит дубли 

Модуль видит удаленные элементы, но не понятно что с этим делать primepix.propertytoolkit

Интересной особенностью модуля является то, что он видит удаленные элементы инфоблоков



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


если обратиться к списку элементов а их тут 700 000, то открытие страницы занимает вечность, как вы понимаете

Вопросы - 

зачем нам видеть то, чего по сути нет.

где это все хранится?

как это удалить (явно это типа корзины битрикса получается)

это баг модуля или фича?

Баг запоминания последнего инфоблока к которому обращались primepix.propertytoolkit

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



Все бы ничего, но иногда модуль ловит 504 ошибку при обращении к инфоблоку и тогда 

все. каждый раз он обращается к тем же данным, которые привели к ошибке и все. смерть)

приходится модуль удалять, а потом ставить

Но даже если модуль удалить, а потом поставить (без стрирания), то он все равно помнить последнее обращение к инфоблоку.


Баг подсчета элементов с пустыми значениями primepix.propertytoolkit

Модуль как то видит старые значения свойств элементов. 

В элементе свойство не заполнено (тип список), но модуль его считает





Эта история происходит также, если товар удалить. Число товаров показывается не корректное, а вот уже в ID товаров не подтягиваются данные, что верно.

Баги модуля легкий директ wtc.easydirect

Не показываются свойства инфоблока Легкий директ

В шаблоне объявления не показываются свойства

пробовал переустанавливать модуль после его стирания - не помогло



Баги модуля Новости в Telegram

Новости в Telegram
от СеоВен

Не работает модуль после установки

Установили модуль Новости в Telegram

Создали чат-бота, получили токен, назначили его админом для канала

Далее в настройках модуля (у нас многосайтовость) на вкладке Инфоблоки выбрали Инфоблок, заполнили данные



нажимаю сохранить и вот такой результат:



все пустое

Аспро максимум

Баги аспро максимум

Вывод пустых характеристик и служебных маркеров в HTML карточки товара «Аспро: Максимум»

Как исключить пустые характеристики из HTML карточки товара в «Аспро: Максимум»

В карточке товара решения «Аспро: Максимум» один и тот же шаблон используется как для вывода реальных характеристик товара, так и для создания служебной заготовки, необходимой JavaScript при переключении торговых предложений.

Из-за этого при отсутствии значения свойства в итоговый HTML страницы могут попадать пустые строки характеристик или служебные значения:

#PROP_TITLE#
#PROP_VALUE#

Сами служебные значения внутри элемента <template> являются частью штатной логики Аспро. Основная проблема возникает тогда, когда пустое реальное свойство выводится в HTML как обычная характеристика товара.


Описание проблемы

Файл шаблона характеристики может вызываться в двух режимах:

  1. Для вывода настоящего свойства товара.
  2. Для создания служебного шаблона, который JavaScript использует при смене SKU.

В исходном шаблоне название свойства выводится следующим образом:

<?=$arProp['NAME'] ?? '#PROP_TITLE#';?>

Значение свойства выводится так:

<?=$arProp['DISPLAY_VALUE']
	? implode(', ', (array)$arProp['DISPLAY_VALUE'])
	: '#PROP_VALUE#';?>

Если массив свойства не был передан, формируется служебная заготовка:

<div class="properties__item js-prop">
	<div class="js-prop-title">#PROP_TITLE#</div>
	<div class="js-prop-value">#PROP_VALUE#</div>
</div>

Такой вариант нужен для динамической работы характеристик и не должен удаляться без изменения JavaScript.

Однако тот же файл используется и для настоящих свойств товара. Если свойство присутствует в массиве, но его отображаемое значение пустое, в HTML может появиться конструкция:

<div class="properties__item">
	<div class="js-prop-title">Парфюмер</div>
	<div class="js-prop-value"></div>
</div>

Не следует просто удалять строки #PROP_TITLE# и #PROP_VALUE#. Они могут использоваться JavaScript Аспро при создании новых строк характеристик после переключения торгового предложения.


В каких ситуациях проявляется проблема

Проблема может проявляться не на каждой карточке товара. Она возникает, когда свойство присутствует в настройках вывода или в массиве данных, но фактического значения у товара нет.

  • Свойство выбрано для отображения, но не заполнено у конкретного товара.
  • Свойство заполнено у родительского товара, но отсутствует у торгового предложения.
  • Разные SKU имеют разный набор характеристик.
  • Значение было очищено после импорта из 1С.
  • Свойство содержит пустую строку.
  • Множественное свойство содержит массив пустых элементов.
  • Значение было отфильтровано при подготовке массива свойств.
  • Пользовательское свойство существует, но его отображаемое значение не сформировалось.
  • После смены SKU ранее показанная характеристика должна быть удалена.
Примечание:

Особенно часто проблема проявляется в каталогах с большим количеством торговых предложений, когда у разных вариантов товара используется неодинаковый набор свойств.


Где находится служебный шаблон

В шаблоне карточки товара Аспро присутствует следующий блок:

<!-- noindex -->
<template class="props-template">
	<?TSolution\Functions::showBlockHtml([
		'FILE' => 'catalog/props/list.php',
		'PARAMS' => [
			'ITEM_CLASSES' => 'properties__item--compact font_xs',
		]
	]);?>
</template>
<!-- /noindex -->

Он подключает файл:

catalog/props/list.php

Этот файл формирует как обычные строки характеристик, так и служебную заготовку.

Почему нельзя полностью удалить элемент <template>
```

Принцип безопасного исправления

Необходимо разделить два режима работы файла:

  • служебный режим без переданного свойства;
  • режим вывода настоящей характеристики.

Если объект свойства не передан, файл должен продолжать формировать:

#PROP_TITLE#
#PROP_VALUE#

Если передано настоящее свойство, но у него отсутствует название или значение, строку характеристики необходимо полностью исключить из HTML.

Код исправления

После строк:

$arOptions = $arConfig['PARAMS'] ?? [];
$arProp = $arConfig['ITEM'] ?? [];

добавляется определение режима работы:

$isJsTemplate = empty($arConfig['ITEM']);

Далее выполняется проверка настоящего свойства:

if (!$isJsTemplate) {
	$propName = trim((string)($arProp['NAME'] ?? ''));
	$propValue = $arProp['DISPLAY_VALUE'] ?? null;

	$hasValue = is_array($propValue)
		? count(array_filter(
			$propValue,
			static fn($value) => trim((string)$value) !== ''
		)) > 0
		: trim((string)$propValue) !== '';

	if ($propName === '' || !$hasValue) {
		return;
	}
}

Проверка через trim() позволяет считать пустыми строки, содержащие только пробелы. При этом строковое или числовое значение 0 не удаляется и продолжает отображаться.


Полный исправленный файл

Открыть полный код файла catalog/props/list.php

Как работал шаблон до исправления

Если свойство имело название, но не имело значения, мог сформироваться следующий HTML:

<div class="properties__item js-prop">
	<div class="js-prop-title">Парфюмер</div>
	<div class="js-prop-value"></div>
</div>

В некоторых сценариях вместо пустой строки мог использоваться служебный маркер:

<div class="js-prop-value">#PROP_VALUE#</div>

Как работает шаблон после исправления

Заполненное свойство

Исходные данные:

NAME = "Объём"
DISPLAY_VALUE = "100 мл"

Результат:

<div class="properties__item js-prop">
	<div class="js-prop-title">Объём</div>
	<div class="js-prop-value">100 мл</div>
</div>

Пустое свойство

Исходные данные:

NAME = "Парфюмер"
DISPLAY_VALUE = ""

Результат:

HTML-элемент свойства не выводится.

Служебный вызов

Если файл вызывается без объекта свойства, служебная заготовка сохраняется:

<template class="props-template">
	<div class="properties__item js-prop">
		<div class="js-prop-title">#PROP_TITLE#</div>
		<div class="js-prop-value">#PROP_VALUE#</div>
	</div>
</template>
Примечание:

Служебные маркеры должны остаться только внутри <template class="props-template">. Среди настоящих характеристик товара они присутствовать не должны.


Полученный результат

После изменения шаблона и очистки кеша была повторно проверена итоговая HTML-структура карточки товара.

Получены следующие результаты:

  • пустые реальные строки характеристик отсутствуют;
  • служебный элемент <template class="props-template"> сохранился;
  • #PROP_TITLE# встречается один раз;
  • #PROP_VALUE# встречается один раз;
  • оба маркера находятся только внутри служебного шаблона;
  • заполненные характеристики продолжают отображаться;
  • структура блока характеристик не нарушена;
  • JavaScript сохраняет возможность динамически создавать строки свойств.

Полученный результат подтверждает, что исправление разделяет служебный режим и вывод реальных характеристик. Пустые свойства исключаются, но штатная заготовка Аспро остаётся доступной для JavaScript.


Почему это важно

Чистая HTML-структура

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

Корректная семантика

Если значение характеристики отсутствует, соответствующий элемент вообще не создаётся.

Это корректнее, чем выводить название свойства без значения.

Снижение количества лишних элементов DOM

В карточках с большим количеством характеристик и SKU пустые строки могут создавать значительное количество бесполезных HTML-элементов.

Корректная работа автоматических систем

HTML страницы анализируют не только браузеры, но и:

  • поисковые роботы;
  • SEO-краулеры;
  • товарные парсеры;
  • внутренние системы поиска;
  • сервисы формирования фидов;
  • системы анализа карточек товаров.

Пустые свойства и служебные значения могут создавать некорректные пары «название — значение» и ухудшать качество автоматически извлекаемых данных.

Наличие #PROP_TITLE# и #PROP_VALUE# внутри корректного элемента <template> не следует считать самостоятельной критической SEO-ошибкой. Важнее исключить их попадание в реальные характеристики и не выводить свойства без значения.


Проверка после внедрения

После изменения файла необходимо:

  1. Сохранить резервную копию исходного шаблона.
  2. Очистить кеш Битрикс.
  3. Очистить композитный кеш.
  4. Открыть карточку товара в режиме инкогнито.
  5. Проверить характеристики родительского товара.
  6. Последовательно переключить все торговые предложения.
  7. Проверить изменение характеристик каждого SKU.
  8. Убедиться, что пустые строки не появляются.
  9. Проверить консоль браузера на наличие JavaScript-ошибок.
  10. Повторно сохранить исходный HTML страницы.
Критерии успешной проверки

Важное замечание об обновлениях решения

Если изменение внесено непосредственно в штатный файл шаблона «Аспро: Максимум», оно может быть перезаписано при обновлении решения.

Перед обновлением Аспро необходимо сохранить изменённый файл отдельно или зафиксировать изменение в системе контроля версий.


После обновления следует сравнить новую штатную версию файла со своей доработкой и при необходимости повторно перенести проверку пустых свойств.

Итог

Проблема заключалась не в самом наличии служебного HTML-шаблона, а в том, что общий файл не различал:

  • формирование служебной заготовки;
  • вывод настоящего свойства без значения.

После исправления:

  • служебные маркеры сохраняются для JavaScript;
  • пустые реальные характеристики не попадают в HTML;
  • заполненные свойства отображаются штатно;
  • переключение торговых предложений продолжает работать;
  • HTML карточки товара становится чище и семантически корректнее.

Рекомендуется реализовать подобную проверку в штатном шаблоне решения «Аспро: Максимум», чтобы пустые реальные характеристики автоматически исключались из HTML во всех карточках товаров.


Как задать индивидуальное Open Graph-изображение для произвольной страницы в Аспро: Максимум

В этой статье разберём, как настроить отдельное изображение для превью страницы в Telegram, социальных сетях и мессенджерах, если страница создана обычным PHP-файлом и не является элементом инфоблока.

Исходная задача

Для страницы /company/ требовалось установить отдельное изображение Open Graph:

https://parfumersha.by/upload/og/parf-by-og-mobile-optimized.jpg

Это изображение должно было использоваться при отправке ссылки:

https://parfumersha.by/company/

в Telegram и другие сервисы, которые формируют превью страницы на основании метатега og:image.

В чём была проблема

Страница «О магазине» была создана как произвольная PHP-страница:

/company/index.php

Она не является элементом инфоблока, поэтому у неё нет стандартных полей:

  • «Картинка для анонса»;
  • «Детальная картинка»;
  • свойств элемента инфоблока.

У товарных карточек Аспро может автоматически брать Open Graph-изображение из картинки анонса или детальной картинки элемента. У обычной PHP-страницы такого источника нет.

Поэтому Аспро подставляло глобальное изображение сайта — логотип:

https://parfumersha.by/upload/CMax/543/54342cb11af388cb8af9e11b05224d45.png

В итоговом HTML выводилось:

<meta property="og:image"
      content="https://parfumersha.by/upload/CMax/543/54342cb11af388cb8af9e11b05224d45.png">

<link rel="image_src"
      href="https://parfumersha.by/upload/CMax/543/54342cb11af388cb8af9e11b05224d45.png">

Почему нельзя было просто вставить метатег в HTML страницы

Сначала была попытка добавить метатег непосредственно в содержимое страницы:

<meta property="og:image"
      content="https://parfumersha.by/upload/og/parf-by-og-mobile-optimized.jpg">

Но содержимое PHP-страницы выводится уже внутри тега <body>.

Метатеги Open Graph должны находиться внутри <head>. Если вставить их в контент страницы, они либо не будут использоваться, либо окажутся в неправильной части HTML-документа.

Кроме того, шаблон Аспро самостоятельно формирует свой набор Open Graph-тегов, поэтому простое добавление второго og:image могло привести к появлению дубликатов.

Как Аспро формирует Open Graph

В решении «Аспро: Максимум» для добавления индивидуальных метаданных используется метод:

\CMax::AddMeta()

Именно через него в товарных карточках передаются:

  • og:title;
  • og:description;
  • og:image;
  • другие Open Graph-параметры.

Чтобы сохранить штатную логику Аспро, для произвольной страницы лучше также использовать \CMax::AddMeta(), а не выводить метатеги вручную.

Первое рабочее решение

Для проверки в PHP-файл страницы был добавлен прямой вызов:

\CMax::AddMeta(
    array(
        "og:image" => "/upload/og/parf-by-og-mobile-optimized.jpg",
    )
);

После очистки кеша в исходном коде страницы появилось:

<meta property="og:image"
      content="https://parfumersha.by/upload/og/parf-by-og-mobile-optimized.jpg">

<link rel="image_src"
      href="https://parfumersha.by/upload/og/parf-by-og-mobile-optimized.jpg">

Это подтвердило, что метод \CMax::AddMeta() работает и корректно переопределяет стандартную картинку Аспро.

Недостаток прямого указания адреса

При прямой записи путь к изображению находился внутри PHP-кода:

"og:image" => "/upload/og/parf-by-og-mobile-optimized.jpg"

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

/company/index.php

Это неудобно и создаёт лишний риск ошибки в PHP-коде.

Финальное решение

Для страницы было создано дополнительное пользовательское свойство:

OG_IMAGE

В свойство записывается путь к изображению:

/upload/og/parf-by-og-mobile-optimized.jpg

В PHP-файле страницы это свойство задаётся стандартным способом Битрикс:

$APPLICATION->SetPageProperty(
    "OG_IMAGE",
    "/upload/og/parf-by-og-mobile-optimized.jpg"
);

Далее PHP-код получает значение этого свойства:

$ogImage = trim(
    (string)$APPLICATION->GetPageProperty("OG_IMAGE")
);

Если поле заполнено, значение передаётся в штатный механизм Аспро:

if ($ogImage !== "") {
    \CMax::AddMeta(
        array(
            "og:image" => $ogImage,
        )
    );
}

Полный рабочий блок

Этот код размещается в начале PHP-файла страницы после настройки заголовков и свойств страницы.

<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");

$APPLICATION->SetPageProperty(
    "OG_IMAGE",
    "/upload/og/parf-by-og-mobile-optimized.jpg"
);

$APPLICATION->SetPageProperty("BLOG_PAGE", "N");
$APPLICATION->SetPageProperty("HIDE_LEFT_BLOCK", "Y");
$APPLICATION->SetPageProperty("WIDE_PAGE", "Y");

$APPLICATION->SetPageProperty(
    "description",
    "PARF.BY — магазин оригинальной парфюмерии в Минске. Товары в наличии и под заказ с получением в магазине по адресу: ул. Веры Хоружей, 2."
);

$APPLICATION->SetPageProperty(
    "keywords",
    "PARF.BY, магазин парфюмерии Минск, оригинальная парфюмерия"
);

$APPLICATION->SetPageProperty(
    "title",
    "О магазине PARF.BY — оригинальная парфюмерия в Минске"
);

$APPLICATION->SetTitle("О магазине PARF.BY");

/* Получаем индивидуальную Open Graph-картинку */
$ogImage = trim(
    (string)$APPLICATION->GetPageProperty("OG_IMAGE")
);

if ($ogImage !== "") {

    /*
     * Если путь указан без протокола и без начального слеша,
     * автоматически добавляем слеш.
     */
    if (
        strpos($ogImage, "http://") !== 0 &&
        strpos($ogImage, "https://") !== 0 &&
        strpos($ogImage, "/") !== 0
    ) {
        $ogImage = "/" . $ogImage;
    }

    \CMax::AddMeta(
        array(
            "og:image" => $ogImage,
        )
    );
}
?>

Какие значения можно указывать

Код поддерживает несколько вариантов значения свойства OG_IMAGE.

1. Относительный путь с начальным слешем

/upload/og/parf-by-og-mobile-optimized.jpg

Это рекомендуемый вариант для файлов, находящихся на текущем сайте.

2. Относительный путь без начального слеша

upload/og/parf-by-og-mobile-optimized.jpg

Код автоматически преобразует его в:

/upload/og/parf-by-og-mobile-optimized.jpg

3. Полный URL

https://parfumersha.by/upload/og/parf-by-og-mobile-optimized.jpg

Полный адрес также будет передан в Аспро без изменений.

4. Пустое значение

Если свойство OG_IMAGE не заполнено, вызов \CMax::AddMeta() не выполняется.

В этом случае Аспро продолжит использовать стандартную глобальную Open Graph-картинку сайта.

Возможные результаты

Вариант 1. Свойство OG_IMAGE заполнено

В <head> будет выведено индивидуальное изображение страницы:

<meta property="og:image"
      content="https://parfumersha.by/upload/og/parf-by-og-mobile-optimized.jpg">
Вариант 2. Свойство OG_IMAGE не заполнено

Дополнительный метатег не создаётся. Аспро использует стандартное изображение, заданное в настройках решения.

Вариант 3. Указан неправильный путь

Метатег будет сформирован, но Telegram и другие сервисы не смогут загрузить файл. Поэтому после сохранения необходимо открыть URL изображения напрямую в браузере.

Что ещё было исправлено в HTML страницы

В PHP-файле после подключения:

/bitrix/header.php

находились повторные теги:

</head>
<body>

Также весь контент страницы был ошибочно обёрнут в:

<p>
    ...
</p>

Файл /bitrix/header.php уже формирует <head> и открывает <body>. Повторно добавлять эти теги в содержимое страницы нельзя.

Корректная структура произвольной страницы должна выглядеть так:

<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");

/* PHP-настройки страницы */

?>

<style>
    /* Стили страницы */
</style>

<main class="company-page">
    Содержимое страницы
</main>

<script type="application/ld+json">
{
    /* Микроразметка */
}
</script>

<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");
?>

Как проверить результат

  1. Сохранить страницу.
  2. Очистить кеш Битрикс и композитный кеш.
  3. Открыть страницу в браузере.
  4. Нажать Ctrl + U или открыть исходный код страницы.
  5. Найти строку og:image.
  6. Убедиться, что в документе присутствует только один метатег og:image.

Ожидаемый результат:

<meta property="og:image"
      content="https://parfumersha.by/upload/og/parf-by-og-mobile-optimized.jpg">

<link rel="image_src"
      href="https://parfumersha.by/upload/og/parf-by-og-mobile-optimized.jpg">

Проверка превью в Telegram

Telegram кеширует изображения и описание страниц. Поэтому после изменения Open Graph-тегов он может некоторое время показывать старую картинку.

Для повторной проверки можно временно добавить к адресу параметр:

https://parfumersha.by/company/?v=2

Страница останется той же, но Telegram воспримет URL как новый и может заново сформировать превью.

Итог

Для произвольных PHP-страниц в Аспро: Максимум индивидуальную Open Graph-картинку удобно хранить в пользовательском свойстве страницы OG_IMAGE.

PHP-код получает значение через GetPageProperty() и передаёт его в штатный метод \CMax::AddMeta().

В результате:

  • изображение можно менять через свойства страницы;
  • не нужно редактировать путь внутри рабочего PHP-кода;
  • не создаются дублирующие метатеги;
  • сохраняется штатный механизм Open Graph решения Аспро;
  • при пустом поле остаётся стандартная картинка сайта;
  • решение можно повторно использовать на других произвольных страницах.

Практический результат: страница https://parfumersha.by/company/ получила собственное изображение для превью, а управление адресом картинки было вынесено в дополнительное свойство OG_IMAGE.

Есть вопрос?

задать вопрос

Публикация новых ошибок

Написать