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

Проблема с результатом запроса

Автор О28, 06 июл 2017, 17:14

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

О28

Добрый вечер!
Запрос:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ПриемНаРаботу.Ссылка КАК Ссылка,
ПриемНаРаботу.Организация.НаименованиеПолное КАК НазваниеОрганизации,
ПриемНаРаботу.Организация.КодПоОКПО КАК КодПоОКПО,
ПриемНаРаботу.Номер КАК НомерДок,
ПриемНаРаботу.Дата КАК ДатаДок,
ПриемНаРаботу.ДатаПриема,
ПриемНаРаботу.ДатаЗавершенияТрудовогоДоговора,
ПриемНаРаботу.Сотрудник КАК Работник,
ПриемНаРаботу.ФизическоеЛицо.Пол КАК Пол,
ПриемНаРаботу.Сотрудник.Код КАК ТабельныйНомер,
ПриемНаРаботу.Подразделение,
ПриемНаРаботу.Должность,
ПриемНаРаботу.РазрядКатегория,
ПриемНаРаботу.УсловияПриема,
ПриемНаРаботу.ВидЗанятости,
ПриемНаРаботу.ИныеУсловияДоговора,
ПриемНаРаботу.КоличествоСтавок,
ПриемНаРаботу.ДатаПриема КАК Период,
ПриемНаРаботу.ДлительностьИспытательногоСрока,
ПриемНаРаботу.ТрудовойДоговорДата,
ПриемНаРаботу.ТрудовойДоговорНомер,
ПриемНаРаботу.Руководитель,
ПриемНаРаботу.ДолжностьРуководителя,
ПриемНаРаботу.Ответственный,
ПриемНаРаботу.Показатели.(
МАКСИМУМ(ВЫБОР
КОГДА ПриемНаРаботу.Показатели.Показатель.ВидТарифнойСтавки В (ЗНАЧЕНИЕ(Перечисление.ВидыТарифныхСтавок.МесячнаяТарифнаяСтавка), ЗНАЧЕНИЕ(Перечисление.ВидыТарифныхСтавок.ЧасоваяТарифнаяСтавка), ЗНАЧЕНИЕ(Перечисление.ВидыТарифныхСтавок.ДневнаяТарифнаяСтавка))
ТОГДА ПриемНаРаботу.Показатели.Значение
ИНАЧЕ 0
КОНЕЦ) КАК Значение
) КАК Оклад
ИЗ
Документ.ПриемНаРаботу КАК ПриемНаРаботу
ГДЕ
ПриемНаРаботу.Проведен
И ПриемНаРаботу.Ссылка В (&МассивОбъектов)

УПОРЯДОЧИТЬ ПО
Ссылка

Вывожу результат в печатную форму. Всё кроме Оклада выводится. Оклад имеет значение "ТаблицаЗначений". Как получить оклад?
Если выполнять запрос с помощью консоли запросов, то там всё прекрасно, оклад имеет значение.

ilyay

Выборка = Запрос.Выполнить.Выбрать();
Пока Выборка.Следующий() Цикл
    ВыборкаНовая = Выборка.Оклад.Выбрать();
    Пока ВыборкаНовая.Следующий() Цикл

        ...

О28

Цитата: ilyay от 06 июл 2017, 17:25
Выборка = Запрос.Выполнить.Выбрать();
Пока Выборка.Следующий() Цикл
    ВыборкаНовая = Выборка.Оклад.Выбрать();
    Пока ВыборкаНовая.Следующий() Цикл

        ...
Спасибо, но мне не помогло.
Я результат запроса выгружаю:
ОбщаяВыборка = Запрос.Выполнить().Выгрузить();
Для Каждого СсылкаНаОбъект из МассивОбъектов Цикл
    Отбор = Новый Структура;
    Отбор.Вставить("Ссылка", СсылкаНаОбъект);
    ВыборкаДок = ОбщаяВыборка.НайтиСтроки(Отбор);
    Для Каждого Выборка из ВыборкаДок Цикл
    ...
    ОбластьРаботник.Параметры.ОкладСотр = Выборка.Оклад;

Kironten

Тогда используйте метод таблицы значений скопировать(). В параметры передаете структуру отбора и на выходе получаете ТЗ с уже отобранными строками.

ilyay

Не проще ли было передать этот массив ссылок в отбор в запросе в секции ГДЕ? Выберется меньше данных и не нужных строк не будет. Если предполагается несколько строк с одинаковой ссылкой, можно упорядочить по ним и обходить с помощью Выборка.СледующийПоЗначениюПоля("Ссылка").

О28

Цитата: ilyay от 07 июл 2017, 10:52
Не проще ли было передать этот массив ссылок в отбор в запросе в секции ГДЕ? Выберется меньше данных и не нужных строк не будет. Если предполагается несколько строк с одинаковой ссылкой, можно упорядочить по ним и обходить с помощью Выборка.СледующийПоЗначениюПоля("Ссылка").
Спасибо! У меня получилось с помощью временных таблиц:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    МАКСИМУМ(ВЫБОР
            КОГДА ПриемНаРаботуПоказатели.Показатель.ВидТарифнойСтавки В (ЗНАЧЕНИЕ(Перечисление.ВидыТарифныхСтавок.МесячнаяТарифнаяСтавка), ЗНАЧЕНИЕ(Перечисление.ВидыТарифныхСтавок.ЧасоваяТарифнаяСтавка), ЗНАЧЕНИЕ(Перечисление.ВидыТарифныхСтавок.ДневнаяТарифнаяСтавка))
                ТОГДА ПриемНаРаботуПоказатели.Значение
            ИНАЧЕ 0
        КОНЕЦ) КАК Оклад
ПОМЕСТИТЬ ТарифнаяСтавка
ИЗ
    Документ.ПриемНаРаботу.Показатели КАК ПриемНаРаботуПоказатели
ГДЕ
    ПриемНаРаботуПоказатели.Ссылка.Проведен
    И ПриемНаРаботуПоказатели.Ссылка В(&МассивОбъектов)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ПриемНаРаботу.Ссылка КАК Ссылка,
    ПриемНаРаботу.Организация.НаименованиеПолное КАК НазваниеОрганизации,
    ПриемНаРаботу.Организация.КодПоОКПО КАК КодПоОКПО,
    ПриемНаРаботу.Номер КАК НомерДок,
    ПриемНаРаботу.Дата КАК ДатаДок,
    ПриемНаРаботу.ДатаПриема КАК ДатаПриема,
    ПриемНаРаботу.ДатаЗавершенияТрудовогоДоговора КАК ДатаЗавершенияТрудовогоДоговора,
    ПриемНаРаботу.Сотрудник КАК Работник,
    ПриемНаРаботу.ФизическоеЛицо.Пол КАК Пол,
    ПриемНаРаботу.Сотрудник.Код КАК ТабельныйНомер,
    ПриемНаРаботу.Подразделение КАК Подразделение,
    ПриемНаРаботу.Должность КАК Должность,
    ПриемНаРаботу.РазрядКатегория КАК РазрядКатегория,
    ПриемНаРаботу.УсловияПриема КАК УсловияПриема,
    ПриемНаРаботу.ВидЗанятости КАК ВидЗанятости,
    ПриемНаРаботу.ИныеУсловияДоговора КАК ИныеУсловияДоговора,
    ПриемНаРаботу.КоличествоСтавок КАК КоличествоСтавок,
    ЕСТЬNULL(ТарифнаяСтавка.Оклад, 0) КАК Оклад,
    ПриемНаРаботу.ДатаПриема КАК Период,
    ПриемНаРаботу.ДлительностьИспытательногоСрока КАК ДлительностьИспытательногоСрока,
    ПриемНаРаботу.ТрудовойДоговорДата КАК ТрудовойДоговорДата,
    ПриемНаРаботу.ТрудовойДоговорНомер КАК ТрудовойДоговорНомер,
    ПриемНаРаботу.Руководитель КАК Руководитель,
    ПриемНаРаботу.ДолжностьРуководителя КАК ДолжностьРуководителя,
    ПриемНаРаботу.Ответственный КАК Ответственный
ИЗ
    Документ.ПриемНаРаботу КАК ПриемНаРаботу,
    ТарифнаяСтавка КАК ТарифнаяСтавка
ГДЕ
    ПриемНаРаботу.Ссылка.Проведен
    И ПриемНаРаботу.Ссылка В(&МассивОбъектов)

УПОРЯДОЧИТЬ ПО
    Ссылка

ilyay

В последнем запросе забыли соединить таблицы!

О28

Цитата: ilyay от 07 июл 2017, 13:35
В последнем запросе забыли соединить таблицы!
Поясните, пожалуйста, зачем соединять, если я из временной таблицы выбираю Оклад? Условия одинаковые.
Почему, у меня всё работает без объединения таблиц?

ilyay

Не объединение, а соединение. Если у вас есть хотя бы 2 ссылки, вы получите декартово произведение, т.е. документ прием на работу соединится с тарифной ставкой из другого документа. Со своей ставкой тоже соединится, конечно. Количество строк будет n*n. А должно быть n.

О28

Цитата: ilyay от 07 июл 2017, 17:37
Не объединение, а соединение. Если у вас есть хотя бы 2 ссылки, вы получите декартово произведение, т.е. документ прием на работу соединится с тарифной ставкой из другого документа. Со своей ставкой тоже соединится, конечно. Количество строк будет n*n. А должно быть n.
У меня нет возможности отладить из конфигуратора УФ, проверяю результат запроса в Консоли запросов, там всего одна строка результата. Поэтому не могу представить n*n.
В консоли нет вкладки Связи, где я могла бы показать порядок соединения. Думаю, это потому что первая таблица временная. Пробовала запросы без ВТ, тогда да, можно соединять.

Теги: ЗКГУ 3.1 

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

Рейтинг@Mail.ru

Поиск