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

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

Автор Igor100500, 20 ноя 2015, 11:46

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

Igor100500

Здравствуйте. Хочу сделать запрос на отказ проведения, но выдает ошибку {Документ.Заселение.МодульОбъекта(30)}: Поле объекта не обнаружено (НомерКомнаты)
   Если НомерКомнаты = ВЗ.НомерКомнаты Тогда
Суть в том чтобы срабатывал отказ в проведении когда мы хотим заселить человека в комнату в которой уже проживает кто-либо.
Процедура ОбработкаПроведения(Отказ, Режим)
   //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
   // Данный фрагмент построен конструктором.
   // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

   // регистр Расселение
   Движения.Расселение.Записывать = Истина;
   Движение = Движения.Расселение.Добавить();
   Движение.Период = Дата;
   Движение.Клиент = ФИО;
   Движение.НомерКомнаты = НомерКомнаты;
   Движение.ДатаЗаселения = ДатаЗаселения;
   Движение.Статус = Занята;

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

   КонецЕсли;
КонецЦикла;

вот код.
Что не так?
через отладку смотрел(выборку видит, значения подставляет - все правильно) само значение номера комнаты тоже видит.

Kironten

//Если НомерКомнаты = ВЗ.НомерКомнаты Тогда
Если НомерКомнаты = Выборка.НомерКомнаты Тогда

Igor100500

Цитата: Kironten от 20 ноя 2015, 11:49
//Если НомерКомнаты = ВЗ.НомерКомнаты Тогда
Если НомерКомнаты = Выборка.НомерКомнаты Тогда


Спасибо, все работает.)))

Igor100500

Как-то немножко не так она работает, она находит значение в регистре первое, а не последнее
Добавлено: 25 ноя 2015, 19:48


https://cloud.mail.ru/public/9Jt5/RE644g7Ky
В запросе он в выборке подставит значения комнаты которые у меня очищаются при выселении, не должен же подставлять..в чем может быть проблема?

Движения документа Выселение:
// регистр Расселение
Движения.Расселение.Записывать = Истина;
Движение = Движения.Расселение.Добавить();
Движение.Период = Дата;
Движение.Клиент = ФИО;
Движение.Статус = Занята;
Движение.НомерКомнаты = 0;
Движение.ДатаЗаселения = ДатаВыселения;

Kironten

Цитата: Igor100500 от 25 ноя 2015, 19:42
Как-то немножко не так она работает, она находит значение в регистре первое, а не последнее
Добавлено: 25 ноя 2015, 19:48


https://cloud.mail.ru/public/9Jt5/RE644g7Ky
В запросе он в выборке подставит значения комнаты которые у меня очищаются при выселении, не должен же подставлять..в чем может быть проблема?

Движения документа Выселение:
// регистр Расселение
Движения.Расселение.Записывать = Истина;
Движение = Движения.Расселение.Добавить();
Движение.Период = Дата;
Движение.Клиент = ФИО;
Движение.Статус = Занята;
Движение.НомерКомнаты = 0;
Движение.ДатаЗаселения = ДатаВыселения;

Ничего не понял. По подробнее объяснить попытайтесь.
И кстати вопрос: Почему вы ставить статус комнаты "занята" если освобождаете её?
И зачем вам вообще 2 регистра понадобилось?
Почему нельзя было обойтись одним - "СостояниеНомеров" например?
Заселили - сделали запись документом, расселили - сделали вторую запись.

Igor100500

У меня 1 регистр "Расселение"
Есть 2 документа :
        Заселение
        Выселение
Заселил я человека = мы видим что запись в регистре появилась( как там на рисунке, ссылка выше )
в документе есть реквизит(тип булево) при заселении он активен.
Хочу выселить его = он номер комнаты не запоминает(дабы запрос на проверку свободной комнаты работал, на картинке это видно).
Проблема в том что по факту когда человека выселил, он все равно видит что он есть.
Допустим Иванова заслил в 1 комнату, выселил его(тобишь в регистре запись появилась где не хранится значение номера комнаты), далее он вдруг приехал и опять хочет в 1 комнату заселится - Эта комната Занята.
Открываем документ Заселение. и вот этот код
// регистр Расселение
Движения.Расселение.Записывать = Истина;
Движение = Движения.Расселение.Добавить();
Движение.Период = Дата;
Движение.Клиент = ФИО;
Движение.НомерКомнаты = НомерКомнаты;
Движение.ДатаЗаселения = ДатаЗаселения;
Движение.Статус = Занята;

// регистр Заселение Приход
Движения.Заселение.Записывать = Истина;
Движение = Движения.Заселение.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Клиент = ФИО;
Движение.НомерКомнаты = НомерКомнаты;
Движение.ДатаЗаселения = ДатаЗаселения;
Движение.Статус = Занята;



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

Движения.Расселение.Записывать = Истина;
Движение = Движения.Расселение.Добавить();
Движение.Период = Дата;
Движение.Клиент = ФИО;
Движение.НомерКомнаты = НомерКомнаты;
Движение.ДатаЗаселения = ДатаЗаселения;
Движение.Статус = Занята;

КонецЕсли;
КонецЦикла;

через отладку смотрел, он подставляет получается не последнее значение в регистре сведений, а первое..почему?)

Добавлено: 25 ноя 2015, 21:02


Цитата: Igor100500 от 25 ноя 2015, 20:33
У меня 1 регистр "Расселение"
Есть 2 документа :
        Заселение
        Выселение
Заселил я человека = мы видим что запись в регистре появилась( как там на рисунке, ссылка выше )
в документе есть реквизит(тип булево) при заселении он активен(истина).
При выселении этот реквизит не аткивен(ложь) - это автоматически ставится.
Хочу выселить его = он номер комнаты не запоминает(дабы запрос на проверку свободной комнаты работал, на картинке это видно).
Проблема в том что по факту когда человека выселил, он все равно видит что он есть.
Допустим Иванова заслил в 1 комнату, выселил его(тобишь в регистре запись появилась где не хранится значение номера комнаты), далее он вдруг приехал и опять хочет в 1 комнату заселится - Эта комната Занята.
Открываем документ Заселение. и вот этот код
// регистр Расселение
Движения.Расселение.Записывать = Истина;
Движение = Движения.Расселение.Добавить();
Движение.Период = Дата;
Движение.Клиент = ФИО;
Движение.НомерКомнаты = НомерКомнаты;
Движение.ДатаЗаселения = ДатаЗаселения;
Движение.Статус = Занята;

// регистр Заселение Приход
Движения.Заселение.Записывать = Истина;
Движение = Движения.Заселение.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Клиент = ФИО;
Движение.НомерКомнаты = НомерКомнаты;
Движение.ДатаЗаселения = ДатаЗаселения;
Движение.Статус = Занята;



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

Движения.Расселение.Записывать = Истина;
Движение = Движения.Расселение.Добавить();
Движение.Период = Дата;
Движение.Клиент = ФИО;
Движение.НомерКомнаты = НомерКомнаты;
Движение.ДатаЗаселения = ДатаЗаселения;
Движение.Статус = Занята;

КонецЕсли;
КонецЦикла;

через отладку смотрел, он подставляет получается не последнее значение в регистре сведений, а первое..почему?)

Kironten

Цитата: Igor100500 от 25 ноя 2015, 20:33
У меня 1 регистр "Расселение"
Есть 2 документа :
        Заселение
        Выселение
Заселил я человека = мы видим что запись в регистре появилась( как там на рисунке, ссылка выше )
в документе есть реквизит(тип булево) при заселении он активен.
Хочу выселить его = он номер комнаты не запоминает(дабы запрос на проверку свободной комнаты работал, на картинке это видно).
Проблема в том что по факту когда человека выселил, он все равно видит что он есть.
Допустим Иванова заслил в 1 комнату, выселил его(тобишь в регистре запись появилась где не хранится значение номера комнаты), далее он вдруг приехал и опять хочет в 1 комнату заселится - Эта комната Занята.
Открываем документ Заселение. и вот этот код
// регистр Расселение
Движения.Расселение.Записывать = Истина;
Движение = Движения.Расселение.Добавить();
Движение.Период = Дата;
Движение.Клиент = ФИО;
Движение.НомерКомнаты = НомерКомнаты;
Движение.ДатаЗаселения = ДатаЗаселения;
Движение.Статус = Занята;

// регистр Заселение Приход
Движения.Заселение.Записывать = Истина;
Движение = Движения.Заселение.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Клиент = ФИО;
Движение.НомерКомнаты = НомерКомнаты;
Движение.ДатаЗаселения = ДатаЗаселения;
Движение.Статус = Занята;



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

Движения.Расселение.Записывать = Истина;
Движение = Движения.Расселение.Добавить();
Движение.Период = Дата;
Движение.Клиент = ФИО;
Движение.НомерКомнаты = НомерКомнаты;
Движение.ДатаЗаселения = ДатаЗаселения;
Движение.Статус = Занята;

КонецЕсли;
КонецЦикла;

через отладку смотрел, он подставляет получается не последнее значение в регистре сведений, а первое..почему?)
Из вашего кода по заселению видно что:
1. Создается набор записей в регистр сведений "Расселение".
2. Создается набор записей в регистр накопления "Заселение" с видом движения "Приход".
3. После этого делается запрос к виртуальной таблице регистра сведений "Расселение", причем раз запрос идет с конструкцией ГДЕ, то будет браться последняя запись с условиями:
РасселениеСрезПоследних.Клиент = &Клиент И РасселениеСрезПоследних.НомерКомнаты = &НомерКомнаты
Т.е. если была запись с такими условиями в регистре сведений то она возьмется по-любому. (этим кстати и объясняется, что  у вас обязательно появляется запись после вашего запроса после того, как клиент приехал второй раз, в этот же номер)
4. После этого задаете условие, что если номер комнаты в документе равен комнате в выборке (а он обязательно будет равен, т.к. этот клиент уже был в этой комнате)
Если НомерКомнаты = Выборка.НомерКомнаты Тогда
Происходит отказ от записи наборов записей.
Если же нет, происходит формирование еще двух наборов записей. Один в регистр сведений "Заселение", другой в регистр сведений "Расселение".
В итоге, если не происходит отказ должно быть записано 4(четыре)!!! набора записей в 3 разных регистра.
Вообще, ваш код никак не вяжется с вашими же объяснениями по структуре конфигурации.

Igor100500

Так то да, но формируется 1 запись в регистре накопления(хотя как вы написали 4) кроме-того, запрос 50 на 50 работает, то есть после ИНАЧЕ должны происходить записи в регистры(они не записываются).
Добавлено: 25 ноя 2015, 22:06


А как грамотно переделать этот код?)

Kironten

Цитата: Igor100500 от 25 ноя 2015, 22:05
Так то да, но формируется 1 запись в регистре накопления(хотя как вы написали 4) кроме-того, запрос 50 на 50 работает, то есть после ИНАЧЕ должны происходить записи в регистры(они не записываются).
Добавлено: 25 ноя 2015, 22:06


А как грамотно переделать этот код?)
Ну, 4 это я погорячился. Два набора у вас одинаковые, поэтому пойдут как один:
    Движения.Расселение.Записывать = Истина;
    Движение = Движения.Расселение.Добавить();
    Движение.Период = Дата;
    Движение.Клиент = ФИО;
    Движение.НомерКомнаты = НомерКомнаты;
    Движение.ДатаЗаселения = ДатаЗаселения;
    Движение.Статус = Занята;
   
    Движения.Расселение.Записывать = Истина;
    Движение = Движения.Расселение.Добавить();
    Движение.Период = Дата;
    Движение.Клиент = ФИО;
    Движение.НомерКомнаты = НомерКомнаты;
    Движение.ДатаЗаселения = ДатаЗаселения;
    Движение.Статус = Занята;

Оставшиеся 2 - косячные. Поэтому ни один из них не запишется. Так что, вот вы и получили 1 набор записей в итоге.
Если даже взять за основу тот многострадальный РС Расселение, то принцип такой:
При заселении пишете набор записей со статусом "занята" при выселении статус меняется.
Иначе говоря, при заселении запрос по срезу последних с условием
где РасселениеСрезПоследних.НомерКомнаты = &НомерКомнаты
В результате получите состояние комнаты на текущую дату.
Далее условие
Если Выборка.Статус = "Занята" (или значение перечисления, что правильнее) Тогда
    Сообщить("Хрена лысого, хата на приколе!");
    Отказ = Истина;
Иначе
    //Создаем набор записей с текущим клиентом, комнатой, и статусом занята
КонецЕсли;

Как то так.

Igor100500

https://cloud.mail.ru/public/8ZEU/QtzQxCiBQ
Создали запись в документе заселение - заселяем человека( запись добавилась).
Создали запись в доке. выселение статус перешел в значение Ложь(тобишь свободна)
код щас такой:
Запрос = Новый Запрос;
Запрос.Текст =  "ВЫБРАТЬ
                | РасселениеСрезПоследних.Клиент,
                | РасселениеСрезПоследних.НомерКомнаты,
                | РасселениеСрезПоследних.Статус
                |ИЗ
                | РегистрСведений.Расселение.СрезПоследних КАК РасселениеСрезПоследних
                |ГДЕ
                | РасселениеСрезПоследних.НомерКомнаты = &НомерКомнаты" ;
                                                                       
Запрос.УстановитьПараметр("НомерКомнаты", НомерКомнаты);
ВЗ = Запрос.Выполнить();
Выборка = ВЗ.Выбрать();
  Пока Выборка.Следующий() Цикл
Если Выборка.Статус = Истина Тогда
Сообщить("Занято");
Отказ = Истина;
Иначе
// регистр Расселение
Движения.Расселение.Записывать = Истина;
Движение = Движения.Расселение.Добавить();
Движение.Период = Дата;
Движение.Клиент = ФИО;
Движение.НомерКомнаты = НомерКомнаты;
Движение.ДатаЗаселения = ДатаЗаселения;
Движение.Статус = Занята;

// регистр Заселение Приход
Движения.Заселение.Записывать = Истина;
Движение = Движения.Заселение.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Клиент = ФИО;
Движение.НомерКомнаты = НомерКомнаты;
Движение.ДатаЗаселения = ДатаЗаселения;
Движение.Статус = Занята;

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

// регистр Заселение Приход
Движения.Заселение.Записывать = Истина;
Движение = Движения.Заселение.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Клиент = ФИО;
Движение.НомерКомнаты = НомерКомнаты;
Движение.ДатаЗаселения = ДатаЗаселения;
Движение.Статус = Занята;

Щас ругается на регистр мой(ну я так думаю)
мол запись с такими ключ. параметрами существует
Добавлено: 25 ноя 2015, 23:07


Вот тут уже интересно почему он так делает, у меня же периодичность в пределах секунды вроде, не должно так быть.
Добавлено: 25 ноя 2015, 23:09


Через отладчик все правильно теперь подставляет.

Теги: Запрос 

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

Рейтинг@Mail.ru

Поиск