Имя: Пароль:
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) Если всё сделано правильно, то повторно задавать не надо, если, конечно, вид не поменялся.
Программист всегда исправляет последнюю ошибку.