8.х Проблемка с запросом.

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем ифкпфт009, 25 ноя 2015.

  1. TopicStarter Overlay
    ифкпфт009
    Offline

    ифкпфт009 Опытный в 1С

    Регистрация:
    23 апр 2014
    Сообщения:
    81
    Симпатии:
    0
    Баллы:
    26
    Здравствуйте. Сделал запрос на отказ проведения.Суть в том чтобы срабатывал отказ в проведении когда мы хотим заселить человека в комнату в которой уже проживает кто-либо.
    У меня 1 регистр "Расселение"
    Есть 2 документа :
    Заселение
    Выселение
    Заселил я человека = мы видим что запись в регистре появилась( как там на рисунке, ссылка выше )
    в документе есть реквизит(тип булево) при заселении он активен.
    Хочу выселить его = он номер комнаты не запоминает(дабы запрос на проверку свободной комнаты работал, на картинке это видно).
    Проблема в том что по факту когда человека выселил, он все равно видит что он есть.
    Допустим Иванова заслил в 1 комнату, выселил его(тобишь в регистре запись появилась где не хранится значение номера комнаты), далее он вдруг приехал и опять хочет в 1 комнату заселится - Эта комната Занята.
    Открываем документ Заселение. и вот этот код
    Код:
    // регистр Расселение
        Движения.Расселение.Записывать = Истина;
        Движение = Движения.Расселение.Добавить();
        Движение.Период = Дата;
        Движение.Клиент = ФИО;
        Движение.НомерКомнаты = НомерКомнаты;
        Движение.ДатаЗаселения = ДатаЗаселения;
        Движение.Статус = Занята;
       
        // регистр Заселение Приход
        Движения.Заселение.Записывать = Истина;
        Движение = Движения.Заселение.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
        Движение.Период = Дата;
        Движение.Клиент = ФИО;
        Движение.НомерКомнаты = НомерКомнаты;
        Движение.ДатаЗаселения = ДатаЗаселения;
        Движение.Статус = Занята;
    
    
       
        Запрос = Новый Запрос;
        Запрос.Текст =  "ВЫБРАТЬ
                        |    РасселениеСрезПоследних.Клиент,
                        |    РасселениеСрезПоследних.НомерКомнаты,
                        |    РасселениеСрезПоследних.Статус
                        |ИЗ
                        |    РегистрСведений.Расселение.СрезПоследних КАК РасселениеСрезПоследних
                        |ГДЕ
                        |    РасселениеСрезПоследних.Клиент = &Клиент
                        |    И РасселениеСрезПоследних.НомерКомнаты = &НомерКомнаты" ;
                                                                               
        Запрос.УстановитьПараметр("НомерКомнаты", НомерКомнаты);
        Запрос.УстановитьПараметр("Клиент", ФИО);
        ВЗ = Запрос.Выполнить();
        Выборка = ВЗ.Выбрать();
          Пока Выборка.Следующий() Цикл
        Если НомерКомнаты = Выборка.НомерКомнаты Тогда
        Сообщить("Занято");
        Отказ = Истина;
        Иначе   
        Движения.Заселение.Записывать = Истина;
        Движение = Движения.Заселение.Добавить();
        Движение.Период = Дата;
        Движение.Клиент = ФИО;
        Движение.НомерКомнаты = НомерКомнаты;
        Движение.ДатаЗаселения = ДатаЗаселения;
        Движение.Статус = Занята;
       
        Движения.Расселение.Записывать = Истина;
        Движение = Движения.Расселение.Добавить();
        Движение.Период = Дата;
        Движение.Клиент = ФИО;
        Движение.НомерКомнаты = НомерКомнаты;
        Движение.ДатаЗаселения = ДатаЗаселения;
        Движение.Статус = Занята;
    
        КонецЕсли;
    КонецЦикла;
    через отладку смотрел, он подставляет получается не последнее значение в регистре сведений, а первое..почему?)
  2. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    А где у вас дата, на которую нужно "срезать" данные ?
  3. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.977
    Симпатии:
    397
    Баллы:
    104
    Структура регистров однозначно не правильная. Для чего делать их два. В этом и прикол проведения. Сделайте один общий регистр. Сведений подойдет вполне. Назовите его например "СостояниеКомнат".
    Измерения: По порядку. Это важно
    Комната (Справочник лучше)
    Состояние (Перчисление)
    Ресурсы
    Клиент (Справочник)
    Периодический Секунда.
    Тем самым мы имеем состояние комнаты в определенную секунду. Допустим, что человек может ее забронировать на несколько часов.
    Код:
    Выбрать
    СостояниеКомнат.Комната,
    СостояниеКомнат.Состояние
    Из РегистрСведений.СостояниеКомнат(&ДатаСреза, Состояние = Перечисление.СостоянияКомнат.Свободна) Как СостояниеКомнат
    И легко уже все поймете.
  4. TopicStarter Overlay
    ифкпфт009
    Offline

    ифкпфт009 Опытный в 1С

    Регистрация:
    23 апр 2014
    Сообщения:
    81
    Симпатии:
    0
    Баллы:
    26
    Запись идет в 2 регистра, 1 запись в регистр сведений, другая в регистр накоплений.
    Состояние(у меня получается реквизит Занята(тип булево)
    --- Объединение сообщений, 26 ноя 2015 ---
    Я вчера переделал чуток
    Код:
    Запрос = Новый Запрос;
        Запрос.Текст =  "ВЫБРАТЬ
                        |    РасселениеСрезПоследних.НомерКомнаты,
                        |    РасселениеСрезПоследних.Статус
                        |ИЗ
                        |    РегистрСведений.Расселение.СрезПоследних КАК РасселениеСрезПоследних
                        |ГДЕ
                        |    РасселениеСрезПоследних.НомерКомнаты = &НомерКомнаты" ;
                                                                               
        Запрос.УстановитьПараметр("НомерКомнаты", НомерКомнаты);
        ВЗ = Запрос.Выполнить();
        Выборка = ВЗ.Выбрать();
          Пока Выборка.Следующий() Цикл
        Если НомерКомнаты = Выборка.Статус = Истина   Тогда
        Сообщить("Занято");
        Отказ = Истина;
        Иначе   
        // регистр Расселение
        Движения.Расселение.Записывать = Истина;
        Движение = Движения.Расселение.Добавить();
        Движение.Период = Дата;
        Движение.Клиент = ФИО;
        Движение.НомерКомнаты = НомерКомнаты;
        Движение.ДатаЗаселения = ДатаЗаселения;
        Движение.Статус = Занята;
       
        // регистр Заселение Приход
        Движения.Заселение.Записывать = Истина;
        Движение = Движения.Заселение.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
        Движение.Период = Дата;
        Движение.Клиент = ФИО;
        Движение.НомерКомнаты = НомерКомнаты;
        Движение.ДатаЗаселения = ДатаЗаселения;
        Движение.Статус = Занята;
    
    Вот и пишет мол запись с такими ключ. полями существует., интересно почему, у меня же периодический(1сек).
    --- Объединение сообщений, 26 ноя 2015 ---
    https://cloud.mail.ru/public/8ZEU/QtzQxCiBQ
    --- Объединение сообщений, 26 ноя 2015 ---
    А регистр накопления...ну )) так сказали, мол когда заселяем это будет приход, когда выселяем это расход(в регистре сведений же такое не сделать)
    --- Объединение сообщений, 26 ноя 2015 ---
    Щас он правильные значения подставляет, последние которые, но ошибка другая.
    https://cloud.mail.ru/public/6uZC/8WGBiHqWB
    --- Объединение сообщений, 26 ноя 2015 ---
    Может нельзя такое тип использовать(Булево)?
    На парах создавали похожее, как вы сказали(Перечисление) там такой проблемы не было(вроде))
    Последнее редактирование: 26 ноя 2015
  5. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.977
    Симпатии:
    397
    Баллы:
    104
    Вы читали мое сообщение? Смотря что хранить хотите, то и нужно делать. Если хранить состояние комнаты определенной, то это регистр. Доступ быстрый и можно легко узнать в любой момент времени. А если что-то другое. Кооличество заселившихся. то это уже другой вопрос.
  6. TopicStarter Overlay
    ифкпфт009
    Offline

    ифкпфт009 Опытный в 1С

    Регистрация:
    23 апр 2014
    Сообщения:
    81
    Симпатии:
    0
    Баллы:
    26
    Дак мне и то и то надо)

Поделиться этой страницей