Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не работает поиск по таблице значений
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
Mr.Al
Вот такая вот процедурка, но почему то не работает поиск, точнее он находит не все элементы, а только первый

    НомСтр = 0;
    Себ=0; Сум=0; СрЦена=0;    
    Спр = СоздатьОбъект("Справочник.Номенклатура");
    Спр.ВыбратьЭлементы();
    Пока Спр.ПолучитьЭлемент() = 1 Цикл    
        СпрР = СоздатьОбъект("Справочник.Рецептура");
        СпрР.ИспользоватьДату(КонДата);
        СпрР.ИспользоватьВладельца(Спр.ТекущийЭлемент());
        СпрР.ВыбратьЭлементы();
        Пока СпрР.ПолучитьЭлемент() = 1 Цикл
            ТЗ.ВыбратьСтроки();
            Пока ТЗ.ПолучитьСтроку() = 1 Цикл  
                Сообщить(СпрР.Сырье);
                Если ТЗ.НайтиЗначение(СпрР.Сырье.Наименование, НомСтр, "Сырье") = 1 Тогда
                    ТЗ.ПолучитьСтрокуПоНомеру(номстр);
                    СрЦена = ТЗ.СрЦена;
                    Сум = СпрР.Количество * СрЦена;
                    Прервать;
                Иначе
                    Продолжить;
                КонецЕсли;                
            КонецЦикла;
            Если СрЦена=0 Тогда
                СрЦена = СпрР.Сырье.СрЦена;
                Сум = СпрР.Количество * СрЦена;
            КонецЕсли;
            Себ = Себ + Сум;
            СрЦена=0;
        КонецЦикла;    
        Таб.ВывестиСекцию("Строка_1");  
        Себ = 0; Сум = 0;
    КонецЦикла;


Подскажите, куда капать то....а вчера вечером голову сломал но так и не нашел решения((
Naghual
1.
НомСтр = "";
Перед каждым новым поиском.
НомСтр = 0 (инструкция к поиску по 0 строке! Такая фишка 1С 31000000.gif )


2.
А ТЗ точно содержит данные?
Zaval
В ТЗ только первый находит? Походу, все честно.... ясно же написато "Прервать"
Если требуется искать дальше - рвать ничего не нужно)
Иначе
              Продолжить;

тоже лишнее.
Naghual
Цитата(Zaval @ 29.04.10, 13:32) необходимо зарегистрироваться для просмотра ссылки
В ТЗ только первый находит? Походу, все честно.... ясно же написато "Прервать"


И то верно!
Mr.Al
Цитата(Naghual @ 29.04.10, 13:26) необходимо зарегистрироваться для просмотра ссылки
1.
НомСтр = "";
Перед каждым новым поиском.
НомСтр = 0 (инструкция к поиску по 0 строке! Такая фишка 1С 31000000.gif )


2.
А ТЗ точно содержит данные?


1. Поставил перед каждым поиском - эффект такой же
2. ТЗ держит, перед поиском делаю вывод ТЗ, все выводит


Цитата(Zaval @ 29.04.10, 13:32) необходимо зарегистрироваться для просмотра ссылки
В ТЗ только первый находит? Походу, все честно.... ясно же написато "Прервать"
Если требуется искать дальше - рвать ничего не нужно)
Иначе
              Продолжить;

тоже лишнее.


убрал, ничего не получается(
Zaval
Прежде всего нужно убрать
Прервать;


Тогда будет перебрана вся ТЗ, в СрЦена и Сум будут значения по последней найденной строке, значения всех предыдущих строк будут благополучно забыты.
Да, отчет вцелом выдаст полный бред.

Вообще все очень похоже на попытку написать отчет методом тыка, без малейшего понимания творимого.
Предлагаю автору покаяться в злобных замыслах.
Mr.Al
Цитата(Zaval @ 29.04.10, 18:28) необходимо зарегистрироваться для просмотра ссылки
Прежде всего нужно убрать
Прервать;


Тогда будет перебрана вся ТЗ, в СрЦена и Сум будут значения по последней найденной строке, значения всех предыдущих строк будут благополучно забыты.


Прервать;
убрано, но мне надо что бы при нахождении элемента
СпрР.Сырье
цикл поиска по ТЗ останавливался, и переходил на следующий
СпрР.Сырье
Zaval
Упс... так в начале все так и работало... Как тогда понимать заглавие ветки и первое сообщение?

Для начала...
1. Номенклатура выбирается вся - хотя, помимо нужной(имеющей рецептуру), там наверняка еще куча всякого стороннего(в данном случае) хлама.
2. Нет проверок "а не группа ли это?" и "а не помечено ли оно на удаление". Для всего упорно пытаемся найти подчиненные.
3. Для каждой Номенклатуры создаем объект. Слишком жирно для нее. Создать вне цикла.
4. Пытаемся получить элемент из, возможно пустой выборки, хотя
Если СпрР.ВыбратьЭлементы() = 1 Тогда
//здесь перебираем и обрабатываем выбранное
КонецЕсли;

легко избавляет от тщетных попыток получить элемент там где его нет.

И вообще, я бы переебирал СпрР, запихивал бы его в ТЗ вместе с СпрР.ТекущийЭлемент().Владелец. Затем свернуть по Владельцам с суммированием Себ и выводить на печать уже из этой ТЗ.
А может все можно получить одним запросом?

Вопчем, озвучивай задачу, так быстрее получится smile.gif
Mr.Al
Решил свою проблему такой конструкцией...

        Пока СпрР.ПолучитьЭлемент() = 1 Цикл 
            НомСтр = 0;
            ТЗ.ВыбратьСтроки();
            Пока ТЗ.ПолучитьСтроку() = 1 Цикл
                Если ТЗ.Сырье = СпрР.Сырье Тогда
                    СрЦена = ТЗ.СрЦена;
                    Сум = СпрР.Количество * СрЦена;
                КонецЕсли;
            КонецЦикла;
            
            Если СрЦена=0 Тогда
                СрЦена = СпрР.Сырье.СрЦена;
                Сум =  СпрР.Количество * СрЦена;
            КонецЕсли;
            Себ = Себ + Сум;
            СрЦена=0; Сум=0;
        КонецЦикла;


спс за пооддержку и помощьsmile.gif
dmiter
Не совсем оптимально. Можно даже сказать быстродействие =0. Из данного кода по оптимизации один из вариантов:
за циклом:
СЗ=СоздатьОбъект("СписокЗначений");
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
      СЗ.Установить(ПолучитьУникальноеСтроковоеПредставление(ТЗ.Сырье),ТЗ.СрЦена);
КонецЦикла;

теперь в самом цикле получаем что нам необходимо:
Пока СпрР.ПолучитьЭлемент() = 1 Цикл 
     СрЦена=Число(СЗ.Получить(ПолучитьУникальноеСтроковоеПредставление(СпрР.Сырье));
     Если СрЦена=0 Тогда
          СрЦена = СпрР.Сырье.СрЦена;
     КонецЕсли;
     Сум =  СпрР.Количество * СрЦена;
     Себ = Себ + Сум;
КонецЦикла;

Был бы полный код и/или постановка задачи может быть еще лучше написалsmile.gif

[/quote]
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.