Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Получение элемента с максимальной датой с подчиненного справочника          
Zlyukka Подменю пользователя
сообщение 12.08.14, 9:37
Сообщение #1

Общительный
**
Группа: Пользователи
Сообщений: 33
Спасибо сказали: 1 раз
Рейтинг: 0

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

Вопрос собственно вот в чем заключается. Как получить эти данные прямо в запросе. Заранее спасибо

pablo Подменю пользователя
сообщение 12.08.14, 10:11
Сообщение #2

Старейшина
********
Группа: Команда (модераторы)
Сообщений: 1116
Из: Одесса-Луганск
Спасибо сказали: 192 раз
Рейтинг: 0

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


Сообщение отредактировал pablo - 12.08.14, 10:12


Signature
Правильно поставленный вопрос содержит до 90% ответа.

Zlyukka Подменю пользователя
сообщение 12.08.14, 10:24
Сообщение #3

Общительный
**
Группа: Пользователи
Сообщений: 33
Спасибо сказали: 1 раз
Рейтинг: 0

Цитата(pablo @ 12.08.14, 10:11) *
Запрос.Текст="ВЫБРАТЬ
          
             |    Макс(Серии.ДатаСозд) КАК ДатаСозд,
             |    Серии.Ссылка КАК Серия
             |ИЗ
             |    Справочник.Серии КАК Серии
             |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Товары КАК Товары
             |        ПО Серии.Владелец = Товары.Ссылка
             |ГДЕ
             |    Товары.Завод = &Завод
             |сгруппировать по Серия
             |УПОРЯДОЧИТЬ ПО
             |    ДатаСозд УБЫВ
             |";


Вот что вернуло
ДатаСозд Ссылка
10.07.2014 0:00:00
10.07.2014 0:00:00 7351425
10.07.2014 0:00:00 7351425
31.01.2014 0:00:00 7351447A
Мне надо что б вернуло дату и ссылку прямо в запросе. А так мне придётся снова получать первую запись в цикле. Мне хотелось бы использовать запрос как подчиненный

pablo Подменю пользователя
сообщение 12.08.14, 11:24
Сообщение #4

Старейшина
********
Группа: Команда (модераторы)
Сообщений: 1116
Из: Одесса-Луганск
Спасибо сказали: 192 раз
Рейтинг: 0

Эту строчку оставили на месте?
ВладВыб=Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Владелец");

или меняли ее?


Signature
Правильно поставленный вопрос содержит до 90% ответа.

Zlyukka Подменю пользователя
сообщение 12.08.14, 11:41
Сообщение #5

Общительный
**
Группа: Пользователи
Сообщений: 33
Спасибо сказали: 1 раз
Рейтинг: 0

Я проверял в консоли запросов. значение в группировке владелец NULL

Да и причем тут владелец мне нужно получить Ссылку на серию с последней датой создания . Задача звучит как получить приходную цену последних поставок. Цена закупочная находится в серии.

pablo Подменю пользователя
сообщение 12.08.14, 11:58
Сообщение #6

Старейшина
********
Группа: Команда (модераторы)
Сообщений: 1116
Из: Одесса-Луганск
Спасибо сказали: 192 раз
Рейтинг: 0

Все дело в том, что группировки в консоли запросов быть не должно, если Вы используете мой запрос без изменения.


Signature
Правильно поставленный вопрос содержит до 90% ответа.

alex040269 Подменю пользователя
сообщение 12.08.14, 12:13
Сообщение #7

Крутой
Иконка группы
Группа: Местный
Сообщений: 1626
Из: Гуляйполе
Спасибо сказали: 236 раз
Рейтинг: 0

ВЫБРАТЬ * ИЗ 
(ВЫБРАТЬ Владелец,Максимум(ДатаСозд)
    ИЗ Справочник.Серии
СГРУППИРОВАТЬ ПО
Владелец ) КАК Серии
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Товары КАК Товар
        ПО Серии.Владелец = Товары.Ссылка


Запрос должен выбрать товары с последней серией.
Это нужно?


Signature
Никогда не бойся делать то, что не умеешь, помни - Ноев ковчег был построен любителем, профессионалы построили Титаник.
ЗиУП

Zlyukka Подменю пользователя
сообщение 12.08.14, 12:31
Сообщение #8

Общительный
**
Группа: Пользователи
Сообщений: 33
Спасибо сказали: 1 раз
Рейтинг: 0

Цитата(pablo @ 12.08.14, 11:58) *
Все дело в том, что группировки в консоли запросов быть не должно, если Вы используете мой запрос без изменения.

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

Но в таком варианте нет группировки Владелец
за что получаем

{Отчет.а7.Форма.ФормаОтчета.Форма(25)}: Ошибка при вызове метода контекста (Выбрать)
ВыбМаксСер=Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Владелец");
по причине:
Измерение не найдено "Владелец"


Цитата(alex040269 @ 12.08.14, 12:13) *
ВЫБРАТЬ * ИЗ 
(ВЫБРАТЬ Владелец,Максимум(ДатаСозд)
    ИЗ Справочник.Серии
СГРУППИРОВАТЬ ПО
Владелец ) КАК Серии
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Товары КАК Товар
        ПО Серии.Владелец = Товары.Ссылка


Запрос должен выбрать товары с последней серией.
Это нужно?


Я же писал мне ссылку на серию с последней датой нужно получить. А не дату последнего прихода

alex040269 Подменю пользователя
сообщение 12.08.14, 12:42
Сообщение #9

Крутой
Иконка группы
Группа: Местный
Сообщений: 1626
Из: Гуляйполе
Спасибо сказали: 236 раз
Рейтинг: 0

ВЫБРАТЬ Владелец, Серии.Ссылка ИЗ 
(ВЫБРАТЬ Владелец,Максимум(ДатаСозд)
    ИЗ Справочник.Серии
СГРУППИРОВАТЬ ПО
Владелец ) КАК ВЗСерии
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Серии КАК Серии
        ПО ВЗСерии.Владелец = Серии.Владелец
        И ВЗСерии.ДатаСозд  = Серии.ДатаСозд

Товар и Ссылка на последнюю серию.


Signature
Никогда не бойся делать то, что не умеешь, помни - Ноев ковчег был построен любителем, профессионалы построили Титаник.
ЗиУП

Спасибо сказали: Zlyukka,

pablo Подменю пользователя
сообщение 12.08.14, 12:43
Сообщение #10

Старейшина
********
Группа: Команда (модераторы)
Сообщений: 1116
Из: Одесса-Луганск
Спасибо сказали: 192 раз
Рейтинг: 0

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


А еще можно добавить в конец первой строки ПЕРВЫЕ 1


Signature
Правильно поставленный вопрос содержит до 90% ответа.

Zlyukka Подменю пользователя
сообщение 12.08.14, 13:06
Сообщение #11

Общительный
**
Группа: Пользователи
Сообщений: 33
Спасибо сказали: 1 раз
Рейтинг: 0

Цитата(pablo @ 12.08.14, 11:24) *
Эту строчку оставили на месте?
ВладВыб=Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Владелец");

или меняли ее?

Возможно smile.gif Но все равно это не то. Да и если допилить туда первые оно вернет одну строку. alex040269 Вам спасибо почти то что надо.

Kashemir Подменю пользователя
сообщение 14.08.14, 11:31
Сообщение #12

Молчаливый
*
Группа: Пользователи
Сообщений: 8
Из: Киев
Спасибо сказали: 0 раз
Рейтинг: 0

ВЫБРАТЬ
    Товары.Ссылка КАК Владелец,
    Серии.Ссылка,
    Серии.ДатаСозд
ИЗ
    Справочник.Товары КАК Товары
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Серии КАК Серии
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                МАКСИМУМ(Серии.ДатаСозд) КАК ДатаСозд,
                Серии.Владелец КАК Владелец
            ИЗ
                Справочник.Серии КАК Серии
            
            СГРУППИРОВАТЬ ПО
                Серии.Владелец) КАК ВложенныйЗапрос
            ПО Серии.Владелец = ВложенныйЗапрос.Владелец
                И Серии.ДатаСозд = ВложенныйЗапрос.ДатаСозд
        ПО (Серии.Владелец = Товары.Ссылка)
ГДЕ
    Товары.Завод = &Завод



 ! 

Правила, п.12
 


Сообщение отредактировал logist - 14.08.14, 13:00

Kashemir Подменю пользователя
сообщение 14.08.14, 13:21
Сообщение #13

Молчаливый
*
Группа: Пользователи
Сообщений: 8
Из: Киев
Спасибо сказали: 0 раз
Рейтинг: 0

Zlyukka приведенный листинг запроса в http://pro1c.org.ua/index.php?showtopic=19341 просто ужастен.

Первое, поскольку очевидно что знания запросов не слишком глубокие - предлагаю взять за правило все использованные таблицы предварительно выносить во временные таблицы (кроме виртуальных таблиц регистров). Это сильно облегчит жизнь построителю планов запросов SQL.

Во вторых, данный запрос не выполняет поставленную задачу - при обращении к виртуальной таблице остатков и оборотов в середине отчетного периода, при отсутствии оборота за день, записей в пределах данного дня по остаткам не будет.
Допустим если 1.08 числа остатки были 200, а 2.08 не было оборота, то записи в результатах обращения к виртуальной таблице с остатком 200 на 2.08 тоже не будет (если отчет допустим строить за 01.08 - 03.08).

Ну и третье, использование менеджера временных таблиц здесь совершенно неуместено и никак не влияет на запрос.

Кстати больше всего данный запрос грузит скорее всего безумное размножение неотфильтрованных результатов соединений * количество записей временной таблицы "ДНИ".


Zlyukka Подменю пользователя
сообщение 15.08.14, 7:05
Сообщение #14

Общительный
**
Группа: Пользователи
Сообщений: 33
Спасибо сказали: 1 раз
Рейтинг: 0

Благодарю за критику, в дальнейшем буду учитывать Ваши замечания по оптимизации. Что же до запроса - проверил остатки выводит корректно даже по дням без движений.

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 25.04.24, 12:17
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!