Реквизит неопределенного типа -> строка. Работа на форме |
Я |
17.06.08 — 15:07
Есть документ.
В табличной части реквизит: реквМой; в этом реквизите должно содержаться значение любого типа; при начале редактирования строки этому реквизиту назначается тип.
Чтобы хранить строку сделал второй реквизит ТЧ: реквМойСтрокой с типом Строка.
Т.о. чтобы сохранить строку, нужно занести эту строку именно в реквизит реквМойСтрокой.
А как сделать удобной работу пользователя при корректировке? Если расположить оба реквизита на форме, пользователю придется самому выбирать какой из них заполнять — что не гут.
Кто еще как-нидь решал такой вопрос?
1 — 17.06.08 — 15:07
2 — 17.06.08 — 15:08
(0) Тупо видимостью колонки.
3 — 17.06.08 — 15:10
(2) Дык в разных строка могут быть значения разных типов. Блин, забыл это сказать в (0), сорри
4 — 17.06.08 — 15:14
(3) Тогда вообще скрой Обе колонки, сделай одну текстовую — в ней и показывай. что хочешь…а при клике на колонке — вводи/редактируй…
5 — 17.06.08 — 15:19
(0) 1С-ники уже решили — строка с кнопкой выбора + ПриначалеВыбораЗначения + ОбработкаВыбораЗначения. Хватает на все случаи жизни
6 — 17.06.08 — 15:26
(5) Факт … Забыл уже про педальку 
Еще можно делаать Форма.КолонкаСтроковая.Редактирование(0), если присвоили тип типа справочника, чтоб строку не могли ввести, чтоб токма с педальки выбор был ..
7 — 17.06.08 — 15:42
(5) Придется хранить еще и строковое представление объекта строкой + при открытии старого документа оно может отличаться от текущего значения в базе: например, сохранили контрагента и его наименование строкой. Потом наименование сменилось, а в документе старое значение отображаетя.
(6) Форма.КолонкаСтроковая.Редактирование(0) действует на всю колонку, поэтому придется использовать ВвестиСтроку() для строк …
8 — 17.06.08 — 15:45
(7) Зачем «хранить еще и строковое представление объекта строкой»??
9 — 17.06.08 — 15:46
(8) больше 22 символов видать надоть …
10 — 17.06.08 — 15:46
(6) а если юзеру вздумается сменить тип? тут уж лучше — либо руками набирай, либо на педаль дави.
11 — 17.06.08 — 15:46
(7) Не угадал, будешь менять в ПриНачалеВыбораЗначения
12 — 17.06.08 — 15:48
(9) На сколько я понял (7), он в новой колонке хочет показывать текстовое представление объекта, занесенного в скрытую колонку. Так зачем для этого хранить это самое представление в документе?
13 — 17.06.08 — 15:48
(10) Та не , автор же где-то устанавливает нужный тип, и скорее всего, в зависимости от другово реквизита… вот и будет в ПриНачалеВыбораЗначения делать
Редактирование(0/1) в зависимости от этого типа …
14 — 17.06.08 — 15:50
(0) А как вообще база/пользователь понять должны, что именно сейчас будет заполняться — строка или объект агрегатного типа? Менюшка будет вываливаться?
15 — 17.06.08 — 15:50
(12) Ну тогда да…. ХЗ , чего он там хранит 
16 — 17.06.08 — 15:52
(11) Ты про Редактирование(0)? Я сделал в прцедуре при выборе третьего реквизита ТЧ, о нем в (0) не сказано, т.к. он имеет тип — обычный справочник,
При этом запрещается редактирование реквизита во всех строках …
17 — 17.06.08 — 15:55
(16) Всё равно можно сделать… 
Хотя бы через формулу Текста на форме …
Строковый тебе реквизит нафига сдался в ТЧ дока ? Из-за (9) ?
18 — 17.06.08 — 15:55
(16) Слушай, автор. Может ты все-таки подробно объяснишь механику своих хотелок. Трудно ведь быть телепатом.
19 — 17.06.08 — 15:58
(14) Тип назначается при выборе другого реквизита ТЧ.
Вся проблема в том, что 2 реквизита: реквМой и реквМойСтрокой, а на форме хочется иметь только одну колонку, ведь зверь и понятия не имеет, что у 1С всего 22 см. …
Про педальку не очень понял. Ее можно весить только на реквизит ТЧ, значит этот реквизит нужно будет отображать, а если так, то будет тот реквизит, значение которого (по мнению пользователя) редактируется. Я могу сделать, что нажатием педальки будет выбираться, например значение элемента справочника и записываться в колонку реквМой, которая скрыта. А как зверь узнает, что значение изменилось …?
20 — 17.06.08 — 15:58
(17) Конечно из-за (9)
21 — 17.06.08 — 16:02
(19) Колонка — реквизит неопределенного типа. На скрытом слое — 2 реквизита формы: строка и чего там тебе надо из агрегатных типов. При начале редактирования ячейки — делать один (нужный) из скрытых реквизитов видимым и подгонять его под положение и размер редактируемой ячейки.
За образец взять класс Общие.РедакторТаблицыЗначений.
22 — 17.06.08 — 16:03
(18) По-пробую исчо раз.
1) В реквизите ТЧ храню некое значение. Типы могут быть различны => рекв. неопределенного типа: реквМой
2) Но строку длинее 22 симв. не сохранишь => нужно как-то вывернуться — придумал второй реквизит — строковый: реквМойСтрокой
3) Но пользователь просто хочет записать туда некое значение и он не должен делать выбор в какой из 2 реквизитов писать, => на форме нуно отобразить вместо этих 2 реквизитов только одну колонку.
Вот тут и загвоздка: как сделать, чтобы редактирование значения в этой колонке выполнялось максимально приближенно (для пользователя) к редактированию обычного реквизита ТЧ
23 — 17.06.08 — 16:04
(21) У меня ТЧ и без ВК …
24 — 17.06.08 — 16:05
(23) Почему такое требование — «без ВК»?
25 — 17.06.08 — 16:05
(19) У тебя 2 реквизита, один строковый, второй неопределенный…
втыкаешь токма строковый , ставишь в свойствах колонки — педалька на …
Ловишь педальку в ПриНачалеВыбораЗначения(), назначаешь тип — выбираешь что надо …Присваиваешь в ОбработкеВыбораЗначения неопр.реквизиту нужное значение …
в ПриНачалеРедактированияСтроки, ПриРедактированииНовойСтроки(),в ПриНачалеВыбораЗначения делаешь Редактирование(0/1) для этой колонки, в зависимости от типа… чтоб строку не мог ввести, ежели агрегатный объект.
26 — 17.06.08 — 16:06
+(23) Однако если на скрытом слое обычный реквизит, то его нужно будет двигать поверх ТЧ, я правильно понял?
27 — 17.06.08 — 16:07
(24) Не люблю я ВК, хотя не считаю их однозначным злом. Поэтому, если мона без ВК, то лучше без них. Если так не удается, то мона думать и про ВК …
28 — 17.06.08 — 16:08
(26) Да, правильно. Формекс с этим прекрасно справляется 
Ёпрст3 тебе более простое решение подсказал.
29 — 17.06.08 — 16:09
(25) Прекрасно, но как значение неопр.реквизита будет отображаться на форме, если я там отображаю только строковую колонку? Вот о чем я говорю, при таком способе решения …
30 — 17.06.08 — 16:10
(28) Бли, это же какой гемор точно по пикселям таскать реквизит и менять передавать фокус … Страшно 
31 — 17.06.08 — 16:10
(29) Поле = СокрЛП(АгрегатныйРеквизит)

32 — 17.06.08 — 16:11
(29) В строковом Реквизите ! Как же еще :))
33 — 17.06.08 — 16:16
(32)
1) Т.о. в строковый реквизит пишем, например, наименование выбранного агрегатного — ОК
2) Раз это реквизит документа, то это значение при записи сохранится
3) Открыв документ через некоторое время мы видим только это самое наименование — ОК
4) Пусть прошло еще некоторое время и наименование этого элемента изменилось, и вот мзверь открыл документ и видит, что в строке совсем не тот элемент (он ведь не догадывается что это строковое представление элемента 5-ти летней давности) … Вот тут-то и есть не гут этого метода …
34 — 17.06.08 — 16:18
(30) Зачем по пикселам? Есть хороший метод:
УстановитьКоординаты(<?>,,,)
СИНТАКСИС:
УстановитьКоординаты(<Лево>,<Верх>,<Ширина>,<Высота>)
НАЗНАЧЕНИЕ:
Устанавливает новые значения для положения и размеров атрибута. Если какой-либо параметр
при вызове метода не задан, то данный параметр не изменяется.
ПРИМЕР:
АтрФормы = СоздатьОбъект(«АтрибутФормы»);
АтрФормы.УстановитьАтрибут(Форма,3);
Высота=0;
АтрФормы.ПолучитьКоординаты(,,,Высота);
АтрФормы.УстановитьКоординаты(,,,Высота+40);
ПАРАМЕТРЫ:
<Лево> — Необязательный параметр. Расстояние от левой границы формы до левой границы атрибута.
<Верх> — Необязательный параметр. Расстояние от верхней границы формы до верхней границы атрибута.
<Ширина> — Необязательный параметр. Ширина атрибута.
<Высота> — Необязательный параметр. Высота атрибута.
35 — 17.06.08 — 16:20
(33) «Пусть прошло еще некоторое время и наименование этого элемента изменилось, и вот мзверь открыл документ и видит, что в строке совсем не тот элемент (он ведь не догадывается что это строковое представление элемента 5-ти летней давности) … Вот тут-то и есть не гут этого метода …»
Так ты при открытии документа предусмотри перезапись реквизита актуальными данными.
36 — 17.06.08 — 16:22
(33) Влепи еще текстовую колонку …
Если открыли токма на просмотр — показывай её, остальные скрывай.
Если на редактирование — скрывай текст, а строковую колонку перезаполняй актуальными данными.
(35) При каждом открытии документа шерстить все строки и перезаписывать? А если в документе 100 строк? А если пользователей хотя бы 10 человек?
Назначить тип для реквизита неопределенного типа.
Синтаксис
Метод НазначитьТип() имеет следующий синтаксис:
НазначитьТип(ИмяРеквизита, ИмяТипа, [Длина], [Точность])
А также альтернативный англоязычный синтаксис:
SetType(FieldName, TypeName, [Length], [Precision])
Параметры
Описание параметров метода НазначитьТип():
| Имя параметра | Тип | Описание |
|---|---|---|
| ИмяРеквизита | Строка | наименование реквизита неопределенного типа, как он задан в конфигураторе. |
| ИмяТипа | Строка | имя типа, которое необходимо присвоить реквизиту. Например:Строка,Число,Справочник.Товары,Документ.ПриходнаяНакладная |
| Длина | Число | допустимая длина значения строкового или числового типа |
| Точность | Число | допустимая точность значения числового типа |
| Жирным шрифтом выделены обязательные параметры |
Описание
Метод НазначитьТип() назначает тип для реквизита неопределенного типа. Только после этого реквизиту можно присвоить значение нужного типа (в противном случае, поле останется пустым)
Пример использования
Пример кода с использованием метода НазначитьТип():
Товар = СоздатьОбъект("Справочник.Товары"); //создаем новый элемент справочника Товар.Новый(); //неправильно: Товар.ДопЗначение = 1; Сообщить(Товар.ДопЗначение); //рузльтат: // <> //правильно: Товар.НазначитьТип("ДопЗначение", "Число", 1); Товар.ДопЗначение = 1; Сообщить(Товар.ДопЗначение); //Результат: // 1
Поделиться страницей в соц.сетях
Много задач сводится к тем, которые нельзя формализовать. Ну, например, ввод остатков. Субконто могут быть разные. Кроме того, если речь заходит о универсальных документах, например авансовый отчет, то в нем могут быть совершенно разные корреспонденции счетов, а у счетов могут быть разные субконто. Как тут поступать? Можно сделать неопределенный реквизит.
А определять его программный путем в зависимости от корреспонденции счетов. Итак, сделаем на документ кнопку, по которой будет меняться тип реквизита. Основа всего функция Назначить тип.
НазначитьТип
Назначить тип для реквизита неопределенного вида.
Синтаксис:
НазначитьТип(<ИмяРеквизита>, <ИмяТипа>, <Длина>, <Точность>)
Англоязычный синоним:
SetType
Параметры:
<ИмяРеквизита> Строковое выражение — название реквизита документа неопределенного типа, как он назван в конфигураторе.
<ИмяТипа> Строковое выражение — название типа данных (или Вид субконто), который назначается реквизиту документа. Например: «Строка», «Число», «Справочник.Товары», «Документ.РасходнаяНакладная» и т. п.
<Длина> Необязательный параметр. Числовое выражение — длина поля представления данных. Имеет смысл только при задании числового или строкового типа.
<Точность> Необязательный параметр. Числовое выражение — число знаков числа после десятичной точки. Имеет смысл только при задании числового типа.
Описание:
Метод НазначитьТип позволяет назначить тип для реквизита, которому в конфигураторе назначен тип <Неопределенный>.
Пишем код:
Процедура Изменить()
Форма.Субконто.НазначитьТип("Справочник.Номенклатура");
КонецПроцедуры
Пробуем. Если кнопку не нажимать, то выбрать субконто будет нельзя.
После установки типа субконто уже можно будет выбрать.
Задача : установить значение реквизита (неопределенного типа )создаваего элемента справочника из обработки Как программно установить тип значения этого реквизита Кусок кода :
Синтаксис: НазначитьВид(<Значение>,<Вид>) Назначение: Процедура НазначитьВид используется для установки значениям типа »Документ неопределенного вида», »Справочник неопределенного вида», »Счет неопределенного вида» конкретного вида. При этом, если существующее значение не соответсвует вновь установленному виду — то оно очищается. Данная процедура может использоваться в сочетании с методом элемента формы НеИзменятьВид. Это возволяет регулировать программно собственно вид, а само значение предоставить выбирать пользователю интерактивно. Параметры: <Значение> — Значение типа документ/справочник/счет неопределенного вида — обычно реквизит документа, справочника или диалога формы. <Вид> — строковое выражение — вид значения. Может быть задан строкой, содержащей идентификатор конкретного справочника, документа, плана счетов. Вид субконто — вид значения может быть задан видом субконто, который имеет тип соответственно конкретного справочника, документа, счета.
не срабатывает , открываю элемент — там пустоые значения этих реквизитов
ТипЗначенияСтр(СчетДТ.ВидСубконто) <> «Строка»
НазначитьТип(СпрШаблон.СубконтоДт1,СчетДТ.ВидСубконто);
+ Для неопределенного типа.
СпрШаблон.НазначитьТип(«СубконтоДт1»,СчетДТ.ВидСубконто)
да получилось, спасибо большое за помощь всем откликнувшимся !
ты думаешь, что с не вышло бы ?
Не уверен, но нваерное не получилось бы. Там в описании написано, что это для Документа или Справочника общего вида, а у него реквизит вообще неопределнного вида.
И для реквизита с типом значения Документ или Справочник общего вида для присвоения необязательно усатанавливать конкретный вид, оно и так присвоится, а НазначитьВид используется в этом случае , чтобы при выборе не появлялось окно выбора вида документа или справочника.
Ну это надо у ТС уточнить, что он имел ввиду под
Тэги: 1С 7.7 и ранее
Комментарии доступны только авторизированным пользователям
Показывать по
10
20
40
сообщений
Новая тема
Ответить
Thorvardr
Дата регистрации: 25.02.2005
Сообщений: 3082
Платформа: 7.70.027<br>Конфигурация: любая<br><br>А у нас в реквизите неопределенного типа строка хранится с длиной не более чем 22 символа что ли?<br><br>Пример, в котом видно грабли:<br>Конфигуарция 1С:Предприниматель 7.7, релиз 7.70.155, типовой.<br>1. Создаем новый документ «Строка выписки банка (приход)».<br>2. В форме имеется поле для занесения «Платежного документа». Записываем туда строковое представление, например «Платежное поручение №365 от 02.07.2009 г.», сохраняем документ, закрываем его<br>3. Открываем его снова и видим, что в поле то указано только «Платежное поручение №3»
zak555 (398843952)
Дата регистрации: 27.03.2008
Сообщений: 4656
> Платформа: 7.70.027<br>> Конфигурация: любая<br>> <br>> А у нас в реквизите неопределенного типа строка хранится с длиной не более чем 22 символа что ли?<br>> <br>> Пример, в котом видно грабли:<br>> Конфигуарция 1С:Предприниматель 7.7, релиз 7.70.155, типовой.<br>> 1. Создаем новый документ «Строка выписки банка (приход)».<br>> 2. В форме имеется поле для занесения «Платежного документа». Записываем туда строковое представление, например «Платежное поручение №365 от 02.07.2009 г.», сохраняем документ, закрываем его<br>> 3. Открываем его снова и видим, что в поле то указано только «Платежное поручение №3″<br><br>для хранения неопределенного типа отводится 22 литерала для представления внутренного хранения
Thorvardr
Дата регистрации: 25.02.2005
Сообщений: 3082
Безобразие, в общем… Переделал, теперь у меня все норм, остальным сочуствую
zak555 (398843952)
Дата регистрации: 27.03.2008
Сообщений: 4656
> Безобразие, в общем… Переделал, теперь у меня все норм, остальным сочуствую<br><br>какова реализация?
Thorvardr
Дата регистрации: 25.02.2005
Сообщений: 3082
А там 1С сама сделала предпосылки для реализации, просто тестировали на троечку, вот и не работает у них в конфигурации как положено. В документе имеется скрытый реквизит определенного типа «Строка», в котором хранится истинное значение. Нужно лишь при открытии формы диалога переносить его в элемент управления формы диалога, который имеет неопределенный тип. Они в ПриОткрытии() написали:<br><br>Если Выбран()=0 Тогда<br>… переносим значение в реквизит формы<br><br>вот с чего так то? Зачем сделали «Если Выбран()=0 Тогда»? перенос значения в реквизит формы делать надо в любом случае, хоть записан документ (наш пример), хоть создается новый (ВводНового() срабатывает до ПриОткрытии() и в скрытые реквизиты заносятся какие то значения и тоже должны быть перенесены в элементы управления формы). Короче, лишняя срезка там стояла, я ее заремкал и все заработало как положено.
Показывать по
10
20
40
сообщений




