מנהל מבלה שעה בהרכבת מחירון ב-Excel — ועדיין טועה במחיר עבור לקוח קבוע. עם קטלוג של 15,000 פריטים, ייצוא ידני לוקח יום שלם, ושגיאות תמחור מובילות לאובדן רווח או לקוחות. כל שגיאה עולה לחברה בממוצע 45–65 דולר; עם 2,000 שגיאות בשנה, מדובר בהפסד של 90–130 אלף דולר. הקמת מחולל מחירונים מ-1C-Bitrix מבטיחה שהנתונים תמיד עדכניים ומותאמים להרשאות. האוטומציה מבטלת שגיאות ידניות ומעניקה למנהלים מסמכים מוכנים תוך שניות. הלקוח מקבל גיליון מחירים עדכני תוך דקות, לא שעות. הגדרת ייצוא אוטומטי עם בקרת גישה ועדכונים היא הבסיס למחלקת מכירות יעילה.
בעיות שאנחנו פותרים
עדכוני מחירים ידניים — כשפריטים או מחירים משתנים, צריך לערוך קבצים ידנית, תוך סיכון לנתונים מיושנים וחוסר שביעות רצון של לקוחות. בפרויקט אחד עם 50,000 מוצרים, מנהלים בילו 3 ימים בעדכון Excel. שגיאות חישוב: סוגי מחירים שונים (סיטונאי, קמעונאי, מבצעים) מתבלבלים בקלות. המערכת שלנו מחליפה אוטומטית את המחיר הנכון עבור המשתמש, ומבטלת בלבול. גישה למידע חסוי: לקוחות קמעונאיים לא צריכים לראות מחירים סיטונאיים. הפרדה באמצעות קבוצות משתמשים וסוגי מחירים פותרת זאת.
איך אנחנו עושים את זה
אנחנו משתמשים ב-PhpSpreadsheet (phpoffice/phpspreadsheet) PhpSpreadsheet — ספרייה מודרנית לעבודה עם Excel. המחולל כתוב ב-PHP 8.1+, משתמש ב-Bitrix ORM ובמטמון מתויג לשאילתות מהירות יותר. כל השאילתות מותאמות: בחירת מחירים דרך CCatalogProduct::GetOptimalPrice, מלאי דרך CCatalogStoreProduct, מטמון סעיפים.
הנה דוגמה ליצירת מחירון Excel עם עיצוב ורוחב עמודות אוטומטי:
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
class BitrixPriceListGenerator
{
public function generate(int $priceTypeId, array $userGroups): string
{
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('Прайс-лист');
// Заголовки
$headers = ['Артикул', 'Наименование', 'Раздел', 'Цена', 'Валюта', 'Остаток'];
foreach ($headers as $col => $header) {
$sheet->setCellValueByColumnAndRow($col + 1, 1, $header);
}
// Стиль заголовка
$sheet->getStyle('A1:F1')->getFont()->setBold(true);
$sheet->getStyle('A1:F1')->getFill()
->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
->getStartColor()->setARGB('FFE0E0E0');
$row = 2;
$res = $this->getProductsWithPrices($priceTypeId, $userGroups);
foreach ($res as $product) {
$sheet->setCellValueByColumnAndRow(1, $row, $product['ARTICLE']);
$sheet->setCellValueByColumnAndRow(2, $row, $product['NAME']);
$sheet->setCellValueByColumnAndRow(3, $row, $product['SECTION']);
$sheet->setCellValueByColumnAndRow(4, $row, $product['PRICE']);
$sheet->setCellValueByColumnAndRow(5, $row, $product['CURRENCY']);
$sheet->setCellValueByColumnAndRow(6, $row, $product['QUANTITY']);
// Форматирование числа цены
$sheet->getStyleByColumnAndRow(4, $row)
->getNumberFormat()
->setFormatCode(NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED2);
$row++;
}
// Автоширина колонок
foreach (range('A', 'F') as $col) {
$sheet->getColumnDimension($col)->setAutoSize(true);
}
// Добавляем дату генерации
$sheet->setCellValue('A' . ($row + 1), 'Дата формирования: ' . date('d.m.Y H:i'));
$writer = new Xlsx($spreadsheet);
$tempFile = tempnam(sys_get_temp_dir(), 'pricelist_');
$writer->save($tempFile);
return $tempFile;
}
private function getProductsWithPrices(int $priceTypeId, array $userGroups): array
{
$result = [];
$dbRes = \CIBlockElement::GetList(
['SECTION_ID' => 'ASC', 'SORT' => 'ASC'],
['IBLOCK_ID' => CATALOG_IBLOCK_ID, 'ACTIVE' => 'Y'],
false,
false,
['ID', 'NAME', 'IBLOCK_SECTION_ID', 'PROPERTY_ARTICLE']
);
$sectionCache = [];
while ($el = $dbRes->GetNextElement()) {
$fields = $el->GetFields();
$productId = $fields['ID'];
// Получаем цену для типа
$priceRes = \CCatalogProduct::GetOptimalPrice($productId, 1, $userGroups);
$price = $priceRes['PRICE']['PRICE'] ?? 0;
// Кэшируем названия разделов
$sectionId = $fields['IBLOCK_SECTION_ID'];
if (!isset($sectionCache[$sectionId])) {
$sectionCache[$sectionId] = \CIBlockSection::GetByID($sectionId)->GetNext()['NAME'] ?? '';
}
// Остатки
$storeData = \CCatalogStoreProduct::GetList(
[],
['PRODUCT_ID' => $productId]
)->Fetch();
$quantity = $storeData['AMOUNT'] ?? 0;
$result[] = [
'ARTICLE' => $fields['PROPERTY_ARTICLE_VALUE'],
'NAME' => $fields['NAME'],
'SECTION' => $sectionCache[$sectionId],
'PRICE' => $price,
'CURRENCY' => $priceRes['PRICE']['CURRENCY'] ?? 'USD',
'QUANTITY' => $quantity,
];
}
return $result;
}
}בקרת גישה מבוססת על קבוצות משתמשים וסוגי מחירים של Bitrix. דוגמה לקביעת סוג המחיר:
$userId = \Bitrix\Main\Context::getCurrent()->getUser()->getId();
$userGroups = \CUser::GetUserGroup($userId);
$priceTypeId = 1; // базовый
if (in_array(WHOLESALE_GROUP_ID, $userGroups)) {
$priceTypeId = 2; // оптовый
} elseif (in_array(VIP_GROUP_ID, $userGroups)) {
$priceTypeId = 3; // VIP
}גישה זו מאפשרת ליצור גיליון מחירים נפרד לכל סוג מחיר, הנגיש רק לקבוצה המתאימה. אנחנו גם מגדירים הרשאות גישה לקבצים דרך שרת האינטרנט או .htaccess.
היתרונות של אוטומציית הייצור אוטומציה דרך סוכני Bitrix מועילה במיוחד לקטלוגים מ-10,000 פריטים. הסוכן רץ בלילה, מייצר גיליונות מחירים לכל סוגי המחירים, ושומר אותם על השרת:
function GeneratePriceLists(): string {
$generator = new BitrixPriceListGenerator();
foreach (getPriceTypes() as $type) {
$file = $generator->generate($type['ID'], $type['USER_GROUPS']);
$targetPath = '/upload/pricelists/pricelist_' . $type['CODE'] . '.xlsx';
rename($file, $_SERVER['DOCUMENT_ROOT'] . $targetPath);
}
return __FUNCTION__ . '();';
}חיסכון בזמן לקטלוג של 10,000 פריטים: ייצוא ידני — 4 שעות, אוטומטי — 2 דקות ליצירת כל גיליונות המחירים. שגיאת אנוש מתבטלת. כל שגיאת מחיר עולה לחברה בממוצע 45–65 דולר. האוטומציה מפחיתה שגיאות ב-95%, מ-8% ל-0.5%. הלקוחות שלנו מייצרים מעל 100 גיליונות מחירים ביום עם אפס שגיאות. עלות ההקמה מתחילה מ-450–650 דולר, החזר השקעה תוך חודשיים. לקוחות חוסכים בדרך כלל מעל 4.5–6.5 אלף דולר בשנה על ידי ביטול שגיאות ידניות.
השוואת פורמטי מחירון
| פורמט | מטרה | מאפיינים |
|---|---|---|
| Excel (XLSX) | למנהלים ולצרכים ייצוגיים | עיצוב, נוסחאות, גיליונות מרובים. עדיף על CSV לניתוח חזותי. |
| CSV | עיבוד מכונה, אינטגרציות | קל משקל, אוניברסלי, אך ללא עיצוב. נוצר מהר יותר. |
| שליחה ללקוחות | פריסה קבועה, הגנה מפני עריכה. |
בחירת הפורמט תלויה בקהל: מנהלים מעדיפים Excel, להעלאה אוטומטית ל-ERP — CSV, ללקוחות — PDF.
תהליך העבודה
- ניתוח. אנחנו בוחנים את מבנה הקטלוג שלכם, סוגי המחירים, דרישות הפורמט. מאתרים צווארי בקבוק בייצוא הנוכחי.
- עיצוב. מסכמים על פריסת גיליון המחירים, לוגיקת ההרשאות, תדירות הייצור. יוצרים אב טיפוס.
- יישום. כותבים מודול PHP עם מטמון ואופטימיזציית שאילתות. אנחנו מיישמים הקמת מחולל מחירונים מלאה עם מטמון ואופטימיזציה. הקוד מתועד.
- בדיקות. בודקים על נתונים אמיתיים, מתקנים ניואנסים. בודקים את כל סוגי המחירים וקבוצות המשתמשים.
- פריסה. מתקינים על השרת, מגדירים סוכנים, מעניקים גישה. מאמנים עובדים אחראיים.
דוגמה להגדרת סוכן עם cron
הוסיפו ל-/bitrix/php_interface/cron_events.php:
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');
$GLOBALS['DB']->StartTransaction();
if (CAgent::CheckAgentName('GeneratePriceLists();')) {
CAgent::AddAgent('GeneratePriceLists();', 'main', 'N', 86400, '', 'Y', date('d.m.Y H:i:s', strtotime('+1 day')), 30);
}
$GLOBALS['DB']->Commit();לאחר מכן, הסוכן ירוץ פעם ביום בשעה שנבחרה.
מה כלול
- הקמת מחולל מחירונים בפורמטים הנדרשים
- בקרת גישה לסוגי מחירים שונים
- פיתוח והגדרה של סוכני ייצור אוטומטיים
- אינטגרציה עם 1C (CommerceML) אם נדרש
- תיעוד תפעולי
- הדרכת עובדים אחראיים
- אחריות לקוד ל-12 חודשים. הניסיון שלנו: 5+ שנים בשוק, מעל 50 פרויקטי Bitrix מוצלחים. אנחנו מומחי 1C-Bitrix מוסמכים. צרו קשר להערכת הפרויקט שלכם — נחשב את לוח הזמנים והעלות תוך יום עסקים אחד. קבלו ייעוץ על הקמת אוטומציית תמחור עוד היום.
לוחות זמנים משוערים
| תצורה | זמן |
|---|---|
| CSV פשוט לפי סוג מחיר אחד | 0.5–1 יום |
| Excel עם עיצוב, מספר סוגי מחירים | 2–3 ימים |
| ייצור אוטומטי מתוזמן + אזור אישי | 3–5 ימים |

