helpf.pro
Регистрация

v8.3: Выбор из списка значений в поле ввода, как правильно реализовать?

SJslava
16.04.2015 08:34Прочитано: 66097

Работаю в 8.3.5Только начинаю разбираться в платформе, до этого с 1С имел дело только как пользователь. Сейчас стоит задача написать свою небольшую конфу для нашего маленького предприятия. Накупил кучку книжек, сижу изучаю. Голова уже пухнет. Не могу своим мозгом понять как реализовать такой функционал:

Есть документ ЗаказНаряд в котором есть реквизит Комплектность с типом Поле ввода.Ясен пень, у документа есть форма с этим реквизитом.В форме документа, требуется вызывать кнопкой выбора (...) у этого поля, окно в котором можно отметить галочками значения которые по нажатию ОК в этом окне, попадут в это поле ввода.Сами значения в этом окне должны браться из наименований элементов справочника Подстановки, причем из элементов находящихся в определенной группе этого справочника.Поле ввода необходимо, что бы помимо того, что выберет пользователь, он мог в некоторых случаях дописать некоторые данные руками.

Прошу ткнуть носом как это сделать, ибо голова уже кипит...

На всякий набросал как я себе это вижу.

Yandex
Возможно, вас также заинтересует
Реклама на портале
IBReiter
16.04.2015 10:42Ответ № 1

Комплектность должна быть строка и не обязательно реквизит документа, это может быть просто элемент формы.

Еще у документа должна быть ТЧ как раз для хранения списка значений подстановок.

На обработчик начало выбора для комплектности организовать выбор из списка значений, в который помещены элементы из справочника подстановок.

После отметки нужных подстановок необходимо из помеченных элементов сформировать строку и поместить ее в комплектность и также записать их в ТЧ.

Касаемо дописки, мне кажется нужно сделать отдельный строковый реквизит "ДопКомплектность", и в нем уже дополнения писать и присоединять их к комплектности.

SJslava
16.04.2015 20:32Ответ № 2

К сожалению не смог понять Ваш совет и сделал по своему.

Путем долгих мучений получилось добиться промежуточного результата.

Я написал функцию которая получает колонку "Наименование" справочника Подстановки, и вызвал ее в событии начала выбора в поле комплектности. 

Код 1C v 8.3
 &НаСервере
Функция Комплектность();

Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
| Подстановки.Наименование КАК Наименование,
| Подстановки.ЭтоГруппа,
| Подстановки.Родитель
|ИЗ
| Справочник.Подстановки КАК Подстановки
|ГДЕ
|   Подстановки.ЭтоГруппа = ЛОЖЬ
| И Подстановки.Родитель =Родитель";

Запрос.УстановитьПараметр("Родитель", Справочники.Подстановки.НайтиПоНаименованию("Комплектность"));

РезультатЗапроса = Запрос.Выполнить();


Список = Новый СписокЗначений;
Список.ЗагрузитьЗначения(РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Наименование"));
Возврат Список;

КонецФункции




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

Объект.Комплектность=ВыбратьИзСписка(Комплектность(), Элементы.Комплектность);

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

В результате стал выпадать список с нужными мне значениями. 

Но как я писал выше, мне требуется вызывать окно, в котором можно отметить галочками нужные мне значения и в результате заполнять этими значениями поле Комплектность.

Тут у меня случился ступор, из которого я не могу выйти. Прошу подсказать как это сделать.

EMigachev
17.04.2015 01:06Ответ № 3

Зачем такая сложная реализация!?

сделайте табличную часть и выведете в нее эти значения и поле флажка, пусть пользователи выбирают галками в табличной части

SJslava
17.04.2015 07:23Ответ № 4

В смысле просто, в форму документа поместить таблицу с значениями и флажками?

Мне очень критично именно поле ввода с таким функционалом как я описал выше, таблица в форме не подойдет ((

IBReiter
17.04.2015 10:13Ответ № 5

Можно так

Код 1C v 8.3
 

&НаКлиенте
Процедура КомплектностьНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    СписокП             = ВернутьСписокПодстановкиНаСервере();
    ЭлементыПодстановки = СписокП.ОтметитьЭлементы("Выберите элементы комплектности");
    КомплектностьСтрока = "";
    
    Если ЭлементыПодстановки = Истина Тогда
        
        ТЧ = Объект.КомплектностьДокумента;
        ТЧ.Очистить();
        
        Для Каждого ЭлементСписка Из СписокП Цикл
            Если ЭлементСписка.Пометка Тогда
                СтрокаТЧ = ТЧ.Добавить();
                СтрокаТЧ.Подстановка = ЭлементСписка.Значение;
                КомплектностьСтрока  = КомплектностьСтрока + ЭлементСписка.Значение + ", ";
            КонецЕсли;
        КонецЦикла;
        
        КомплектностьСтрока  = Лев(КомплектностьСтрока, СтрДлина(КомплектностьСтрока) - 2);
        Объект.Комплектность = КомплектностьСтрока;
        Модифицированность   = Истина;
        
    КонецЕсли;
    
КонецПроцедуры

&НаСервереБезКонтекста
Функция ВернутьСписокПодстановкиНаСервере()
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Подстановки.Ссылка
    |ИЗ
    |    Справочник.Подстановки КАК Подстановки";
    Результат = Запрос.Выполнить();
    Выборка   = Результат.Выбрать();
    СписокП   = Новый СписокЗначений;
    
    Пока Выборка.Следующий() Цикл
        СписокП.Добавить(Выборка.Ссылка);
    КонецЦикла;
    
    Если СписокП.Количество() > 0 Тогда
        Возврат СписокП;
    Иначе
        Возврат Неопределено;
    КонецЕсли;
    
КонецФункции
SJslava
17.04.2015 12:10Ответ № 6

Ого, спасибо!

Потихоньку буду вникать в Ваш вариант реализации, ибо опыта ноль, не все понятно сразу.

А если просто с ходу опробовать Ваш код, то в режиме отладки по нажатии у поля кнопки выбора вызывается окно, там есть элементы справочника Подстановки, но в независимости от того, стоят отметки или нет, при нажатии "ОК" сначала ругается на :

ТЧ = Объект.КомплектностьДокумента;[/pre]

{Документ.ЗаказНаряд.Форма.ФормаДокумента1.Форма(83)}: Поле объекта не обнаружено (КомплектностьДокумента)

ТЧ = Объект.КомплектностьДокумента;

Но насколько я понимаю нужно просто поправить на:

ТЧ = Объект.Комплектность;[/pre]

Что я и сделал.

Но после этого уже ругается на: 

 ТЧ.Очистить();[/pre]

{Документ.ЗаказНаряд.Форма.ФормаДокумента1.Форма(84)}: Значение не является значением объектного типа (Очистить)

ТЧ.Очистить();

Насколько я понимаю, должно вызываться на стороне сервера.

SJslava
17.04.2015 12:12Ответ № 7

Извиняюсь. В редакторе код выгледел нормально, а после отправки вот так...

IBReiter
17.04.2015 13:25Ответ № 8

Здесь "Комплектность" - это реквизит документа и элемент на форме, у которого и есть кнопка выбора.

"Комплектность документа" - это табличная часть, где вы в итоге список этот будете хранить.

IBReiter
17.04.2015 14:38Ответ № 9

Думаю, что так понятнее будет

SJslava
17.04.2015 14:40Ответ № 10

Все понял, добавил в документ табличную часть КомплектностьДокумента, а в нее строку Подстановка. 

Огромное спасибо. Все заработало.

Поскольку я учусь, я позволил себе поэкспериментировать и изменил процедуру КомплектностьНачалоВыбора вот так:

Код 1C v 8.3
 

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

В итоге получил тот же результат, но без использования табличной части.

Подскажите, есть какая то разница между способом где используется ТЧ и не используется?

IBReiter
17.04.2015 14:50Ответ № 11

Табличная часть нужна для сохранения списка выбранных значений в документе, другого варианта я просто не знаю.

Это ведь только первый этап - выбрать из списка, вам же нужно будет этими значениями пользоваться. При повторном открытии документа вам нужно будет учитывать, что пользователь выбрал ранее и восстановить при открытии списка пометки его элементов. Пользоваться строкой для этого очень неудобно.

В табличной части реквизит "Подстановка" - это не строка, это ссылка в справочник "Подстановки".

SJslava
17.04.2015 15:10Ответ № 12

В данном случае достаточно и того, что можно выбрать из списка. Это поле заполняется один раз при создании документа и более выбор не используется.

Огромная Вам благодарность! Очень помогли. 

Вопрос закрыт =)

Подсказка: Для выделения Кода используйте (в редакторе).
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.