Можно ли оптимизировать программу?
У меня есть примерно следующий программный блок
Процедура ПоискПТФ()
Расх = СоздатьОбъект("Документ.РасходнаяНакладная");
ТЗ = СоздатьОбъект ("ТаблицаЗначений");
Телефон_=СокрЛП(Телефон);
......................................................................
Пока Расх.ПолучитьДокумент()=1 Цикл
Если ((Найти(Расх.Телефон,Телефон_)>0)и(Расх.ПометкаУдаления()=0)) Тогда
.................................................................................
ТЗ.НоваяКолонка("Модель");
ТЗ.НоваяКолонка("СерийныйНомер");
...........................................................................
....................................................................................
Расх.ВыбратьДокументы(НачДата,КонДата);
Если ШД=0 Тогда
Если ДТ=0 Тогда
Пока Расх.ПолучитьДокумент()=1 Цикл
Если ((Найти(Расх.Телефон,Телефон_)>0)и(Расх.ПометкаУдаления()=0)) Тогда
ТЗ.НоваяСтрока();
ТЗ.Модель = Расх.Модель;
ТЗ.СерийныйНомер = Расх.СерийныйНомер;
ТЗ.Телефон = Расх.Телефон;
ТЗ.Контрагент=Расх.Контрагент;
ТЗ.ДопТелефон = Расх.ДопТелефон;
......................................................................................................................
......................................................................................................................
КонецПроцедуры
Если ((Найти(Расх.Имя,Имя_)>0)и(Расх.ПометкаУдаления()=0)) Тогда
Вызывайте процедуру передавая параметры.
Процедура ПоискПТФ() на типа Процедура ПоискПТФ(РасхНакл,Имя,Удаление)
В самой процедуре анализируете передаваемые параметры и выполняете.
Pepe @ Сегодня, 20:26
,
трудно понять. Долго возился, не смог. Гугл не помог, синтакс тоже... Дайте пжлст, маааленький примерчик.
Вот, к примеру, при нажатии кнопки ПоискТФ процедура работает с условием
Если ((Найти(Расх.Телефон,Телефон_)>0)и(Расх.ПометкаУдаления()=0)) Тогда
Если ((Найти(Расх.Имя,Имя_)>0)и(Расх.ПометкаУдаления()=0)) Тогда
ZUBR @ Сегодня, 0:51
,
Добрый день! А если при выборке документов - эти все условия вставить, если конечно я правильно Вас понял
Если ((Найти(Расх.Телефон,Телефон_)>0)и(Расх.ПометкаУдаления()=0)) Тогда
ТЗ.НоваяСтрока();
...........................
ИначеЕсли ((Найти(Расх.Имя,Имя_)>0)и(Расх.ПометкаУдаления()=0)) Тогда
ТЗ.НоваяСтрока();
...........................
Я так зрозумів, що ця процедура визивається різними кнопками. Тому щоби знати якою кнопкою визвана процедура на кожній кнопці визиваємо приблизно так:
ПоискПТФ(1) -на першій кнопці
ПоискПТФ(2) - на другій кнопці
......
ПоискПТФ(НомерВызова)
Если НомерВызова=1 тогда
РеквизитСправочника=Расх.Имя;
РеквизитФормы=Имя_;
ИначеЕсли НомерВызова=2 тогда
РеквизитСправочника=Расх.Телефон;
РеквизитФормы=Телефон_;
Иначе..............
..........
КонецЕсли;
Если ((Найти(РеквизитСправочника,РеквизитФорми)>0)и(Расх.ПометкаУдаления()=0)) Тогда // замінити замість Вашої умови
Если параметры (телефон и имя) присуиствуют на форме, а условие меняется по кнопке, как вариант:
В кнопке пишете ПоискПТФ(0), во второй ПоискПТФ(1)
В процедуре:
ПоискПТФ(Парам)
Если Парам =0 Тогда // Имя
.....
Иначе // Телефон
.....
КонецЕсли
Типа так или воспользуйтесь советом Volodya1122 из предыдущего поста/
Pepe @ Сегодня, 13:32
,
1.Переносите на форму новый объект - "Флажок".
2.В свойствах объекта "Флажок" прописываете переменную -в поле Идентификатор.Например: ПоискПоТелефону.
3.В процедуре ниже пишете примерно следующее:
Расх = СоздатьОбъект("Документ.РасходнаяНакладная");
ТЗ = СоздатьОбъект ("ТаблицаЗначений");
Телефон_=СокрЛП(Телефон);
......................................................................
Пока Расх.ПолучитьДокумент()=1 Цикл
Если ПоискПоТелефону=1 //в элементе управления флажок Включена галочка - выбран поиск по телефону //
Если ((Найти(Расх.Телефон,Телефон_)>0)и(Расх.ПометкаУдаления()=0)) Тогда
КонецЕсли;
ИначеЕсли ////
Расх = СоздатьОбъект("Документ.РасходнаяНакладная");
Если ПоискПоТелефону=1 //в элементе управления флажок Включена галочка - выбран поиск по телефону
Расх.ВыбратьПоЗначению(НачДата,КонДата,"Телефон",Телефон_);
ИначеЕсли ПоискПоФамилии=1 //выбран 2-й флажок на форме
Расх.ВыбратьПоЗначению(НачДата,КонДата,"Имя",Имя_);
ИначеЕсли.... //3 условие
ИначеЕсли ... //4 условие
КонецЕсли...
volodya1122 @ Вчера, 9:59
,
дякую! Ще питання. А якщо в умові я хочу використати кілька реквізитів форми одночасно? Як їх назвати? РеквизитФормы1 не працює. Дякую!
ZUBR @ Сегодня, 1:30
,
Що значить не працює? Реквізит можете назвати хоч АбраКадабраАхалайМахалай.... це немає ніякого значення. Якщо на формі є такий реквізит то і в умові так само писати.
Я в прикладі нааписав змінну "РеквізитФорми" щоб в одній основній умові де йде перевірка, можна було використати різні реквізити форми (відповідно до нажатої кнопки).
Хоча я не зовсім зрозумів запитання що саме мається на увазі
Перем: ТЗ, МояПерем1, МояПерем2;
volodya1122 @ Вчера, 9:21
,
Мені треба в умові використати два реквізити форми. Якщо один я називаю РеквизитФормы, то як назвати другий?
Якщо другий я назву РеквизитФормы2, вискочить помилка
ZUBR @ Сегодня, 1:49
,
Зрозуміліше не стало від цього пояснення. Пропробую здогадатися.
І так і вас на формі обробки (чи де саме використовуєте даний код) є реквізити Имя_, Телефон, АдресаОбласть, АдресаНаселенийПункт, АдресаВулиця.
В залежності від нажатої кнопки потрібно зробити три різних пошуки.
1. по реквізиту форми Имя_
2. по реквізиту форми Телефон
3. одночасно по співпадінню зразу трьох реквізитів АдресаОбласть, АдресаНаселенийПункт, АдресаВулиця
Тоді потрібно ось так прописати
Если НомерВызова=1 тогда
РеквизитДокумента=Расх.Имя;
РеквизитФормы=Имя_;
ИначеЕсли НомерВызова=2 тогда
РеквизитДокумента=Расх.Телефон;
РеквизитФормы=Телефон_;
ИначеЕсли НомерВызова=3 тогда
РеквизитДокумента=Расх.АдресОбл+Расх.НасПункт+Расх.АдресВул;
РеквизитФормы=АдресаОбласть+АдресаНаселенийПункт+АдресаВулиця;
КонецЕсли;
Если ((Найти(РеквизитДокумента,РеквизитФормы)>0)и(Расх.ПометкаУдаления()=0)) Тогда // замінити замість Вашої умови
// РеквизитДокумента, РеквизитФормы придумані довільні
// відповідно у Вашому докумеенті РасходнаяНакладная повинні бути ці реквізити (або вони називаються по іншому) Телефон, Имя, АдресОбл, НасПункт , АдресВул
// або можливо це реквізити контрагента який є на формі документа. Поді відповідно буде Расх.Контрагент.АдресОбл , ..........
// можливо для рексвізитів в даному коді потрібно буде застосувати СокрЛП
Ще добавлю, можливо не зрозуміли.
РеквизитДокумента, РеквизитФормы на формі не потрібно розміщувати взагалі. вини існують тільки в межах даної процедури
Вам прямая дорога в Запросы. Вот там оптимизация будет заметна.
volodya1122 @ 19.08.20, 9:49
,
дуже дякую! Все вийшло.
РеквизитДокумента=Расх.АдресОбл+Расх.НасПункт+Расх.АдресВул;
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua