Версия для печати темы (https://pro1c.org.ua/index.php?s=f26cdbaec07dae049fc3e948337bfa54&showtopic=60963)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 7.7 _ Как использовать один и тот же программный блок с небольшими изменениями несколько раз? 1с 7.7 конф 7.7.00

Автор: ZUBR 16.08.20, 17:28

Можно ли оптимизировать программу?
У меня есть примерно следующий программный блок

Процедура ПоискПТФ()
Расх = СоздатьОбъект("Документ.РасходнаяНакладная");
    ТЗ = СоздатьОбъект ("ТаблицаЗначений");    
    Телефон_=СокрЛП(Телефон);
    ......................................................................
Пока Расх.ПолучитьДокумент()=1 Цикл
                Если ((Найти(Расх.Телефон,Телефон_)>0)и(Расх.ПометкаУдаления()=0)) Тогда
.................................................................................
    ТЗ.НоваяКолонка("Модель");
    ТЗ.НоваяКолонка("СерийныйНомер");    
    ...........................................................................
....................................................................................
    Расх.ВыбратьДокументы(НачДата,КонДата);
    Если ШД=0 Тогда
        Если ДТ=0 Тогда                                                                                                        
            Пока Расх.ПолучитьДокумент()=1 Цикл
                Если ((Найти(Расх.Телефон,Телефон_)>0)и(Расх.ПометкаУдаления()=0)) Тогда
                                        ТЗ.НоваяСтрока();
                    ТЗ.Модель = Расх.Модель;
                    ТЗ.СерийныйНомер = Расх.СерийныйНомер;
                    ТЗ.Телефон = Расх.Телефон;
                    ТЗ.Контрагент=Расх.Контрагент;  
                    ТЗ.ДопТелефон = Расх.ДопТелефон;
......................................................................................................................
......................................................................................................................
КонецПроцедуры


Затем мне нужно с этих же документов сделать выборку по другому условию. Например
Если ((Найти(Расх.Имя,Имя_)>0)и(Расх.ПометкаУдаления()=0)) Тогда


И далее все то же самое.
И так 4 раза по разным условиям.

Сейчас я пишу 4 почти одинаковых процедуры, которые идут одна за другой в модуле отчета.
Вопрос.
Как сделать так, чтобы процедура была одна, а программно менялись только условия в зависимости от нажатой кнопки в диалоге? Или, хотя бы, как сделать так, чтобы таблица значений и другие созданные объекты в одной процедуре, были видны в других процедурах? В пределах модуля.
Или это невозможно?
Спасибо!



Автор: Pepe 16.08.20, 19:26

Вызывайте процедуру передавая параметры.
Процедура ПоискПТФ() на типа Процедура ПоискПТФ(РасхНакл,Имя,Удаление)
В самой процедуре анализируете передаваемые параметры и выполняете.

Автор: ZUBR 16.08.20, 23:51

Pepe @ Сегодня, 20:26 * ,
трудно понять. Долго возился, не смог. Гугл не помог, синтакс тоже... Дайте пжлст, маааленький примерчик.
Вот, к примеру, при нажатии кнопки ПоискТФ процедура работает с условием

Если ((Найти(Расх.Телефон,Телефон_)>0)и(Расх.ПометкаУдаления()=0)) Тогда

А при нажатии кнопки ПоискИмя процедура работает с условием
Если ((Найти(Расх.Имя,Имя_)>0)и(Расх.ПометкаУдаления()=0)) Тогда

Как и какие параметры указывать и где объявлять?
Спасибо!!!

Автор: denis84 17.08.20, 8:31

ZUBR @ Сегодня, 0:51 * ,
Добрый день! А если при выборке документов - эти все условия вставить, если конечно я правильно Вас понял

Если ((Найти(Расх.Телефон,Телефон_)>0)и(Расх.ПометкаУдаления()=0)) Тогда
ТЗ.НоваяСтрока();
...........................
ИначеЕсли ((Найти(Расх.Имя,Имя_)>0)и(Расх.ПометкаУдаления()=0)) Тогда
ТЗ.НоваяСтрока();
...........................

И так далее.
Или на форме отчета сделать переключатель "почем осуществлять поиск" сделать и все это писать в ТЗ

Автор: volodya1122 17.08.20, 8:59

Я так зрозумів, що ця процедура визивається різними кнопками. Тому щоби знати якою кнопкою визвана процедура на кожній кнопці визиваємо приблизно так:

ПоискПТФ(1) -на першій кнопці
ПоискПТФ(2) - на другій кнопці
......


В самому модулі навзву процедури пишемо так;
ПоискПТФ(НомерВызова)

І в тексті процедури, перед Вашою умовою пишем
Если НомерВызова=1 тогда
РеквизитСправочника=Расх.Имя;
РеквизитФормы=Имя_;
ИначеЕсли НомерВызова=2 тогда
РеквизитСправочника=Расх.Телефон;
РеквизитФормы=Телефон_;
Иначе..............
..........
КонецЕсли;

Если ((Найти(РеквизитСправочника,РеквизитФорми)>0)и(Расх.ПометкаУдаления()=0)) Тогда  // замінити замість Вашої умови

Автор: Pepe 17.08.20, 10:32

Если параметры (телефон и имя) присуиствуют на форме, а условие меняется по кнопке, как вариант:
В кнопке пишете ПоискПТФ(0), во второй ПоискПТФ(1)
В процедуре:
ПоискПТФ(Парам)
Если Парам =0 Тогда // Имя
.....
Иначе // Телефон
.....
КонецЕсли
Типа так или воспользуйтесь советом Volodya1122 из предыдущего поста/

Автор: andrew76 17.08.20, 18:30

Pepe @ Сегодня, 13:32 * ,

1.Переносите на форму новый объект - "Флажок".
2.В свойствах объекта "Флажок" прописываете переменную -в поле Идентификатор.Например: ПоискПоТелефону.
3.В процедуре ниже пишете примерно следующее:

Расх = СоздатьОбъект("Документ.РасходнаяНакладная");
    ТЗ = СоздатьОбъект ("ТаблицаЗначений");    
    Телефон_=СокрЛП(Телефон);
    ......................................................................
Пока Расх.ПолучитьДокумент()=1 Цикл
                
Если ПоискПоТелефону=1  //в элементе управления флажок Включена галочка - выбран поиск по телефону //
       Если ((Найти(Расх.Телефон,Телефон_)>0)и(Расх.ПометкаУдаления()=0)) Тогда
      
       КонецЕсли;

ИначеЕсли ////


если еще 3 варианта поиска, то надо сделать как в пунктах 1,2 ,только меняйте имя переменных:
ПоискПоФамилии,поискПоПриметам и т.д.
и в процедуре добавляете условия,если выставлены флажки.


КонецЕсли;
..............................................................................
ТЗ.НоваяКолонка("Модель");
ТЗ.НоваяКолонка("СерийныйНомер");


Не видя всей процедуры,сложно посоветовать оптимальное решение.
Можно было бы попробовать отборами отобрать доки.
Такой вот псевдокод:

Расх = СоздатьОбъект("Документ.РасходнаяНакладная");

Если ПоискПоТелефону=1  //в элементе управления флажок Включена галочка - выбран поиск по телефону
       Расх.ВыбратьПоЗначению(НачДата,КонДата,"Телефон",Телефон_);
ИначеЕсли ПоискПоФамилии=1 //выбран 2-й флажок на форме
       Расх.ВыбратьПоЗначению(НачДата,КонДата,"Имя",Имя_);
ИначеЕсли.... //3 условие

ИначеЕсли ... //4 условие

КонецЕсли...

Автор: ZUBR 18.08.20, 0:30

volodya1122 @ Вчера, 9:59 * ,
дякую! Ще питання. А якщо в умові я хочу використати кілька реквізитів форми одночасно? Як їх назвати? РеквизитФормы1 не працює. Дякую!

Автор: volodya1122 18.08.20, 8:21

ZUBR @ Сегодня, 1:30 * ,
Що значить не працює? Реквізит можете назвати хоч АбраКадабраАхалайМахалай.... це немає ніякого значення. Якщо на формі є такий реквізит то і в умові так само писати.
Я в прикладі нааписав змінну "РеквізитФорми" щоб в одній основній умові де йде перевірка, можна було використати різні реквізити форми (відповідно до нажатої кнопки).

Хоча я не зовсім зрозумів запитання що саме мається на увазі

Автор: volodya1122 18.08.20, 9:28

Цитата(ZUBR @ 16.08.20, 18:28) *
Или, хотя бы, как сделать так, чтобы таблица значений и другие созданные объекты в одной процедуре, были видны в других процедурах?

Це робиться досить просто.
в самому верху модуля (до всіх процедур) робиться обявлення всіх реквізитів які повинні бути доступні у всіх процедурах і функціях даного модуля:
Перем: ТЗ, МояПерем1, МояПерем2;

Автор: ZUBR 19.08.20, 0:49

volodya1122 @ Вчера, 9:21 * ,
Мені треба в умові використати два реквізити форми. Якщо один я називаю РеквизитФормы, то як назвати другий?
Якщо другий я назву РеквизитФормы2, вискочить помилка

Автор: volodya1122 19.08.20, 8:49

ZUBR @ Сегодня, 1:49 * ,
Зрозуміліше не стало від цього пояснення. Пропробую здогадатися.
І так і вас на формі обробки (чи де саме використовуєте даний код) є реквізити Имя_, Телефон, АдресаОбласть, АдресаНаселенийПункт, АдресаВулиця.
В залежності від нажатої кнопки потрібно зробити три різних пошуки.
1. по реквізиту форми Имя_
2. по реквізиту форми Телефон
3. одночасно по співпадінню зразу трьох реквізитів АдресаОбласть, АдресаНаселенийПункт, АдресаВулиця
Тоді потрібно ось так прописати

Если НомерВызова=1 тогда
РеквизитДокумента=Расх.Имя;
РеквизитФормы=Имя_;
ИначеЕсли НомерВызова=2 тогда
РеквизитДокумента=Расх.Телефон;
РеквизитФормы=Телефон_;
ИначеЕсли НомерВызова=3 тогда
РеквизитДокумента=Расх.АдресОбл+Расх.НасПункт+Расх.АдресВул;
РеквизитФормы=АдресаОбласть+АдресаНаселенийПункт+АдресаВулиця;
КонецЕсли;

Если ((Найти(РеквизитДокумента,РеквизитФормы)>0)и(Расх.ПометкаУдаления()=0)) Тогда  // замінити замість Вашої умови
// РеквизитДокумента, РеквизитФормы придумані довільні
// відповідно у Вашому докумеенті РасходнаяНакладная повинні бути ці реквізити (або вони називаються по іншому) Телефон, Имя, АдресОбл, НасПункт , АдресВул
// або можливо це реквізити контрагента який є на формі документа. Поді відповідно буде Расх.Контрагент.АдресОбл , ..........
// можливо для рексвізитів в даному коді потрібно буде застосувати СокрЛП


Автор: volodya1122 19.08.20, 10:39

Ще добавлю, можливо не зрозуміли.
РеквизитДокумента, РеквизитФормы на формі не потрібно розміщувати взагалі. вини існують тільки в межах даної процедури

Автор: Naghual 19.08.20, 11:45

Вам прямая дорога в Запросы. Вот там оптимизация будет заметна.

Автор: ZUBR 23.08.20, 11:18

volodya1122 @ 19.08.20, 9:49 * ,
дуже дякую! Все вийшло.

РеквизитДокумента=Расх.АдресОбл+Расх.НасПункт+Расх.АдресВул;

Це якраз те, що мені треба було! icon_beer17.gif

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua