Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 1
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Не работает поиск по таблице значений , Не работает поиск по таблице значений          
Mr.Al Подменю пользователя
сообщение 29.04.10, 10:23
Сообщение #1

Молчаливый
*
Группа: Пользователи
Сообщений: 8
Из: Днепр
Спасибо сказали: 0 раз
Рейтинг: 0

Вот такая вот процедурка, но почему то не работает поиск, точнее он находит не все элементы, а только первый

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


Подскажите, куда капать то....а вчера вечером голову сломал но так и не нашел решения((
Причина редактирования: При вставке кода пользуйтесь специальными тегами

Naghual Подменю пользователя
сообщение 29.04.10, 11:26
Сообщение #2

Завсегдатай
****
Группа: Пользователи
Сообщений: 102
Из: Днепропетровск
Спасибо сказали: 21 раз
Рейтинг: 0

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


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


Signature
Я желаю всем Счастья!

Zaval Подменю пользователя
сообщение 29.04.10, 11:32
Сообщение #3

Крутой
Иконка группы
Группа: Местный
Сообщений: 1994
Из: Киева и окрестностей
Спасибо сказали: 406 раз
Рейтинг: 0

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

тоже лишнее.

Naghual Подменю пользователя
сообщение 29.04.10, 11:39
Сообщение #4

Завсегдатай
****
Группа: Пользователи
Сообщений: 102
Из: Днепропетровск
Спасибо сказали: 21 раз
Рейтинг: 0

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


И то верно!


Signature
Я желаю всем Счастья!

Mr.Al Подменю пользователя
сообщение 29.04.10, 15:57
Сообщение #5

Молчаливый
*
Группа: Пользователи
Сообщений: 8
Из: Днепр
Спасибо сказали: 0 раз
Рейтинг: 0

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


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


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


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

тоже лишнее.


убрал, ничего не получается(

Zaval Подменю пользователя
сообщение 29.04.10, 16:28
Сообщение #6

Крутой
Иконка группы
Группа: Местный
Сообщений: 1994
Из: Киева и окрестностей
Спасибо сказали: 406 раз
Рейтинг: 0

Прежде всего нужно убрать
Прервать;


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

Вообще все очень похоже на попытку написать отчет методом тыка, без малейшего понимания творимого.
Предлагаю автору покаяться в злобных замыслах.

Mr.Al Подменю пользователя
сообщение 29.04.10, 16:47
Сообщение #7

Молчаливый
*
Группа: Пользователи
Сообщений: 8
Из: Днепр
Спасибо сказали: 0 раз
Рейтинг: 0

Цитата(Zaval @ 29.04.10, 18:28) *
Прежде всего нужно убрать
Прервать;


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


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

Zaval Подменю пользователя
сообщение 29.04.10, 19:11
Сообщение #8

Крутой
Иконка группы
Группа: Местный
Сообщений: 1994
Из: Киева и окрестностей
Спасибо сказали: 406 раз
Рейтинг: 0

Упс... так в начале все так и работало... Как тогда понимать заглавие ветки и первое сообщение?

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

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

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

Вопчем, озвучивай задачу, так быстрее получится smile.gif

Mr.Al Подменю пользователя
сообщение 29.04.10, 21:35
Сообщение #9

Молчаливый
*
Группа: Пользователи
Сообщений: 8
Из: Днепр
Спасибо сказали: 0 раз
Рейтинг: 0

Решил свою проблему такой конструкцией...

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


спс за пооддержку и помощьsmile.gif

dmiter Подменю пользователя
сообщение 30.04.10, 21:38
Сообщение #10

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 108
Из: Киев
Спасибо сказали: 16 раз
Рейтинг: 0

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

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

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

[/quote]

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 22.06.25, 20:05
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!