Имя: Пароль:
1C
1С v8
Вопрос выбора с выводом
, ,
0 stepanov1991
 
31.07.14
09:34
День добрый, ситаация такая нужно сделать так. Если документ не найден например за 31.07.14, то 1с должна сказать что есть данные на 30.07.14 Сформировать? и вывести данные на 30.07.
Вот пример кода который пытаюсь сделать.
             //Перебором: назначаем метод обработки данных запроса в переменную ВЫборка...        
        Выборка=запрос.Выполнить().Выбрать();            
        
        Если выборка.Следующий() Тогда
            // Получили 1 документ, т.к. один за один день
        
            ДокОбъект=Выборка[0].Ссылка.ПолучитьОбъект();        //обращение к индексу выборок таблиц значений и массивов
            //идет с 0- тут я получил ту ссылку в запросе по индексу Выборка[0].Ссылка... это 1 док в выборке запросом, а к этой ссылке применил метод получения               
            ДокОбъект.ДействиеПечать() ;
        Иначе
        //Сообщить("Нет документов за выбранную дату!");
        Режим = РежимДиалогаВопрос.ДаНет;
        Ответ = Вопрос("Есть данные на другое число Сформировать?",Режим,1);
        Если Ответ = КодВозвратаДиалога.Да Тогда
        Выборка=запрос.Выполнить().Выбрать();
        ДокОбъект=Выборка[1].Ссылка.ПолучитьОбъект();
        ДокОбъект.ДействиеПечать() ;
1 NcSteel
 
31.07.14
09:37
Прекрасно, в чем вопрос? )
2 Wobland
 
31.07.14
09:38
бери первые 1 где дата<=нужной, потом сравнивай полученную дату с датой выбранного
3 Wobland
 
31.07.14
09:38
(1) Сформировать?
4 ZaprosMan
 
31.07.14
09:39
У Вас пустая выборка, как вы хотите из неё выбрать[1].
И вообще [0] тоже не надо.
Нужен запрос, текст. так ничего не понять!
5 NcSteel
 
31.07.14
09:41
(3) ))) Автор данный текст забыл в ковычках написать.... А вопрос понятно, что "аАААААа  у мения не работает, как?"

И ответ - правильно написать запрос.
6 stepanov1991
 
31.07.14
09:41
ИначеЕсли ЭлементыФормы.СписокОтчетов.ТекущаяСтрока.Значение="Режим работы очистных сооружений на дату" Тогда     
        
        Запрос=Новый запрос;          //Чререз выбрали документы ОчистныеСооруженияРежимРаботы в пределах даты в менеджере отчетов с начала по конец дня, только проведенные
        запрос.текст="ВЫБРАТЬ
                     |    ОчистныеСооруженияРежимРаботы.Ссылка
                     |ИЗ
                     |    Документ.ОчистныеСооруженияРежимРаботы КАК ОчистныеСооруженияРежимРаботы
                     |ГДЕ
                     |    ОчистныеСооруженияРежимРаботы.Дата МЕЖДУ &НачДата И &КонДата
                     |    И ОчистныеСооруженияРежимРаботы.Проведен";
                     Запрос.УстановитьПараметр("НачДата",НачалоДня(ЭтаФорма.ДатаОтчетов));
                     Запрос.УстановитьПараметр("КонДата",КонецДня(ЭтаФорма.ДатаОтчетов));
                     //Перебором: назначаем метод обработки данных запроса в переменную ВЫборка...        
        Выборка=запрос.Выполнить().Выбрать();            
        
        Если выборка.Следующий() Тогда
            // Получили 1 документ, т.к. один за один день
        
            ДокОбъект=Выборка[0].Ссылка.ПолучитьОбъект();        //обращение к индексу выборок таблиц значений и массивов
            //идет с 0- тут я получил ту ссылку в запросе по индексу Выборка[0].Ссылка... это 1 док в выборке запросом, а к этой ссылке применил метод получения               
            ДокОбъект.ДействиеПечать() ;
        Иначе
        //Сообщить("Нет документов за выбранную дату!");
        Режим = РежимДиалогаВопрос.ДаНет;
        Ответ = Вопрос("Есть данные на другое число,Сформировать?",Режим,0);
        Если Ответ = КодВозвратаДиалога.Да Тогда
        //Выборка=запрос.Выполнить().Выбрать();
        //ДокОбъект=Выборка[1].Ссылка.ПолучитьОбъект();
        //ДокОбъект.ДействиеПечать() ;
                        
        КонецЕсли;
        КонецЕсли;
    КонецЕсли;  
КонецПроцедуры
7 salvator
 
31.07.14
09:43
(0)

Ответ = Вопрос("Есть данные на другое число Сформировать?",Режим,1);
Если Ответ = КодВозвратаДиалога.Да Тогда
   Выборка=запрос.Выполнить().Выбрать();
   ...

т.е. ты заранее знаешь, что за другую дату будут документы?
8 stepanov1991
 
31.07.14
09:44
Нужно что бы он формировал за предыдущий день если за этот нету.
9 ZaprosMan
 
31.07.14
09:45
Тут такая темя, что если "выборка.Следующий()" <> Истина
Значит и выбрать от туда нечего. так как за один день все формируете.
Возьмите первые 2 например
10 ZaprosMan
 
31.07.14
09:46
(9) не непойдет первые 2, группировку по датам и тогда выбирать.
11 Wobland
 
31.07.14
09:46
(8) а ну как вообще документов не будет?
12 NcSteel
 
31.07.14
09:46
(6) смотри (2) Там все правильно сказано. И ты получишь последний документ на дату отчета.... если дата документа меньше периода отчета, то выводи соотетствующий вопрос .
13 ZaprosMan
 
31.07.14
09:53
Можно сделать в рекурсии (вынести поиск даты в отдельную процедуру) после вопроса искать той же процедурой в прошлой дате.

Процедура Рекурсия(Дата)
Запрос=Новый запрос;          //Чререз выбрали документы ОчистныеСооруженияРежимРаботы в пределах даты в менеджере отчетов с начала по конец дня, только проведенные

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

        Выборка=запрос.Выполнить().Выбрать();            
        
        Если выборка.Следующий() Тогда
            // Получили 1 документ, т.к. один за один день

        
            ДокОбъект=Выборка[0].Ссылка.ПолучитьОбъект();        //обращение к индексу выборок таблиц значений и массивов

            //идет с 0- тут я получил ту ссылку в запросе по индексу Выборка[0].Ссылка... это 1 док в выборке запросом, а к этой ссылке применил метод получения              

            ДокОбъект.ДействиеПечать() ;
        Иначе
        //Сообщить("Нет документов за выбранную дату!");

        Режим = РежимДиалогаВопрос.ДаНет;
        Ответ = Вопрос("Есть данные на другое число,Сформировать?",Режим,0);
        Если Ответ = КодВозвратаДиалога.Да Тогда
Дата = НачалоДня(НачалоДня(Дата)-1);
        Рекурсия();                  
        КонецЕсли;
14 ZaprosMan
 
31.07.14
09:54
(13)+
Режим = РежимДиалогаВопрос.ДаНет;
        Ответ = Вопрос("Есть данные на другое число,Сформировать?",Режим,0);
        Если Ответ = КодВозвратаДиалога.Да Тогда
Дата = НачалоДня(НачалоДня(Дата)-1);
        Рекурсия(Дата);                  
        КонецЕсли;
15 NcSteel
 
31.07.14
09:55
(13) Миллион запросов к базе в цикле... не лучшее решение
16 Wobland
 
31.07.14
09:55
// Получили 1 документ, т.к. один за один день

правильный комментарий, верный
17 ZaprosMan
 
31.07.14
09:58
(15) в каким цикле? Вопрос (да нет).
18 Wobland
 
31.07.14
09:59
хорошо. миллион запросов одного и того же один за другим
19 ZaprosMan
 
31.07.14
10:02
почему миллион?
1С Спросил: "Мля, чето нет доков на 31.07.14 посмотреть на 30.07.14"
Пользователь такой: "Да".
1с выполняет поиск 1 запрос.
//
1С Спросил: "Мля, чето нет доков на 30.07.14 посмотреть на 29.07.14"
Пользователь такой: "Да".
1с выполняет поиск 1 запрос.
//
//
1С Спросил: "Мля, чето нет доков на 29.07.14 посмотреть на 28.07.14"
Пользователь такой: "Да".
1с выполняет поиск 1 запрос.
////
опа нашел....
20 Wobland
 
31.07.14
10:04
не дошло, да? ну ладно
21 Drac0
 
31.07.14
10:06
Че за бред? У тебя есть дата. Получаешь один документ, с датой меньше или равной данной, сравниваешь его дату с текущей и спрашиваешь или нет. А сам док у тебя уже есть.
22 ZaprosMan
 
31.07.14
10:06
Объясни. что не так то?
23 Wobland
 
31.07.14
10:07
(22) запрос нужно делать один раз
24 bigandruha
 
31.07.14
10:54
А так?
Только в запросе выбрать документ с датой меньшей или равной заданной.

           //Перебором: назначаем метод обработки данных запроса в переменную ВЫборка...        

        Выборка=запрос.Выполнить().Выбрать();            
        
        Если выборка.Следующий() Тогда
            // Получили 1 документ, т.к. один за один день

        
            ДокОбъект=Выборка[0].Ссылка.ПолучитьОбъект();        //обращение к индексу выборок таблиц значений и массивов

            //идет с 0- тут я получил ту ссылку в запросе по индексу Выборка[0].Ссылка... это 1 док в выборке запросом, а к этой ссылке применил метод получения              
        Если ДокОбъект.Дата = НужнаяДата
            ДокОбъект.ДействиеПечать() ;
        Иначе
        //Сообщить("Нет документов за выбранную дату!");

        Режим = РежимДиалогаВопрос.ДаНет;
        Ответ = Вопрос("Есть данные на другое число Сформировать?" + ДокОбъект.Дата,Режим,1);
        Если Ответ = КодВозвратаДиалога.Да Тогда
        Выборка=запрос.Выполнить().Выбрать();
        ДокОбъект=Выборка[1].Ссылка.ПолучитьОбъект();
        ДокОбъект.ДействиеПечать() ;
        Иначе
        Сообщить("Нет документов Ваабще!");
25 bigandruha
 
31.07.14
10:56
+(24)Строки
        Выборка=запрос.Выполнить().Выбрать();
        ДокОбъект=Выборка[1].Ссылка.ПолучитьОбъект();
Лишние
26 Drac0
 
31.07.14
11:30
(24) (25) норм.
27 Wobland
 
31.07.14
11:35
(24) а я б за такой почерк руки бы да пооборвал
28 fmrlex
 
31.07.14
11:37
Зачатки интеллекта в 1с.
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.