8.х Как запретить СКД править текст запроса?

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

  1. TopicStarter Overlay
    vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    Всем бобра.

    Кидаю текст запроса в скд:

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

    После в режиме предприятия накладываю отбор - вывести всю номенклатуру, у которой нет сертификатов. Эта сволочь СКД-шная берет и накладывает отбор на сертификаты, а не на итоговый результат запроса.. в итоге выходит вся номенклатура и каждая с пустым сертификатом.

    Как запретить СКД менять текст запроса?
    Последнее редактирование модератором: 13 апр 2015
  2. Draco
    Online

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    Пишите тогда запрос в коде - выгружаете его резульат в ТЗ и передаете уже ТЗ в СКД через набор данных. СКД тогда будет отвечать за их вывод и отбор настраиваемый польззователем
    vartanet нравится это.
  3. TopicStarter Overlay
    vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    Ну это понятно.. но лишнее кодище писать. Может галка есть "не корявить запрос"? Может как то итоговый запрос во временные таблицы кинуть? Или автозаполнение не использовать?
  4. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.410
    Симпатии:
    316
    Баллы:
    104
    Да нет. Не нужна там ТЗ.
    Все можно и так настроить.
    В общем Конструктор запроса когда открываете, на закладке Компоновка данных вам надо задать для условия которое не должно накладываться свое имя, чтобы скд эти поля считала разными. (либо сделать это без конструктора ручками).
    Я не знаю как объяснить чтобы понятно было, руками могу сделать, как объяснить не знаю.
    Может пример поможет. Смотрите, допустим есть в СКД изначально такой запрос:
    Код:
    ВЫБРАТЬ
    Т.Номенклатура
    ПОМЕСТИТЬ ВТ_Номенклатура1
    ИЗ
    Справочники.Номенклатура КАК Т
    ;
    ВЫБРАТЬ
    Т.Номенклатура,
    ВТ_Номенклатура1.Номенклатура
    ИЗ
    Справочники.Номенклатура КАК Т
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Номенклатура1 КАК ВТ_Номенклатура1
    ПО ВТ_Номенклатура1.Номенклатура = Т.Номенклатура
    
    Если мы в этом запросе наложим отбор на поле номенклатура, то СКД после преобразования получит что-то вроде
    Код:
    ВЫБРАТЬ
    Т.Номенклатура
    ПОМЕСТИТЬ ВТ_Номенклатура1
    ИЗ
    Справочники.Номенклатура КАК Т
    ГДЕ
    Т.Номенклатура = &П1
    ;
    ВЫБРАТЬ
    Т.Номенклатура,
    ВТ_Номенклатура1.Номенклатура
    ИЗ
    Справочники.Номенклатура КАК Т
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Номенклатура1 КАК ВТ_Номенклатура1
    ПО ВТ_Номенклатура1.Номенклатура = Т.Номенклатура
    ГДЕ
    ВТ_Номенклатура1.Номенклатура = &П1
    
    Это ваша проблема. Чтобы ее решить надо написать изначальный запрос:
    Код:
    ВЫБРАТЬ
    Т.Номенклатура
    ПОМЕСТИТЬ ВТ_Номенклатура1
    ИЗ
    Справочники.Номенклатура КАК Т
    {ГДЕ Т.Номенклатура.* КАК НоменклатураПервая}
    ;
    ВЫБРАТЬ
    Т.Номенклатура,
    ВТ_Номенклатура1.Номенклатура
    ИЗ
    Справочники.Номенклатура КАК Т
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Номенклатура1 КАК ВТ_Номенклатура1
    ПО ВТ_Номенклатура1.Номенклатура = Т.Номенклатура
    
    Тогда в отборе у вас будет два разных поля, ну и собственно на какое надо на такое и накладывайте.

    Как-то так.
    vartanet нравится это.
  5. nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.989
    Симпатии:
    399
    Баллы:
    104
    Как раз сейчас занимаюсь такой же фигней, только в обратную строну :D
    --- Объединение сообщений, 13 апр 2015 ---
    Добавлю к ответу шурика. Галочку "Атозаполнение" придется снять и настроить список полей выборки.
    vartanet нравится это.
  6. Draco
    Online

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    Ну это логично что если два разных поля, то отбор будет наладываться на одно. которое именно указали. Речь (вопрос стоял) шла больше о том, как запрентить менять текст запроса
    если отвечать на него то никак.
    если же вопрос стоял по поводу наложения отбора, то это уже немного другое. Вариантов там несколько. т.к СКД учитвыая смотря какое поле не всегда запихивает его в оператор ГДЕ
    vartanet нравится это.

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