8.х Расчет разности дат в запросеами:

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

  1. TopicStarter Overlay
    JediAlex
    Offline

    JediAlex Опытный в 1С

    Регистрация:
    27 авг 2011
    Сообщения:
    140
    Симпатии:
    0
    Баллы:
    26
    Здравствуйте. Делаю собственную конфигурацию в 1с 8.3. Есть справочник "ЭтапыДоговоров", с реквизитами: НомерЭтапа,наименованиеЭтапа, Договор, ДатаНачалаРабот (Дата,состав - Дата),ДатаНачалаРаботФакт(Дата,состав - Дата) и т.д... Понадобилось сделать выборку элементов по такому условию: ДатаНачалаРабот<=ОтчетнаяДата и ГОД(ДатаНачалаРабот)=ГОД(ОтчетнаяДата), где ОтчетнаяДата - параметр, задаваемый пользователем. Необходимо посчитать отклонение дат: если ДатаНачалаРаботФакт заполнена, то Отклонение=ДатаНачалаРаботФакт-ДатаНачалаРабот ИНАЧЕ Отклонение=ОтчетнаяДата-ДатаНачалаРабот. Сделал обработку, в табличную часть которой вывожу результаты запроса. Ниже код запроса и вывода данных:
    Код:
    &НаСервере
    Процедура СформироватьОтчетНаСервере()
        // Вставить содержимое обработчика.
        Запрос=Новый Запрос;
        Запрос.Текст="ВЫБРАТЬ
                     |    ЭтапыДоговоров.НомерЭтапа,
                     |    ЭтапыДоговоров.НаименованиеЭтапа,
                     |    ЭтапыДоговоров.ДатаНачалаРабот,
                     |    ЭтапыДоговоров.ДатаНачалаРаботФакт,
                     |    ЭтапыДоговоров.Договор,
                     |    ВЫБОР
                     |        КОГДА ЭтапыДоговоров.ДатаНачалаРаботФакт ЕСТЬ NULL
                     |            ТОГДА РАЗНОСТЬДАТ(&ОтчетнаяДата, ЭтапыДоговоров.ДатаНачалаРабот, ДЕНЬ)
                     |        ИНАЧЕ РАЗНОСТЬДАТ(ЭтапыДоговоров.ДатаНачалаРаботФакт, ЭтапыДоговоров.ДатаНачалаРабот, ДЕНЬ)
                     |    КОНЕЦ КАК Отклонение
                     |ИЗ
                     |    Справочник.ЭтапыДоговоров КАК ЭтапыДоговоров
                     |ГДЕ
                     |    ЭтапыДоговоров.ДатаНачалаРабот <= &ОтчетнаяДата
                     |    И ГОД(ЭтапыДоговоров.ДатаНачалаРабот) = ГОД(&ОтчетнаяДата)";
                      Запрос.УстановитьПараметр("ОтчетнаяДата",Объект.ОтчетнаяДата);
                     Результат=Запрос.Выполнить().Выгрузить();
                     Объект.Этапы.Очистить();
                     Для каждого стр Из Результат Цикл
                    НовСтр=Объект.Этапы.Добавить();
                    ЗаполнитьЗначенияСвойств(НовСтр,стр);
                    КонецЦикла;    
                    
    КонецПроцедуры
    
    &НаКлиенте
    Процедура СформироватьОтчет(Команда)
        СформироватьОтчетНаСервере();
    КонецПроцедуры
    
    Все работает правильно, если заполнена ДатаНачалаРаботФакт, а вот выражение РАЗНОСТЬДАТ(&ОтчетнаяДата, ЭтапыДоговоров.ДатаНачалаРабот, ДЕНЬ) если ДатаНачалаРаботФакт не заполнено, выдает непонятное число - 736099...Что не так делаю? помогите пожалуйста.
  2. Dem0lisher
    Offline

    Dem0lisher Профессионал в 1С

    Регистрация:
    4 авг 2009
    Сообщения:
    1.028
    Симпатии:
    51
    Баллы:
    54
    Значит лохматый год какой-то 0001. В консоль запихайте ваш запрос и посмотрите все поля
  3. TopicStarter Overlay
    JediAlex
    Offline

    JediAlex Опытный в 1С

    Регистрация:
    27 авг 2011
    Сообщения:
    140
    Симпатии:
    0
    Баллы:
    26
    при этом выражение РАЗНОСТЬДАТ(ЭтапыДоговоров.ДатаНачалаРаботФакт, ЭтапыДоговоров.ДатаНачалаРабот, ДЕНЬ) нормально рассчитывается, когда оба поля заполнены и расчет не по параметру запроса
  4. Dem0lisher
    Offline

    Dem0lisher Профессионал в 1С

    Регистрация:
    4 авг 2009
    Сообщения:
    1.028
    Симпатии:
    51
    Баллы:
    54
    Консоль..

    736099 / 365
    = 2016,70958904
  5. TopicStarter Overlay
    JediAlex
    Offline

    JediAlex Опытный в 1С

    Регистрация:
    27 авг 2011
    Сообщения:
    140
    Симпатии:
    0
    Баллы:
    26
    ну и что не так с параметром может быть??
    --- Объединение сообщений, 13 май 2016 ---
    в отладчике ОтчетнаяДата:13.05.2016 0:00:00
    Последнее редактирование: 13 май 2016
  6. TopicStarter Overlay
    JediAlex
    Offline

    JediAlex Опытный в 1С

    Регистрация:
    27 авг 2011
    Сообщения:
    140
    Симпатии:
    0
    Баллы:
    26
    в отладчике на строке
    Код:
     Запрос.УстановитьПараметр("ОтчетнаяДата",Объект.ОтчетнаяДата);
    вышло сообщение:{(1,62)}: Ошибка в выражении. В чем ошибка?
  7. Dem0lisher
    Offline

    Dem0lisher Профессионал в 1С

    Регистрация:
    4 авг 2009
    Сообщения:
    1.028
    Симпатии:
    51
    Баллы:
    54
    У вас же работало! Показывайте, что изменили
  8. TopicStarter Overlay
    JediAlex
    Offline

    JediAlex Опытный в 1С

    Регистрация:
    27 авг 2011
    Сообщения:
    140
    Симпатии:
    0
    Баллы:
    26
    Код:
    &НаСервере
    Процедура СформироватьОтчетНаСервере()
        // Вставить содержимое обработчика.
        Запрос=Новый Запрос;
        Запрос.Текст="ВЫБРАТЬ
                     |    ЭтапыДоговоров.НомерЭтапа КАК НомерЭтапа,
                     |    ЭтапыДоговоров.НаименованиеЭтапа,
                     |    ЭтапыДоговоров.ДатаНачалаРабот КАК ДатаНачалаРабот,
                     |    ЭтапыДоговоров.ДатаНачалаРаботФакт КАК ДатаНачалаРаботФакт,
                     |    ЭтапыДоговоров.Договор КАК Договор,
                     |    ЭтапыДоговоров.Договор.Наименование КАК НаименованиеДоговора,
                     |    ВЫБОР
                     |        КОГДА ЭтапыДоговоров.ДатаНачалаРаботФакт ЕСТЬ NULL
                     |            ТОГДА РАЗНОСТЬДАТ(ЭтапыДоговоров.ДатаНачалаРабот, &ОтчетнаяДата, ДЕНЬ)
                     |        ИНАЧЕ РАЗНОСТЬДАТ(ЭтапыДоговоров.ДатаНачалаРаботФакт, ЭтапыДоговоров.ДатаНачалаРабот, ДЕНЬ)
                     |    КОНЕЦ КАК Отклонение
                     |ИЗ
                     |    Справочник.ЭтапыДоговоров КАК ЭтапыДоговоров
                     |ГДЕ
                     |    ЭтапыДоговоров.ДатаНачалаРабот <= &ОтчетнаяДата";
                      Запрос.УстановитьПараметр("ОтчетнаяДата",Объект.ОтчетнаяДата);
                     Результат=Запрос.Выполнить().Выгрузить();
                     Объект.Этапы.Очистить();
                     Для каждого стр Из Результат Цикл
                    НовСтр=Объект.Этапы.Добавить();
                    ЗаполнитьЗначенияСвойств(НовСтр,стр);
                    КонецЦикла;    
                    
    КонецПроцедуры
    
    вот что сейчас... совсем не могу понять, где и что не то делаю...провел отладку еще раз - считает для тех записей, где обе даты есть, а где от параметра отнять надо - опять ерунда
    --- Объединение сообщений, 16 май 2016 ---
    пробовал и так:
    Код:
    Запрос.УстановитьПараметр("ОтчетнаяДата",ТекущаяДата());
    
    все равно от параметра отнять не может
    Последнее редактирование: 16 май 2016
  9. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    КОГДА ЭтапыДоговоров.ДатаНачалаРаботФакт ЕСТЬ NULL - это условие никогда не выполняется.
    Нужно проверять на пустую дату, т.е.

    КОГДА ЭтапыДоговоров.ДатаНачалаРаботФакт = ДатаВремя(1,1,1)
  10. TopicStarter Overlay
    JediAlex
    Offline

    JediAlex Опытный в 1С

    Регистрация:
    27 авг 2011
    Сообщения:
    140
    Симпатии:
    0
    Баллы:
    26
    спасибо большое. Сделал как посоветовали -считает как надо, но почему то не обновляется табличная часть...какую бы дату не ввел для запроса, строки выводятся одни и те же и результаты расчета не меняются....
    --- Объединение сообщений, 16 май 2016 ---
    все, понял сам ошибку. Еще раз спасибо,все работает))

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