Имя: Пароль:
1C
1C 7.7
v7: Создание реквизита документа, который будет связан с выпадающим списком.
0 leonid_gun
 
16.01.19
01:18
Здравствуйте.
ТиС 032. платформа 7.7 027
Есть необходимость создать в форме реквизит документа тип Строка, который будет связан с выпадающим списком, из которого можно выбрать одно значение из многих для этого реквизита, с последующим сохранением этого значения. И при открытии сохраненного документа этот реквизит отображал сохраненное значение. Как можно правильно такое реализовать?

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

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

А вот как быть если обрабатываем список для реквизита тип Число, еще и с дробной частью? ))
при выборе "педальки" список выводится, но при выборе значения из списка, выпадает экранная цифровая калава, стандартная для цифрового поля ввода с кнопкой. Нужно менять тип на Строку? Но хотелось бы оставить ограничение по разрядности для проверки ввода от руки.
1 Смотрящий
 
16.01.19
01:56
(0) 1. в ПриНачалеВыбораЗначения(Рекв,ФлагСтандОбр)
ФлагСтандОбр = 0;
2. СпЗн = СоздатьОбъект("СписокЗначений"); убрать7
повесить выпадающий список на форму. задать ему имя СпЗн
2 Duke1C
 
16.01.19
10:03
+1 Или завести перечисление
3 Kigo_Kigo
 
16.01.19
10:36
А если тип значения НеОпределенный и НазначитьТип?
4 trdm
 
16.01.19
10:47
(0) > Но хотелось бы оставить ограничение по разрядности для проверки ввода от руки.

Позицию точки проверь. Элементарный парсинг строки.
5 Ёпрст
 
16.01.19
11:01
(0)
ФлагСтандОбр = 0 ; И выпадать ничего не будет
6 Birmingem
 
16.01.19
11:13
(0)"А вот как быть если обрабатываем список для реквизита тип Число, еще и с дробной частью?"
Как именно заполняешь список значений? Код покажи.

А вообще, ничего сложного.
1. В форме документа создаешь реквизит формы - список (это ты уже сделал)
2. В процедуре ПриОткрытии() заполняешь этот список, чем тебе надо (см.(1)).
3. В процедуре ПриЗаписи() получаешь текущий элемент списка (выбранный пользователем) и присваиваешь его реквизиту документа.
7 leonid_gun
 
16.01.19
15:40
(6) порядок заполнения списка значений я привел в первом своем посте и в процедуре ПриОткрытии() это и делаю. Все прекрасно работает до момента, когда мне надо так обработать реквизит с типом Число и у которого установлена кнопка выбора в свойствах реквизита на вкладке Дополнительно. При выборе списка "педалькой" можно выбрать значение, но потом появляется экранная цифровая клава и мешает поместить выбор в окно реквизита.
Процедура ИзмУдельныйВес()
    СпЗн = СоздатьОбъект("СписокЗначений");
    СпЗн.ДобавитьЗначение("5,1","5,1");
    СпЗн.ДобавитьЗначение("5,5","5,5");
    СпЗн.ДобавитьЗначение("6,1","6,1");
    СпЗн.ДобавитьЗначение("6,5","6,5");  
    СпЗн.ДобавитьЗначение("7,0","7,0");
    Зн = 0;                                            
    Если СпЗн.ВыбратьЗначение(Зн,"УдельныйВес биоматериала",,,1) = 1 Тогда
        УдельныйВес = Зн; //присваиваем результат выюора реквизиту документа
    КонецЕсли;
КонецПроцедуры

Здесь уже реквизит УдельныйВес тип Число.
Попробую как посоветовал Смотрящий ФлагСтандОбр = 0; , чем убирается стандарный вывод по нажатию на кнопку выбора.
8 leonid_gun
 
16.01.19
16:06
Вот это
ФлагСтандОбр = 0;

в теле предопределенной процедуре как раз и помогло!! Перестала появляться экранная цифровая клава на реквизитах типа Число. То что нужно ))) Всем спасибо!!!
9 Ёпрст
 
16.01.19
18:05
(7) ёё.. нахрена ты в список строки пихаешь ?
10 Birmingem
 
16.01.19
19:02
(7)Ты не понял. Это все выкидывай. Делай так:
1.Открываешь форму документа, меню Вставить-Список (или Поле со списком), и вставляешь этот реквизит формы, на форме куда тебе надо. В свойстве этого вставленного реквизита в Идентификатор пишешь СпЗн.
2. В модуле формы пишешь:
Процедура ПриОткрытии()
    СпЗн.ДобавитьЗначение(5.1,"5,1");
    СпЗн.ДобавитьЗначение(5.1,"5,1");
КонецПроцедуры
11 Birmingem
 
16.01.19
19:07
3.И при записи:
Процедура ПриЗаписи()
    Если СпЗн.ТекущаяСтрока()>0 Тогда
УдельныйВес=СпЗн.ПолучитьЗначение(СпЗн.ТекущаяСтрока());
    КонецЕсли;
КонецПроцедуры
12 leonid_gun
 
16.01.19
23:12
Я не понял, зачем мне в ПриОткрытии() добавлять в СписокЗначений варианты? А потом их записвать в ПриЗаписи.. А если у меня таких реквизитов документа например 45 ??? Они имеют все разные варианты значений списка )))  вот фрагмент  записи толпы реквизитов документа
Процедура ИзмУретальныеНитки()
    СпЗн = СоздатьОбъект("СписокЗначений");
    СпЗн.ДобавитьЗначение("1,001","1,001");
    СпЗн.ДобавитьЗначение("1,010","1,010");
    СпЗн.ДобавитьЗначение("1,020","1,020");
    СпЗн.ДобавитьЗначение("1,030","1,030");  
    СпЗн.ДобавитьЗначение("1,040","1,040");
    Зн = 0;                                            
    Если СпЗн.ВыбратьЗначение(Зн,"УретальныеНитки биоматериала",,,1) = 1 Тогда
        УретальныеНитки = Зн;
    КонецЕсли;
КонецПроцедуры

Процедура ИзмУдельныйВес()
    СпЗн = СоздатьОбъект("СписокЗначений");
    СпЗн.ДобавитьЗначение("5,1","5,1");
    СпЗн.ДобавитьЗначение("5,5","5,5");
    СпЗн.ДобавитьЗначение("6,1","6,1");
    СпЗн.ДобавитьЗначение("6,5","6,5");  
    СпЗн.ДобавитьЗначение("7,0","7,0");
    Зн = 0;                                            
    Если СпЗн.ВыбратьЗначение(Зн,"УдельныйВес биоматериала",,,1) = 1 Тогда
        УдельныйВес = Зн;
    КонецЕсли;
КонецПроцедуры

Процедура ИзмРеакцияPH()
СпЗн = СоздатьОбъект("СписокЗначений");
    СпЗн.ДобавитьЗначение("1,1","1,1");
    СпЗн.ДобавитьЗначение("1,2","1,2");
    СпЗн.ДобавитьЗначение("1,3","1,3");
    СпЗн.ДобавитьЗначение("1,4","1,4");  
    СпЗн.ДобавитьЗначение("1,5","1,5");
    Зн = 0;                                            
    Если СпЗн.ВыбратьЗначение(Зн,"РеакцияPH биоматериала",,,1) = 1 Тогда
        РеакцияPH = Зн;
    КонецЕсли;
КонецПроцедуры
.....

и собственно обработка нажатий на "педальки" элементов формы документа

Процедура ПриНачалеВыбораЗначения(Рекв,ФлагСтандОбр = 0)
    ФлагСтандОбр = 0;
    Если Рекв = "Цвет" Тогда
        ИзмЦвет()
    ИначеЕсли Рекв = "Прозрачность" Тогда
         ИзмПрозрачность()
    ИначеЕсли Рекв = "УретальныеНитки" Тогда
         ИзмУретальныеНитки()
    ИначеЕсли Рекв = "УдельныйВес" Тогда
         ИзмУдельныйВес()
    ИначеЕсли Рекв = "РеакцияPH" Тогда
         ИзмРеакцияPH()
       ИначеЕсли Рекв = "Белок" Тогда
         ИзмБелок()
      ИначеЕсли Рекв = "Сахар" Тогда
         ИзмСахар()
    ИначеЕсли Рекв = "Ацетон" Тогда
         ИзмАцетон()
    ИначеЕсли Рекв = "РеакцияНаКровь" Тогда
         ИзмРеакцияНаКровь()
    ИначеЕсли Рекв = "Билирубин" Тогда
         ИзмБилирубин()
    ИначеЕсли Рекв = "УробилиновыеТела" Тогда
         ИзмУробилиновыеТела()
    ИначеЕсли Рекв = "ЖелчныеКислоты" Тогда
         ИзмЖелчныеКислоты()
    ИначеЕсли Рекв = "Нитриты" Тогда
         ИзмНитриты()
    КонецЕсли;
КонецПроцедуры
13 leonid_gun
 
16.01.19
23:34
хотя если реквизит тип Число с дробной частью, тогда число из списка выбирается только его целая часть. А надо, чтобы было полностью и целая м дробная части. Не знаю как это победить не переводя сам реквизит в тип Строка ((
14 leonid_gun
 
16.01.19
23:58
Догнал. Надо просто использовать децимальный знак точку, а не запятую в списке значений. Вот тупанул ((
15 Duke1C
 
17.01.19
09:54
(12) А-бал-деть...
А завтра показатели твои поменяются, будешь конфу переписывать?
16 Mikeware
 
17.01.19
09:58
Может, программиста позовёте все-таки?
17 Duke1C
 
17.01.19
10:02
+ (15) Эта инфа из документа дальше как будет использоваться?
18 Mikeware
 
17.01.19
10:03
(17) рецепт смешивания вычисляться будет...
19 leonid_gun
 
17.01.19
16:27
(15) Буду переписывать )
20 leonid_gun
 
17.01.19
16:30
(15) Это клинические исследования (анализы в простанородии). А конфа - медицинский центр )) Дальше эти данные будут распечатываться в утвержденной Минздравом форме
21 Duke1C
 
18.01.19
08:16
(19) Это реквизиты шапки документа, я так понимаю?
Табличная часть есть у него?
22 Duke1C
 
18.01.19
08:19
(20) "Дальше эти данные будут распечатываться в утвержденной Минздравом форме" - тупо сам документ, или всё-таки за период с группировками по этим реквизитам?
23 Mikeware
 
18.01.19
08:55
(22) да-да-да! "средняя мутность мочи населения и ее корреляция с фазой луны" и "динамика биллирубина в период новогодних праздников"...
24 Масянька
 
18.01.19
08:59
(17) (18) Честно - все не читала. Но по этим 2 (двум) постам: тебе нужен справочник и выбор из него.
Список значений используется, когда значения списка стабильны и практически не меняются.
25 NikVars
 
18.01.19
09:03
(0) ТиС и выпадающий список... Это удобно?! Если раз в день его использовать, то да. Если 1 раз в минуту... Нужно начинать думать заново.
26 leonid_gun
 
18.01.19
23:24
(24) Справочник думаю будет лишний,  все значения списка постоянны, т.к. утверждены протоколами мед. доков
27 leonid_gun
 
18.01.19
23:34
(25) Это конфа переписана с ТиС под медучреждение, под мутки регистратуры, лаборатории, учета и расхода медпрепаратов по калькуляциям сложных услуг, сделанных на основании наборов номенклатуры (товаров). И вот один аспект в этой теме и попросил общество помочь организовать быстрое и с минимумом ошибок заполнение бланка результатов анализа, а конкретней заполнения реквизитов шапки документа из списков значений. Вот пример одного реквизита анализа мочи (простите!) на наличие солей )))
Процедура ИзмСоли()
СпЗн = СоздатьОбъект("СписокЗначений");
    СпЗн.ДобавитьЗначение("ам.фофсфати +","ам.фофсфаты +");
    СпЗн.ДобавитьЗначение("ам.фофсфати ++","ам.фофсфаты ++");  
    СпЗн.ДобавитьЗначение("ам.фофсфати +++","ам.фофсфаты +++");  
    СпЗн.ДобавитьЗначение("ам.фофсфати ++++","ам.фофсфаты ++++");
    СпЗн.ДобавитьЗначение("кр.сечової к-ти +","кр.мочевой к-ты +");
    СпЗн.ДобавитьЗначение("кр.сечової к-ти ++","кр.мочевой к-ты ++");  
    СпЗн.ДобавитьЗначение("кр.сечової к-ти +++","кр.мочевой к-ты +++");  
    СпЗн.ДобавитьЗначение("кр.сечової к-ти ++++","кр.мочевой к-ты ++++");
    СпЗн.ДобавитьЗначение("кр.сечокислого амонію к-ти +","кр.мочекислого аммония +");
    СпЗн.ДобавитьЗначение("кр.сечокислого амонію к-ти ++","кр.мочекислого аммония ++");
    СпЗн.ДобавитьЗначение("кр.сечокислого амонію к-ти +++","кр.мочекислого аммония +++");
    СпЗн.ДобавитьЗначение("кр.сечокислого амонію к-ти ++++","кр.мочекислого аммония ++++");
    СпЗн.ДобавитьЗначение("кр.білірубіну +","кр.билирубина +");  
    СпЗн.ДобавитьЗначение("кр.білірубіну ++","кр.билирубина ++");
    СпЗн.ДобавитьЗначение("оксалатовий пісок +","оксалатовый песок +");  
    СпЗн.ДобавитьЗначение("оксалатовий пісок ++","оксалатовый песок ++");
    СпЗн.ДобавитьЗначение("оксалатовий пісок +++","оксалатовый песок +++");  
    СпЗн.ДобавитьЗначение("оксалатовий пісок ++++","оксалатовый песок ++++");
    СпЗн.ДобавитьЗначение("оксалати +","оксалаты +");  
    СпЗн.ДобавитьЗначение("оксалати ++","оксалаты ++");
    СпЗн.ДобавитьЗначение("оксалати +++","оксалаты +++");
    СпЗн.ДобавитьЗначение("оксалати ++++","оксалаты ++++");
    СпЗн.ДобавитьЗначение("трипельфосфати +","трипельфосфаты +");
    СпЗн.ДобавитьЗначение("трипельфосфати ++","трипельфосфаты ++");  
    СпЗн.ДобавитьЗначение("трипельфосфати +++","трипельфосфаты +++");
    СпЗн.ДобавитьЗначение("трипельфосфати ++++","трипельфосфаты ++++");
    СпЗн.ДобавитьЗначение("урати +","ураты +");  
    СпЗн.ДобавитьЗначение("урати ++","ураты ++");
    СпЗн.ДобавитьЗначение("урати +++","ураты +++");  
    СпЗн.ДобавитьЗначение("урати ++++","ураты ++++");
    СпЗн.ДобавитьЗначение("фосфати +","фосфаты +");
    СпЗн.ДобавитьЗначение("фосфати ++","фосфаты ++");  
    СпЗн.ДобавитьЗначение("фосфати +++","фосфаты +++");
    СпЗн.ДобавитьЗначение("фосфати ++++","фосфаты ++++");
    Зн = 0;                                            
    Если СпЗн.ВыбратьЗначение(Зн,"Соли биоматериала",,,1) = 1 Тогда
        Соли = Зн;
    КонецЕсли;
КонецПроцедурыПроцедура

ПриНачалеВыбораЗначения(Рекв,ФлагСтандОбр)
ФлагСтандОбр = 0;
    Если Рекв = "Соли " Тогда
        ИзмСоли()
    КонецЕсли;
КонецПроцедуры

Мыслимо вручную вводить это? Наверняка вероятность ошибки высока. А так выбрал и пошел дальше )))
28 hhhh
 
19.01.19
05:22
(27) ну как раз все используют справочник, для этого он и нужен. Чего вы со списком значений заморрочились, это маразм.
29 Злопчинский
 
19.01.19
09:54
Лучше бы был склероз. Тогда забыли бы что маразм.
30 DrZombi
 
гуру
19.01.19
10:04
(0) в 7.7 можно и просто список разместить на форме, без магии от 8.3 УФ :)
31 Злопчинский
 
19.01.19
17:14
(30) причем даже список с крыжиками!
32 Злопчинский
 
19.01.19
17:17
а если сделать список значений типа

СЗ.ДобавитьЗначение(1,"Первый");
СЗ.ДобавитьЗначение(2,"ПервыйПервый");
СЗ.ДобавитьЗначение(3,"Явторой");

СЗморе = СоздатьОббъект("СписокЗначений");
СЗморе.ДобавитьЗначение("4","ВторойСлышуВас");
СЗморе.ДобавитьЗначение("5","ВэфиреУтенок");

СЗ.ДобавитьЗначение(СЗморе,"Караван");

итд с произвольной вложенностью - то можно штатно без извратом, типовым Формексом получить многоуровневый Выбор
глСервис.ВыбратьЗначение(СЗ,....);
33 ДенисЧ
 
19.01.19
17:20
(32) @можно штатно типовым Формексом!@

Нельзя так шутить. Я чуть со стула не упал...
34 Злопчинский
 
19.01.19
17:21
а когда делать было нефиг я талмуды писал
http://catalog.mista.ru/public/16973/ - статья,
сама обработка http://catalog.mista.ru/public/14837/ для типовой ТиС
35 Злопчинский
 
19.01.19
17:23
(33) он обновился, кстати, 17 числа
дописал в доках, внизу страницы по ссылке http://www.1cpp.ru/forum/YaBB.pl?num=1189693831/30