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

Запрос выдает не верные данные из регистра сведений

Автор andryus, 08 ноя 2023, 15:57

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

andryus

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

Объект.Дата = Дата документа и она равна 29.10.2023 года. Вопрос: Почему мне данная проверка возвращает значение что тот монитор который я выбираю еще все в составе КОМПЬЮТЕР1 ?

LexaK

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

andryus

LexaK, переделал, без разницы, так же выдает ошибку

LexaK

andryus, попробуйте в консоли запросов выполнить такой запрос

Выбрать * из РегистрСведений.СоставКомпьютера
упорядочить по Период

и посмотрите где/как встречается ваш Монитор
если помогло нажмите: Спасибо!

andryus

LexaK, встречается в записи от 28.04.2015, в других записях его нет

LexaK

если помогло нажмите: Спасибо!

andryus

LexaK, Не совсем ошибку, а срабатывает условие в коде
Пока Выборка.Следующий() Цикл
         Сообщить("Новый монитор состоит в составе компьютера "+Выборка.Компьютер); 
        Возврат Ложь;
    КонецЦикла;

Дошло до меня почему срабатывает данное условие, документом от 25.10.2023 года я не убираю МОНИТОР1 из РС вообще, я просто делаю запись в том что КОМПЬЮТЕР1 не имеет в своем составе измерения МОНИТОР1, а запрос мне по условиям запроса все равно будет находит запись от 28.04.2015 образно выглядит это так
ДатаРесурсИзмерение
28.04.2015КОМПЬЮТЕР1МОНИТОР1
25.10.2023КОМПЬЮТЕР1

Т.о. по условиям запроса он мне все равно будет выводить по записи от 28.04.2015 года что МОНИТОР1 в составе КОМПЬЮТЕРА1, если удалять его из записи от 28.04.2015, тогда, да, запрос будет работать идеально, но тогда потеряю хронологию что когда и где было

А как сделать дальше не могу сообразить))

Максим75

andryus, можно в регистр добавить еще измерение (допустим Статус), в котором указывать Истина, если монитор в составе компа, и Ложь, если убрали из состава.
и тогда не Монитор убирать, а делать вторую запись и менять статус, и уже тогда в запросе по срезу последних смотреть какой по монитору статус. и дальше принимать решение.

может кто чего еще предложит.

LexaK

точную/полную структуру вашего регистра СоставКомпьютера выложите
кажется вы неправильно используете измерения и ресурсы
если помогло нажмите: Спасибо!

andryus

Максим75, хороший вариант но у меня регистр состоит из нескольких измерений, т.е. структура регистра следующая

ДатаРесурсИзмерениеИзмерениеИзмерение
ДатаКомпьютерМониторИБППринтер

А для чего служит РЕКВИЗИТ в РС с ним ничего нельзя сделать? Я его никогда не применял

Теги:

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

Рейтинг@Mail.ru

Поиск