• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

  • Автор темы Timzi
  • Дата начала
T

Timzi

Добрый день!

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

Итак.
Есть стправочник "Туристы", в форме списка справочника хочу сделать кнопку "Поиск", которая вызывает НЕ модально некую обработку "Обработка.Поиск", в свою очередь мы задаём параметры в обработке по которым ищем туристов и в конце концов в форме списка справочника остаются только найденные. А после того как закрыл обработку все туристы в справочнике возвращаются на место. Это то, что я хочу сделать. Последнее (возврат всех в справочник после закрытия обработки) не обязательно, но очень хотелось бы.
Вот код в форме списка справочника:
Код:
Процедура Поиск() 
глСписокТуристов = ""; //Глобальная переменная
ОткрытьФорму("Обработка.Поиск"); 
Если ПустоеЗначение(глСписокТуристов) = 1 Тогда 
ИспользоватьСписокЭлементов();  
Иначе
ИспользоватьСписокЭлементов(глСписокТуристов); 
КонецЕсли;
КонецПроцедуры //Поиск

Если обработка открывается НЕ МОДАЛЬНО, то в модуле формы списка команда ИспользоватьСписокЭлементов(глСписокТуристов); проскакивает не меняя общую картину списка (глСписокТуристов будет всегда пуст).
Если обработка открывается МОДАЛЬНО, то команда ИспользоватьСписокЭлементов(глСписокТуристов); отрабатывается, но работать со списком найденных туристов нельзя пока не закроешь обработку. После закрытия остаются только найденные туристы и тогда надо придумать как вернуть полный список без особых извращений. Я конечно могу сделать вторую кнопку, которая возвращает всех на место (ИМХО извращение), могу сделать кнопку "Поиск", которая после нахождения и вывода туристов поменяет надпись на "Сброс" и при повторном нажатии вернёт как было (ИМХО тоже извращение, но это последний вариант). Есть у меня ещё и другие варианты, но хочу осуществить тот который я описал в самом начале.
Итог.
У меня не получается управлять списком элементов из обработки, т.к. ИспользоватьСписокЭлементов(); может использоваться только в модуле формы списка справочника. Подскажите, всё таки можно ли как-нибудь управлять списком элементов из обработки?
 
Z

Zab

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

Timzi

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

Zab

Блин, если ты внимательно прочитаешь, что я тебе написал в предыдущем посте, то поймешь, что там описан механизм, с помощью которого твою проблему решать с внешней обработкой. Не идейка, а почти пошаговая инструкция. Функция, отдельная, нужна потому, что надо ждать пока пока пользователь установит твои отборы. Именно она должна ставить фильтры, а не процедура вызываемая по кнопке. В этом и есть твоя проблема, удачи.
 
T

Timzi

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

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

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

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

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

Zab

Можешь попробовать без извращений, сделать Форма.Обновить();
 
T

Timzi

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

Timzi

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

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

Zab

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

Timzi

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

Zab

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!