Как связать обработку с формой списка справочника

Тема в разделе "1C и всё что с ней связано", создана пользователем Timzi, 25 фев 2008.

  1. Timzi

    Timzi Гость

    Добрый день!

    Программирую в 1С 7.7: Бухгалтерия.
    Столкнулся с одной задачкой с которой никак не могу справится. Подскажите возможно ли вообще сделать, то что я хочу.

    Итак.
    Есть стправочник "Туристы", в форме списка справочника хочу сделать кнопку "Поиск", которая вызывает НЕ модально некую обработку "Обработка.Поиск", в свою очередь мы задаём параметры в обработке по которым ищем туристов и в конце концов в форме списка справочника остаются только найденные. А после того как закрыл обработку все туристы в справочнике возвращаются на место. Это то, что я хочу сделать. Последнее (возврат всех в справочник после закрытия обработки) не обязательно, но очень хотелось бы.
    Вот код в форме списка справочника:
    Код (Text):
    Процедура Поиск()
    глСписокТуристов = ""; //Глобальная переменная
    ОткрытьФорму("Обработка.Поиск");
    Если ПустоеЗначение(глСписокТуристов) = 1 Тогда
    ИспользоватьСписокЭлементов();  
    Иначе
    ИспользоватьСписокЭлементов(глСписокТуристов);
    КонецЕсли;
    КонецПроцедуры //Поиск
    Если обработка открывается НЕ МОДАЛЬНО, то в модуле формы списка команда ИспользоватьСписокЭлементов(глСписокТуристов); проскакивает не меняя общую картину списка (глСписокТуристов будет всегда пуст).
    Если обработка открывается МОДАЛЬНО, то команда ИспользоватьСписокЭлементов(глСписокТуристов); отрабатывается, но работать со списком найденных туристов нельзя пока не закроешь обработку. После закрытия остаются только найденные туристы и тогда надо придумать как вернуть полный список без особых извращений. Я конечно могу сделать вторую кнопку, которая возвращает всех на место (ИМХО извращение), могу сделать кнопку "Поиск", которая после нахождения и вывода туристов поменяет надпись на "Сброс" и при повторном нажатии вернёт как было (ИМХО тоже извращение, но это последний вариант). Есть у меня ещё и другие варианты, но хочу осуществить тот который я описал в самом начале.
    Итог.
    У меня не получается управлять списком элементов из обработки, т.к. ИспользоватьСписокЭлементов(); может использоваться только в модуле формы списка справочника. Подскажите, всё таки можно ли как-нибудь управлять списком элементов из обработки?
     
  2. Zab

    Zab Well-Known Member
    1C Team

    Регистрация:
    7 авг 2006
    Сообщения:
    583
    Симпатии:
    0
    Идеальный вариант решения твоей проблемы - размещение элементов управления поиском на форме списка справочника, чисто, красиво, и форма списка справочника не будет закрывать форму обработки с настройкой отбора.
    Можно, конечно, и так, как хочешь ты, но это будет через задницу. На этот случай даю наводку: обработка устанавливает глСписокЭлементов, если он пустой. Метод ОткрытьФорму(<ОписательОбъекта>,<КонтекстФормы>)
    возвращает в <КонтекстФормы> контекст открытой формы и пока форма открыта, тип его значения равен 100, когда закрыта - 0." Т.е. в форме справочника тебе надо будет постоянно проверять глСписокЭлементов на наличие в нем данных и равенство ТипЗначения(КонтекстФормы)=100 если условия выполняются, ставить отбор и очищать список. Все. Да, чтобы какая-то Функция отрабатывала постоянно "в фоне" работала, пропиши ее в "действия" какого-нибудь текстового реквизита.
    Вроде все, будут вопросы - пиши
     
  3. Timzi

    Timzi Гость

    Это как?
    Предположим мне надо отобрать всех людей 1983 года рождения с именем "Илья" и фамилия начинается на букву "Р".
    Не думаю, что я сильно перегнул палку с таким запросом, т.к. менеджеры работают с большим количеством разных людей и всё о каждом не неупомнишь, могут остаться отрывочные воспоминания по которым надо найти человека. А можно добавить ещё с десяток какие-нибудь параметров: телефоны, место проживания, паспорт и т.д. Дополнительно форму поиска в форме списка помещать не имеет смысла (сильно загружена будет)....
    Хотя, как вариант, можно изменить форму списка и при нажатии кнопки "Поиск" скрыть таблицу, кнопки, дерево папок, на время ввода параметров, а потом отобразить. Хороший вариант, но зюзють не по душе.
    С функцией работать можно, но что она сделает полезного? Покажет количество найденых элементов? Я её конечно буду использовать в обработке, но на список она ведь повлиять не может. Или может?
    Ещё более простой и очень действенный вариант - это сделать в обработке таблицу подобную списку в справочнике и работать с ней, но хочу узнать на сколько возможно связать список с обработкой по моим условиям. Согласись достаточно интересно и нужно, то что я задумал :blink:
    Мне на другом форуме идейку подкинули. Сегодня проверю. Отпишусь.
     
  4. Zab

    Zab Well-Known Member
    1C Team

    Регистрация:
    7 авг 2006
    Сообщения:
    583
    Симпатии:
    0
    Блин, если ты внимательно прочитаешь, что я тебе написал в предыдущем посте, то поймешь, что там описан механизм, с помощью которого твою проблему решать с внешней обработкой. Не идейка, а почти пошаговая инструкция. Функция, отдельная, нужна потому, что надо ждать пока пока пользователь установит твои отборы. Именно она должна ставить фильтры, а не процедура вызываемая по кнопке. В этом и есть твоя проблема, удачи.
     
  5. Timzi

    Timzi Гость

    Перечитал. Попробую понять что ты имел ввиду и сделать. О результатах напишу. У меня уже появилось решение этой задачки:
    Код в модуле списка:
    Код (Text):
    Процедура Поиск()
    ОткрытьФорму("Обработка.Поиск",Контекст);
    КонецПроцедуры //Поиск
    Код в обработке:
    Код (Text):
    Процедура Поиск()        
    СписокТуристов = СоздатьОбъект("СписокЗначений");

    {Нужный нам алгоритм, заполняющий СписокТуристов}

    Форма.Параметр.ИспользоватьСписокЭлементов(СписокТуристов);
    КонецПроцедуры //Поиск
    //*******************************************
    Процедура ПриЗакрытии()
    Форма.Параметр.ИспользоватьСписокЭлементов();
    КонецПроцедуры //ПриЗакрытии
    Всё вроде срабатывает, но косяк в том, что визуально не обновляяется список элементов. А когда тыкаешь по этому списку, то они по одному обновляются.
    Пришлось из....ся, добавил в обработку несколько строк:
    Код (Text):
    Процедура Поиск()        
    СписокТуристов = СоздатьОбъект("СписокЗначений");

    {Нужный нам алгоритм, заполняющий СписокТуристов}

    Форма.Параметр.ИспользоватьСписокЭлементов(СписокТуристов);
    сортир = Форма.Параметр.Сортировка(,);
    Форма.Параметр.Сортировка(сортир,1);
    КонецПроцедуры //Поиск
    //*******************************************
    Процедура ПриЗакрытии()
    Форма.Параметр.ИспользоватьСписокЭлементов();
    сортир = Форма.Параметр.Сортировка(,);
    Форма.Параметр.Сортировка(сортир,1);
    КонецПроцедуры //ПриЗакрытии
    И всё замечательно работает!!!
     
  6. Zab

    Zab Well-Known Member
    1C Team

    Регистрация:
    7 авг 2006
    Сообщения:
    583
    Симпатии:
    0
    Можешь попробовать без извращений, сделать Форма.Обновить();
     
  7. Timzi

    Timzi Гость

    Тогда уж Форма.Параметр.Обновить(). Думаю, что не сработает.
    Уже поздно. Завтра проверю всё.
     
  8. Timzi

    Timzi Гость

    Проверил разные варианты. Рабочий оказался один: заменить в коде выше две строки с сортировкой на одну строку Форма.Параметр.Форма.Обновить().
    Этот вариант, к сожалению, работает не корректно. Функция привязанная к текстовому элементу отрабатывает только тогда, когда я что-то меняю или выделяю в списке. После того как я задал параметры поиска и нашёл кого надо, окно в списке не обновляется, мне надо в него тыкнуть, чтобы увидеть результат. А так как обработку я вызываю через ОткрытьФорму("Обработка.Поиск",КонтекстОбработкиПоиск);, а не ОткрытьФорму("Обработка.Поиск",Контекст);, то доступ к списку из обработки через Форма.Параметр уже закрыт и обновить его из обработки я не могу.
    (может я что-то не так сделал... но я перечитывал твой пост не один десяток раз и сделал всё до буквы, что ты написал и даже больше)

    Идея была хороша! Спасибо! Много нового узнал в очередной раз пытая 1С, в частности как проверять закрыта вызванная форма или нет.
    Теперь думаю возможно ли из списка определить открыта обработка или нет? Чтобы не было конфликтов при разном порядке закрытия списка и обработки.
     
  9. Zab

    Zab Well-Known Member
    1C Team

    Регистрация:
    7 авг 2006
    Сообщения:
    583
    Симпатии:
    0
    Текстовое поле вызовет свою функцию еще и в том случае, если вызвать нашу многострадальную Форма.Обновить().
    не совсем понял... по идее, после вызова немодальной формы, у тебя происходит параллельное выполнение двух участков кода. В списке продолжается работа после метода открытия формы, и там значение второго параметра принимает контекст формы обработки. А в самой обработке через Форма.Параметр ты можешь получить что угодно, вплоть до списка значений, в котором можешь передать и контекст формы списка, и еще что надо.
     
  10. Timzi

    Timzi Гость

    Пробовал. Не помогает.
    Если ставлю Форма.Обновить() в обработке, то на форму списка она не влияет,
    если ставлю в форме списка, то 1С-ка тупит (Форма.Обновить() постоянно запускает нашу функцию привязанную к текстовому элементу ...замкнутый круг).
    Вот в том то и дело, что если я в форме списка ставлю ОткрытьФорму("Обработка.Поиск",Контекст); то в обработку передаются переменные списка,
    но если ставлю ОткрытьФорму("Обработка.Поиск",КакаяНибудьПеременнаяОтличнаяОтКонтекст); то в форму списка ВОЗВРАЩАЮТСЯ переменные (т.е. значения элементов и ещё какие-то переменные) обработки. В отладчике в обработке Форма.Параметр видится как Форма.Параметр= а не +Форма.Параметр=, т.е. в обработку ничего не передаётся. Об этом я тоже узнал из экспериментов. В этом направлении больше эксперементировать не буду, время жалко.
    Твой вариант мне понравился, в нём есть свои плюсы. Но он оказался, честно говоря, плохим. Потому что время которое я потратил на его проверку и отладку в большинстве своём ушло на исправление косяков связанных с осуществлением этого метода из-за особенностей 1С-ки. Приходилось исправлять косяки, как говорится, через задницу. Пришлось вводить разные контрольные переменные, проверять их значения и в модуле списка, и в обработке, присваивать какое-то значение одной из них при открытии обработки и т.п.. Короче геморой. Иначе список работал не корректно и тупила 1С-ка.
     
  11. Zab

    Zab Well-Known Member
    1C Team

    Регистрация:
    7 авг 2006
    Сообщения:
    583
    Симпатии:
    0
    Я предупреждал. Реализовать можно, но будет геморой. Глянь в начало треда, и сделай фильтры прямо в форме спика. А опыт еще никому не мешал. Удачи в познании нового.
     
Загрузка...

Поделиться этой страницей