8 (800) 302-62-68
+7 (499) 348-29-58
sale@rbs-crm.ru

Документация разработчика

РосБизнесСофт CRM > База знаний > Разработчикам > Работа с экземпляром объекта

Работа с экземпляром объекта

За работу с отдельным Объектом (одной записью) отвечает класс Entry.

С объектом можно совершать следующие операции:

  • Получать объект
  • Создавать новый объекта
  • Изменять значения полей объекта
  • Удалять объект (помечать на удаление)
  • Полностью удалять объект из системы
  • и т.д.

Основные методы

getEntryById($id)

Получение экземпляра объекта по ID класса Entry.

Пример: получить документ «Счет» с ID = «2» и выведем значение поле number этого “Счета”

$order = $this->Data->{'documents.orders'}->getEntryById(2); 

if($order) { 
 echo $order->number;
}
// Выведет 5
getByID($id)

Получение массива с одним объектом (нулевым элементов) класса EntrySet (набор записей).

Пример:

$order = $this->Data->{'documents.orders'}->getById(2); 
echo $order[0]->number; 
// Выведет 5
create()

Для создания экземпляра “Объекта” используется метод create(). Необходимо указать название “Объекта”.

Может состоять из двух или трех элементов. Два элемента — для создания основных объектов (документы, справочники, перечисления), три — для создания табличных частей объектов.

Допускается два варианта использования:

$this->Data->{"documents.orders"}->create();
$this->Data->{"documents.orders.products"}->create();

или

$this->Data->Documents->Orders->create();
$this->Data->Documents->Orders->Products->create();

Оба они равнозначны, но первый работает быстрее.

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

Пример:

->visible(1)
->date(date("Y-m-d H:i:s"))
->owner(2)

После этого используются 2 метода restore() и sync(). При создании возвращается созданный экземпляр “Объекта”.

Пример создания объекта:

$order = $this->Data->{'documents.orders'}->create()
    ->visible(1)
    ->owner(4)
    ->number(100)
    ->date(date('Y-m-d H:i:s'))
    ->restore()->sync();

echo $order->owner->id;
// выведет 4

echo $order->date;
// выведет дату счета

Обращаем внимание, что если у Объекта есть обязательные поля, то их нужно всегда заполнять. Например, у Объектов типа «Документ» поля number, date должны быть заполнены.

Поле visible при создании любого Объекта в Системе должно быть = 1, иначе новый Объект будет помечен на удаление.

Если при создании Объекта он будет сразу помечен на удаление (серая строка), то возможно разработчик указал какое-то неверное поле у Объекта или устанавливаемое значение не соответствует типу поля.

sync()

Сохранение объекта.

Для того, чтобы изменить поле в «Объекте» необходимо сначала получить сам «Объект». Затем указать поле и в скобках значение (можно указать несколько полей), затем использовать метод sync().

Пример использования в форме редактирования текущего объекта:

$this->structure
    ->status(2)
    ->responsible(4)
    ->type(5)
->sync();

Если нужно изменить значение у массива объектов:

$orders = $this->Data->{'documents.orders'}
    ->filter('responsible=' . $this->User->getEmployeeId())
    ->filter('date>=' . date('2020-01-01'))
    ->filter('date<' . date('2021-01-01'));

foreach($orders as $order) {
     $order->status(2)
        ->responsible(4)
        ->type(5)
    ->sync();
}

Метод обычно используется вместе с restore():

$this->Data->Documents->Deal->create()->
visible(1)->
owner($this->structure->owner->id)->
responsible($this->structure->responsible->id)->
status(1)->
restore()->
sync();
delete()

Установить пометку на удаление.

$this->structure->delete();
restore()

Восстановить (снять пометку на удаление).

$this->structure->restore();
wipe()

Полное стирание объекта.

$this->structure->wipe();

Пример: удалить текущий объект из Системы

$this->structure->wipe();
getName()

Получить название объекта (иерархическое, например «references.companies»).

Пример:

echo $this->structure->getName();
// references.companies
markAsSaved()

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

Используется при создании нового Объекта через интерфейс системы (нажатии кнопки «Добавить») в форме «Редактирования» уже были выбраны определённые поля с пользуются методы getField() и markAsSaved().

Значения по умолчанию устанавливаются в «Форме редактирования» в методе checkAjaxMethods().

Пример: При создании “Счета” установить ответственным текущего пользователя

protected function checkAjaxMethods() {
    
    // проверяем, что форма в режиме добавления
    if($this->isAddForm() && !$this->isActionSave()) { 
        
        $this->structure->responsible($this->User->getEmployee()->id)->getField("responsible")->markAsSaved();
        
    }
}
clone

Если в начале «PHP-сценария» выполнить

$this->structure->products->filter('product.type=1');

то во всём документе структура Объекта переопределится с данным фильтром.

Для решения этой проблемы необходимо клонировать объект (clone):

$productsNew = clone $this->structure->products;
$totalProducts = $productsNew->filter('product.type=2')->sum('total');

При этом основной объект «$this->structure->products» останется без изменения.

Работа с полями объекта

getFirstByFlag($flag)

Получить первое поле в Объекте, имеющее указанный флаг. Обычно используется для получения поля с флагом «name»

Где:

  • flag — Флаг

Пример: получить поле у первого Объекта с флагом «name»

echo $this->structure->getFirstByFlag("name");
// Структура = Контрагент,
// Результат: РосБизнесСофт
getField ($name)

Получить значение поля Объекта

Где:

  • name — Название поля

Пример: получить значение поля date и перевести его в формат d.m.Y H:i

$message->getField("date")->toFormat("d.m.Y H:i"),
addFilter($filter)

Где:

  • filter — фильтр вида: {поле}{операция}{значение}

Для поля можно вызывать различные команды. В частности, метод addFilter для «поля-указателя» (Pointer) добавляет фильтрующее правило для структур на которые может ссылаться поле. Это не меняет само значение поля, однако полезно при выводе возможных вариантов заполнения поля.

Пример: в «Форме редактирования» в поле «Ответственный» в справочнике «Контрагент» вывести только сотрудников, не помеченных на удаление.

$this->structure->getField("responsible")->addFilter("visible=1");

Получение всех полей и значений объекта

Для вывода всех полей и значений используется метод getCurrentFieldsList().

$fList = $this->getCurrentFieldsList($this->structure);
if($fList){
  foreach($fList as $field => $value)
  { 
     echo $field . ' - '. $value . "\n";
  }
}

Результат:

id 	- 53
date 	- 03.02.2022

Работа с регистром

move($args)

Подвинуть регистр.

Где:

  • args — ассоциативный массив пар ключ-значение для данных. Основные параметры регистра (такие как дата) проставляются автоматически.

Пример: добавим новую запись в регистр «Слад»

$regEntry = Kernel::Data()->Registers->Stock->move(
[
 "product" => $product,
 "storehouse" => $storehouse,
 "registrator" => $object->getBlind(),
 "number" => $number,
 "price" => $price,
 "gtd" => $gtd
]);
getOnDate([int $date])
Подсчитать регистр на дату. Возвращает виртуальный псевдо-элемент типа Entry.

Где:

  • date — дата. По умолчанию возвращается регистр на текущий день.

Пример: Получить актуальную цену (на сегодня) на товар из регистра «Цен»

$this->Data->{"registers.prices"}->filter("product=" . $product)->filter("type=" . $type)->getOnDate()->price;
countSum($field, $params)

Подсчитать сумму поля регистра (для регистров накопления).

Где:

  • field — название поля
  • params — дополнительные параметры (массив фильтров).

Пример:

$filters = ["product" => $lastProduct];
if ($this->filters->storehouse->get())
 $filters["storehouse"] = $this->filters->storehouse->get();

if ($this->filters->gtd->get())
 $filters["gtd"] = $this->filters->gtd->get();

$lastStart = $this->Data->Registers->Stock->filter("date<" . Format::DBTime($line["date"]))->countSum("number", $filters);

Работа с полем типа Multipointer

Поле «Множественный выбор» в базе данных хранится в виде JSON.

Пример:

[{"id":1},{"id":2}]

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

   $companies = json_decode($this->structure->companies, true);

    $companiesStr = '';

    if(!empty($companies))
    {
      foreach ($companies as $v) 
      {
          $companiesObj = $this->Data->{'references.companies'}->filter('id='. $v['id']);
          $companiesStr .= $companiesObj->name . ', ';
      }
    }

$companiesStr = substr($companiesStr, 0, -2);

Метод для формирования json элемента (получает $objectsIdsArray — массив из id):

private function getMultipointerJsonFromArray($objectsIdsArray) {

    if (count($objectsIdsArray) == 0)
        return '';

    $objectsArray = [];

    foreach ($objectsIdsArray as $objectId) {
        $objectsArray[]['id'] = $objectId;
    }

    return json_encode($objectsArray);
}