Имя: Пароль:
1C
1С v8
Помогите пожалуйста разобраться с отбором
0 Vitalii72
 
30.06.16
06:57
В общем задача такая, необходимо сделать отбор по последней строчке табличной части с колонкой ТекущаяДата. В стандартном отборе не смог найти как это сделать, скорей всего не такой возможности. Попробовал сам написать запрос по убыванию строки этой колонки и записать в список после проверки:

Если ТекущаяДатаИстина = Истина Тогда
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Контрагенты.ТабличнаяЧасть.(
        |        ТекущаяДата КАК ТекущаяДата
        |    )
        |ИЗ
        |    Справочник.Контрагенты КАК Контрагенты
        |
        |УПОРЯДОЧИТЬ ПО
        |    ТекущаяДата УБЫВ";
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        
        Выборка = ВыборкаДетальныеЗаписи.ТабличнаяЧасть.Выбрать();
        
        Пока Выборка.Следующий() Цикл
            Если Выборка.ТекущаяДата < ДатаНачало ИЛИ Выборка.ТекущаяДата = ДатаНачало Тогда
                Если НЕ Выборка.ТекущаяДата = '0001.01.01 00:00:00' Тогда
                    
            СписокДляОтбора=Новый СписокЗначений;
            СписокДляОтбора.Добавить(Выборка.ТекущаяДата);
            
                    
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
        
    КонецЦикла;
    
            Для Каждого ЭлементСписка Из СписокДляОтбора Цикл
            Сообщить(ЭлементСписка.Значение);
            КонецЦикла;

    
    
            ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
            ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("ТабличнаяЧасть.ТекущаяДата");
            ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.ВСписке;
            ЭлементОтбора.ПравоеЗначение = СписокДляОтбора;
            ЭлементОтбора.Использование = Истина;

Отбор проходит, но почему то находит только 14 контрагентов, а их по факту намного больше. После загрузки списка из колонки Выборка.ТекущаяДата пишу Сообщить(СписокДляОтбора);, он мне выдаёт больше 50 контрагентов. У списка значений есть ограничение по количеству строк? Если делаю в цикле, тогда отбор вообще не работает. Помоги пожалуйста разобраться, что не так делаю.
1 Cyberhawk
 
30.06.16
07:54
Покажи на картинке внятно, что есть и что требуется
2 Vitalii72
 
30.06.16
08:07
Есть справочник контрагенты, есть табличная часть контрагента. В неё вносят каждый раз в новую строку ТекущаяДата(Дата создания строки), комментарий и ДатаСледующегоКонтакта. Вот при отборе пользователь указывает например ТабличнаяЧасть.ТекущаяДата Меньше или Равно например 30.06.2016. Отбор перебирает все строки в этих табличных частей и всех контрагентов, но надо чтобы отбор был только по последней строке. То есть если я зайду в контрагента, создам новый комментарий с ТекущейДатой 01.07.2016, он не должен найти этого контрагента.
3 Vitalii72
 
30.06.16
08:09
Примерно понял почему не работает, в СписокДляОтбора загружается только последнее значение. Видимо надо в цикле передать в массив, а потом после цикла из массива передать в список значение. В цикле написал: Массив.Добавить(Выборка.ТекущаяДата);
После Цикла
СписокДляОтбора=Новый СписокЗначений;
СписокДляОтбора.ЗагрузитьЗначения(Массив);
И дальше отбор
4 Cyberhawk
 
30.06.16
08:11
Заведи реквизит у контрагента и пиши в него дату последней строки. И отбирай по нему.
5 Vitalii72
 
30.06.16
08:12
(4) А как я делал, не получится сделать отбор?
6 catena
 
30.06.16
08:20
(5)по реквизиту проще и быстрее работать будет.
По коду: когда список значений создается, он пустой. И не важно, что было до того. А он у тебя создается внутри списка. И переделай все условия в запрос, не надо никаких циклов. Запрос - выгрузить колонку - отбор по ссылке.
7 Vitalii72
 
30.06.16
08:23
Спасибо большое за ответы!