Имя: Пароль:
1C
1C 7.7
v7: НазначитьТип для реквизита в таб. части документа
0 Zhuravlik
 
22.04.12
19:26
Здравствуйте. Пишу документ "ВводОстатков", - в виде тренировки. На форме - выпадающий список, с значениями - идентификаторами всех регистров в системе. Его я получаю так:

Процедура ПриОТкрытии()

   Для сч=1 По Метаданные.Регистр()  Цикл
       спВидРегистра.ДобавитьЗначение(Метаданные.Регистр(сч).Идентификатор, Метаданные.Регистр(сч).Синоним);
   КонецЦикла;

   
КонецПроцедуры // ПриОТкрытии



В самом документа - два реквизита (измерения регистра), предполагаю что их везде два. ОсновноеИзмерение - в диалоге формы (например для мест хранения - склад), ДополнительноеИзмерение - в таб. части (напр. номенклатура).
Оба реквизита - неопределенного типа. Суть задачи: при выборе вида регистра из списка им назначается соотв. тип и вид. Пробовал делать так:

   текРегистр = спВидРегистра.ПолучитьЗначение(спВидРегистра.ТекущаяСтрока());
   
   ТипОсн = Метаданные.Регистр(текРегистр).Измерение(1).Тип;
   ВидОсн = Метаданные.Регистр(текРегистр).Измерение(1).Вид;
   НазначитьТип("ОсновноеИзмерение", ТипОсн + "." + ВидОсн);
   
   ТипОсн = Метаданные.Регистр(текРегистр).Измерение(2).Тип;
   ВидОсн = Метаданные.Регистр(текРегистр).Измерение(2).Вид;
   НазначитьТип("ДополнительноеИзмерение", ТипОсн + "." + ВидОсн);    


Но почему-то при выборе регистра из списка тип назначается только диалоговому реквизиту. Я подумал, что для таб. части надо назначать тип при вводе новой строки, прописал в процедуру ПриВводеСтроки() - но все-равно не получается. Как это сделать?
Конфа - тестовая, четыре вида регистра, измерения по номерам совпадают, Сообщить(тип + "." +вид) - все как надо возвращается...
1 zak555
 
22.04.12
19:27
> Пишу документ "ВводОстатков"


возьми готовый
2 Zhuravlik
 
22.04.12
19:28
(1) Хочу понять, это все для себя делается.
3 Zhuravlik
 
22.04.12
19:31
Я смотрел в типовой конфе, в тисе, но там не нашел такого. А где-то было, при вводе строки спрашивается вид номенклатуры, и назначается вид справочника... Пробовал назначать ДополнительномуРеквизиту тип - справочник, и НазначитьВид() - тоже не прокатывает. Уже моск себе проел...
4 andrewks
 
22.04.12
19:36
5 Zhuravlik
 
22.04.12
19:49
(4) Класс) Спасибо, сейчас буду копать.
6 Torquader
 
22.04.12
19:54
Только нужно не забывать, что тип нужно выбирать для каждой строки отдельно.
7 Zhuravlik
 
22.04.12
19:57
(4) Интересный документ, но на свой вопрос не могу найти ответа...
8 Torquader
 
22.04.12
20:00
(7) Перехватывай ПриВыбореЗначения с идентификатором твоего реквизита - тогда можно одновременно выбрать и тип и значение.
9 Zhuravlik
 
22.04.12
20:01
(4) У Вас заполняется таблицаЗначений, а при записи просто переносится в табличную часть? А именно в табличной части если реквизит неопределенного вида, его нельзя определять? Тогда почему есть возможность назначать неопределнный в тч?

(8) Именно ПриВыборе? Я пробовал так делать приНачалеВыбораЗначения, привыборе - надо ведь сначала выбрать... А как выбирать, если тип неопределен? Сейчас попробую конечно...
10 Torquader
 
22.04.12
20:05
(9) Если стандартно, то система предлагает выбрать сначала тип - потом значение.
Если внучную, то отключаешь стандартный выбор и выбираешь списком, что хочешь - причём - можно даже все типы и значения в одном списке собрать.
11 andrewks
 
22.04.12
20:09
(9) "У Вас заполняется таблицаЗначений, а при записи просто переносится в табличную часть?" да
"А именно в табличной части если реквизит неопределенного вида, его нельзя определять?"  можно
12 Zhuravlik
 
22.04.12
20:09
(10) А нельзя назначить программно и тип и вид, чтобы пользователь уже выбирал сразу непосредственно значение?
Вот, изменил для ДополнительныйРеквизит тип с неопределенного на справочник. Прописал:

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

КонецПроцедуры // ПриВыбореЗначения



При вводе новой строки выскакивает список с типами справочников для выбора. Т.е. не але(

Если назначаю неопределенный, и делаю то же самое, то вообще ничего не вцыбирается.

(11) а как?) Я это и хочу узнать...
13 Zhuravlik
 
22.04.12
20:10
(12) не то же самое а НазначитьТип
14 andrewks
 
22.04.12
20:10
(12) ты забываешь изменять ФСО
15 Torquader
 
22.04.12
20:11
(14) Так он и не должен его менять - он назначает тип, и система сама обрабатывает ввод значения - ему сам ввод отключать не надо.
16 Zhuravlik
 
22.04.12
20:20
(14) Если его отключать, то надо писать свой подбор, а не стандартно как это происходит при выборе...
Но что с отключенный, что с включенным ФСО вот это


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

   
   Сообщить(ДополнительноеИзмерение.Вид());    
   
КонецПроцедуры // ПриВыбореЗначения


Сообщает нужный вид справочника, а все равно при выборе выходит список.
17 andrewks
 
22.04.12
20:21
(16) НазначитьВид() не предназначен для типа Неопределенный. только НазначитьТип()
18 Zhuravlik
 
22.04.12
20:21
(16) + это если доп.реквизит - не неопределнный, а справочник.
19 Zhuravlik
 
22.04.12
20:22
(17) ну да, я просто и так и так пробую.
20 Torquader
 
22.04.12
20:22
НазначитьТип(ИмяРеквизита,"Регистр."+ИдентификаторРегистра)
21 Zhuravlik
 
22.04.12
20:24
(17) Процедура ПриНАчалеВыбора не работает, если реквизит - неопределенный, у реквизита просто нет "педальки" для выбора.
(20) У меня реквизит заранее известно, что справочник. Это не регистр ни разу...
22 Zhuravlik
 
22.04.12
20:25
(21) + получается, что надо обходиться предопределенными ПриВводеСтроки, ПриНачалеРедактирования - но это ничего не дает...
23 Torquader
 
22.04.12
20:26
(21) Тогда какого хрена ты пишешь:
ВидОсн = Метаданные.Регистр(текРегистр).Измерение(2).Вид;

Пиши, что справочник и указывай вид справочника, если это нужно.
24 Torquader
 
22.04.12
20:28
(22) Так можно и ПриНачалеРедактированияСтроки - получить момент, когда у нас вводится наше поле Через АктивныйЭлемент и дальше обработать ввод.
Если же нужно установить какой-то справочник заранее, то ПриВводеНовойСтроки выставляем Тип и оставляем автовыбор.
25 Zhuravlik
 
22.04.12
20:28
(23) ну - Метаданные.Регистр(текРегистр).*ИЗМЕРЕНИЕ*(2).Вид - вид измерения регистра. Они все - справочник) Суть задачи, как  определить этот тип для реквизита табличной части, если он неопределен. Просто я потом уже начал пробовать с указанием типа Справочник, но так тоже не выходит.
26 Torquader
 
22.04.12
20:30
"Справочник."+Метаданные.Регистр(текРегистр).Измерение(2).Вид - не помогает ?
27 Zhuravlik
 
22.04.12
20:32
(24) я пробовал, ничего не выходит.
Если вид реквизита - справочник:

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

КонецПроцедуры // ПриВводеСтроки


При выборе выпадает список всех справочников.


Если вид реквизита - неопределнный:

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

КонецПроцедуры // ПриВводеСтроки


И вообще отсутствует выбор...
28 Zhuravlik
 
22.04.12
20:32
(26) Сообщить(ТипОсн + "." + ВидОсн) - Возвращает нормально справочник.Такой-то
29 Zhuravlik
 
22.04.12
20:33
А можно программно назначить, чтобы у реквизита была "педалька"?
30 Torquader
 
22.04.12
20:35
(29) Так в табличной части педалька предполагается автоматом, то есть она должна работать.
31 andrewks
 
22.04.12
20:37
(21) Неопределенный у тебя редактироваться не будет, пока не назначишь тип
32 Torquader
 
22.04.12
20:37
Только педалька начинает работать тогда, когда выбираешь именно этот реквизит (а он у тебя явно не первый).
Попробуй вставить данный код в ПриРедактированииНовойСтроки()
33 Zhuravlik
 
22.04.12
20:38
(30) нету. Для неопределенного...
(31) ну вот, назначаю - а ее все равно нету. Вроде все так, я понять не могу что неправильно?
34 Zhuravlik
 
22.04.12
20:39
(32) Пробовал. Он идет после номера строки, получается, что первый в тч?
35 andrewks
 
22.04.12
20:40
(33) у меня всё работает. что-то ты там перемудрил

назначай тип в ПриРедактированииНовойСтроки() и ПриНачалеРедактированияСтроки()
36 Torquader
 
22.04.12
20:41
(34) Ну, если уж совсем не получается, то делай выбор вручную.
Спр=CreateObject("Справочник."+ВидОсн);
If Спр.Choose()=1 Then МойРекв=Спр.CurrentItem();EndIf;
37 andrewks
 
22.04.12
20:43
но вообще, ТЗ побогаче смотрится. а ТП ещё лучше
38 Zhuravlik
 
22.04.12
20:44
(35) странное дело, тип назначается для ПРЕДИДУЩЕЙ строки! Т.е. ввожу вторую строку - могу сделать выбор в первой, вторую - в третьей и т.д.
39 Zhuravlik
 
22.04.12
20:45
Вот так заработало -


//======================================================================
Процедура ПриВводеСтроки()
       текРегистр = спВидРегистра.ПолучитьЗначение(спВидРегистра.ТекущаяСтрока());
       ТипОсн = Метаданные.Регистр(текРегистр).Измерение(2).Тип;
       ВидОсн = Метаданные.Регистр(текРегистр).Измерение(2).Вид;
       НазначитьТип("ДополнительноеИзмерение", ТипОсн + "." + ВидОсн);            

КонецПроцедуры // ПриВводеСтроки


Процедура ПриРедактированииНовойСтроки()
   
       текРегистр = спВидРегистра.ПолучитьЗначение(спВидРегистра.ТекущаяСтрока());
       ТипОсн = Метаданные.Регистр(текРегистр).Измерение(2).Тип;
       ВидОсн = Метаданные.Регистр(текРегистр).Измерение(2).Вид;
       НазначитьТип("ДополнительноеИзмерение", ТипОсн + "." + ВидОсн);        
   
КонецПроцедуры

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


т.е. для всех трех процедур... странно как-то.
40 Zhuravlik
 
22.04.12
20:46
(37) а что такое ТП?
41 Torquader
 
22.04.12
20:46
(38) ПриВводеНовойСтроки вызывается, насколько я помню, после того, как строка будет уже введена, то есть очень похоже, что у тебя именно это и есть.
42 andrewks
 
22.04.12
20:47
(39) у меня всё работает при назначении типа только в указанных мной двух предопределённых процедурах
43 andrewks
 
22.04.12
20:47
(40) ТабличноеПоле 1с++
44 Zhuravlik
 
22.04.12
20:47
(41) Но спозиционирована текущая строка? Значит В этой процедуре обрабатываются переменные в ней...
45 Torquader
 
22.04.12
20:48
У меня число методологический вопрос - почему нельзя задать измерение сразу, если вы положили в коде, что Тип это Справочник, то задать всевозможные справочники.
46 Zhuravlik
 
22.04.12
20:48
(42) да, у меня тоже, поспешил...
47 Zhuravlik
 
22.04.12
20:50
(45) В регистрах - измерения - справочники определенного вида. Я хотел для тч понять как именно для неопределенного реквизита задать и тип и вид, потому что возможно позже столкнусь с тем, что в регистрах будут измерения - перечисления.
48 Zhuravlik
 
22.04.12
20:53
(46) все-равно непонятно. Если я при начале редактирования задаю тип и вид, зачем мне это делать еще и ПРИ редактировании? Это же просто случайно пальцем в небо ткнул, и догадался, а технически - я не понимаю почему так?
49 andrewks
 
22.04.12
20:55
(48) когда вводишь новую строку, ПриНачалеРедактированияСтроки() не вызывается. если тип уже проставлен, то потом в ней его указывать уже необязательно
50 Zhuravlik
 
22.04.12
20:59
(49) это понятно. Я о другом. Вот я тыкнул два раза в диалог, вызывалось ПриНачалеРедактированияСтроки(), я так рассуждал - здесь указываю тип и вид переменной, и ПриРедактировании - когда я ввожу данные система уже понимает, что там за тип и вид. А получается, что не так?
51 Zhuravlik
 
22.04.12
21:11
Видимо с этим вопросом я один на один)))) Спасибо всем за помощь.
52 Torquader
 
22.04.12
21:13
(50) Если всё сделано правильно, то повторно задавать не надо, если, конечно, вид не поменялся.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn