Имя: Пароль:
1C
1С v8
v8: УФ, список выбора
, ,
0 ЧтоТакое1С
 
23.08.11
11:13
доброго времени суток.
подскажите как проще реализовать такую управляемую форму:

Есть 2 справочника КонфигурацииКонтрагентов и его владелец справочник Контрагенты. Про выборе контрагента должен формироваться список выбора с конфигурациями этого контрагента, а при выборе конфигурации должен отображаться ее регистрационный номер который хранится так же в справочнике КонфигурацииКонтрагентов.
1 ЧтоТакое1С
 
23.08.11
11:36
ап
2 ЧтоТакое1С
 
23.08.11
12:05
Как из запроса формировать список выбора в УФ??
3 Cube
 
23.08.11
12:07
(2) А как не в УФ знаешь? Вот в УФ также.
4 ЧтоТакое1С
 
23.08.11
12:11
Колонка = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Конфигурация");
Список.ЗагрузитьЗначения(Колонка);
ЭлементыФормы.ПолеВыбора.СписокВыбора = Список;

я так делаю, в уф так не фунциклирует
5 ЧтоТакое1С
 
23.08.11
12:12
в уф вообще нет элемента СписокВыбора
6 Cube
 
23.08.11
12:16
(5) Правильно, нет. А ты посмотри обработку события поля ввода "Начало выбора" - что там за параметр "ДанныеВыбора"?... :)
7 jump if zero
 
23.08.11
12:35
&НаСервере
Процедура ПолучитьДоговоры()
   
   Выборка=  Справочники.Договоры.Выбрать(,Контрагент);
   Элементы.Договор.СписокВыбора.Очистить();
   Пока Выборка.Следующий() Цикл
Элементы.Договор.СписокВыбора.Добавить(Выборка.ссылка);
   КонецЦикла;
КонецПроцедуры
8 Cube
 
23.08.11
12:36
(7) А на клиенте?)
9 jump if zero
 
23.08.11
12:38
&НаКлиенте
Процедура ДоговорНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
   
    ПолучитьДоговоры();
КонецПроцедуры
10 jump if zero
 
23.08.11
12:40
в смысле заполнить СписокВыбора без вызова сервера ?
11 Cube
 
23.08.11
12:43
(10) Да)
Я тебе подскажу: смотри (7), потом (9), потом (6). :)
12 ЧтоТакое1С
 
23.08.11
12:52
&НаКлиенте
Процедура КонфигурацияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка, ТекущийКонтрагент)
   ТекущийКонтрагент = ЭтаФорма.Элементы.Контрагент;
   КонфигурацияНачалоВыбораСервер(Элемент, ДанныеВыбора, СтандартнаяОбработка, ТекущийКонтрагент)
   
КонецПроцедуры

&НаСервере
Функция КонфигурацияНачалоВыбораСервер(Элемент, ДанныеВыбора, СтандартнаяОбработка, ТекущийКонтрагент)
   СписокКонф = Новый СписокЗначений;
   
   ЗапросКонф = Новый Запрос;
   ЗапросКонф.Текст =
   "ВЫБРАТЬ
   |    КонфигурацииКонтрагентов.Владелец.Ссылка,
   |    КонфигурацииКонтрагентов.Конфигурация.Ссылка
   |ИЗ
   |    Справочник.КонфигурацииКонтрагентов КАК КонфигурацииКонтрагентов
   |ГДЕ
   |    КонфигурацииКонтрагентов.Владелец.Ссылка = &ТК";
   
   ЗапросКонф.УстановитьПараметр("ТК", ТекущийКонтрагент);
   КолонкаКонф = ЗапросКонф.Выполнить().Выгрузить().ВыгрузитьКолонку("Конфигурация");
   СписокКонф.ЗагрузитьЗначения(КолонкаКонф);
   Возврат СписокКонф;
КонецФункции

Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.

что не так?
13 Cube
 
23.08.11
12:53
(12) Блин)) Я для кого (6) написал?) Иди в синтаксис-помощнике посмотри, что за параметр "ДанныеВыбора"...
14 ЧтоТакое1С
 
23.08.11
12:57
(13) Данные Выбора нет в синтаксис помошнике)
15 Cube
 
23.08.11
13:06
(14) Дарю свой СП (бесплатно) :)

Расширение поля формы для поля ввода (Form field extension for a text box)
НачалоВыбора (StartChoice)
Синтаксис:

НачалоВыбора(<ДанныеВыбора>, <СтандартнаяОбработка>)
Параметры:

<ДанныеВыбора>

Тип: СписокЗначений. В обработчике можно сформировать и передать в этом параметре данные для выбора. При этом параметр <СтандартнаяОбработка> должен быть установлен в Ложь.
Значение по умолчанию: Неопределено
<СтандартнаяОбработка>

Тип: Булево. В данный параметр передается признак выполнения стандартной (системной) обработки события. Если в теле процедуры-обработчика установить данному параметру значение Ложь, стандартная обработка события производиться не будет.
Значение по умолчанию: Истина
Описание:

Возникает в момент нажатия кнопки выбора или клавиши F4.
Примечание:

В обработчике данного события нельзя использовать серверные методы формы с директивой компиляции &НаСервере.
16 ЧтоТакое1С
 
23.08.11
13:10
&НаКлиенте
Процедура КонфигурацияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка, ТекущийКонтрагент)
   ТекущийКонтрагент = ЭтаФорма.Элементы.Контрагент;
   СтандартнаяОбработка = ЛОЖЬ;
   ДанныеВыбора = КонфигурацияНачалоВыбораСервер(Элемент, ДанныеВыбора, СтандартнаяОбработка, ТекущийКонтрагент)
   КонецПроцедуры

так?
17 ЧтоТакое1С
 
23.08.11
13:13
(16) не работает.

В обработчике данного события нельзя использовать серверные методы формы с директивой компиляции &НаСервере. а где взять тогда ДанныеВыбора?
18 Cube
 
23.08.11
13:13
(16) О госпади... :)
Пожалуй, напишу за тебя:

&НаКлиенте
Процедура КонфигурацияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка, ТекущийКонтрагент)

   СтандартнаяОбработка = ЛОЖЬ;
   ДанныеВыбора = Новый СписокЗначений;
   ДанныеВыбора.Добавить("Значение1");
   ДанныеВыбора.Добавить("Значение2");

КонецПроцедуры
19 Cube
 
23.08.11
13:14
+(18) Точнее, так:

&НаКлиенте
Процедура КонфигурацияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

   СтандартнаяОбработка = ЛОЖЬ;
   ДанныеВыбора = Новый СписокЗначений;
   ДанныеВыбора.Добавить("Значение1");
   ДанныеВыбора.Добавить("Значение2");

КонецПроцедуры
20 ЧтоТакое1С
 
23.08.11
14:51
значения из запроса браться должны..
21 ЧтоТакое1С
 
23.08.11
15:23
&НаКлиенте
Процедура КонфигурацияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
   ТекущийКонтрагент = ЭтаФорма.Элементы.Контрагент;
   ДанныеВыбора = Новый СписокЗначений;
   СтандартнаяОбработка = ЛОЖЬ;
   Массив = КонфигурациПолучить(ТекущийКонтрагент);
   а = Массив.Количество();
   Для б = 0 по а - 1 Цикл
       ДанныеВыбора.Добавить(Массив [б]);
   КонецЦикла;
КонецПроцедуры

&НаСервере
Функция КонфигурациПолучить(ТекущийКонтрагент)
   ЗапросКонф = Новый Запрос;
   ЗапросКонф.Текст =
   "ВЫБРАТЬ
   |    КонфигурацииКонтрагентов.Владелец.Ссылка,
   |    КонфигурацииКонтрагентов.Конфигурация.Ссылка
   |ИЗ
   |    Справочник.КонфигурацииКонтрагентов КАК КонфигурацииКонтрагентов
   |ГДЕ
   |    КонфигурацииКонтрагентов.Владелец.Ссылка = &ТК";
   
   ЗапросКонф.УстановитьПараметр("ТК", ТекущийКонтрагент);
   Выборка = ЗапросКонф.Выполнить().Выбрать();
   Массив = Новый Массив;
   Пока Выборка.Следующий() Цикл
       Массив.Добавить(Выборка.КонфигурацияСсылка)
   КонецЦикла;
   Возврат Массив;
КонецФункции

так в чем ошибка?
22 Mort
 
23.08.11
15:26
(21) Это загадка? Угадайте какую ошибку выдает программа?
23 ЧтоТакое1С
 
23.08.11
15:27
{Документ.Документ3.Форма.ФормаДокумента.Форма(7)}: Ошибка при вызове метода контекста (КонфигурациПолучить)
   Массив = КонфигурациПолучить(ТекущийКонтрагент);
по причине:

по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'param':
   форма: Элемент
   имя: {http://v8.1c.ru/8.2/managed-application/modules}param
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ПолеФормы
24 Mort
 
23.08.11
15:30
(23) Ты в параметр суешь элемент формы а не его значение. Хватит уже получать значения реквизитов через элементы формы! Если в 8.1 иногда это было необходимо, то в 8.2 непривязанных элементов формы тупо не видно.

Массив = КонфигурациПолучить(Контрагент)
25 Mort
 
23.08.11
15:30
+(24) * в УФ 8.2
26 Mort
 
23.08.11
15:32
А вообще зайди в свойства поля конфигурации и попробуй создать связи параметров выбора.
27 Mort
 
23.08.11
15:33
А этот код распечатай на память (паржать через пару лет) и удали к ч.м.
28 ЧтоТакое1С
 
23.08.11
16:06
через связи параметров выбора при выборе почему то <> и все, хотя варианты для выбора пральные
29 Cube
 
25.08.11
11:27
(21) Вотэтода!)))
Что тебе в (19) было не понятно? Уже вроде и пожевал...
В рот положить? Ну чтож, положим:

&НаКлиенте
Процедура КонтрагентНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
   
   СтандартнаяОбработка = Ложь;
   ДанныеВыбора = Новый СписокЗначений;
   
   Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 10
                         |    Контрагенты.Ссылка
                         |ИЗ
                         |    Справочник.Контрагенты КАК Контрагенты");
   ДанныеВыбора.ЗагрузитьЗначения(Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"));
   
КонецПроцедуры //КонтрагентНачалоВыбора()
30 ЧтоТакое1С
 
26.08.11
11:40
мм..спасибо. а можно в список выбора записать из 2 х колонок запроса типа  ДанныеВыбора.ЗагрузитьЗначения(Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка" + "Ссылка2")); ??
31 ЧтоТакое1С
 
26.08.11
11:40
чтобы был список:
значение, 123
значение, 234
значение, 345
32 Cube
 
26.08.11
11:44
(30) Ну у тебя два варианта:

1). Получить такое поле запросом, путем сложения этих строк прямо в запросе.

2). Пройтись по выборке из запроса циклом и заполнять ДанныеВыбора ручками, как в (19)
33 ЧтоТакое1С
 
26.08.11
11:50
такие оперативные ответы..
а почему у меня не записывается в документ значение из ДанныхВыбора (29)?
34 Cube
 
26.08.11
11:54
(33) "такие оперативные ответы.." - в смысле, что-то не устраивает?

"а почему у меня не записывается в документ значение из ДанныхВыбора" - "СтандартнаяОбработка = Ложь" это тебе ни о чем не говорит? :)
35 ЧтоТакое1С
 
26.08.11
11:57
В смысле удивляюсь по доброму!
36 ЧтоТакое1С
 
26.08.11
11:57
СтандартнаяОбработка = Ложь мы ж специально ставили
37 ЧтоТакое1С
 
26.08.11
12:00
если СтандартнаяОбработка = Истина, то ничего не работает
38 Cube
 
26.08.11
12:00
(36) Правильно, специально. А что значит "СтандартнаяОбработка = Ложь"?)))
39 ЧтоТакое1С
 
26.08.11
12:06
отказ от стандартных действий системы для замены своим алгоритмом
40 Cube
 
26.08.11
12:10
(39) Ну вот и ответ на (33) :)
41 Cube
 
26.08.11
12:11
Ладно, подскажу))) Помимо "НачалоВыбора" у поля формы есть ещё и "ОбработкаВыбора"...
42 ЧтоТакое1С
 
26.08.11
12:12
Ну ведь в ЭтаФорма.Элементы.Конфигурация данные есть которые мы выбрали, а а  ЭтаФорма.Объект.Конфигурация разве нет? Путь к данным у поля к реквизиту же написан
43 Kookish
 
26.08.11
12:17
Каков крайний вариант кода? Тот, что в (21)? Тогда какой тип у переменной ТекущийКонтрагент при передаче ее в процедуру на сервере?
44 ЧтоТакое1С
 
26.08.11
12:20
я написал
&НаКлиенте
 Процедура КонфигурацияОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
     ЭтаФорма.Объект.Конфигурация = ВыбранноеЗначение;
 КонецПроцедуры

и нет что то
45 ЧтоТакое1С
 
26.08.11
12:21
(43) неа, в (29)
46 Cube
 
26.08.11
12:21
(44)
&НаКлиенте
 Процедура КонфигурацияОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
     Объект.Конфигурация = ВыбранноеЗначение;
 КонецПроцедуры
47 Cube
 
26.08.11
12:26
+(46) Ой, что-то я накосячил))) Вот так, конечно же:

&НаКлиенте
 Процедура КонфигурацияОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
     Конфигурация = ВыбранноеЗначение;
 КонецПроцедуры
48 ЧтоТакое1С
 
26.08.11
12:32
(47) что то не фунциклирует..
49 Cube
 
26.08.11
12:41
(48) Отладчик в руки! В процедуру "ОбработкаВыбора" заходит?
50 ЧтоТакое1С
 
26.08.11
12:43
угумс, и значение передавалось во всех вариантах (44),(46),(47) но не записывалось в документ. Значение типа справочник ссылка
51 Cube
 
26.08.11
12:47
(50) Что значит "не записывалось в документ"? В реквизит формы значение попадает?
52 ЧтоТакое1С
 
26.08.11
12:52
Ну оно же на форме отображается, но после проводки его нету
53 Cube
 
26.08.11
12:53
(52) Распиши всё по пунктам. А лучше со скриншотами, а то моя твоя не понимает...
54 ЧтоТакое1С
 
26.08.11
13:01
Процедура РегНомерНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
     ТекущийКонтрагент = ЭтаФорма.Объект.Контрагент;
     СтандартнаяОбработка = Истина;
     ДанныеВыбора = Новый СписокЗначений;
     Запрос = Новый Запрос("ВЫБРАТЬ
     |    КонфигурацииКонтрагентов.Конфигурация КАК Конфигурация,
     |    КонфигурацииКонтрагентов.РегНомер,
     |    КонфигурацииКонтрагентов.Владелец
     |ИЗ
     |    Справочник.КонфигурацииКонтрагентов КАК КонфигурацииКонтрагентов
     |ГДЕ
     |    КонфигурацииКонтрагентов.Владелец = &ТК
     |    И (НЕ КонфигурацииКонтрагентов.ПометкаУдаления)");
     
     Запрос.УстановитьПараметр("ТК", ТекущийКонтрагент);
     Результат=Запрос.Выполнить();
     ДанныеВыбора.ЗагрузитьЗначения(Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("РегНомер"));
   КонецПроцедуры

После этой процедуры в ПолеВвода Конфигурация у которой тип Объект.Конфигурация появляется список, вы его открываем и выбираем значения (тип СправочникСсылка.Конфигурации)
Но после нажатия записать и закрыть это значение не сохраняется в документе. Ну т.е. я открываю список документов и там поле Конфигурация пустое
55 ЧтоТакое1С
 
26.08.11
13:02
в (54) колонка не регномер в Конфигурация
56 ЧтоТакое1С
 
26.08.11
13:03
вот точнее она
Процедура КонфигурацияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
     ТекущийКонтрагент = ЭтаФорма.Объект.Контрагент;
     СтандартнаяОбработка = Ложь;
     ДанныеВыбора = Новый СписокЗначений;
     Запрос = Новый Запрос("ВЫБРАТЬ
     |    КонфигурацииКонтрагентов.Конфигурация КАК Конфигурация,
     |    КонфигурацииКонтрагентов.РегНомер,
     |    КонфигурацииКонтрагентов.Владелец
     |ИЗ
     |    Справочник.КонфигурацииКонтрагентов КАК КонфигурацииКонтрагентов
     |ГДЕ
     |    КонфигурацииКонтрагентов.Владелец = &ТК
     |    И (НЕ КонфигурацииКонтрагентов.ПометкаУдаления)");
     
     Запрос.УстановитьПараметр("ТК", ТекущийКонтрагент);
     Результат=Запрос.Выполнить();
     ДанныеВыбора.ЗагрузитьЗначения(Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Конфигурация"));
57 ЧтоТакое1С
 
26.08.11
13:47
обед чтоль у всех ))
58 Cube
 
26.08.11
13:56
Рабочий день кончился. За МКАДом тоже жизнь есть, прикинь? :)
Удачи разобраться с вопросом.
59 ЧтоТакое1С
 
26.08.11
14:38
угумс, спасибо!
60 jump if zero
 
26.08.11
14:41
чем тебя вариант в (7) не устраивал ?
))
61 ЧтоТакое1С
 
26.08.11
16:10
(60) не знаю )

(58) всего навсего в поле надо было поставить
режим выбора нет
а кнопка выбора да