8.х СрезПоследних

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем MyNameNoName, 7 июн 2013.

  1. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Написал функцию:
    Код:
    Функция ПолучитьАналог(Код) Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    АналогиНоменклатуры.Аналог.Наименование КАК Аналог,
    |    НоменклатураОсн.Код КАК КодНом
    |ИЗ
    |    РегистрСведений.АналогиНоменклатуры КАК АналогиНоменклатуры
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК НоменклатураОсн
    |        ПО АналогиНоменклатуры.Номенклатура = НоменклатураОсн.Ссылка
    |
    |СГРУППИРОВАТЬ ПО
    |    АналогиНоменклатуры.Аналог.Наименование,
    |    НоменклатураОсн.Код";
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    Пока Выборка.Следующий() Цикл
    Если Выборка.КодНом = Код Тогда
    Аналог = Выборка.Аналог;
    КонецЕсли;
    КонецЦикла;
    Возврат Аналог;
    КонецФункции
    
    Не могу понять, как переписать ее так чтобы из регистра сведений бралось последнее значение.
    Спасибо.
  2. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    ну дык обращайтесь не к таблице РегистрСведений, а к виртуальной таблице РегистрСведенийСрезПоследних

    кстати ваш код вернет последний найденный аналог, а не все полученные аналоги

    Код:
    Функция ПолучитьАналог(Код) Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    АналогиНоменклатуры.Аналог.Наименование КАК Аналог,
    |    НоменклатураОсн.Код КАК КодНом
    |ИЗ
    |    РегистрСведений.АналогиНоменклатуры.СрезПоследних(&Период, ) КАК АналогиНоменклатуры
    |	    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК НоменклатураОсн
    |	    ПО АналогиНоменклатуры.Номенклатура = НоменклатураОсн.Ссылка
    |
    |СГРУППИРОВАТЬ ПО
    |    АналогиНоменклатуры.Аналог.Наименование,
    |    НоменклатураОсн.Код
    |ГДЕ
    |    ПоказателиРентабельности.Код = &Код";
    Запрос.УстановитьПараметр("тПериод", ТутВашаДата); //если надо на текущую дату, то можно из запроса параметр исключить совсем    
    Запрос.УстановитьПараметр("Код", Код);
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();    
    Возврат Выборка.Аналог;
    КонецФункции
  3. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Я код перепишу на более правильный
    Код:
    Функция ПолучитьАналог(Код) Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    АналогиНоменклатуры.Аналог.Наименование КАК Аналог,
    |    НоменклатураОсн.Код КАК КодНом
    |ИЗ
    |    РегистрСведений.АналогиНоменклатуры.СрезПоследних(&Период, ) КАК АналогиНоменклатуры
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК НоменклатураОсн
    |        ПО АналогиНоменклатуры.Номенклатура = НоменклатураОсн.Ссылка
    |
    |СГРУППИРОВАТЬ ПО
    |    АналогиНоменклатуры.Аналог.Наименование,
    |    НоменклатураОсн.Код";    
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    Пока Выборка.Следующий() Цикл
    Если Выборка.КодНом = Код Тогда
    Аналог = Выборка.Аналог;
    КонецЕсли;
    КонецЦикла;
    Возврат Аналог;
    КонецФункции
    
    Но ругается на
    {Форма.Форма.Форма(154)}: Ошибка при вызове метода контекста (Выполнить)
    РезультатЗапроса = Запрос.Выполнить();
    по причине:
    {(5, 2)}: Таблица не найдена "РегистрСведений.АналогиНоменклатуры.СрезПоследних"
    <<?>>РегистрСведений.АналогиНоменклатуры.СрезПоследних(&Период, ) КАК АналогиНоменклатуры
  4. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    значит регистр сведений у вас не периодический

    и еще если вам надо аналог именно на определенный код номенклатуры найти, то почему вы убрали из запроса параметр Код? в чем смысл перебирать выборку, если можно сразу отобрать нужное значение?
  5. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Код вернул обратно
    Код:
    Функция ПолучитьАналог(Код) Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    АналогиНоменклатуры.Аналог.Наименование КАК Аналог,
    |    НоменклатураОсн.Код КАК КодНом
    |ИЗ
    |    РегистрСведений.АналогиНоменклатуры КАК АналогиНоменклатуры
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК НоменклатураОсн
    |        ПО АналогиНоменклатуры.Номенклатура = НоменклатураОсн.Ссылка
    |ГДЕ
    |    НоменклатураОсн.Код = &Код
    |
    |СГРУППИРОВАТЬ ПО
    |    АналогиНоменклатуры.Аналог.Наименование,
    |    НоменклатураОсн.Код";
    Запрос.УстановитьПараметр("Код",Код);
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();
    Возврат Выборка.Аналог;
    КонецФункции
    
    Да, регистр не периодический.
    В принципе как я понимаю строка кода
    Код:
    Выборка.Следующий();
    должна обеспечить вывод последнего значения?
  6. Неназываемый
    Offline

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

    Регистрация:
    2 фев 2007
    Сообщения:
    507
    Симпатии:
    7
    Баллы:
    29
    Что значит "последнее значение", если регистр не периодический?

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

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.979
    Симпатии:
    397
    Баллы:
    104
    Вы плохо понимаете.
  8. Андрей Федотов
    Offline

    Андрей Федотов

    Регистрация:
    12 июн 2013
    Сообщения:
    36
    Симпатии:
    1
    Баллы:
    1
    Напишите лично. По Вашей выгрузке или скриншоту регистра разберемся с проблемой.
    Если регистр не периодический, то надо или в отборе сортировку делать или же в выборке код писать.
  9. mialord
    Offline

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

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Угу, сортировку нелинейным алгоритмом по несуществующему полю Период. Вы прежде чем просить в личку написать включили бы мозк, а если считаете что тут бараны сидят пишут, то для начапа докажите что мы не правы

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