|   |   | 
| 
 | УФ Позиционирование при открытии формы выбора справочника с отбором | ☑ | ||
|---|---|---|---|---|
| 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 | 
        Как передаются параметры в управляемых формах
  В управляемых формах теперь есть возможность сразу передавать параметры при получении формы. Параметры передаются в виде структуры: Параметры = Новый Структура("ТекущееЗначение",ПоследнийЭлемент); ФормаВыбора = ПолучитьФорму("Справочник.Номенклатура.ФормаВыбора",Параметры); НайденыйЭлемент = ФормаВыбора.ОткрытьМодально(); Также у управляемой формы появились «расширения формы» (объект, справочник, документ, отчет). В зависимости от типа объекта определяется состав доступных параметров. Например, если в форме выбора справочника нужно позиционироваться на определенном элементе, то используется параметр «ТекущееЗначение». | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |