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

Запрет на добавление уже имеющихся данных в другом документе

Автор filomonko, 29 мар 2022, 15:19

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

filomonko

Здравствуйте!))
Очень нужна помощь!))
Необходимо сделать так, чтобы нельзя было бронировать дважды один и тот же номер на одни и те же даты брони в документе "Бронирование".
Скрин самого документа ниже.
-.png

Oscar

filomonko,
Наверное нужно копать в сторону регистра накопления. Нужно при добавлении строки делать запрос в регистр по номеру комнаты, то есть узнать свободен номер или нет, ну и соответственно при проведении документа нужно делать движения по этому регистру.

filomonko


alexandr_ll

filomonko, Документ "Бронирование" делает движения по каким-либо регистрам?

Yotram

Я бы воспользовался не регистром накопления, а регистром сведений. В нем бы хранил информацию о занятости номера по датам.

Создается регистр сведений "ЗанятостьНомеров". В нем измерение "Номер", Ресурс "Занят" (булево), периодичность день, регистратор документ "Бронирование"

Код модуля объекта документа "Бронирование"

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

// Циклом проходимся по табличной части документа
// в регистр заносим все занятые дни номера
Для каждого СтрокаТабличнойЧасти Из Таблица Цикл

// Период - переменная в которой хранится дата, в цикле увеличиваем её на сутки
// до тех пор, пока она не будет равна дате выезда. Делаем строго меньше чтобы
// дата выезда не занимала номер
Период = ДатаЗаезда;
Пока Период < ДатаВыезда Цикл
Движение = Движения.ЗанятостьНомеров.Добавить();
Движение.Период = Период;
Движение.Номер = СтрокаТабличнойЧасти.Номер;
Движение.Занят = Истина;

Период = Период + 84600;
КонецЦикла;

КонецЦикла;

Движения.ЗанятостьНомеров.Записать();

КонецПроцедуры

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

// Перед записью проводим проверку
Для каждого СтрокаТабличнойЧасти Из Таблица Цикл

// Аналогично обработке проведения проходим по всем датам
Период = ДатаЗаезда;
Пока Период < ДатаВыезда Цикл

// Можно использовать разные способы. Скуки ради я использовал менеджер записи.
// это не профессиональный подход, но можно и попробовать
МенеджерЗаписи = РегистрыСведений.ЗанятостьНомеров.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = Период;
МенеджерЗаписи.Номер = СтрокаТабличнойЧасти.Номер;
МенеджерЗаписи.Прочитать();

// Можно просто проверять на МенеджерЗаписи.Занят, но я предпочитаю подобную проверку
// Если номер в этот период занят - то отменяем запись
Если МенеджерЗаписи.Занят = Истина Тогда
Отказ = Истина;
Возврат;
КонецЕсли;

Период = Период + 84600;
КонецЦикла;

КонецЦикла;

КонецПроцедуры

P.S. Код писался на коленке и служит для общей концепции идеи. Он не оптимизирован, возможны синтаксические ошибки и может нанести вред компьютеру и психике.
"Дай человеку рыбу, и ты накормишь его на один день, научи его рыбачить, и он будет сыт всю жизнь"

Oscar

Yotram,
Да я тоже думал об регистре сведений. Ну вообщем самое главное есть куда идти, нужно делать при проведении движения по регистру. И соответственно проверку о наличии можно делать запросом из этого же регистра.

filomonko

Yotram, Ошибка при выполнении обработчика - 'ПередЗаписью'
по причине:
Менеджер записи не может быть использован для регистра с режимом записи "Подчинение регистратору"

Теги:

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

Рейтинг@Mail.ru

Поиск