Устранение ошибок Битрикс после обновления PHP до 8.2

Выпала задача обновить на одном из сайтов PHP с 7.3 до 8.2. на операционной системе RedOS. Далее что делал.

Обновление PHP

dnf install php81-release
dnf clean all
dnf makecache
dnf update php

Обновление БД

alter table b_iblock_element_property modify ID bigint not null auto_increment;

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

После чего лично у меня стала вылезать ошибка вида:

count(): Argument #1 ($value) must be of type Countable|array, null given (0)
/var/www/html/bx-site/bitrix/templates/aspro-allcorp2/components/bitrix/news.detail/services/component_epilog.php:21

На строки в коде вида:

<?if(count($templateData['GALLERY_BIG'])):?>

А всё просто. Если в PHP 7.3 допустимо было так обращаться к переменным не являющимися массивами, то в PHP 8.2, где введено более строгое отношение к типизации, так уже нельзя. Поэтому все подобные конструкции нужно заменить на вида:

<?php
$templateData['GALLERY_BIG'] = (array)$templateData['GALLERY_BIG'];
if(count($templateData['GALLERY_BIG'])):
....
?>

Ну или я просто поискал все подобные конструкции которые встречаются в файле и в шапку добавил:

$templateData['VIDEO'] = (array)$templateData['VIDEO'];
$templateData['VIDEO_IFRAME'] = (array)$templateData['VIDEO_IFRAME'];
$templateData['GALLERY_BIG'] = (array)$templateData['GALLERY_BIG'];
$templateData['LINK_SALE'] = (array)$templateData['LINK_SALE'];
$templateData['LINK_NEWS'] = (array)$templateData['LINK_NEWS'];
$arElement['PROPERTY_LINK_STAFF_VALUE'] = (array)$arElement['PROPERTY_LINK_STAFF_VALUE'];

RedOS: обновление ядра Linux

Узнать текущую. версию ядра:

uname -a

Обновить текущее ядро:

dnf update kernel-lt

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

dnf remove --oldinstallonly --setopt installonly_limit=2 kernel

Уведомления пользователю в Astra Linux

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

1) notify-send

notify-send --urgency normal --expire-time=10000 -i typing-monitor -h int:x:500 -h int:y:500 "Внимание!" "В ITIL висит задача срок которой скоро подходит к концу!"

2) fly-dialog

fly-dialog --passivepopup "В ITIL висит задача срок которой скоро подходит к концу!" 10

3) qdbus

qdbus org.kde.plasmashell /org/kde/osdService showText "" "Уважаемый, у тебя куча инцидентов не закрытых в ИТИЛ!"

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

JavaScript: улучшаем понимание работы функций

Классически функция объявляется используется примерно так:

function Inc(s,n){
  return s+n;
};

Однако её можно объявить и так:

const Inc=(s,n)=>{
  return s+n; 
}

Кроме того! Можно еще короче, используя не явный return:

const Inc=(s,n)=>s+n;

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

const People=(name,soname,age,comment)=>({
  name:name,
  soname:soname,
  age:age,
  comment:comment
});

aa=People("Вася","Сидоров",18,"Вася обычный школьник")

Или например добавить событие onClick к кнопке на странице при помощи стрелочных функций:

but=document.getElementById('#button1');
but.onclick=()=>{
  console.log("Вася нажал кнопку");
}

Выглядит гораздо проще, чем если бы мы использовали «классическую» запись:

function VasyaPress(){
   console.log("Вася нажал кнопку");
};
but=document.getElementById('#button1');
but.onclick=VasyaPress();

Но! только если код внутри функции не сильно длинный. Иначе всё превращается в кашу.

1С: Поиск элемента справочника с одинаковыми кодами.

1С позволяет создавать элементы справочника (да и документа) с одинаковыми кодами (номерами), в этом случае поиск элемента по типичному:

 справочники.ГруппыПользователей.НайтиПоКоду("123");

Становится невозможным. Есть несколько вариантов решения данной проблемы:

1) Можно поискать по заведомо уникальному реквизиту (если есть):

 справочники.ГруппыПользователей.НайтиПоРеквизиту("Артикул","123");

2) Можно поискать по уникальному идентификатору (если известен):

доко.ТекущийЭтап=Справочники.itilprofЭтапыМаршрутов.ПолучитьСсылку(Новый УникальныйИдентификатор("149e1ab6-325f-11ec-9560-005056be733d"));

3) Можно поискать по сочетанию факторов, которые сделают элемент уникальным (в данном случае по владельцу):

ТекДок.ТекущийЭтап			= справочники.itilprofЭтапыМаршрутов.НайтиПоКоду("Регистрация",,,Справочники.itilprofМаршруты.НайтиПоНаименованию("Инцидент"));
1 7 8 9 10 11 303