Реализация системы предварительной записи — одна из ключевых задач при автоматизации предприятий сферы услуг, таких как автосервисы. В среде 1С:Предприятие 8.1, несмотря на отсутствие некоторых современных объектов (например, «Планировщика»), задачу можно успешно решить, используя классические инструменты платформы. Разберем пошагово, как спроектировать архитектуру и программный код для такого функционала.
Для того чтобы система знала, на какое время можно записать клиента, нам необходимо хранить информацию о занятости. Использовать для этих целей документ напрямую неэффективно, так как поиск свободного «окна» в базе документов будет медленным. Проанализируем, какие регистры нам понадобятся:
Мастер (тип СправочникСсылка.Сотрудники), Пост (тип СправочникСсылка.Посты).ДатаНачала, ДатаОкончания.Важно понимать, что в автосервисе мы записываем клиента не только к человеку, но и на конкретное рабочее место (подъемник, бокс). Поэтому контроль занятости должен идти в разрезе обеих сущностей.
Этот документ будет служить интерфейсом для ввода данных. В нем должны быть реквизиты:
МастерПостДатаНачалаПродолжительность (в часах или минутах)ДатаОкончания (расчетный реквизит)Клиент и АвтомобильРассмотрим пример кода для автоматического расчета времени окончания при изменении длительности работы:
Процедура ПродолжительностьПриИзменении(Элемент)
Если ЗначениеЗаполнено(ДатаНачала) Тогда
ДатаОкончания = ДатаНачала + (Продолжительность * 3600); // Перевод часов в секунды
КонецЕсли;
КонецПроцедуры
Самый ответственный момент — не допустить «наложения» записей. Перед проведением документа или при выборе времени в форме необходимо проверить, не занят ли выбранный мастер или пост. Выясним причину возможного конфликта: новое событие пересекается с уже существующим, если начало новой записи меньше конца существующей, а конец новой записи больше начала существующей.
Проанализируем запрос для проверки занятости:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Занятость.Мастер
|ИЗ
| РегистрСведений.ЗанятостьМастеров КАК Занятость
|ГДЕ
| Занятость.Мастер = &ПарамМастер
| И Занятость.ДатаНачала < &ПарамДатаОкончания
| И Занятость.ДатаОкончания > &ПарамДатаНачала";
Запрос.УстановитьПараметр("ПарамМастер", Мастер);
Запрос.УстановитьПараметр("ПарамДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ПарамДатаОкончания", ДатаОкончания);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Сообщить("Выбранное время уже занято этим мастером!");
КонецЕсли;
Для удобства пользователя (мастера-приемщика) запись должна выглядеть наглядно. В 1С 8.1 у нас есть два основных пути:
1. Использование объекта «Диаграмма Ганта»
Этот объект встроен в платформу и позволяет отображать интервалы времени на шкале. Мы можем программно заполнять её данными из нашего регистра сведений. Каждая строка — это мастер, а блоки — это его записи. Посмотрим на логику заполнения:
// Пример заполнения диаграммы
Для Каждого Запись Из РегистрСведений.ЗанятостьМастеров.Выбрать() Цикл
Точка = Диаграмма.УстановитьТочку(Запись.Мастер);
Серия = Диаграмма.УстановитьСерию(Запись.Клиент);
Значение = Диаграмма.ПолучитьЗначение(Точка, Серия);
Интервал = Значение.Добавить();
Интервал.Начало = Запись.ДатаНачала;
Интервал.Конец = Запись.ДатаОкончания;
КонецЦикла;
2. Использование Табличного документа
Рассмотрим более гибкий вариант. Создадим форму, где по вертикали будут интервалы времени (например, по 30 минут), а по горизонтали — мастера. Программно раскрасим ячейки Область.ЦветФона, которые соответствуют занятому времени. При двойном клике на свободную ячейку будем открывать новый документ ЗаписьНаОбслуживание с уже заполненными временем и мастером.
Чтобы работа выглядела завершенной и профессиональной, добавим следующие элементы:
КоличествоНормоЧасов. При выборе услуги в записи система должна автоматически рассчитывать Продолжительность.СтатусыЗаписи (Запланировано, Выполнено, Отменено, Не приехал). Это позволит в будущем строить отчеты по эффективности работы сервиса.ЗаказНаряд на основании Записи. Это стандартная бизнес-логика: когда клиент приехал, мы не вводим данные заново, а переносим их в основной рабочий документ.Важное примечание: При работе в версии 8.1 всегда следите за моментом записи в регистр. Оптимально делать движения регистра при проведении документа «Запись на обслуживание». Если документ просто записан, но не проведен — место должно оставаться свободным, либо нужно использовать статус «Предварительный».
Таким образом, мы построили надежную систему, которая контролирует время сотрудников и оборудования, предоставляет визуальный интерфейс для управления записями и интегрирована в общий документооборот автосервиса.