Имя: Пароль:
1C
1С v8
Выбор элементов из группы
0 Gill
 
30.05.17
10:22
Всем привет! Имеется форма подбора адресатов(управляемая).На ней Дерево и соответственно группы и элементы.Галочкой отмечается Группа (например Дирекция) и при этом должны "отметиться" все элементы из этой группы.И далее это должно естественно попасть в соответствующую ТЧ документа.

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


Что нужно написать в обработчике?

&НаКлиенте
Процедура АдресатыОтметкаПриИзменении(Элемент)
    // Вставить содержимое обработчика.
    Если Элемент ???
КонецПроцедуры
1 Ц_У
 
30.05.17
10:35
Нужно найти строки подчиненные текущей строке, что-то вроде этого:
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Родитель", ТекСтрока);
НайденныеСтроки = СтрокиСостава.НайтиСтроки(ПараметрыОтбора,Истина);
2 Gill
 
30.05.17
10:56
()  Метод объекта не обнаружен (НайтиСтроки)
3 Ц_У
 
30.05.17
11:00
(2) у дерева?
4 Gill
 
30.05.17
11:01
(3) да
5 Gill
 
30.05.17
11:24
(3) Как быть?
6 dezss
 
30.05.17
11:43
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Родитель", ТекСтрока);
НайденныеСтроки = ТвоеДерево.Строки.НайтиСтроки(ПараметрыОтбора,Истина);
7 Gill
 
30.05.17
11:47
(6) Форма.ФормаПодбораАдресатов.Форма(33)}: Поле объекта не обнаружено (Строки)
8 dezss
 
30.05.17
11:49
какого типа у тебя твое дерево?
9 Ц_У
 
30.05.17
11:50
Дерево на форме как называется?
10 Gill
 
30.05.17
11:50
(9) Адресаты
11 dezss
 
30.05.17
11:56
Так тип какой?
Это точно ДеревоЗначений?
12 Gill
 
30.05.17
12:02
(11) Тип ДеревоЗначений
13 Gill
 
30.05.17
12:04
У меня у Дерева Адресаты доступны только методы ПолучитьЭлементы() и НайтиПоИдентификатору()
14 Ц_У
 
30.05.17
12:11
&НаКлиенте
Процедура АдресатыОтметкаПриИзменении(Элемент)
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Родитель", Элемент.Родитель.ТекущиеДанные);
НайденныеСтроки = Элемент.Родитель.Строки.НайтиСтроки(ПараметрыОтбора,Истина);
//
КонецПроцедуры
15 НЕА123
 
30.05.17
12:12
элемент.текущиеДанные.ПолучитьЭлементы()
16 Gill
 
30.05.17
12:19
(14) Поле объекта не обнаружено (Строки)
НайденныеСтроки = Элемент.Родитель.Строки.НайтиСтроки(ПараметрыОтбора,Истина);
17 dezss
 
30.05.17
12:31
(16) да посмотри ты уже в отладчике какие типы у твоих элементов и какие есть реквизиты.
У ДереваЗначений есть свойство "Строки", если у тебя пишет, что нет, значит ты не к дереву обращаешься.
18 Ц_У
 
30.05.17
12:34
(17) спасибо, я хотел матом написать
19 Gill
 
30.05.17
12:35
(17),(18)...спасибо....не волнуйтесь так
20 Gill
 
30.05.17
16:53
(17),(18) Метод не обнаружен

http://radikal.ru/lfp/s48.radikal.ru/i122/1705/69/0f3eac141090.jpg/htm
21 dezss
 
30.05.17
17:10
(20) покажи свойства этого дерева
22 Gill
 
30.05.17
17:14
23 dezss
 
30.05.17
17:18
(22) переобзови один из адресатов в АдресатыДерево, например. У тебя получается один перекрывает другой, из-за того, что названия одинаковые.
24 dezss
 
30.05.17
17:24
либо делай
МоеДерево = ПолучитьРеквизиты().Получить(0);
25 Gill
 
30.05.17
17:41
(23) не помогает.... (24) ПолучитьРеквизиты() доступен только на сервере
26 dezss
 
31.05.17
08:27
(25) тебе надо обращаться именно к реквизиту, а не к элементу формы.
Если переименовал реквизит, то пиши АдресатыДерево, если элемент формы, то просто Адресаты.

Ну так попробуй сделать это на сервере.
27 SashaNox
 
31.05.17
09:17
Если хочешь работать с деревом значения то делай на сервере так:

Дерево = РеквизитФормыВЗначение("РеквизитФормы_Дерево");

После того как поработаешь, обратно:

ЗначениеВРеквизитФормы(Дерево, "РеквизитФормы_Дерево");

Если хочешь работать с ДанныеФормыДерево, то ПО СУТИ:

ДанныеФормыДерево.ПолучитьЭлементы() = ДеревоЗначений.Строки
28 Gill
 
31.05.17
09:21
29 Buster007
 
31.05.17
09:27
Берешь ПолучитьЭлементы() и делаешь. Если не работает, то вызови специалиста
30 Gill
 
31.05.17
09:32
(29) Видимо я тупой, а ты умный....Ну так поделись секретом применительно к моему коду....
31 Fedor-1971
 
31.05.17
09:44
(30) Внятно напиши:
1. на форме подбора есть реквизит ... (как называется реквизит формы) тип Дерево, с колонками ... ( какими?), хочу поставить в колонке, например, "выбрано" галочку и автоматически изменить Выбрано у всех подчинённых элементов.
2. на основной форме есть ТЧ (как называется), хочу в нее вынести все выбранные значения

Без этого - разговор ни о чём
32 Gill
 
31.05.17
09:56
(31) Есть ТЧ Документа-Применика (называется Маршрут) в ней пишу:

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


Есть вызываемая форма подбора "ФормаПодбораАдресатов", на ней Реквизит "ДанныеДерево" и Колонки "Получатель" и "Отметка"
Также на ней Таблица "Адресаты" и поля "АдресатыДеревоПолучатель" и "АдресатыДеревоОтметка"

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

&НаКлиенте
Процедура АдресатыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    
    ТекущиеДанные = Элементы.Адресаты.ТекущиеДанные;
    ТекСтрока = Элементы.Адресаты.ТекущаяСтрока;

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

КонецПроцедуры


Нужно чтобы пользователь отметил галочкой Подразделение (Родитель) и в Документ-приемник в ТЧ  Маршрут попали все сотрудники этого подразделения
33 Fedor-1971
 
31.05.17
10:11
(32) примерно так
ПриИзмененииОтметка - у ДанныеДерево, перейди в серверную процедурку и напиши

  Адресаты.Очистить(); //дабы не двоились данные при снятии/установке Отметка
  ур1=Элементы.ДанныеДерево.ПолучитьЭлементы(); // выбрали верхний уровень
  Для каждого эл из ур1 цикл
    Если эл.Отметка=Истина тогда
      урСотр=эл.ПолучитьЭлементы(); //если уровней сотрудников несколько, сам модернизируешь
      Для каждого сотр из урСотр цикл
        нов=Адресаты.добавить();
        нов.АдресатыДеревоПолучатель=сотр.Получатель;
        нов.АдресатыДеревоОтметка=Истина;
      КонецЦикла;
    КнецЕсли;
  КонецЦикла;


Возвращай из подбора не структуру а Массив с сотрудниками или массив структур с доп информацией для каждого сотрудника
34 Gill
 
31.05.17
10:25
(33) Прошу сильно не ругаться....

Не совсем понятно это - "ПриИзмененииОтметка - у ДанныеДерево, перейди в серверную процедурку и напиши "

И это "нов=Адресаты.добавить();" - только ДобавитьСтроку() выдает.

И Адресаты доступно для выбора только через Элементы
35 Fedor-1971
 
31.05.17
10:32
(34)
ПриИзмененииОтметка обработчик события ПриИзменении у колонки дерева Отметка, в нём переходим в процедуру &НаСервере - как её назвать без разницы
Адресаты - я исходил из того, что это реквизит формы типа ТаблицаЗначений, что у тебя смотри сам (возможно, что реквизит Объекта)

" И это "нов=Адресаты.добавить();" - только ДобавитьСтроку() выдает." - я писал примерный код, потому сам исправь, суть понятна, нужно добавить строку в таблицу
36 Gill
 
31.05.17
12:29
Всем спасибо....Прошу не ругаться...у меня последний вопрос (34) А если мне нужен только один "отмеченный" сотрудник из подразделения?...
37 Fedor-1971
 
31.05.17
12:33
(38) как Отмеченный? галкой или выделен курсором?
38 Gill
 
31.05.17
12:35
(38) галочкой....точнее могут быть сотрудники из разных подразделений..например из подразделения №1 выбрать 2 из 5....а из подразделения №2 выбрать 3 из 6....Короче говоря отмеченных галочками
39 Gill
 
31.05.17
12:39
+(38) может быть ситуация из одного подразделения всех (ставим галку напротив подразделения) а из другого только некоторые из списка
40 Fedor-1971
 
31.05.17
12:49
(38) вот же, блин горелый. Не годится для данной задачи код в (33).
Заполни ДанныеДерево, в Адресаты добавь колонку Подразделение и тоже заполни. Т.е. получаешь примерно одинаковые данные в обеих представлениях связанные по колонке "подразделение"
Потом в событие ПриАктивацииСтроки ДеревоДанных вписываешь примерно следующее:
стр=Элементы.ДеревоДанных.ТекущиеДанные;  //как сделать защиту от отсутствия строки сам придумай (в СП почитай)
Элементы.Адресаты.ОтборСтрок=новый ФиксированнаяСтруктура("Подразделение", стр.Подразделение);
В результате на форме при выборе строки ДеревоДанных будет устанавливаться фильтр по подразделению в Адресатах
Код установки отметок для Адресатов будет несколько другой: идея мас=Адресаты.НайтиСтроки(новый Структура("Подразделение", выбПодразделение));
41 Gill
 
31.05.17
17:10
(40) Для таблицы Адресаты Недоступен метод ОтборСтрок()
42 Gill
 
01.06.17
11:52
С получение данных вроде разобрался.Теперь проблема с заполнением ТЧ документа Приемника.На форме подбора
прицепил кнопку "Выбор отмеченных", пишу

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

КонецПроцедуры

А документе приемнике пишу

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

Не заполняются данные
43 Gill
 
01.06.17
16:11
Товарищи, что не так в ОбработкеВыбора?
44 Gill
 
01.06.17
17:06
^
45 Gill
 
01.06.17
17:06
Я все еще надеюсь на ВАС
46 Gill
 
01.06.17
17:09
Почему не срабатывает ОбработкеВыбораиз из (42)
47 dezss
 
01.06.17
17:13
(46) запускаешь отладку и смотришь!!!
что тут может быть не понятного?