PriceTable - класс для работы с таблицей ценовых предложений товаров в 1С-Битрикс D7

Работая с интернет-магазинами и каталогами товаров на базе 1С-Битрикс, нередко встает задача управления ценами на товары. Начиная с версии ядра 16.0.3, для работы с ценовыми предложениями была внедрена новая концепция D7 (Data-driven Development) и класс PriceTable, который значительно упрощает доступ к таблице цен.

PriceTable - класс для работы с таблицей ценовых предложений

В данной статье мы рассмотрим:

  1. Общее описание и назначение класса
  2. Цепочку наследования
  3. Методы класса
  4. Структуру таблицы ценовых предложений
  5. Примеры использования

Статья будет полезна как начинающим разработчикам, так и опытным специалистам, желающим оптимизировать работу с ценами товаров в 1С-Битрикс.


1. Общие сведения о классе PriceTable

Класс \Bitrix\Catalog\PriceTable отвечает за взаимодействие с таблицей ценовых предложений для товаров в интернет-магазине. Он позволяет:

  • Выполнять CRUD-операции (Create, Read, Update, Delete) над записями в таблице цен.
  • Получать структуру полей таблицы (метод getMap).
  • Определять имя таблицы в базе данных (метод getTableName).
  • Валидировать данные в полях (например, метод validateCurrency помогает проверять, что указан корректный код валюты).

Преимущества использования D7-подхода:

  • Более лаконичный и понятный код.
  • Единый интерфейс для работы с данными.
  • Упрощённое расширение функционала за счёт наследования.
  • Возможность использования ORM (Object-Relational Mapping) для более гибкой выборки данных.

2. Цепочка наследования

\Bitrix\Catalog\PriceTable
   extends \Bitrix\Main\ORM\Data\DataManager
   // до версии 18.0.2 модуля Main — \Bitrix\Main\Entity\DataManager

Таким образом, PriceTable наследует базовые методы от класса DataManager, который обеспечивает:

  • Подключение к базе данных и работу на уровне ORM.
  • Обеспечение валидаторов.
  • Определение структуры таблицы через метод getMap.

3. Методы класса PriceTable

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

Метод Описание С версии
getMap() Возвращает список полей (метаданные) для таблицы ценовых предложений. 16.0.3
getTableName() Возвращает название таблицы в базе данных, в которой хранятся ценовые предложения. 16.0.3
validateCurrency() Возвращает валидатор для поля CURRENCY (код валюты). Гарантирует, что значение соответствует форматам и стандартам валют. 16.0.3
validateTmpId() Возвращает валидатор для поля TMP_ID (временный символьный идентификатор, используемый для служебных целей). 16.0.3

Рассмотрим каждый метод более подробно.

3.1. getMap()

Метод getMap() возвращает массив, описывающий структуру полей таблицы, их типы, обязательность, а также валидаторы. Если вы посмотрите в исходном коде PriceTable, то увидите, что getMap() возвращает элементы (массивы), определяющие:

  • Имя поля (ключ массива).
  • Настройки ORM, например, тип (DataType), обязательность (required), связи (reference), валидаторы (validation).

3.2. getTableName()

Метод getTableName() возвращает строку с именем таблицы в базе данных, в которой хранятся ценовые предложения товаров. На момент написания статьи это таблица b_catalog_price.

public static function getTableName()
{
    return 'b_catalog_price';
}

3.3. validateCurrency()

Метод validateCurrency() необходим для проверки корректности кода валюты (поле CURRENCY). Например, он обеспечивает контроль, чтобы в базе не появлялись некорректные коды, не соответствующие реальным валютам.

Как правило, валидация осуществляется путём вызова системных классов, отвечающих за проверку форматов валюты в рамках 1С-Битрикс. При попытке сохранить неверное значение будет сгенерировано исключение или возвращена ошибка валидации.

3.4. validateTmpId()

Метод validateTmpId() аналогично выполняет проверку корректности временного строкового идентификатора (поле TMP_ID). В большинстве случаев это внутренний служебный код, который не выводится на сайт, но используется при различных системных операциях (например, при массовом добавлении новых предложений или импорте из CSV).


4. Структура таблицы ценовых предложений

Ниже приведены основные поля таблицы b_catalog_price, с которыми мы работаем через PriceTable. Многие из этих полей становятся доступными в результате вызова getMap().

Поле Описание Тип Обязательное
ID Код (ID) ценового предложения. Int Да
PRODUCT_ID Код товара или торгового предложения (ID элемента инфоблока). Int Да
EXTRA_ID Код (ID) типа наценки. Int Нет
CATALOG_GROUP_ID Код (ID) типа цен. Int Да
PRICE Величина цены. Decimal(18,2) Да
CURRENCY Код валюты цены. Char(3) Да
TIMESTAMP_X Время модификации записи. Datetime Да
QUANTITY_FROM Минимальное количество товара, на которое распространяется предложение. Int Нет
QUANTITY_TO Максимальное количество товара, на которое распространяется предложение. Int Нет
TMP_ID Временный строковый идентификатор, используемый для служебных целей. Varchar(40) Нет
PRICE_SCALE Цена в базовой валюте. Поле доступно только для чтения, пересчитывается автоматически. Decimal(26,12) Да

Обратите внимание, что такие поля, как PRICE_SCALE, могут не всегда присутствовать в методе getMap(). Они могут задаваться в зависимости от конфигурации модуля и версии.


5. Примеры использования

5.1. Получение всех цен конкретного товара

Одной из распространенных задач в интернет-магазине является вывод всех цен на определенный товар или торговое предложение (когда у товара есть несколько типов цен или диапазонов количества).

Ниже приведён пример кода, показывающего, как получить все записи из таблицы цен (b_catalog_price) по конкретному PRODUCT_ID:

\Bitrix\Main\Loader::includeModule("catalog");

$allProductPrices = \Bitrix\Catalog\PriceTable::getList([
    "select" => ["*"],  // можно выбрать конкретные поля, например ['ID', 'PRICE', 'CURRENCY']
    "filter" => [
        "=PRODUCT_ID" => $arResult['ID'],  // ID нужного товара/ТП
    ],
    "order" => ["CATALOG_GROUP_ID" => "ASC"]  // сортировка по типу цен
])->fetchAll();

// Теперь $allProductPrices будет содержать массив данных о ценах:
foreach ($allProductPrices as $priceRow) {
    echo "Тип цены: " . $priceRow['CATALOG_GROUP_ID'] . "
"; echo "Цена: " . $priceRow['PRICE'] . " " . $priceRow['CURRENCY'] . "
"; echo "
"; }

Данный пример часто используется в компоненте catalog.element, когда необходимо отобразить несколько вариантов цены (например, оптовая и розничная) или цены для разных групп пользователей.

5.2. Добавление новой цены в таблицу

Чтобы добавить новую цену для товара, необходимо использовать метод add() родительского класса DataManager. Так как PriceTable наследуется от DataManager, мы можем вызывать методы add(), update() и delete() напрямую.

\Bitrix\Main\Loader::includeModule("catalog");

$result = \Bitrix\Catalog\PriceTable::add([
    'PRODUCT_ID'       => 123,    // ID товара или торгового предложения
    'CATALOG_GROUP_ID' => 1,      // ID типа цены
    'PRICE'            => 1000.00,
    'CURRENCY'         => 'RUB',
    'QUANTITY_FROM'    => 1,
    'QUANTITY_TO'      => 10,
    'PRICE_SCALE'      => 1,
]);

if ($result->isSuccess()) {
    $newPriceId = $result->getId();
    echo "Новая цена успешно добавлена, ID = {$newPriceId}";
} else {
    $errors = $result->getErrorMessages();
    echo "Ошибка при добавлении цены: " . implode(', ', $errors);
}

5.3. Обновление существующей цены

Допустим, нам нужно скорректировать цену (поле PRICE) для конкретного типа цен (поле CATALOG_GROUP_ID). Для этого используется метод update():

\Bitrix\Main\Loader::includeModule("catalog");

$priceId = 10; // Условный ID цены, которую нужно обновить

$result = \Bitrix\Catalog\PriceTable::update($priceId, [
    'PRICE'    => 1200.50,
    'CURRENCY' => 'USD'
]);

if ($result->isSuccess()) {
    echo "Цена с ID={$priceId} обновлена.";
} else {
    $errors = $result->getErrorMessages();
    echo "Ошибка при обновлении цены: " . implode(', ', $errors);
}

5.4. Удаление цены

Если необходимо удалить запись цены, достаточно вызвать метод delete():

\Bitrix\Main\Loader::includeModule("catalog");

$priceId = 10;

$result = \Bitrix\Catalog\PriceTable::delete($priceId);
if ($result->isSuccess()) {
    echo "Цена с ID={$priceId} удалена.";
} else {
    $errors = $result->getErrorMessages();
    echo "Ошибка при удалении цены: " . implode(', ', $errors);
}

Заключение

Класс \Bitrix\Catalog\PriceTable является удобным инструментом для управления ценами в интернет-магазине на базе 1С-Битрикс, позволяя работать с таблицей цен по принципу ORM. Использование D7-подхода дает разработчикам:

  • Единый интерфейс для чтения, добавления, обновления и удаления записей.
  • Гибкую настройку валидации полей.
  • Возможность легко расширять функционал без изменения базового кода.

В материалах официальной документации вы можете найти дополнительные примеры и уточнения по настройкам, методам, а также вариантам интеграции с другими модулями. Регулярное обновление 1С-Битрикс и модулей каталога позволяет использовать новые возможности D7, обеспечивая современную и безопасную работу с ценами ваших товаров.

Теги:  руководство, D7


Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Модули и компоненты для «1С-Битрикс»

оценка производится на основе предоставленного Технического Задания

от 20 000 рублей
Разработка дополнительных модулей для 1С-Битрикс, расширение функционала, внедрение любых решений, требующихся для выполнения ваших бизнес-задач.

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

Разработка корпоративного сайта

от 7 дней

от 40 000 рублей

Разработка сайта без системы оплаты заказов через корзину

* стоимость зависит от наличия верстки, использования готового решения и т.д.

Разработка интернет-магазина с готовой версткой

от 4 недель

от 90 000 рублей

* указана минимальная стоимость. Стоимость выбранной лицензии «1С-Битрикс» оплачивается отдельно.