Я так предполагаю, что для этих целей у Битрикса был Index (Bitrix\Sale\Discount\Index\IndexElementTable) и соответственно Manager для работы с ним, но вот пока не находил места где это бы применялось Вообще все зависит от скидок которые Вы используете.
Мы для себя постановили что сделаем собственный загрузчик скидок (из xlsx файлов) и параллельное столкнулись с той же задачей что и Вы - выводить скидки. Поэтому при загрузке мы сами записываем в свою таблицу участвующие в скидках товары.
Чисто теоретически для этого можно и b_sale_discount_entities использовать - там же хранятся поля по которым можно найти скидки.
Цитата
Евгений Плашенко написал: 1. Возможно ли в CIBlockElement::GetList получить помимо базовой цены ещё и цену со скидкой, чтобы не запрашивать её на втором шаге?
Даже если и возможно, то не думаю что это будет сильно отличаться от getOptimalPrice
Цитата
Евгений Плашенко написал: 2. Реально ли получить какой-то параметр, говорящий, что на товар действует скидка, чтобы не вытягивать цены, а просто отбросить товары без скидки?
Многие правила корзины действуют только в корзине, ну или через getOptimalPrice
Цитата
Евгений Плашенко написал: 3. Возможно имеется более изящный способ реализации.
Хотелось бы верить Тем более что подобие индексатора, то уже есть
Если подытожить мой сумбурный спич, то мы сделали следующее: 1) Акции у нас фиксированные и загружаются из xlsx-файла. Создали загрузчик, который читает структуру из файла в нашу структуру и из нее уже конвертирует в скидку битрикса. 2) Акция может быть перезагружена и частично изменена, так что написали парсер из битриксовой скидки (структура же известна) в нашу структуру 3) Акция может быть исправлена через прямое редактирование правила корзины битрикса, поэтому сейчас в работе стоит скрипт который будет срабатывать после редактирования правила и перегенерировать в нашу структуру обновляя правило.
Ну и естественно при сохранении нашей структуры мы пишем полные реляции какой товар в какой акции участвует
Андрей Васильев написал: Как грамотней реализовать поиск одновременно и там и там.
1) Выделить нормальные компоненты и в фильтре использовать LOGIC => OR
Цитата
Андрей Васильев написал: И в столбец показывать одно из свойств.
Произвести правки в шаблоне catalog_section_template компонента "bitrix:catalog.section"
Цитата
Андрей Васильев написал: Но у одних элементов это свойство ОСТ , а у других ГОСТ.
Я так понимаю, что ОСТ'ы это запись в Highloadblock, а ГОСТ'ы это тоже HLB ?
Цитата
Андрей Васильев написал: На скриншоте видно - что бы хотелось. Я думаю - на этом форуме не трудно будет кому-то подправить код. (добавить OR)
Всецело разделяю Вашу позицию, но думаю что Вам не будет трудно заплатить хотя бы 500 рублей специалисту который выполнит этоу работу. По факту Вы же обращаетесь не за подсказкой помощи в реализации этого, Вы хотите чтобы кто-то сделал это ЗА ВАС.
Если Вы на редакции Бизнес, то можете использовать многоскладовость (т.е. создать доп. склад) и это будет наилучшим решением. Если же Вы на более низкой редакции, то можно сделать OR-логику.
- 654 не должен попасть в выборку из-за неактивности - 650 должен попасть - 651 не должен попасть в выборку так как дата вне зоны активности - 652 должен попасть - 653 должен попасть - 665 не должен попасть в выборку (наличия на складе нет и количество 0)
Оговорка: - Создал поле "В наличии на складе" - типа список, с один значением: Да (XML_ID = Y) и указал тип флажок
Иван Иванов, по-разному У Вас эта страница в sitemap есть? попробуйте оттуда тоже ее удалить. В любом случае, даже при успешном изменении пройдет не меньше 2 дней
Александр Паржецкий написал: Подскажите как средствами rest api можно загрузить excel файл в пользовательское поле типа "файл" из внешней системы?
Насколько я знаю, файлы можно загрузить не везде. Для загрузки файла нужно передавать его в base64 кодированном виде. Я бы посоветовал сделать свойство типа "Файл на диске" и уже прикладывать туда (знаю что загрузка файла на диск есть 100%)
Maks написал: Не могу уже, крыша едет. С каталогом така же проблема. Не понимаю в чем дело. Помогите пожалуйста.
Откройте компонент в режиме правки и сохраните его (это к обоим компонентам относится). Потом проверьте, чтобы url-ссылка в описании элемента совпадала с настройками SEF в компоненте
Александр Ермакович написал: Если я сделаю поле не обязательным, то как в шаблоне сделать поле обязательным с выводом ошибки если что?
На событиях проверять. Можно для простоты создать пользовательское поле "Тип" и зашить его в формы, а на обработчике событиях проверять и выдавать ошибки
Влад Булгаков, а с какого лабутена в твоем кастомном шаблоне в template.php используется прямое обращение к БД да еще и через функция mysql_connect. Это не битрикс, а криворукие разрабы сайта.
Никита Сидорко, включи вывод ошибок. На текущий момент, все что я могу судить - скрипт падает и не доходит до сброса буфера, вот и возвращается вся страница. P.S. Проверь корректность верстки, у тебя перед доктайпом пустые символы и формы не валидны
Сергей, 1) Вы ищете в штат или есть задачи? 2) Нужен именно администратор (чтобы рулил курсами, планерками, публиковал новости/сообщения, создавал бизнес-процессы) или разработчик (чтобы гнул систему под вашу компанию)
Вячеслав, хм... идея интересная. У меня получилось нечто среднее. Не было времени тщательно протестировать, но прямой кейс: 1) Создаем множественное свойство типа число 2) Создаем простые счета, называет их "Дочерний 1", "Дочерний 2" и "Родительский". Дочерние счета с товарами 3) Редактируем "Родительский" указываем в свойстве счета "Дочерний 1", "Дочерний 2" 4) Редактируем любой дочерний счет, изменяя состав.
Как результат: при изменении товарного состава (через кнопку редактировать) изменяется состав родительского счета
Код
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandlerCompatible('crm', 'OnBeforeCrmInvoiceUpdate', ['\\InvoiceHandler','updateInvoice']);
class InvoiceHandler
{
/**
* @var string Название свойства где храним ID дочерних счетов
*/
protected static $fieldCode = 'UF_CRM_1525862024';
public static function updateInvoice(&$arFields)
{
global $APPLICATION;
/**
* Если передается непустое свойство с дочерними счетами
* значит это родительский счет, который не нужно проверять
* так как [ 0 => "" ] не пустой массив нужно использовать
* array_filter для получение пустого массива
*
* Полагаем, что вложенность счетов не больше 1 уровня,
* а значит, если передано не пустое свойство, то это родительский
* элемент который не нужно обрабатывать.
* @var array Значение "Дочерние элементы"
*/
$arRealChildInvoices = ( !array_key_exists(static::$fieldCode, $arFields) )
? array_filter($arFields[static::$fieldCode])
: [];
if ( !empty($arRealChildInvoices) )
{
return true;
}
/**
* Нас интересуют только счета у которых есть товары, если это дочерний
* счет без товаров, то и учитывать его не нужно
*/
if ( empty($arFields['PRODUCT_ROWS']) )
{
return true;
}
/**
* Получим родительский счет и необходимые параметры
* для обновления товарного каталога.
* Если родитель не найден, значит это простой счет и делать ничего не нужно
*/
$arParentInvoice = \Bitrix\Crm\InvoiceTable::getRow([
'select' => ['ID', static::$fieldCode, 'ORDER_TOPIC', 'PAY_SYSTEM_ID' ,'PERSON_TYPE_ID'],
'filter' => [
static::$fieldCode => $arFields['ID'],
]
]);
if ( !$arParentInvoice )
{
return true;
}
$arProductRows = $arFields['PRODUCT_ROWS'];
/**
* Получим единый массив из товаров для всех счетов.
* @todo Лучше передать без запроса в цикле, так как
* счет это ничто иное как заказ в БД, можно просто
* достать товары всех заказов за 1 запрос
*/
foreach ($arParentInvoice[static::$fieldCode] as $invoiceId)
{
if ( $invoiceId == $arFields['ID'] || empty($invoiceId) )
{
continue;
}
$arProducts = \CCrmInvoice::GetProductRows($invoiceId);
if ( empty($arProducts) )
{
continue;
}
$arProductRows = array_merge($arProductRows,$arProducts);
}
unset($arProducts);
/**
* Особое внимание на значение [ "" ] в INVOICE_PROPERTIES
* без него обработки счета не будет, но в последней версии
* он почему-то unset'ится
* @var array Обновляемая информация родительского счета
*/
$arParentUpdateFields = [
'ORDER_TOPIC' => $arParentInvoice['ORDER_TOPIC'],
'PAY_SYSTEM_ID' => $arParentInvoice['PAY_SYSTEM_ID'],
'PERSON_TYPE_ID' => $arParentInvoice['PERSON_TYPE_ID'],
'INVOICE_PROPERTIES' => [ "" ],
'PRODUCT_ROWS' => $arProductRows
];
/**
* @var CCrmInvoice Объект счета с выключенной проверкой прав
*/
$invoice = new \CCrmInvoice(false);
$bResult = $invoice->Update($arParentInvoice['ID'], $arParentUpdateFields);
if ( !$bResult )
{
// логгируем ошибку
}
return true;
}
}
Я вижу, что при обновлении счета происходит поиск по всем счетам и ищется не пустые значения некоторого свойства (т.е. все счета у которых UF_CRM_1525687440 заполнено). Все счета записываются в массив $result Затем если их количество (если счетов больще 0), мессив проходится по всем значениям первого счета и проверяет соответствие текущего ID и значению данной переменной. после происходит какой-то дикий мерж между массивом и товарами. Затем происходит еще один мерж и зацикливание обработчика, т.е. даже если он и не накосячит, то уж точно уйдет в рекурсию, так как на событии обновления счета происходит обновление счета, которое триггерит событие обновление счета, в котором происходит обновление счета ... и так далее до бесконечности.
Почему сразу не написать как-нибудь так:
Код
// То, что должно быть в UF_CRM_1525687440
$acceptedValue = 463;
$result = [];
$CCrmInvoice = new \CCrmInvoice(false);
$invoices = $CCrmInvoice::GetList(
[],
[
'UF_CRM_1525687440' => $acceptedValue
]
);
if ( $result = $invoices->GetNext() )
{
// дальнейшие действия
}
Александр написал: Что нужно: добавить его в группу на АД, запустить импортирование, а потом уже пользователь должен входить и авторизироваться на сайте.
В таком случае мы обычно делаем так: 1) Создаем группу "Bitrix Users" и настраиваем импорт пользователей только из этой группы 2) Пишет обработчик события добавления пользователя. Если не найдены UF_DEPARTMENTS то автоматически добавляем корневое подразделение 3) Выключаем подтягивание структуры из AD 4) Включаем опцию "Создавать пользователей из AD" 5) Ставим мериодическую синхронизацию на 1 день
Таким образом: 1) Если сегодня в группу будут включены пользователи, то завтра они автоматически попадут на портал 2) Если сегодня завели пользователя в группу и он сегодня прорвался на портал, то он будет создан сегдня же 3) Другие пользователи не получат доступа и не будут созданы
Но мы редко работаем с системами где есть AD и нет ЗУП, и зачастую импортером пользователей служит именно ЗУП, а АД дополняет его авторизацией
Владимир Голубь написал: Использовать с данными из БД компоненты я уже не могу ?
Компоненты работают с таблицами модулей, а те, в свою очередь лежат в СУБД сайта. Таким образом ни с какими компонентами в стандартной поставке Вы работать не можете (или это не та работа, которую вы подразумеваете)