8.х 1C 8.x Ошибка в запросе при попытке получения значения из Табличной части документа

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

  1. TopicStarter Overlay
    bigrunner
    Offline

    bigrunner

    Регистрация:
    8 авг 2014
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    Здравствуйте. Я новичок в 1с. Если возможно помогите разобраться.Используется Упр. Торговлей 10.3 без изменений в конфе. Редактируется документ РеализацияТоваровУслуг. Необходимо получить предыдущую цену продажи по данному Контрагенту, Дате и номенклатуре.
    В первом запросе все получилось и предыдущая дата(с таким контрагентом) определяется верно, но второй запрос с выводом предыдущей цены не дает никакого результата. Данные в дальнейшем планируется вывести в поле ввода в табличной части документа.(Поле не является реквизитом табличной части).
    Помогите кто может,подскажите где ошибся. Вся загвоздка в том что поле Цена это поле табличной части формы документа,как и номенклатура. А дата и контрагент поля формы документа. Спасибо.
    Код:
    Код:
    Строка=ЭлементыФормы.Товары.ТекущиеДанные;
    Номенклатура=Строка.Номенклатура;
    Сообщить(""+Контрагент+" от "+Дата+" По "+Номенклатура);
        Запрос1=Новый Запрос;
        Запрос1.Текст="ВЫБРАТЬ
                      | МАКСИМУМ(РеализацияТоваровУслуг.Дата) КАК ПредыдущаяДата,
                      | РеализацияТоваровУслуг.Контрагент
                      |ИЗ
                      | Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
                      |ГДЕ
                      | РеализацияТоваровУслуг.Дата < &Дата
                      | И РеализацияТоваровУслуг.Контрагент = &Контрагент
                      |
                      |СГРУППИРОВАТЬ ПО
                      | РеализацияТоваровУслуг.Контрагент";
    Запрос1.УстановитьПараметр("Контрагент", Контрагент);
    Запрос1.УстановитьПараметр("Дата", Дата);
    РезультатЗапроса1 = Запрос1.Выполнить();
    
        Выборка1 = РезультатЗапроса1.Выбрать();
    
        Пока Выборка1.Следующий() Цикл
            НужнаяДата=Выборка1.ПредыдущаяДата;
        КонецЦикла;
        Сообщить("Нужная дата%"+НужнаяДата);
        ПредыдущаяДата=НужнаяДата;
        Запрос = Новый Запрос;
        Запрос.Текст ="ВЫБРАТЬ
                      | РеализацияТоваровУслуг.Товары.(
                      |     Цена
                      | ) КАК Цена
                      |ИЗ
                      | Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
                      |ГДЕ
                      | РеализацияТоваровУслуг.Дата = &Дата";
                 
    
        Запрос.УстановитьПараметр("Дата", ПредыдущаяДата);
        Результат=Запрос.Выполнить().Выбрать();
        Пока Результат.Следующий() Цикл
            ПрЦена=Результат.Цена;
            КонецЦикла;
    Сообщить("Предыдущая цена на товар равна "+ПрЦена);
  2. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.750
    Симпатии:
    509
    Баллы:
    204
    Данные нужно брать не из документов, а из регистров. Так проще и надежнее.
  3. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    bigrunner
    1) Во втором запросе обращайтесь к табличной части документа. Т.е. не "Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг", а "Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары".
    2) Не нужно там два запроса, делайте одним.
    3) Предыдущую цену надо определять только для текущей строки или для всех строк в документе?
  4. TopicStarter Overlay
    bigrunner
    Offline

    bigrunner

    Регистрация:
    8 авг 2014
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    Для каждой строки, которая есть в документе. Получается для текущей строки,которая редактируется. Поэтому и взял событие привыводестроки
    --- Объединение сообщений, 8 авг 2014 ---
    Спасибо за ответ. Да вот я не разобрался из каких регистров брать данные.Поэтому пошел по этому пути. В модуле формы уже изначально большой объем кода.
    Последнее редактирование: 8 авг 2014
  5. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Компьютер насилуете (если написали это все в ПриВыводеСтроки).
    ПриВыводеСтроки - только вывод. Т.е. данные нужно получить (например в событии ПриОткрытии), запомнить их в локальной переменной (тип ТЗ, Структура, Массив. На выбор), а в событии ПриВыводеСтроки только считывать их из этой переменной. Также вероятно вызов процедуры по получению данных нужно будет дублировать в процедуре ОбработкаВыбора().

    И данные лучше получать одним запросом.
  6. TopicStarter Overlay
    bigrunner
    Offline

    bigrunner

    Регистрация:
    8 авг 2014
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    Исправил. Но считается предыдущая цена только последней строки. Не догнал про получение данных в событии ПриОткрытии,поскольку при получении их там массив должен быть глобальной переменной, а в моем случае(УТ 10.3 толстый клиент) программа не понимает что это за экспорт. Данные в поле Прцена(которое не явл. реквизитом) не записываются.[​IMG]
    Код:
    Сообщить(""+Контрагент+" от "+Дата+" По "+Номенклатура);
    Строка=ЭлементыФормы.Товары.ТекущиеДанные;
    Номенклатура=Строка.Номенклатура;
    Сообщить(""+Контрагент+" от "+Дата+" По "+Номенклатура);
        Запрос1=Новый Запрос;
        Запрос1.Текст="ВЫБРАТЬ
                      |    РеализацияТоваровУслугТовары.Цена КАК Цена
                      |ИЗ
                      |    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
                      |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
                      |        ПО РеализацияТоваровУслугТовары.Ссылка = РеализацияТоваровУслуг.Ссылка
                      |ГДЕ
                      |    РеализацияТоваровУслуг.Контрагент = &Контрагент
                      |  И РеализацияТоваровУслуг.Товары.Номенклатура = &Номенклатура
                      |
                      |СГРУППИРОВАТЬ ПО
                      |    РеализацияТоваровУслугТовары.Цена
                      |
                      |ИМЕЮЩИЕ
                      |    МАКСИМУМ(РеализацияТоваровУслуг.Дата) < &Дата";
                      Запрос1.УстановитьПараметр("Контрагент",Контрагент);
                      Запрос1.УстановитьПараметр("Дата",Дата);
                      Запрос1.УстановитьПараметр("Номенклатура",Номенклатура);
                         Результат=Запрос1.Выполнить().Выбрать();
                         Пока Результат.Следующий() Цикл
                             ПрЦена=Результат.Цена;
                         КонецЦикла;
                         Сообщить(""+"Прцена= "+Прцена);
                         Стр=ЭлементыФормы.Товары.Колонки.Прцена;
    //Строка.Прцена=ПрЦена;
    СтрЦена=Строка(ПрЦена);
    Стр=СтрЦена;
    
  7. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Не надо никаких экспортов. Просто глобальная переменная модуля формы документа.

    Смотрите параметр ОформлениеСтроки (свойство Ячейки) в процедуре ПриВыводеСтроки().

    Эм.. Не совсем понимаю как оно вообще что-то выдает.

    Хорошо, поскольку понимаю что написать запрос который сразу получал бы предпоследнюю цену сразу для всех строк ТЧ для вас может быть затруднительно, давайте для одной строки.
    Разбейте написание запроса на несколько этапов, например:
    а) получите список вообще всех реализаций по данному контрагенту
    б) доработайте запрос, так чтобы в нем остались только реализации с нужной номенклатурой
    в) доработайте запрос, чтобы остались документы с датой меньшей даты вашей реализации
    г) отсортируйте запрос по убыванию
    д) возьмите первую запись

    и да, оформите это все дело в отдельную процедуру.
  8. TopicStarter Overlay
    bigrunner
    Offline

    bigrunner

    Регистрация:
    8 авг 2014
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    Спасибо огромное. Все получилось. Только вот оформил не в процедуру а в функцию,потому что не нашел как прописать в процедуре возврат переменной. Хотя наверное можно было в глобальную записать,а потом обратиться?
  9. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Пусть будет в функцию. Нет, глобальные переменные не нужны, лучше функцией оставьте.


    А так: по-умолчанию в 1С параметры в функции передаются по-ссылке. Таким образом изменение переданного параметра внутри функции будет видно после возврата из нее.
  10. TopicStarter Overlay
    bigrunner
    Offline

    bigrunner

    Регистрация:
    8 авг 2014
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    Спасибо.

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