Закажите бесплатную презентацию продуктов РосБизнесСофт прямо сейчас!
За работу с отдельным Объектом (одной записью) отвечает класс Entry.
С объектом можно совершать следующие операции:
Получение экземпляра объекта по ID класса Entry.
Пример: получить документ «Счет» с ID = «2» и выведем значение поле number этого “Счета”
$order = $this->Data->{'documents.orders'}->getEntryById(2); if($order) { echo $order->number; } // Выведет 5
Получение массива с одним объектом (нулевым элементов) класса EntrySet (набор записей).
Пример:
$order = $this->Data->{'documents.orders'}->getById(2); echo $order[0]->number; // Выведет 5
Для создания экземпляра “Объекта” используется метод 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().
Пример использования в форме редактирования текущего объекта:
$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();
Установить пометку на удаление.
$this->structure->delete();
Восстановить (снять пометку на удаление).
$this->structure->restore();
Полное стирание объекта.
$this->structure->wipe();
Пример: удалить текущий объект из Системы
$this->structure->wipe();
Получить название объекта (иерархическое, например «references.companies»).
Пример:
echo $this->structure->getName(); // references.companies
Пометить объект или поле, как уже сохраненные. При синхронизации значения полей существующих объектов будут перезаписаны.
Используется при создании нового Объекта через интерфейс системы (нажатии кнопки «Добавить») в форме «Редактирования» уже были выбраны определённые поля с пользуются методы getField() и markAsSaved().
Значения по умолчанию устанавливаются в «Форме редактирования» в методе checkAjaxMethods().
Пример: При создании “Счета” установить ответственным текущего пользователя
protected function checkAjaxMethods() { // проверяем, что форма в режиме добавления if($this->isAddForm() && !$this->isActionSave()) { $this->structure->responsible($this->User->getEmployee()->id)->getField("responsible")->markAsSaved(); } }
Если в начале «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» останется без изменения.
Получить первое поле в Объекте, имеющее указанный флаг. Обычно используется для получения поля с флагом «name»
Где:
Пример: получить поле у первого Объекта с флагом «name»
echo $this->structure->getFirstByFlag("name"); // Структура = Контрагент, // Результат: РосБизнесСофт
Получить значение поля Объекта
Где:
Пример: получить значение поля date и перевести его в формат d.m.Y H:i
$message->getField("date")->toFormat("d.m.Y H:i"),
Где:
Для поля можно вызывать различные команды. В частности, метод 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
Подвинуть регистр.
Где:
Пример: добавим новую запись в регистр «Слад»
$regEntry = Kernel::Data()->Registers->Stock->move( [ "product" => $product, "storehouse" => $storehouse, "registrator" => $object->getBlind(), "number" => $number, "price" => $price, "gtd" => $gtd ]);
Где:
Пример: Получить актуальную цену (на сегодня) на товар из регистра «Цен»
$this->Data->{"registers.prices"}->filter("product=" . $product)->filter("type=" . $type)->getOnDate()->price;
Подсчитать сумму поля регистра (для регистров накопления).
Где:
Пример:
$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);
Поле «Множественный выбор» в базе данных хранится в виде 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); }