8.х Запрос по 2-м условиям

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

  1. TopicStarter Overlay
    Sereg@
    Offline

    Sereg@

    Регистрация:
    5 янв 2010
    Сообщения:
    14
    Симпатии:
    0
    Баллы:
    1
    Добрый вечер.
    Делаю в документе запрос для получения данных из регистра сведений. Условие: Период в документе равен периоду в регистре и наименование услуги в документе равно наименованию услуги в регистре, Необходимо: получить величину тарифа по заданной услуге на заданный период.
    Измерения - Услуга, ПериодРасчета
    Ресурсы - Тариф.
    Код запроса:
    Код:
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ * 
    |ИЗ РегистрСведений.Тарифы КАК Тарифы
    |ГДЕ Тарифы.Услуга = &Услуга И
    |Тарифы.ПериодРасчета = &ПериодРасчета";
    Запрос.УстановитьПараметр("Услуга",
    ЭлементыФормы.ПереченьУслуг.Значение);
    Запрос.УстановитьПараметр("ПериодРасчета",
    ЭлементыФормы.Период.Значение);
    Результат = Запрос.Выполнить().Выбрать();
    
    Если Результат.Следующий() > 0 Тогда
    ЭлементыФормы.ПереченьУслуг.Тариф.Значение =
    Результат.Тариф;
    Иначе
    ЭлементыФормы.ПереченьУслуг.Тариф.Значение = 0;
    Сообщить("Такого тарифа нет! Добавьте тариф!");
    КонецЕсли
    
    
    Выходит ошибка: {Документ.Начисление.Форма.ФормаДокумента(26)}: Ошибка при вызове метода контекста (Выполнить): {(3, 19)}: Неверные параметры в операции сравнения. Нельзя сравнивать поля
    неограниченной длины и поля несовместимых типов.
    ГДЕ Тарифы.Услуга <<?>>= &Услуга И
    Результат = Запрос.Выполнить().Выбрать();
    Типы полей одинаковы.
    Все перепробывал, не получается запрос сделать.
  2. Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    А в регистре поле "Услуга" какого типа и в документе поле "ПереченьУслуг" какого типа?
  3. TopicStarter Overlay
    Sereg@
    Offline

    Sereg@

    Регистрация:
    5 янв 2010
    Сообщения:
    14
    Симпатии:
    0
    Баллы:
    1
    СправочникСсылка и в Регистре, и в Документе используется один справочник.
  4. gosn1ck
    Offline

    gosn1ck Опытный в 1С

    Регистрация:
    13 авг 2009
    Сообщения:
    1.329
    Симпатии:
    1
    Баллы:
    26
    а вы уверены, что вам не нужен переодический регистр, если работаете с периодами? что такое ПереченьУслуг? это случаем не ТабличнаяЧасть?
  5. Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    Да, скорее всего должно быть так:
    Код:
    Запрос.УстановитьПараметр("Услуга",
    ЭлементыФормы.ПереченьУслуг.Услуга.Значение);
    
    
  6. TopicStarter Overlay
    Sereg@
    Offline

    Sereg@

    Регистрация:
    5 янв 2010
    Сообщения:
    14
    Симпатии:
    0
    Баллы:
    1
    Нет, периодический не нужен, тариф может изменяться как по месяцам так и по кварталам или году, или неделе.

    ПереченьУслуг - Табличная часть документа
  7. TopicStarter Overlay
    Sereg@
    Offline

    Sereg@

    Регистрация:
    5 янв 2010
    Сообщения:
    14
    Симпатии:
    0
    Баллы:
    1
    Исправил:
    Код:
    Запрос.УстановитьПараметр("Услуга",ЭлементыФормы.ПереченьУслуг.Услуга.Значение);
    Запрос.УстановитьПараметр("ПериодРасчета",ЭлементыФормы.ПериодРасчета.Значение);
    
    
    
    Ошибка:
    {Документ.Начисление.Форма.ФормаДокумента(22)}: Поле объекта не обнаружено (Услуга)
    Запрос.УстановитьПараметр("Услуга",ЭлементыФормы.ПереченьУслуг.Услуга.Значение);
  8. gosn1ck
    Offline

    gosn1ck Опытный в 1С

    Регистрация:
    13 авг 2009
    Сообщения:
    1.329
    Симпатии:
    1
    Баллы:
    26
    Код:
        Запрос = Новый Запрос;
    Запрос.Текст = "
    | ВЫБРАТЬ
    |   КакойТоДокументТЧ.Услуга КАК Услуга,
    |    ЕСТЬNULL(РегистрСведений1.Тариф,0) КАК Тариф
    |ИЗ
    |    Документ.КакойТоДокумент.ТЧ КАК КакойТоДокументТЧ
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РегистрСведений1 КАК РегистрСведений1
    |        ПО КакойТоДокументТЧ.Услуга = РегистрСведений1.Услуга
    |ГДЕ
    |    РегистрСведений1.ДатаПериода = &Дата
    |    И КакойТоДокументТЧ.Услуга В(&Услуги)";
    Запрос.УстановитьПараметр("Дата",    ПериодРасчета);     
    Запрос.УстановитьПараметр("Услуги",    ДокументОбъект.ТЧ.ВыгрузитьКолонку("Услуга"));     
    РезультатЗапроса = Запрос.Выполнить().Выбрать();
    
    Пока РезультатЗапроса.Следующий() Цикл
    Для Каждого СтрокаТЧ из ТЧ Цикл
    Если СтрокаТЧ.Услуга = РезультатЗапроса.Услуга Тогда
    СтрокаТЧ.Тариф = РезультатЗапроса.Тариф;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    
    
    
    да меняйте ваш тариф хоть каждую секунду, почитайте про виртуальные таблицы РС в Профессиональная разработка в 1С Предприятии 8.0 под ред. Радченко. думаю Радченко вас переубедит
  9. TopicStarter Overlay
    Sereg@
    Offline

    Sereg@

    Регистрация:
    5 янв 2010
    Сообщения:
    14
    Симпатии:
    0
    Баллы:
    1
    {Документ.Начисление.Форма.ФормаДокумента(51)}: Ошибка при вызове метода контекста (Выполнить): {(3, 4)}: Поле не найдено "Документ.Начисление.ПереченьУслуг.Услуга"

    <<?>>Документ.Начисление.ПереченьУслуг.Услуга КАК Услуга,
  10. Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    А в табличной части ПереченьУслуг реквизит "Услуга" то есть?
  11. TopicStarter Overlay
    Sereg@
    Offline

    Sereg@

    Регистрация:
    5 янв 2010
    Сообщения:
    14
    Симпатии:
    0
    Баллы:
    1
    Есть )
  12. Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    Код:
    Запрос.УстановитьПараметр("Услуга", ЭлементыФормы.ПереченьУслуг.ТекущиеДанные.Услуга);
    
    
    
  13. TopicStarter Overlay
    Sereg@
    Offline

    Sereg@

    Регистрация:
    5 янв 2010
    Сообщения:
    14
    Симпатии:
    0
    Баллы:
    1
    Уже пробовал, та же ошибка
  14. Itsys
    Offline

    Itsys Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    0
    Баллы:
    26
    Ну не знаю :) давай всю конфу - надо смотреть
  15. TopicStarter Overlay
    Sereg@
    Offline

    Sereg@

    Регистрация:
    5 янв 2010
    Сообщения:
    14
    Симпатии:
    0
    Баллы:
    1
  16. gosn1ck
    Offline

    gosn1ck Опытный в 1С

    Регистрация:
    13 авг 2009
    Сообщения:
    1.329
    Симпатии:
    1
    Баллы:
    26
    во-первых с ваш РС периодический, вы меня обманули, во-вторых если дали синоним таблице, то при выборке полей надо указывать СИНОНИМ, именно поэтому платформа не могла найти поле. в-третьих вы уверены, что расчитывать тариф надо именно при изменении единицы измерения?
    советую почитать хоть какие-нибудь книги перед тем как писать конфу с нуля
  17. TopicStarter Overlay
    Sereg@
    Offline

    Sereg@

    Регистрация:
    5 янв 2010
    Сообщения:
    14
    Симпатии:
    0
    Баллы:
    1
    Периодическим сделал уже позже для того, чтобы попробовать запрос, предложенный в теме, Вами.
    Даже, если убрать СИНОНИМ, то ничего не меняется.
    Когда выполняться запросу тоже особого значения нет, при выборе услуги или ед.изм

    А вот книги читаю с удовольствием, только не сразу все понятно.
  18. gosn1ck
    Offline

    gosn1ck Опытный в 1С

    Регистрация:
    13 авг 2009
    Сообщения:
    1.329
    Симпатии:
    1
    Баллы:
    26
    Код:
    	СтрокаТЧ = ЭлементыФормы.ПереченьУслуг.ТекущиеДанные;
    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |	Начисление.Услуга КАК Услуга,
    |	ЕСТЬNULL(ТарифыСрезПоследних.Тариф, 0) КАК Тариф
    |ИЗ
    |	Документ.Начисление.ПереченьУслуг КАК Начисление
    |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Тарифы.СрезПоследних(&Период, ) КАК ТарифыСрезПоследних
    |		ПО Начисление.Услуга = ТарифыСрезПоследних.Услуга
    |ГДЕ
    |	Начисление.Услуга = &Услуга";
    Запрос.УстановитьПараметр("Период", Период);     
    Запрос.УстановитьПараметр("Услуга",СтрокаТЧ.Услуга);     
    РезультатЗапроса = Запрос.Выполнить().Выбрать();
    
    РезультатЗапроса.Следующий();
    
    СтрокаТЧ.Тариф = РезультатЗапроса.Тариф;
    
  19. TopicStarter Overlay
    Sereg@
    Offline

    Sereg@

    Регистрация:
    5 янв 2010
    Сообщения:
    14
    Симпатии:
    0
    Баллы:
    1
    Ура!!!
    Респект тебе!!!

    ____
    А, если я еще что-нибудь спрашивать буду, Вы сильно ругаться станете?
  20. gosn1ck
    Offline

    gosn1ck Опытный в 1С

    Регистрация:
    13 авг 2009
    Сообщения:
    1.329
    Симпатии:
    1
    Баллы:
    26
    Успехов, кстати Итого можно засунуть в ТЧ (читайте практическое пособие) или обычно делается Надписью, но никак не полем ввода :)

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