8.х Проверка на наличие и отсутствие ресурса в регистре сведений на определённую дату

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

  1. TopicStarter Overlay
    alexiy281
    Offline

    alexiy281 Опытный в 1С

    Регистрация:
    31 окт 2012
    Сообщения:
    62
    Симпатии:
    0
    Баллы:
    26
    Помогите решить построение запроса, у самого не получается :(

    Есть Регистр сведений ПриборНаВходе - в нём измерение ВХОД известен
    Необходимо на определённую дату определить заполнен ли ресурс или он пустой (измерение в нём всегда заполнено, меняется лишь измерение - пусто или заполнено)


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

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.987
    Симпатии:
    398
    Баллы:
    104
    Уверен на 1000000000%, что смысл регистра у вас не верен. Самая распространенная ошибка новичков. В периодическом регистре условие на дату нужно ставить в условиях виртуальной таблицы. И условия по отбору измерений тоже ставить во условия виртуальной таблицы. Понимаете о чем я говорю?
    alexiy281 нравится это.
  3. TopicStarter Overlay
    alexiy281
    Offline

    alexiy281 Опытный в 1С

    Регистрация:
    31 окт 2012
    Сообщения:
    62
    Симпатии:
    0
    Баллы:
    26
    нет к сожалению пока что я ничего из этого не понял :(
  4. nbIpKuH_BaH9I
    Online

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.987
    Симпатии:
    398
    Баллы:
    104
    :) Ясно.
    Вот смотрите на моем примере. У меня есть регистр сведений Активность карт. Он периодичен по дням. Понимаете, что это значит?
    Код:
    ВЫБРАТЬ
        АктивностьКартСрезПоследних.ЛицевойСчет,
        АктивностьКартСрезПоследних.Карта
    ИЗ
        РегистрСведений.АктивностьКарт.СрезПоследних(&ДатаСреза, ЛицевойСчет = &ЛицевойСчет) КАК АктивностьКартСрезПоследних
    alexiy281 нравится это.
  5. TopicStarter Overlay
    alexiy281
    Offline

    alexiy281 Опытный в 1С

    Регистрация:
    31 окт 2012
    Сообщения:
    62
    Симпатии:
    0
    Баллы:
    26
    да я понимаю что такое периодичность по дням)
    вот так как вы указали я уже пробовал,...
    попробую ещё разок)
    --- Объединение сообщений, 16 сен 2014 ---
    Ура)
    как я до этого пробовал - перепробовал....
    Вобщем всё получилось, Спасибо огромное)

    а ещё вопрос) - мне необходимо выполнить проверку на каждый день в месяце по циклу, чтобы перебрать значения на каждый день я по циклу делаю запрос на каждую дату поочерёдно, дата у меня с секундами) (в отличии от 7.7)
    я чтобы получить очередной день делаю так: НачальЦикла=НачальЦикла+86400;
    86400 - это кол-во секунд в сутках
    а как-то п другому можно новые сутки получать?
    Последнее редактирование: 16 сен 2014
  6. nbIpKuH_BaH9I
    Online

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.987
    Симпатии:
    398
    Баллы:
    104
    Да вариантов полно. Все зависит от знаний программиста и его фантазии, а также от условий самой задачи. Если прибавлять по 86400 секунд, думаю это нормально. Можно использовать функцию ДобавитьКДате. Можно в запросе.
    --- Объединение сообщений, 16 сен 2014 ---
    А вообще совет. Пользуйтесь консолью запросов. Многое поймете сразу.
    Последнее редактирование: 16 сен 2014
    alexiy281 нравится это.
  7. TopicStarter Overlay
    alexiy281
    Offline

    alexiy281 Опытный в 1С

    Регистрация:
    31 окт 2012
    Сообщения:
    62
    Симпатии:
    0
    Баллы:
    26
    Спасибо :)
  8. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.572
    Симпатии:
    717
    Баллы:
    204
    Ээээ....сделаете динамический срез состояния сотрудников организации таки образом? :)
  9. nbIpKuH_BaH9I
    Online

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.987
    Симпатии:
    398
    Баллы:
    104
    Че? Меня решили по вопросам погонять? Не чего не перепутали?
  10. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.572
    Симпатии:
    717
    Баллы:
    204
    Я к тому, что не стоит сразу говорить, что все необходимо в параметры виртуальной таблицы пихать :)
  11. nbIpKuH_BaH9I
    Online

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.987
    Симпатии:
    398
    Баллы:
    104
    Случаи разные. Задачи разные. Все зависит от конкретных данных. Думаю об этом вообще вслух не стоит говорить, это и так понятно :) но как для новичка пусть сначала поймет для чего срезы нужны и как они работают. :)
  12. mialord
    Offline

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

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Здравствуйте!
    За данную задачу всем ставлю кол с минусом.
    Недеюсь Вы хоть понимаете какую ерунду сейчас нагородили. Ваше решение задачи загнало запрос в цикл что противоречит методологии разработки конфигураций описанной 1С. Данное решение считается наиболее грубой ошибкой из всех возможных.
    Так же, использовать виртуальную таблицу в параметрах запроса у Вас не получится. Языки запросов ограничивают выборку таблиц количеством более 255. На каждый виртуальный параметр переодического регистра у Вас бы создавалась новая виртуальная таблица. Загнав в параметры 526 таблиц Вы бы разрушили базу данных, что сделать Вам 1С не позволит.
    Для работы с периодической информацией необходимо уметь правильно работать с параметрами запросов. Я не буду решать конкретную задачу, но накидаю Вам пример в виде исключения
    Запрос выбирает последние цены (переодическую информацию).
    Пример постоения запроса к периодическим регистрам с добавлением исключений т.к. это без разрушения и увеличения нагрузок на базу данных не возможно. Вы не используете срез последних, а выбираете информацию за весь период дополняя её при наличии пустых показателей.
    Код:
            Запрос.Текст = "ВЫБРАТЬ
            |    ДанныеДляРасчетов.Номенклатура,
            |    ДанныеДляРасчетов.ХарактеристикаНоменклатуры,
            |    ДанныеДляРасчетов.Дата,
            |    ДанныеДляРасчетов.ДокументУстановкиЦен,
            |    ВЫБОР
            |        КОГДА ДанныеДляРасчетов.СебестоимостьПрошлойЗакупки = 0
            |                ИЛИ ДанныеДляРасчетов.ЦенаВРозницеСтарая = 0
            |            ТОГДА 0
            |        ИНАЧЕ (ДанныеДляРасчетов.ЦенаВРозницеСтарая / ДанныеДляРасчетов.СебестоимостьПрошлойЗакупки - 1) * 100
            |    КОНЕЦ КАК Наценка,
            |    ДанныеДляРасчетов.ЦенаВРозницеСтарая,
            |    ДанныеДляРасчетов.Себестоимость,
            |    ДанныеДляРасчетов.СебестоимостьПрошлойЗакупки,
            |    ДанныеДляРасчетов.ЕдиницаИзмерения КАК Единица0
            |ИЗ
            |    (ВЫБРАТЬ
            |        ПодЗапрос.Номенклатура КАК Номенклатура,
            |        ПодЗапрос.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
            |        ЕСТЬNULL(ЦеныНоменклатурыСХарактеристиками.Цена, ЕСТЬNULL(ЦеныНоменклатурыБезХарактеристик.Цена, 0)) КАК ЦенаВРозницеСтарая,
            |        ПодЗапрос.Дата КАК Дата,
            |        ПодЗапрос.Ссылка КАК ДокументУстановкиЦен,
            |        ЕСТЬNULL(ТоварыПрошлойЗакупки.СебестоимостьПрошлойЗакупки, 0) КАК СебестоимостьПрошлойЗакупки,
            |        ПодЗапрос.Себестоимость КАК Себестоимость,
            |        ПодЗапрос.Номенклатура.ЕдиницаХраненияОстатков КАК ЕдиницаИзмерения
            |    ИЗ
            |        (ВЫБРАТЬ
            |            ПоступлениеТоваров.Номенклатура КАК Номенклатура,
            |            ПоступлениеТоваров.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
            |            МАКСИМУМ(ВЫБОР
            |                    КОГДА ЕСТЬNULL(ПоступлениеТоваров.ЕдиницаИзмерения.Коэффициент, 0) <> 0
            |                        ТОГДА ПоступлениеТоваров.Цена * ПоступлениеТоваров.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / ПоступлениеТоваров.ЕдиницаИзмерения.Коэффициент
            |                    ИНАЧЕ ПоступлениеТоваров.Цена
            |                КОНЕЦ) КАК Себестоимость,
            |            ДокументПоступлениеТоваров.Ссылка КАК Ссылка,
            |            ДокументПоступлениеТоваров.Дата КАК Дата
            |        ИЗ
            |            Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваров
            |                ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваров КАК ДокументПоступлениеТоваров
            |                ПО (ДокументПоступлениеТоваров.Ссылка = ПоступлениеТоваров.Ссылка)
            |        ГДЕ
            |            ПоступлениеТоваров.Ссылка = &ДокументПоступления
            |      
            |        СГРУППИРОВАТЬ ПО
            |            ПоступлениеТоваров.Номенклатура,
            |            ПоступлениеТоваров.ХарактеристикаНоменклатуры,
            |            ДокументПоступлениеТоваров.Ссылка,
            |            ДокументПоступлениеТоваров.Дата) КАК ПодЗапрос
            |            ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            |                ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
            |                ЦеныНоменклатуры.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
            |                ЦеныНоменклатуры.Цена КАК Цена
            |            ИЗ
            |                РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
            |                        &Дата,
            |                        ТипЦен = &ТипЦен
            |                            И ХарактеристикаНоменклатуры = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) " + ?(ЭтоНовый(),"", " И Регистратор <> &ДокументУстановкиЦен") + ") КАК ЦеныНоменклатуры) КАК ЦеныНоменклатурыБезХарактеристик
            |            ПО ПодЗапрос.Номенклатура = ЦеныНоменклатурыБезХарактеристик.Номенклатура
            |            ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            |                ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
            |                ЦеныНоменклатуры.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
            |                ЦеныНоменклатуры.Цена КАК Цена
            |            ИЗ
            |                РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
            |                        &Дата,
            |                        ТипЦен = &ТипЦен
            |                            И (НЕ ХарактеристикаНоменклатуры = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)) " + ?(ЭтоНовый(),"", " И Регистратор <> &ДокументУстановкиЦен") + ") КАК ЦеныНоменклатуры) КАК ЦеныНоменклатурыСХарактеристиками
            |            ПО ПодЗапрос.Номенклатура = ЦеныНоменклатурыСХарактеристиками.Номенклатура
            |                И ПодЗапрос.ХарактеристикаНоменклатуры = ЦеныНоменклатурыСХарактеристиками.ХарактеристикаНоменклатуры
            |            ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            |                ПрошлаяЗакупка.Номенклатура КАК Номенклатура,
            |                ПрошлаяЗакупка.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
            |                ЦеныПрошлойЗакупки.СебестоимостьПрошлойЗакупки КАК СебестоимостьПрошлойЗакупки
            |            ИЗ
            |                (ВЫБРАТЬ
            |                    ТоварыПрошлойЗакупки.Номенклатура КАК Номенклатура,
            |                    ТоварыПрошлойЗакупки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
            |                    МАКСИМУМ(ТоварыПрошлойЗакупки.Ссылка.Дата) КАК Дата,
            |                    МАКСИМУМ(ТоварыПрошлойЗакупки.Ссылка) КАК Ссылка
            |                ИЗ
            |                    Документ.ПоступлениеТоваров.Товары КАК ТоварыПрошлойЗакупки
            |                ГДЕ
            |                    ТоварыПрошлойЗакупки.Ссылка <> &ДокументПоступления
            |                    И ТоварыПрошлойЗакупки.Ссылка.Проведен
            |                    И ТоварыПрошлойЗакупки.Ссылка.Дата <= &Дата
            |              
            |                СГРУППИРОВАТЬ ПО
            |                    ТоварыПрошлойЗакупки.Номенклатура,
            |                    ТоварыПрошлойЗакупки.ХарактеристикаНоменклатуры) КАК ПрошлаяЗакупка
            |                    ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            |                        МАКСИМУМ(ВЫБОР
            |                                КОГДА ЦеныПрошлойЗакупки.ЕдиницаИзмерения.Коэффициент <> 0
            |                                    ТОГДА ЦеныПрошлойЗакупки.Цена * ЦеныПрошлойЗакупки.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / ЦеныПрошлойЗакупки.ЕдиницаИзмерения.Коэффициент
            |                                ИНАЧЕ ЦеныПрошлойЗакупки.Цена
            |                            КОНЕЦ) КАК СебестоимостьПрошлойЗакупки,
            |                        ЦеныПрошлойЗакупки.Номенклатура КАК Номенклатура,
            |                        ЦеныПрошлойЗакупки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
            |                        ДокументПоступлениеТоваров1.Дата КАК ДатаДокумента,
            |                        ДокументПоступлениеТоваров1.Ссылка КАК Ссылка
            |                    ИЗ
            |                        Документ.ПоступлениеТоваров.Товары КАК ЦеныПрошлойЗакупки
            |                            ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваров КАК ДокументПоступлениеТоваров1
            |                            ПО (ДокументПоступлениеТоваров1.Ссылка = ЦеныПрошлойЗакупки.Ссылка)
            |                    ГДЕ
            |                        ЦеныПрошлойЗакупки.Ссылка <> &ДокументПоступления
            |                        И ДокументПоступлениеТоваров1.Дата <= &Дата
            |                  
            |                    СГРУППИРОВАТЬ ПО
            |                        ДокументПоступлениеТоваров1.Ссылка,
            |                        ЦеныПрошлойЗакупки.Номенклатура,
            |                        ЦеныПрошлойЗакупки.ХарактеристикаНоменклатуры,
            |                        ДокументПоступлениеТоваров1.Дата) КАК ЦеныПрошлойЗакупки
            |                    ПО ПрошлаяЗакупка.Номенклатура = ЦеныПрошлойЗакупки.Номенклатура
            |                        И ПрошлаяЗакупка.ХарактеристикаНоменклатуры = ЦеныПрошлойЗакупки.ХарактеристикаНоменклатуры
            |                        И ПрошлаяЗакупка.Дата = ЦеныПрошлойЗакупки.ДатаДокумента
            |                        И ПрошлаяЗакупка.Ссылка = ЦеныПрошлойЗакупки.Ссылка) КАК ТоварыПрошлойЗакупки
            |            ПО ПодЗапрос.Номенклатура = ТоварыПрошлойЗакупки.Номенклатура
            |                И ПодЗапрос.ХарактеристикаНоменклатуры = ТоварыПрошлойЗакупки.ХарактеристикаНоменклатуры) КАК ДанныеДляРасчетов";
    Ваша задача решается вводом временной таблицы периодов в запрос и выборке всех данных без срезов таблиц (без использования виртуальных таблиц)
  13. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    милорд, вам этот трэш оптимизировать не надо? :)

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

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

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Нет, не надо, тот кусок кода для своей задачи практически идеален
  15. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    просто подзапрос и виртуальная таблица справа в соединении - гарантированный TableScan и Nested Loops, если записей соединяется немного - пофиг, а если много - можно неплохо ускорить
  16. mialord
    Offline

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

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    По сути в соединении не может быть много записей, это запрос старых цен на товары в новом поступлении товара. Хотя оптимизация - всегда хорошо :)
    На данный момент для меня важно чтобы тс не умудрился загнать запрос в цикл что видно из его сообщения, это ппц будет весело
    Такое отношение к запросам на форуме программистов 1С не может существовать -Rage-

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