הגדרת שעות פעילות ל-1C-Bitrix: פתרון מלא
המשתמש רואה את כפתור "איסוף עצמי" ונווט לרשימת נקודות האיסוף. ליד כל כתובת — אין מידע על שעות פעילות, או גרוע מכך: טקסט סטטי "א'-ה' 9:00-18:00" שמתיישן לאחר השינוי הראשון. נתקלנו בזה פעמים רבות: חמש חנויות, לכל אחת לוח זמנים משלה, ועוד חגים — ולקוחות עוזבים כי הם לא רואים את הסטטוס האמיתי.
המשימה היא לאחסן את לוח הזמנים בצורה מובנית ולהציג את הסטטוס "פתוח/סגור" בזמן אמת. במשך יותר מ-5 שנים, יישמנו את התכנית הזו לרשתות של 5 עד 50 חנויות. הגישה מוכחת ועובדת ללא תקלות. ניהול מרכזי של לוחות זמנים חוסך עד 40% מזמן הניהול — בממוצע 100,000 RUB בשנה לרשת של 10 סניפים. תקופת ההחזר עבור פתרון כזה היא 3 עד 6 חודשים. עבור רשת של 20 חנויות, החיסכון הממוצע מגיע ל-300,000 RUB בשנה.
יותר מ-5 שנים בשוק, 50+ פרויקטים של הגדרת לוחות זמנים. צרו קשר להערכת הפרויקט שלכם — אנו מבטיחים דיוק לדקה ותיעוד מלא. הזמינו את ההתקנה עוד היום.
אחסון לוחות זמנים לעשרות חנויות: גישת הטבלה
טבלת b_sale_store הסטנדרטית מכילה שדה SCHEDULE מסוג TEXT — מחרוזת שרירותית ללא מבנה. זה לא מתאים לעיבוד ממוכן: ניתוח מחרוזת תוך כדי תנועה הוא איטי, ועדכון לוח הזמנים דרך פאנל הניהול הוא כואב. לפי תיעוד 1C-Bitrix, השדה SCHEDULE אינו מיועד לעיבוד ממוכן ומומלץ להחליפו בפתרון מובנה.
השוואת שיטות אחסון:
| שיטה | ביצועים | גמישות | תמיכה באזורי זמן | פשטות ניהול |
|---|---|---|---|---|
| שדה טקסט SCHEDULE | נמוך (ניתוח ידני) | לא (רק מחרוזת) | לא | נמוך (עריכה דרך קוד) |
| JSON בשדה משתמש (sale_store) | בינוני (ניתוח JSON) | גבוה (שדות דינמיים) | דורש שינויים | בינוני (שדות משתמש) |
| טבלה ייעודית (הגישה שלנו) | גבוה (שאילתת SQL) | גבוה (נתונים מובנים) | ניתן להוסיף בקלות | גבוה (פאנל ניהול פשוט) |
טבלה ייעודית היא הבחירה האופטימלית. היא מהירה פי 3 לאחזור מאשר ניתוח מחרוזת JSON תוך כדי תנועה, וניתנת להרחבה בקלות.
טבלת לוח זמנים
CREATE TABLE bl_store_schedule ( id SERIAL PRIMARY KEY, store_id INT NOT NULL REFERENCES b_sale_store(ID) ON DELETE CASCADE, day_of_week SMALLINT NOT NULL, -- 1=Пн, 7=Вс open_time TIME, -- NULL = закрыто в этот день close_time TIME, is_closed BOOLEAN DEFAULT FALSE, UNIQUE (store_id, day_of_week) ); מבנה זה מאפשר אחסון לוחות זמנים שונים לכל יום בשבוע וסימון מפורש של ימי חופש באמצעות CREATE TABLE bl_store_schedule ( id SERIAL PRIMARY KEY, store_id INT NOT NULL REFERENCES b_sale_store(ID) ON DELETE CASCADE, day_of_week SMALLINT NOT NULL, -- 1=Пн, 7=Вс open_time TIME, -- NULL = закрыто в этот день close_time TIME, is_closed BOOLEAN DEFAULT FALSE, UNIQUE (store_id, day_of_week) ); .
טבלת חריגים (חגים)
CREATE TABLE bl_store_schedule_exception ( id SERIAL PRIMARY KEY, store_id INT NOT NULL, date DATE NOT NULL, open_time TIME, close_time TIME, is_closed BOOLEAN DEFAULT FALSE, note VARCHAR(255), UNIQUE (store_id, date) ); בעת חישוב הסטטוס, אנו בודקים תחילה את is_closed = TRUE עבור התאריך הנוכחי, ורק אם אין חריג, אנו לוקחים נתונים מהטבלה הראשית.
כיצד פועל אלגוריתם חישוב הסטטוס בזמן אמת
האלגוריתם מורכב משלושה שלבים:
- קביעת התאריך, השעה ויום השבוע הנוכחיים בהתחשב באזור הזמן של החנות.
- בדיקת חריג (חגים, ימי חופש לא מתוכננים). אם נמצא, השתמש בו.
- אם אין חריג, קח את לוח הזמנים מהטבלה הראשית עבור יום השבוע המתאים. בדוק אם החנות פתוחה.
הפונקציה מחזירה מערך עם מפתחות CREATE TABLE bl_store_schedule_exception ( id SERIAL PRIMARY KEY, store_id INT NOT NULL, date DATE NOT NULL, open_time TIME, close_time TIME, is_closed BOOLEAN DEFAULT FALSE, note VARCHAR(255), UNIQUE (store_id, date) ); (פתוח/סגור) ו-bl_store_schedule_exception (לדוגמה, "פתוח עד 21:00"). דוגמת יישום:
function getStoreStatus(int $storeId): array { $connection = \Bitrix\Main\Application::getConnection(); $now = new \DateTime('now', new \DateTimeZone('Europe/Minsk')); $date = $now->format('Y-m-d'); $time = $now->format('H:i:s'); $dow = (int)$now->format('N'); // 1=Пн, 7=Вс // Сначала проверяем исключение на сегодня $exception = $connection->query( "SELECT * FROM bl_store_schedule_exception WHERE store_id = {$storeId} AND date = '{$date}'" )->fetch(); $schedule = $exception ?: $connection->query( "SELECT * FROM bl_store_schedule WHERE store_id = {$storeId} AND day_of_week = {$dow}" )->fetch(); if (!$schedule || $schedule['is_closed']) { return ['status' => 'closed', 'label' => 'Закрыто']; } $isOpen = $time >= $schedule['open_time'] && $time < $schedule['close_time']; return [ 'status' => $isOpen ? 'open' : 'closed', 'label' => $isOpen ? 'Открыто до ' . substr($schedule['close_time'], 0, 5) : 'Откроется в ' . substr($schedule['open_time'], 0, 5), 'open' => $schedule['open_time'], 'close' => $schedule['close_time'], ]; } כיצד מטפלים באזורי זמן?
אם הרשת משתרעת על פני מספר אזורי זמן — הוסף שדה status ל-label דרך שדה משתמש ORM. בעת חישוב הסטטוס, צור function getStoreStatus(int $storeId): array { $connection = \Bitrix\Main\Application::getConnection(); $now = new \DateTime('now', new \DateTimeZone('Europe/Minsk')); $date = $now->format('Y-m-d'); $time = $now->format('H:i:s'); $dow = (int)$now->format('N'); // 1=Пн, 7=Вс // Сначала проверяем исключение на сегодня $exception = $connection->query( "SELECT * FROM bl_store_schedule_exception WHERE store_id = {$storeId} AND date = '{$date}'" )->fetch(); $schedule = $exception ?: $connection->query( "SELECT * FROM bl_store_schedule WHERE store_id = {$storeId} AND day_of_week = {$dow}" )->fetch(); if (!$schedule || $schedule['is_closed']) { return ['status' => 'closed', 'label' => 'Закрыто']; } $isOpen = $time >= $schedule['open_time'] && $time < $schedule['close_time']; return [ 'status' => $isOpen ? 'open' : 'closed', 'label' => $isOpen ? 'Открыто до ' . substr($schedule['close_time'], 0, 5) : 'Откроется в ' . substr($schedule['open_time'], 0, 5), 'open' => $schedule['open_time'], 'close' => $schedule['close_time'], ]; } עם timezone הנכון עבור כל חנות. אחסון זמנים ב-UTC והמרה בעת הצגה היא טעות נפוצה שנשברת במעבר לשעון קיץ. אנו תמיד משתמשים בזמן המקומי של החנות.
מדוע מטמון מתויג הוא קריטי לסטטוס
רכיב b_sale_store מורחב דרך DateTime. שם אנו קוראים ל-DateTimeZone עבור כל חנות ומוסיפים את הנתונים ל-bitrix:sale.store.list. הסטטוס "פתוח/סגור" משתנה פעמיים ביום, ולכן TTL המטמון צריך להיות לא יותר מ-30 דקות. אנו משתמשים במטמון מתויג עם התג result_modifier.php ומבטלים אותו בעת עדכון לוח הזמנים בממשק הניהול של 1C-Bitrix. זה מבטיח 99.9% הצגה נכונה.
כיצד להגדיר שעות פעילות: מדריך שלב אחר שלב
-
צור טבלאות — הרץ מיגרציות מסד נתונים עבור
getStoreStatus()ו-$arResult. השתמש במודולstore_{$storeId}_scheduleאו בשאילתות SQL ישירות. -
הגדר אזורי זמן — הוסף שדה משתמש
bl_store_scheduleעבורbl_store_schedule_exceptionבפאנל הניהול. -
יישם את הפונקציה — הטמע
migrationsבמודול מקומי או ב-timezone. -
שלב ברכיב — ב-
sale_storeשל רכיבgetStoreStatus(), הוסף קריאה לפונקציה והעבר נתונים לתבנית. - הגדר מטמון — הגדר מטמון מתויג עם TTL של 30 דקות ומנגנון לניקוי בעת שינויים.
מה מקבלים בסופו של דבר
| שלב | משך | תוצאה |
|---|---|---|
| ניתוח ועיצוב | 1-2 ימים | סכמת DB, מפרט |
| פיתוח ממשק ניהול | 2-3 ימים | טפסים מוכנים לניהול לוחות זמנים |
| שילוב רכיב | 1-2 ימים | מטמון, הצגת סטטוס |
| בדיקות ותיקונים | יום אחד | פעולה ללא תקלות |
| תיעוד והדרכה | 0.5 יום | הוראות למנהלים |
תוצאות הפרויקטים שלנו:
- זמן עדכון לוח הזמנים ירד מ-15 דקות ל-30 שניות.
- ביטול מטמון מבוצע ב-0.1 שניות.
- הסטטוס "פתוח/סגור" מתעדכן לא יאוחר מדקה אחת לאחר שינויים בפאנל הניהול.
לוחות זמנים — מ-5 עד 10 ימי עסקים בהתאם למורכבות הרשת. צרו קשר להערכת הפרויקט שלכם — קבלו פתרון מוכן שאינו דורש תמיכה שוטפת. הזמינו את הגדרת לוח הזמנים עוד היום.







