Имя: Пароль:
1C
1С v8
УФ Позиционирование при открытии формы выбора справочника с отбором
0 rikodroo
 
19.06.13
14:10
Привет! Есть 1с82 (8.2.16.368) Розница на УФ. На форме документа есть реквизит контрагент. Хочу, чтобы при выборе контрагента из формы этого документа нельзя было выбрать контрагента по списку условий.
Написал такой код:

&НаКлиенте
Процедура КонтрагентНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
   
   СтандартнаяОбработка = Ложь;
   
   СписокЗначений = Новый СписокЗначений;
   СписокЗначений.Добавить(ПредопределенноеЗначение("Перечисление.ПлВеденияВзаиморасчетовСКонтрагентами.НеВедутся"));
           
   ФормаВыбора = ПолучитьФорму("Справочник.Контрагенты.ФормаВыбора",,Элемент);
   ФормаВыбора.Список.Отбор.Элементы.Очистить();
   ЭлементОтбора = ФормаВыбора.Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));  
   ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("ВедениеВзаиморасчетов");
   ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.НеВСписке;
   ЭлементОтбора.Использование  = Истина;
   ЭлементОтбора.ПравоеЗначение = СписокЗначений;
   ФормаВыбора.Открыть();    
   
КонецПроцедуры

Отбор на форме выбора устанавливается нормально, но если в текущем документе контрагент который и по условиям отбора должен быть виден, то не происходит позиционирование на этом контрагенте. Подскажите, если кто знает как позиционироваться правильно на текущем контрагенте?


ПС. Еще заметил, что по умолчанию (если никаких настроек отборов не приделывать), при выборе контрагентов опять же из формы документа - позиционирование происходит только по элементам справочника, которые находятся в какой-либо группе, т.е. если в корне - то не позиционируется. Это так задумано?
1 olegves
 
19.06.13
14:35
(0) про получитьФорму в УФ забудь. Смотри в сторону ОткрытьФорму
для позиционирования используй параметр Ключ, кот. передается в ОткрытьФорму. Отбор также можно в параметры передать
2 rikodroo
 
19.06.13
14:38
(1)Ок. Написал так:


&НаКлиенте
Процедура КонтрагентНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
   
   СтандартнаяОбработка = Ложь;
   
   СписокЗначений = Новый СписокЗначений;
   СписокЗначений.Добавить(ПредопределенноеЗначение("Перечисление.ПлВеденияВзаиморасчетовСКонтрагентами.НеВедутся"));
   
   ПараметрыФормы = Новый Структура;
   ПараметрыФормы.Вставить("ЛевоеЗначение", "ВедениеВзаиморасчетов");    
   ПараметрыФормы.Вставить("ВидСравнения", ВидСравненияКомпоновкиДанных.НеВСписке);    
   ПараметрыФормы.Вставить("ПравоеЗначение", СписокЗначений);    
   ПараметрыФормы.Вставить("Использование", Истина);    
       
   ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", Новый Структура("мПараметрыОтбора", ПараметрыФормы), Элемент);
   
КонецПроцедуры

При создании формы выбора на сервере:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   
   Если Параметры.Свойство("мПараметрыОтбора") Тогда
                       
       Список.Отбор.Элементы.Очистить();
       ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));  
       ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных(Параметры.мПараметрыОтбора.ЛевоеЗначение);
       ЭлементОтбора.ВидСравнения   = Параметры.мПараметрыОтбора.ВидСравнения;
       ЭлементОтбора.Использование  = Параметры.мПараметрыОтбора.Использование;
       ЭлементОтбора.ПравоеЗначение = Параметры.мПараметрыОтбора.ПравоеЗначение;

   КонецЕсли;
   
КонецПроцедуры

Точно таже история - отбор устанавливается, а позиционирование - нет.
3 rikodroo
 
19.06.13
14:40
(1) а что за ключ?
4 rikodroo
 
19.06.13
15:14
ап
5 viktor_vv
 
19.06.13
15:33
Попробуй вариант

  СтандартнаяОбработка = Ложь;
   
   СписокЗначений = Новый СписокЗначений;
   СписокЗначений.Добавить(ПредопределенноеЗначение("Перечисление.ПлВеденияВзаиморасчетовСКонтрагентами.НеВедутся"));
           
   ФормаВыбора = ПолучитьФорму("Справочник.Контрагенты.ФормаВыбора",,Элемент);
   ФормаВыбора.Список.Отбор.Элементы.Очистить();
   ЭлементОтбора = ФормаВыбора.Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));  
   ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("ВедениеВзаиморасчетов");
   ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.НеВСписке;
   ЭлементОтбора.Использование  = Истина;
   ЭлементОтбора.ПравоеЗначение = СписокЗначений;
   ФормаВыбора.Открыть();    
ФормаВыбора.Элементы.Список.ТекущаяСтрока = ЭтаФорма.Контрагент ;

так-то позиционируется, единственно не знаю как с отбором будет, но думаю нормально.
6 viktor_vv
 
19.06.13
15:38
И в (2) ты ж и не позиционируешь.
В апартмеры передай контаргента и в форме

   Если Параметры.Свойство("мПараметрыОтбора") Тогда
                       
       Список.Отбор.Элементы.Очистить();
       ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));  
       ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных(Параметры.мПараметрыОтбора.ЛевоеЗначение);
       ЭлементОтбора.ВидСравнения   = Параметры.мПараметрыОтбора.ВидСравнения;
       ЭлементОтбора.Использование  = Параметры.мПараметрыОтбора.Использование;
       ЭлементОтбора.ПравоеЗначение = Параметры.мПараметрыОтбора.ПравоеЗначение;
// +++++++
Список.ТекущаяСтрока = Параметры.Свойство("ТекущийКонтагент") ;
   КонецЕсли;
7 rikodroo
 
19.06.13
15:43
(6) Спасибо. Попробую попозже.
8 viktor_vv
 
19.06.13
16:00
Там вернее

Если Параметры.Свойство("ТекущийКонтрагент") Тогда
     Список.ТекущаяСтрока = Параметры.ТекущийКонтрагент ;
   КонецЕсли;
9 rikodroo
 
19.06.13
18:56
(8) Оба способа работают. Хотя второй (там где ПриСозданииНаСервере - медленнее). Однако, если у контрагент лежит в корне, то на него позиционирование всеравно не происходит. Галочка Восстанавливать текущую строку на форме выбора - не помогает. Список на форме выбора - это динамический список. Может с этим связано?
10 viktor_vv
 
19.06.13
21:23
(9) Насчет второго не проверял, но первый проверил, и для варианта контрагента в корне нормально позиционируется.
11 viktor_vv
 
19.06.13
21:25
(9) А без отборов попробовать. Может все-таки отборы влияют.
12 rikodroo
 
19.06.13
21:32
(11) Дык я в (0) и писал, что без всяких отборов - ситуация таже. Но, блин, этоже неправильно.
Кстати, если установку через ТекущуйСтроку делать, то прям видно, что в момент открытия курсор спозиционирован правильно, а затем перескакивает вверх - сбивается, как буд-то сразу после обновления динамический список обновляется поновой.
13 banco
 
19.06.13
21:37
(12)  а зачем при создании на сервере устанавливать текущую строку? просто в параметрах формы отправь ТекущаяСтрока платформа сама установит курсор при открытии формы
14 MikhaDi4
 
19.06.13
21:46
(13) Поправьте меня, может я чего-то не понимаю. Я вроде этоже и делаю:

ПараметрыФормы = Новый Структура;
   ПараметрыФормы.Вставить("ЛевоеЗначение", "ВедениеВзаиморасчетов");    
   ПараметрыФормы.Вставить("ВидСравнения", ВидСравненияКомпоновкиДанных.НеВСписке);    
   ПараметрыФормы.Вставить("ПравоеЗначение", СписокЗначений);    
   ПараметрыФормы.Вставить("Использование", Истина);    
   
   ПараметрыФормы.Вставить("ТекКонтрагент", Объект.Контрагент);
   
   ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", Новый Структура("мПараметрыОтбора", ПараметрыФормы), Элемент);
   
   

Ну, а потом мне же как-то нужно отбор установить, ну и сразу тек.строку:

Список.Отбор.Элементы.Очистить();
       ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));  
       ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных(Параметры.мПараметрыОтбора.ЛевоеЗначение);
       ЭлементОтбора.ВидСравнения   = Параметры.мПараметрыОтбора.ВидСравнения;
       ЭлементОтбора.Использование  = Параметры.мПараметрыОтбора.Использование;
       ЭлементОтбора.ПравоеЗначение = Параметры.мПараметрыОтбора.ПравоеЗначение;
       
       Если Параметры.мПараметрыОтбора.Свойство("ТекКонтрагент") Тогда
           Элементы.Список.ТекущаяСтрока = Параметры.мПараметрыОтбора.ТекКонтрагент.Ссылка;
       КонецЕсли;
15 MikhaDi4
 
19.06.13
21:48
Таже история, что в (0)
16 banco
 
19.06.13
21:51
(14)  вместо ПараметрыФормы.Вставить("ТекКонтрагент", Объект.Контрагент) пиши ПараметрыФормы.Вставить("ТекущаяСтрока", Объект.Контрагент) и удали код
Если Параметры.мПараметрыОтбора.Свойство("ТекКонтрагент") Тогда
         Элементы.Список.ТекущаяСтрока = Параметры.мПараметрыОтбора.ТекКонтрагент.Ссылка;
КонецЕсли;
17 viktor_vv
 
19.06.13
21:59
(16)+1 И тогда уж


ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", Новый  ПараметрыФормы, Элемент);

ПараметрыФормы = Новый Структура;
ПараметрыОтбора = Новый Структура;
   ПараметрыОтбора.Вставить("ЛевоеЗначение", "ВедениеВзаиморасчетов");    
   ПараметрыОтбора.Вставить("ВидСравнения", ВидСравненияКомпоновкиДанных.НеВСписке);    
   ПараметрыОтбора.Вставить("ПравоеЗначение", СписокЗначений);    
   ПараметрыОтбора.Вставить("Использование", Истина);    
   
   ПараметрыФормы.Вставить("мПараметрыОтбора", ПараметрыОтбора);
   ПараметрыФормы.Вставить("ТекКонтрагент", Объект.Контрагент);
18 MikhaDi4
 
19.06.13
22:00
(16) таже борода. А на форме выбора точно не нужно устанавливать значение текущей строки? Или там еще какие настройки? Так он вообще не позиционируется, даже если элемент и в группе.
19 viktor_vv
 
19.06.13
22:00
(17)+ ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора",  ПараметрыФормы, Элемент);
20 viktor_vv
 
19.06.13
22:01
(18) Да нет, так тоже нормально работает. Ты лучше посмотри, может у тебя где в справочнике есть перепозиционирование.
21 banco
 
19.06.13
22:01
(18) вот прочитай, неплохая статья http://wiki.kint.ru/index.php/Параметры_управляемой_формы_1Cv82
22 banco
 
19.06.13
22:04
(18)  а у твоего динамического списка основная таблица хоть Справочник.Контрагенты?
23 MikhaDi4
 
19.06.13
22:05
(22) да конечно
24 MikhaDi4
 
19.06.13
22:07
Вот сейчас такие процедуры:

&НаКлиенте
Процедура КонтрагентНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
   
   СтандартнаяОбработка = Ложь;
   
   СписокЗначений = Новый СписокЗначений;
   СписокЗначений.Добавить(ПредопределенноеЗначение("Перечисление.ПлВеденияВзаиморасчетовСКонтрагентами.НеВедутся"));
           
   ПараметрыФормы = Новый Структура;
   ПараметрыОтбора = Новый Структура;
   
   ПараметрыОтбора.Вставить("ЛевоеЗначение", "ВедениеВзаиморасчетов");    
   ПараметрыОтбора.Вставить("ВидСравнения", ВидСравненияКомпоновкиДанных.НеВСписке);    
   ПараметрыОтбора.Вставить("ПравоеЗначение", СписокЗначений);    
   ПараметрыОтбора.Вставить("Использование", Истина);    
   
   ПараметрыФормы.Вставить("мПараметрыОтбора", ПараметрыОтбора);
   ПараметрыФормы.Вставить("ТекКонтрагент", Объект.Контрагент);
   ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора",  ПараметрыФормы, Элемент);
       
КонецПроцедуры


и


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   
   Если Параметры.Свойство("мПараметрыОтбора") Тогда
                       
       Список.Отбор.Элементы.Очистить();
       ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));  
       ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных(Параметры.мПараметрыОтбора.ЛевоеЗначение);
       ЭлементОтбора.ВидСравнения   = Параметры.мПараметрыОтбора.ВидСравнения;
       ЭлементОтбора.Использование  = Параметры.мПараметрыОтбора.Использование;
       ЭлементОтбора.ПравоеЗначение = Параметры.мПараметрыОтбора.ПравоеЗначение;
       
               
   КонецЕсли;
   
КонецПроцедуры
25 MikhaDi4
 
19.06.13
22:08
+(24) и вообще позиционирования нет
26 MikhaDi4
 
19.06.13
22:10
(20) там в модуле формы выбора вообще ничего больше нет
27 MikhaDi4
 
19.06.13
22:23
Блин, в (24) должна быть строка
ПараметрыФормы.Вставить("ТекущаяСтрока", Объект.Контрагент);

Но, один фиг, если элемент лежит в корне - не позиционируется.
28 zladenuw
 
19.06.13
22:43
Как передаются параметры в управляемых формах
В управляемых формах теперь есть возможность сразу передавать параметры при получении формы. Параметры передаются в виде структуры:

Параметры = Новый Структура("ТекущееЗначение",ПоследнийЭлемент);
ФормаВыбора = ПолучитьФорму("Справочник.Номенклатура.ФормаВыбора",Параметры);
НайденыйЭлемент = ФормаВыбора.ОткрытьМодально();
Также у управляемой формы появились «расширения формы» (объект, справочник, документ, отчет). В зависимости от типа объекта определяется состав доступных параметров.  Например, если в форме выбора справочника нужно позиционироваться на определенном элементе, то используется параметр «ТекущееЗначение».