Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 07:40

Запись клиентов на определенную дату-время: подскажите как реализовать?

Автор nst1, 19 июн 2017, 17:58

0 Пользователей и 1 гость просматривают эту тему.

nst1

Здравствуйте. Я полный новичок в 1С, прошу помощи, в гугле не смог найти решения.

Есть форма записи клиентов (Документ "Заказы"), содержащая фамилию, тип услуги и так далее.
Нужно добавить поля Дата и Время записи, но чтобы время выбиралось из заранее заданных промежутков и после записи клиента нельзя было добавить нового на это же время в этот день.

Я добавил новый документ "Временные промежутки" с реквизитом "Интервал" типа Строка (заполнил его 9:30-10:00, 10:00-10:30 и т.п). Для документа "Заказы" добавил реквизиты "Дата" (тип дата) и "Время" (тип СправочникСсылка.ВременныеПромежутки). Правильно? Теперь как понимаю нужно написать код, который будет сравнивать выбранную дату и отображать только незанятые элементы справочника "Временные промежутки"? Или есть волшебная кнопочка/галочка, которая сама будет исключать записи?

oleg-x

Цитата: nst1 от 19 июн 2017, 17:58
Здравствуйте. Я полный новичок в 1С, прошу помощи, в гугле не смог найти решения.

Есть форма записи клиентов (Документ "Заказы"), содержащая фамилию, тип услуги и так далее.
Нужно добавить поля Дата и Время записи, но чтобы время выбиралось из заранее заданных промежутков и после записи клиента нельзя было добавить нового на это же время в этот день.

Я добавил новый документ "Временные промежутки" с реквизитом "Интервал" типа Строка (заполнил его 9:30-10:00, 10:00-10:30 и т.п). Для документа "Заказы" добавил реквизиты "Дата" (тип дата) и "Время" (тип СправочникСсылка.ВременныеПромежутки). Правильно? Теперь как понимаю нужно написать код, который будет сравнивать выбранную дату и отображать только незанятые элементы справочника "Временные промежутки"? Или есть волшебная кнопочка/галочка, которая сама будет исключать записи?
Используй регистр сведений, он сам будет проверять уникальность записей. Периодичность день, измерения Интервал времени(справочник/перечисление).
При попытке записать в регистр два одинаковых интервала, выдаст ошибку об не уникальности записи. Перед записью можно проверять (через запрос) есть ли запись и выдавать отказ со своим сообщением.
Помог, нажми спасибо. Не помог, нажми спасибо :-)
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google

nst1

Создал регистр сведений, режим записи=подчинение регистратору, Регистраторы-галочка на "Заказы" (правильно?), Данные-Измерения-Интервал времени, тип "СправочникСсылка.ВременныеИнтервалы".

Теперь как понимаю нужно организовать чтение и запись из регистра сведений, т.е как-то связать его с полем "Время" на основной форме "Заказы"?

oleg-x

Цитата: nst1 от 19 июн 2017, 18:52
Создал регистр сведений, режим записи=подчинение регистратору, Регистраторы-галочка на "Заказы" (правильно?), Данные-Измерения-Интервал времени, тип "СправочникСсылка.ВременныеИнтервалы".

Теперь как понимаю нужно организовать чтение и запись из регистра сведений, т.е как-то связать его с полем "Время" на основной форме "Заказы"?
Воспользуйся конструктором движений в самом документе. Он тебе сам пропишет код
Помог, нажми спасибо. Не помог, нажми спасибо :-)
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google

nst1

Кажись работает) Надеюсь последний вопрос: как при выборе времени скрывать уже занятые другими клиентами интервалы для выбранного дня? Просто натолкните на мысль

oleg-x

Сделать отбор, по регистру выбрать записи (запросом) которые уже есть и указать не в списке.
Помог, нажми спасибо. Не помог, нажми спасибо :-)
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google

nst1

Вы уж простите, за 2 дня не смог разобраться :dfbbdrfb: можете чуть пояснить?

Отбор вы имели в виду передать выбранную дату в форму выбора справочника "ВременныеИнтервалы"? То есть я пишу код для события "НачалоВыбора" поля "ВремяЗаписи", где отключаю стандартную обработку и открываю форму "НачалоВыбора" с параметром "ДатаЗаписи"?

Далее у меня открывается форма выбора справочника "ВременныеИнтервалы", а запрос на выборку записей из регистра нужно писать в модуле этой формы (процедура ПриОткрытии) или где-то в самом регистре?

oleg-x

Цитата: nst1 от 21 июн 2017, 10:17
Вы уж простите, за 2 дня не смог разобраться :dfbbdrfb: можете чуть пояснить?

Отбор вы имели в виду передать выбранную дату в форму выбора справочника "ВременныеИнтервалы"? То есть я пишу код для события "НачалоВыбора" поля "ВремяЗаписи", где отключаю стандартную обработку и открываю форму "НачалоВыбора" с параметром "ДатаЗаписи"?

Далее у меня открывается форма выбора справочника "ВременныеИнтервалы", а запрос на выборку записей из регистра нужно писать в модуле этой формы (процедура ПриОткрытии) или где-то в самом регистре?
1) Берем дату документа, будет как параметр в запросе.
2) Делаем запрос к регистру, срез последних. Получаем список интервалов (запрос выполняется в событие при начале выбора у данного реквизита, если не ошибаюсь).
3) При выборе делаем отбор интервалов "не в списке" и передаем туда полученный список в пункте 2.

Помог, нажми спасибо. Не помог, нажми спасибо :-)
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google

nst1

Спасибо, oleg-x, спустя 6 часов родил это :zebzdr:

&НаСервере
Функция ВыбратьЗанятыеДаты(ВыбраннаяДатаЗаписи)
Запрос = Новый Запрос;
//выбираем из регистра сведений интервалы времени (лежат в наименованиях) для выбранной даты
Запрос.Текст = "ВЫБРАТЬ
| РегистрСведений1СрезПоследних.Период,
| РегистрСведений1СрезПоследних.ИнтервалВремени.Наименование КАК Наименование
|ИЗ
| РегистрСведений.РегистрСведений1.СрезПоследних КАК РегистрСведений1СрезПоследних
|ГДЕ
     | РегистрСведений1СрезПоследних.Период = &Период";

Запрос.УстановитьПараметр("Период",ВыбраннаяДатаЗаписи); // в запросе &Период заменится на переданный функции параметр ВыбраннаяДатаЗаписи 
Список = Новый Массив;
Результат = Запрос.Выполнить();
Итог = Результат.Выбрать();
//заполняем массив элементами запроса
Пока Итог.Следующий() Цикл
Список.Добавить(Итог.Наименование);   
КонецЦикла;
Возврат  Список;  //функция вернет массив
КонецФункции


&НаКлиенте
Процедура ВремяЗаписиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ЗанятыеДаты=ВыбратьЗанятыеДаты(Объект.ДатаЗаписи);  //вызываем функцию ВыбратьЗанятыеДаты, передаем ей дату (имя реквизита)
ПараметрыФормы = Новый Структура;
Настройки = Новый НастройкиКомпоновкиДанных;
ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Наименование"); //название поля (реквизита) в открываемом справочнике, по которому будет фильтрация
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке; //тип фильтрации
    ЭлементОтбора.ПравоеЗначение = ЗанятыеДаты; //значение=массив ЗанятыеДаты
    ЭлементОтбора.Использование = Истина;
    ПараметрыФормы.Вставить("ФиксированныеНастройки", Настройки);
    ОткрытьФорму("Справочник.ВременныеИнтервалы.ФормаВыбора", ПараметрыФормы, Элемент);
КонецПроцедуры

Если есть грубые ошибки или можно оптимизировать код подскажите :D а если нет, то и так сойдет

oleg-x

Помог, нажми спасибо. Не помог, нажми спасибо :-)
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google

Похожие темы (5)

Рейтинг@Mail.ru

Поиск