Имя: Пароль:
1C
1С v8
v8.3: Процедура ОбработкаПроведения
0 user1365457
 
27.04.20
01:13
Документ "Резервирование" при проведении должен проверять:

окончание резервирования должно быть строго позже начала резервирования

если стол уже зарезервирован на указанное время, то выводить сообщение и не проводить документ

дописать код надо чуть чуть не понимаю помогите пожалуйста

Процедура ОбработкаПроведения(Отказ, РежимПроведения)


СекундВЧасе = 3600;
СекундВМинуте = 60;

ТекНачалоБронирования = НачалоДня(Дата) + СекундВЧасе * Час(НачалоРезервирование) +
СекундВМинуте * Минута(НачалоРезервирование) + Секунда(НачалоРезервирование);
ТекОкончаниеБронирования = НачалоДня(Дата) + СекундВЧасе * Час(КонецРезервирование) +
СекундВМинуте * Минута(КонецРезервирование) + Секунда(КонецРезервирование);


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

ВыборкаПересечениеПериодов = Запрос.Выполнить().Выбрать();

РезервированиеСтоликов.ДатаНачалоРезервирование <= &ДатаОкончаниеБронирования;
РезервированиеСтоликов.ОкончаниеБронирования >= &ДатаНачалоРезервирование);

Пока ВыборкаПересечениеПериодов.Следующий() Цикл
Сообщить("Стол " + Стол + " уже забронирован с " + ВыборкаПересечениеПериодов.Период + " по " + ВыборкаПересечениеПериодов.ОкончаниеБронирования);
КонецЦикла;

Если ВыборкаПересечениеПериодов.Количество() > 0 Тогда
Отказ = Истина;
Возврат;
КонецЕсли;

Движения.РезервированиеСтоликов.Записывать = Истина;
Движение = Движения.РезервированиеСтоликов.Добавить();
Движение.Период = НачалоДня(Дата) + СекундВЧасе * Час(НачалоРезервирование) +
СекундВМинуте * Минута(НачалоРезервирование) + Секунда(НачалоРезервирование);
Движение.Стол = Стол;
Движение.ОкончаниеБронирования = НачалоДня(Дата) + СекундВЧасе * Час(КонецРезервирование) +
СекундВМинуте * Минута(КонецРезервирование) + Секунда(КонецРезервирование);

//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры
1 palsergeich
 
27.04.20
01:51
А зачем так хитро даты хранятся?
Время без даты. Вот ты на эти грабли по всему коду и наступаешь.
Храни не просто время, а полную дату, тогда условие будет тривиально.
2 user1365457
 
27.04.20
03:12
более подробно можете пояснить ????

а как правильно написать?
подскажите чуть чуть не понятно