Идеи для: Главный модуль

Рейтинг: 0.8582  
На голосовании
Предложил Masiutin Maxim 17.05.2017 11:54:14

Возможность удаления с диска кода неиспользуемых модулей

Предлагаю добавить возможность удаления кода неиспользуемых модулей из /bitrix/modules/

Нам доступен 31 модуль, но используем мы лишь малую часть из всего числа модулей. Если удалить их код на диске из /bitrix/modules/ - то перестаёт правильно работать система обновлений, т.к. возникает ошибка при проверке версии отсутствующих модулей (а точнее, модуля "Highload-блоки";), проблема в коде PHP, но если его немного исправить, то обновления проходят нормально. https://idea.1c-bitrix.ru/to-do-a-normal-update-without-the-illegal-string-offset-version-0-and-/

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

Возможность удаления кода неиспользуемых модулей из /bitrix/modules/ путем удаления администратором соответствующих файлов и папок на диске, или просто через shell или средствами «Битрикс Управление Сайтом» должна нормально восприниматься данной системой, а вышеуказанное исправление должно войти в стандартный состав «из коробки».
Рейтинг: 0  
На голосовании
Предложил Masiutin Maxim 14.05.2017 14:38:34

Сделать нормально обновление - без "Illegal string offset 'VERSION' (0)" и без хакерских eval(base64decode(фрагменты c конкатенацией в update_client.php - как делают трояны

При обновлении платформы "Битрикс Управление Сайтом", число обновлений отображалось правильно на закладке «Установка обновлений», но перейти на закладку «Список обновлений» было нельзя, при нажатии возникала ошибка в браузере, см. первый снимок экрана.


Одновременно с этим, незаметно в журнале ошибок PHP появлялась ошибка Illegal string offset “VERSION”. Ошибка была в файле update_system.php, из-за чего он, очевидно, прекращался, выводился не до конца, и, как результат, не выводил скрипты, с помощью которых можно переходить на другие закладки.

Illegal string offset 'VERSION' (0)
/home/site/public_html/bitrix/modules/main/admin/update_system.php:2022
#0: require_once(string)
/home/site/public_html/bitrix/admin/update_system.php:2
----------



Я в коде update_system.php добавил проверки существования массива “VERSION”, внес изменения, после чего ошибки прекратились, обновления проверились, на закладку «Список обновлений» перейти смог.

Почему не работал скрипт и почему не было массива “VERSION” – мне неизвестно. Скорее всего, что update_system.php не предусматривал варианта, при котором не будет массива “VERSION”, и поэтому не работал, когда не было массива “VERSION”. После того, как я добавил проверку наличия массива “VERSION”, как показано на снимках, всё заработало.

Предлагаю разработчикам "Битрикс Управление Сайтом" доработать update_system.php, чтобы когда нет массива “VERSION”, скрипт нормально отрабатывал.


P.S. Там же нашел файл update_client.php – думал сначала что это троян, у него там идут хакерские конкатенации, декодирование из base64 и eval() – так себя маскируют трояны. Какой смысл так делать?

P.S.S. И не даёт создать обращение через техподдержку http://www.1c-bitrix.ru/ , говорит "не выбрана категория обращения", предлагает приобрести тариф за 990 рублей, хотя у нас на www.ritlabs.com лицензия действующая. Если у вас на http://www.1c-bitrix.ru/ выбираю категорию "обновление", получаю ошибку "не выбрана категория", следовательно не даёт создать обращение. То есть фактически не могу создать ниодного обращения. Поэтому написал сюда.
Рейтинг: 3.5135  
На голосовании
Предложил Masiutin Maxim 04.05.2017 20:03:41

Ускорение всей работы «Битрикс Управление Сайтом» за счет ликвидации медленных некешируемых запросов к базе данных для сравнения времени активности групп пользователей и замену их быстрыми кешируемыми запросами

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

Сейчас при авторизации пользователя или при получения списка групп, в которых он состоит, проверка срока действия принадлежности этого пользователя к той или иной группе производится сервером базы данных, за счет сравнения периода начала и окончания действия привязки к группе с результатом функции СУБД MySL NOW().
Вызов NOW() не даёт СУБД закешировать запрос. Если у нас больше ста тысяч пользователей, то каждая авторизация могла бы проходить быстрее, за счет использования кеша MySQL.
Предлагаю ускорить работу за счет того, что операции сравнения времени переложить на PHP, а база данных будет лишь возвращать эти данные без какого-либо сравнения, что позволит её закешировать запрос.

Ищем в коде места следующие места
((UG.DATE_ACTIVE_FROM IS NULL) OR (UG.DATE_ACTIVE_FROM <=
((UG.DATE_ACTIVE_TO IS NULL) OR (UG.DATE_ACTIVE_TO >=
(окончанием этих строк будет вызов функции Now())

-    Например в /bitrix/modules/main/classes/general/user.php – и изменяем код PHP, формирующий SQL-запросы, убираем даты из WHERE и добавляем их в начало SEL ECT
Таким образом, запрос и его обработка будут примерно такими:

      $strSql =
   "SELECT ".
   "UG.DATE_ACTIVE_FROM, ".
   "UG.DATE_ACTIVE_TO, ".
   "UG.GROUP_ID ".
   "FR OM b_user_group UG ".
   "WHERE UG.USER_ID = ".$ID." ";
 $res = $DB->Query($strSql, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
 $now_timestamp = time();
 while ($r = $res->Fetch())
 {
   if (array_key_exists("DATE_ACTIVE_FROM", $r))
   {
$from = $r["DATE_ACTIVE_FROM"];
if (strlen($from)>8)
     {
 $from_timestamp = strtotime($from);
 if ($from_timestamp > $now_timestamp) continue;
}
   }

   if (array_key_exists("DATE_ACTIVE_TO", $r))
   {
$to = $r["DATE_ACTIVE_TO"];
if (strlen($to)>8)
{
 $to_timestamp = strtotime($to);
 if ($to_timestamp < $now_timestamp) continue;
}
   }

   $arr[] = intval($r["GROUP_ID"]);
 }

… и так во всех местах.

Не забываем и про D7:
Находим метод public static function getUserGroupIds($userId)
убираем    
$nowTimeExpression = new SqlEx * pression(
static::getEntity()->getConnection()->getSqlHelper()->getCurrentDateTimeFunction()
   );


Далее по тексту, после
   $result = GroupTable::getList(array(
'select' => array('ID',

добавляем
'UserGroup:GROUP.DATE_ACTIVE_FROM',
'UserGroup:GROUP.DATE_ACTIVE_TO',
),

а также убираем следующие строки:

     array(
   'LOGIC' => 'OR',
   '=UserGroup:GROUP.DATE_ACTIVE_FROM' => null,
   '<=UserGroup:GROUP.DATE_ACTIVE_FROM' => $nowTimeExpression,
 ),
 array(
   'LOGIC' => 'OR',
   '=UserGroup:GROUP.DATE_ACTIVE_TO' => null,
        '>=UserGroup:GROUP.DATE_ACTIVE_TO' => $nowTimeExpression,
 ),



обработка массива будет немного отличаться, т.к. время начала возвращается не в строках, а в объектах. Вот такой будет обработка:

  $timetamp_now = time();
   while ($row = $result->fetch())
   {
if (array_key_exists("MAIN_GROUP_MAIN_USER_GROUP_GROUP_DATE_ACTIVE_FROM", $row))
{
 $from = $row["MAIN_GROUP_MAIN_USER_GROUP_GROUP_DATE_ACTIVE_FROM"];
 if (is_object($from))
 {
   $from_timestamp = $from->getTimestamp();
   if ($from_timestamp > $timetamp_now) continue;
 }
     }

if (array_key_exists("MAIN_GROUP_MAIN_USER_GROUP_GROUP_DATE_ACTIVE_TO", $row))
{
 $to = $row["MAIN_GROUP_MAIN_USER_GROUP_GROUP_DATE_ACTIVE_TO"];
if (is_object($to))
 {
   $to_timestamp = $to->getTimestamp();
   if ($to_timestamp < $timetamp_now) continue;
 }
}
$groups[] = intval($row['ID']);
   }

   sort($groups);

   return $groups;

 
Рейтинг: 1.3564  
На голосовании
Предложил Masiutin Maxim 04.05.2017 19:06:01

Ускорение всей работы «Битрикс Управление Сайтом» за счет ликвидации ненужных некешируемых запросов к базе данных для получения статуса IS_ONLINE при вызове CUser::GetByID

Предлагаю Ускорение всей работы «Битрикс Управление Сайтом» за счет ликвидации ненужных некешируемых запросов к базе данных для получения статуса IS_ONLINE при вызове CUser::GetByID


В различных местах «Битрикс Управление Сайтом» есть очень много вызовов CUser ::GetByID , которая, в свою очередь, вызывает CUser::GetList без arParams, то есть запрашивает все параметры пользователя, включая IS_ONLINE, который использует функцию NOW() и не даёт MySQL кешировать результат запроса. См. https://dev.1c-bitrix.ru/api_help/main/reference/cuser/getlist.php Цитирую «FIELDS (с версии ядра 11.0.13) - массив с идентификаторами полей для выборки. Если не указан или пустой, то выбираются все поля”  (в том числе IS_ONLINE). Однако в подавляющем большинстве случаев, при вызове CUser::GetByID нужно всего лишь несколько параметров, а не все, и тем более не IS_ONLINE. Остальные параметры запрашиваются впустую. Например, шаблон отображения файла на форуме вызывает CUser::GetByID чтобы отобразить лишь имя пользвоателя, а IS_ONLINE и NOW() не дают кешировать запрос, что замедляет отображение страниц форума. Особенно это критично, когда страницы форумов запрашивают роботы поисковиков в больших количествах.  
В \bitrix\modules\main\classes\mysql\user.php мы видим такой код:
    $arSelectFields['IS_ONLINE'] =  "IF(U.LAST_ACTIVITY_DATE > DATE_SUB(NOW(), INTERVAL ".$online_interval." SECOND), 'Y', 'N') IS_ONLINE";
В документации MySQL мы видим, что NOW() препятствует кешированию запроса: https://dev.mysql.com/doc/refman/5.5/en/query-cache-operation.html

Я предлагаю:
1. Добавить в CUser ::GetByID второй, необязательный параметр – массив названий полей. Если этот параметр не задан, то запрашиваются все поля, как и раньше. Если задан – то только запрашиваемые поля.
2. Проверить во всём коде «Битрикс Управление Сайтом» и во всех шаблонах все вызовы CUser ::GetByID и перечислить только нужные поля (если вариант №1 неприемлем, то можно все CUser ::GetByID заменть на CUser::GetList .
Опишем коротко где какие параметры нужны:
1. /bitrix/components/bitrix/forum.interface/templates/show_file/template.php  -- больше всего тормозов приходилось на этот шаблон. Ему нужны только следующие параметры: "ID", "NAME", "LAST_NAME", "SECOND_NAME", "TITLE", "EMAIL", "LOGIN"
2. /bitrix/modules/support/admin/ticket_dict_list.php - "NAME","LAST_NAME","LOGIN","ID"
3. /bitrix/modules/support/admin/ticket_edit.php - "LOGIN", "NAME", "LAST_NAME"
4. /bitrix/modules/support/classes/general/reminder.php - "ID", "LOGIN", "NAME", "LAST_NAME"
5. /bitrix/modules/support/classes/general/email.php – в одном месте только “EMAIL”, в другом – только „ID”
6. /bitrix/modules/support/classes/general/support.php  - "LOGIN", "NAME", "LAST_NAME", "EMAIL"
7. /bitrix/modules/forum/classes/general/user.php – в первом месте только PERSONAL_PHOTO, во втором месте "ID", "NAME", "LAST_NAME", "SECOND_NAME", "TITLE", "EMAIL", "LOGIN"
8. /bitrix/modules/main/classes/general/time.php - "AUTO_TIME_ZONE", "TIME_ZONE", "TIME_ZONE_OFFSET"
9. /bitrix/modules/main/classes/general/user.php – в первом месте только UF_DEPARTMENT, во втором - "ID", "PASSWORD", в третьем - "NAME", "LAST_NAME", "LOGIN", в четвёртом тоже "NAME", "LAST_NAME", "LOGIN", в пятом тоже "NAME", "LAST_NAME", "LOGIN"
10.   /bitrix/modules/main/classes/general/event_log.php – только ID

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

Это я перечислил основные файлы – изменений немного, а выигрыш в скорости – существенный – плюс мы получаем нормальное кеширование средствами MySQL.
Рейтинг: 0.705  
На голосовании
Предложил Статиевский Данила 28.03.2017 06:49:47

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

Сейчас служебная процедура "Временное закрытие публичной части сайта" из настроек главного модуля не учитывает многосайтовость и закрывает публичную часть всех сайтов на системе управления.
Мне кажется, что достаточно очевидна необходимость выборочного закрытия публичной части для выборочных сайтов на одной системе управления.
Рейтинг: 2.2384  
На голосовании
Предложил Парыгин Никита 06.02.2017 10:10:14

Выпущены обновления для вашего Битрикса

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

У нас N сайтов на Битриксе и когда приходит такое сообщение не понятно от какого сайта и какой сайт обновлять)
Рейтинг: 0.0764  
На голосовании
Предложил Неслуховский Иван 06.02.2017 09:01:25

В визуальном редакторе поддерживать поиск по идентификаторам компонентов и выводить название/описание перед выбором

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

То же с поиском. Если я нашёл в документации компонент (условно говоря bitrix:sale.personal.section), я его никак не найду в списке компонентов.

Сейчас нигде не выводится краткое описание компонента, кроме настроек. Хотя это описание в первую очередь нужно для выбора компонента, потом оно уже не нужно.

Предлагаемые изменения:
  • выводить название компонента в подсказке при наведении курсора на иконку компонента (как в меню, так и в рабочем поле визуального редактора)
  • то же, но при нажатии на компонент. где-то внизу должно выводиться название
  • описание должно появляться во всплывающей подсказке
  • в поиске компонентов поиск должен идти также по идентификаторам
Рейтинг: 0.1164  
На голосовании
Предложил Неслуховский Иван 27.01.2017 20:12:14

На страницах "Командная PHP-строка" и "SQL запрос к базе данных" хранить библиотеку заготовок

Часто для обслуживания сайта требуется использование рутинных скриптов, которые используются лишь время от времени, а потому забываются, но каждый раз писать их где-то, потом находить сложно.
Если бы заготовки хранились прямо на сайте, это было бы удобно.
Рейтинг: 0  
В работе
Предложил Ганин Дмитрий 10.01.2017 12:25:50

Удалить дублирующий класс SystemException

В главном модуле есть класс SystemException, файл /bitrix/modules/main/lib/systemexception.php,  и его дубль в файле /bitrix/modules/main/lib/exception.php
Рейтинг: 0.0001  
Ответил Жуков Евгений 10.01.2017 13:30:54
Файла /bitrix/modules/main/lib/systemexception.php в продукте нет.

P.S. Проблему зафиксировали, именно с дистрибутивами. Поправим в ближайшее время.
Рейтинг: 3.3344  
На голосовании
Предложил Tre 19.12.2016 00:12:58

Разобраться с ошибками в коде (notice, warning etc)

Пытался на днях мониторить систему. Это ж капец, на 1 хит 127 уникальных ошибок (notice, warning). Невозможно включить отлов warning, notice. Они все утонут в битриксе. Конечно, можно делать поиск по ссылкам на свои скрипты, но это не вариант.

1

Выставил

'handled_errors_types' => E_ALL ,
Рейтинг: 4.8327  
На голосовании
Предложил Клёпов Роман 31.08.2016 17:23:11

Поправьте баг с Переместить весь Javascript в конец страницы

Добрый день, коллеги!

Обнаружил баг при отмеченной опции "Переместить весь Javascript в конец страницы" главного модуля.

Суть: при закомментированном коде <sc ript> метод ядра перемещает его в конец страницы. Таким образом "отключенный" <sc ript> начинает работать.

Исправьте, пожалуйста, баг.
Рейтинг: -0.3392  
Отложено
Предложил Кирсанов Анатолий 22.08.2016 03:45:12

Регулярное резервное копирование раз в месяц

Более частое архивирование делается силами панели управления сервера. Если и использовать Битрикс в таком случае, то только для подстраховки.

Пока в голову приходит только:
Bitrix\Main\Config\Option::set("main", "dump_auto_interval_auto", "30"); 
Но эту команду предстоит выполнять каждый раз, когда меняешь настройки регулярного резервного копирования.
Рейтинг: -0.1658  
Ответил Шаромов Денис 07.03.2017 19:02:14
Очень частная задача. В подавляющем большинстве случаев резервная копия делается чаще.
Я бы рекомендовал делать регулярное резервное копирование только базы средствами битрикса в наше облако. К сожалению, случаются ситуации, когда на хостинге теряются резервные копии. В этом случае ваша актуальная база данных будет в сохранности.  
Рейтинг: 1.2676  
На голосовании
Предложил Born 16.08.2016 20:34:10

system.field.edit рихтуйте

Вторую жизнь обретают поля типа UF_ , справочники, д-седьмые ядра, и то и сё. Но, традиционно, часть для людей по ним в загоне, что по доке, что по коду.
В частности, сабжевый компонент родной, поле типа дата. В админке ставим запрет на редактирование пользователем. Шаблон честно ставит текст-инпуту атрибут readonly. И выводит рядом яваскриптовый календарик, которому на эту readonly-евость положить с прибором, он меняет дату в поле явою.
Смысл поста, кроме как сообщить о недоработке (на всякий извинюсь, а вдруг так специально задумано, мало ли), еще натолкнуть на идею потщитильнее прорихтовать темку UF_ для людей.
Рейтинг: 6.1261  
На голосовании
Предложил Долганин Антон 21.07.2016 10:51:23

Loader::includeModule - научить принимать массив (либо дать метод-аналог)

Часто модули идут парно, и тогда пишешь такие условия перед использованием
if (\Bitrix\Main\Loader::includeModule('crm') && \Bitrix\Main\Loader::includeModule('iblock'))

Предлагаю наделить метод возможностью передавать массив, или дать аналогичный метод:
if (\Bitrix\Main\Loader::includeModule(array('crm', 'iblock'))) 


Тогда метод вернет true в случае подключения всех модулей из списка.  
Рейтинг: 7.9843  
На голосовании
Предложил Долганин Антон 21.07.2016 07:27:42

Календарь - кнопка "сегодня"

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


Рейтинг: 14.1982  
На голосовании
Предложил Салихов Ильяс 15.07.2016 12:44:17

Поддержка Composer и стандарта автозагрузки PSR-0

Для PHP на https://packagist.org/statistics выложено уже порядка 100 тысяч (!) библиотек, компонентов, бандлов и фреймворков. При разработке проектов, в том числе на Битриксе логично использовать готовые решения, если они помогают в решения задачи. Все подобные пакеты ставятся через Composer, который генерирует файл autoload.php в соответствии с PSR-0.

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

Я видел идею http://idea.1c-bitrix.ru/implement-the-ability-to-install-bitrix-using-composer/, но она про установку битрикса через composer, это как раз не так критично, а вот подключение внешних библиотек в проект было бы очень полезной вещью.
Рейтинг: 1.1999  
Новая
Предложил Ульянов Владимир 14.07.2016 06:20:22

HttpClient, асинхронность

В документации по вебсокетам в php указанно, что можно работать асинхронно ( http://php.net/manual/ru/function.stream-socket-client.php ), однако в классе httpClient нет такой возможности.

Просьба добавить.
Рейтинг: 0.2915  
На голосовании
Предложил Селихов Владимир 09.07.2016 13:39:30

Cортировать список перечислений свойства типа "Список" по "значению", "названию значения" (не используя при этом поле "Сортировка"

На сайте следующая проблема. В качестве свойств торгового предложения можно выбрать только тип свойства "Список". Подразумевается завести свойство "Размер" в котором будут перечисляться значения вида "10х20х30" и таких значений очень много. Можно ли каким то образом при добавлении нового значения в список иметь возможность сортировать по значению названию значения (не используя при этом поле "Сортировка"
Рейтинг: 5.1109  
На голосовании
Предложил Долганин Антон 24.06.2016 14:09:00

А это только у меня после ввода логина и пароля мышка тянется сюда?

Почему-то создается впечатление, что кнопка действия это именно нижняя. Прокол в юзабилити.