Перейти к содержимому


Событие изменения поля при прямой записи в БД


Сообщений в теме: 10

#1 Anton1

    Участник

  • Пользователи
  • PipPip
  • 20 сообщений
  • Пол:Мужчина

Отправлено 30 Ноябрь 2021 - 08:27

Возможно ли внутри КБ вызвать событие изменения поля если оно изменено внешним скриптом напрямую в БД?

#2 AntonKravchenko

    Активный участник

  • Пользователи
  • PipPipPip
  • 152 сообщений
  • Пол:Мужчина
  • Город:Нижний Новгород

Отправлено 30 Ноябрь 2021 - 12:56

вроде как нет, но можно сделать чуть иначе:
1. Добавьте скрытое поле
2. При записи в БД скриптом меняйте и это поле (например, с 0 на 1)
3. Запускайте крон, который будет включаться только для записей, где это поле = 1
4. По крону запускайте необходимые коды
5. Обнуляйте то поле (1 -> 0) этим же кроном

#3 Anton1

    Участник

  • Пользователи
  • PipPip
  • 20 сообщений
  • Пол:Мужчина

Отправлено 01 Декабрь 2021 - 19:00

Ну реализация то с помощью подобных костылей понятна, но интересует именно создание события как это происходит в самой КБ.
Как оно кстати происходит? Может быть после записи в БД можно вызвать какой то скрипт передав ему параметром список полей которые были обновлены?

#4 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 761 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 02 Декабрь 2021 - 17:50

А вам зачем менять напрямую в БД если все равно вы потом хотите вызвать скрипт для запуска событий? Меняйте через API, или в том же скрипте с использованием функций КБ. Для принудительного вызова событий все равно потребуется подключать в скрипте ядро КБ, так проще на мой взгляд сразу использовать запросы КБ с включенной обработкой событий, чем самому их формировать.

#5 Anton1

    Участник

  • Пользователи
  • PipPip
  • 20 сообщений
  • Пол:Мужчина

Отправлено 02 Декабрь 2021 - 20:50

Существует веб-ресурс который напрямую использует данные из БД КБ, читает/пишет. При записи необходимо запускать вычисления внутри КБ. Снаружи эти вычисления реализовать невозможно, т.к. ресурс не имеет полного доступа ко всем таблицам КБ, но и это не удобно. Если бы в АПИ была функция вызова ивента по конкретным полям, это подошло бы, но переводить весь функционал ресурса на АПИ не представляется возможным.

#6 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 761 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 10 Декабрь 2021 - 15:52

Просмотр сообщенияAnton1 (02 Декабрь 2021 - 20:50) писал:

Существует веб-ресурс который напрямую использует данные из БД КБ, читает/пишет

В этом случае вы априори никакие события вызвать не сможете, т.к. события/вычисления - это часть кода Клиентской базы. При изменениях напрямую в БД события вызваны не будут сами по себе.

#7 Anton1

    Участник

  • Пользователи
  • PipPip
  • 20 сообщений
  • Пол:Мужчина

Отправлено 11 Декабрь 2021 - 15:18

Это понятно, что сами они не запустятся. Но я знаю какие поля были изменены и задача вызвать алгоритм выполняющийся после изменения, например через АПИ. Т.е. пишу напрямую в БД и затем запускаю какой то скрипт на который КБ отрабатывает как изменения указанных полей.

#8 Timur

    Активный участник

  • Техподдержка ООО "КБ"
  • PipPipPip
  • 865 сообщений
  • Пол:Мужчина

Отправлено 15 Декабрь 2021 - 11:57

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

#9 Anton1

    Участник

  • Пользователи
  • PipPip
  • 20 сообщений
  • Пол:Мужчина

Отправлено 24 Декабрь 2021 - 13:58

Оказывается есть функция popup_event(), как раз то что нужно. Осталось дождаться ее поддержки в API.

Имя:
popup_event
Описание:
Вызов события и связанных с ним вычислений.
Параметры:
$table - массив параметров таблицы, полученный через get_table
&$line - массив строки, по которой вызывается вычисление
$event - массив события
$display_notification = 1 - отображать ли системные сообщения о событии
Примеры:
// вызываем событие на изменение поля 333 строки 222 в таблице 111
$table = get_table(111);
$line = data_select(111, "id = 222");
$event = array(
  type' => 'save',
  'table_id' => 111,
  'line_id' => 222,
  'changed' => array(
  333 => array(
    'field_id' => 333,
    'int_name' => 'f333',
    'old' => 'aaa',
    'new' => 'bbb'
    )
  )
);
popup_event($table, $line, $event);

Сообщение отредактировал Anton1: 24 Декабрь 2021 - 14:04


#10 Timur

    Активный участник

  • Техподдержка ООО "КБ"
  • PipPipPip
  • 865 сообщений
  • Пол:Мужчина

Отправлено 29 Декабрь 2021 - 11:03

Просмотр сообщенияAnton1 (24 Декабрь 2021 - 13:58) писал:

Оказывается есть функция popup_event(), как раз то что нужно. Осталось дождаться ее поддержки в API.

Имя:
popup_event
Описание:
Вызов события и связанных с ним вычислений.
Параметры:
$table - массив параметров таблицы, полученный через get_table
&$line - массив строки, по которой вызывается вычисление
$event - массив события
$display_notification = 1 - отображать ли системные сообщения о событии
Примеры:
// вызываем событие на изменение поля 333 строки 222 в таблице 111
$table = get_table(111);
$line = data_select(111, "id = 222");
$event = array(
  type' => 'save',
  'table_id' => 111,
  'line_id' => 222,
  'changed' => array(
  333 => array(
	'field_id' => 333,
	'int_name' => 'f333',
	'old' => 'aaa',
	'new' => 'bbb'
	)
  )
);
popup_event($table, $line, $event);

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

#11 Anton1

    Участник

  • Пользователи
  • PipPip
  • 20 сообщений
  • Пол:Мужчина

Отправлено 20 Январь 2022 - 21:47

В API на текущий момент эта функция не реализуется, ТП предложила такое решение:

Создать свой внешний файл и туда положить всю нужную логику по вызову событий. Логика предполагает запуск функции popup_event() с нужными параметрами в коде файла.
Подключение к КБ идет через include 'common.php' и далее можно использовать функции КБ напрямую из кода.
Далее уже вызывается этот файл по тому же адресу, что и КБ.
Например: https://my_crm.com/my_script.php, где "https://my_crm.com" - адрес КБ, а "my_script.php" - указанный файл

Если точнее, в начале файла должно быть:
$config['script_noauth'] = 1; //чтобы не было редиректа на страницу логина
require_once "common.php";






Количество пользователей, читающих эту тему: 4

0 пользователей, 4 гостей, 0 анонимных