Реквизит неопределенного типа

Реквизит неопределенного типа -> строка. Работа на форме

Я
   YF

17.06.08 — 15:07

Есть документ.

  В табличной части реквизит: реквМой; в этом реквизите должно содержаться значение любого типа; при начале редактирования строки этому реквизиту назначается тип.

  Чтобы хранить строку сделал второй реквизит ТЧ: реквМойСтрокой с типом Строка.

  Т.о. чтобы сохранить строку, нужно занести эту строку именно в реквизит реквМойСтрокой.

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

  Кто еще как-нидь решал такой вопрос?

   ТелепатБот

1 — 17.06.08 — 15:07

   Ёпрст

2 — 17.06.08 — 15:08

(0) Тупо видимостью колонки.

   YF

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), если присвоили тип типа справочника, чтоб строку не могли ввести, чтоб токма с педальки выбор был ..

   YF

7 — 17.06.08 — 15:42

(5) Придется хранить еще и строковое представление объекта строкой + при открытии старого документа оно может отличаться от текущего значения в базе: например, сохранили контрагента и его наименование строкой. Потом наименование сменилось, а в документе старое значение отображаетя.

(6) Форма.КолонкаСтроковая.Редактирование(0) действует на всю колонку, поэтому придется использовать ВвестиСтроку() для строк …

   Sadovnikov

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) Не угадал, будешь менять в ПриНачалеВыбораЗначения

   Sadovnikov

12 — 17.06.08 — 15:48

(9) На сколько я понял (7), он в новой колонке хочет показывать текстовое представление объекта, занесенного в скрытую колонку. Так зачем для этого хранить это самое представление в документе?

   Ёпрст

13 — 17.06.08 — 15:48

(10) Та не , автор же где-то устанавливает нужный тип, и скорее всего, в зависимости от другово реквизита… вот и будет в ПриНачалеВыбораЗначения делать
Редактирование(0/1) в зависимости от этого типа …

   Sadovnikov

14 — 17.06.08 — 15:50

(0) А как вообще база/пользователь понять должны, что именно сейчас будет заполняться — строка или объект агрегатного типа? Менюшка будет вываливаться?

   Ёпрст

15 — 17.06.08 — 15:50

(12) Ну тогда да…. ХЗ , чего он там хранит :)

   YF

16 — 17.06.08 — 15:52

(11) Ты про Редактирование(0)? Я сделал в прцедуре при выборе третьего реквизита ТЧ, о нем в (0) не сказано, т.к. он имеет тип — обычный справочник,

При этом запрещается редактирование реквизита во всех строках …

   Ёпрст

17 — 17.06.08 — 15:55

(16) Всё равно можно сделать… :)
Хотя бы через формулу Текста на форме …

Строковый тебе реквизит нафига сдался в ТЧ дока ? Из-за (9) ?

   victuan1

18 — 17.06.08 — 15:55

(16) Слушай, автор. Может ты все-таки подробно объяснишь механику своих хотелок. Трудно ведь быть телепатом.

   YF

19 — 17.06.08 — 15:58

(14) Тип назначается при выборе другого реквизита ТЧ.

Вся проблема в том, что 2 реквизита: реквМой и реквМойСтрокой, а на форме хочется иметь только одну колонку, ведь зверь и понятия не имеет, что у 1С всего 22 см. …

Про педальку не очень понял. Ее можно весить только на реквизит ТЧ, значит этот реквизит нужно будет отображать, а если так, то будет тот реквизит, значение которого (по мнению пользователя) редактируется. Я могу сделать, что нажатием педальки будет выбираться, например значение элемента справочника и записываться в колонку реквМой, которая скрыта. А как зверь узнает, что значение изменилось …?

   YF

20 — 17.06.08 — 15:58

(17) Конечно из-за (9)

   Sadovnikov

21 — 17.06.08 — 16:02

(19) Колонка — реквизит неопределенного типа. На скрытом слое — 2 реквизита формы: строка и чего там тебе надо из агрегатных типов. При начале редактирования ячейки — делать один (нужный) из скрытых реквизитов видимым и подгонять его под положение и размер редактируемой ячейки.

За образец взять класс Общие.РедакторТаблицыЗначений.

   YF

22 — 17.06.08 — 16:03

(18) По-пробую исчо раз.

1) В реквизите ТЧ храню некое значение. Типы могут быть различны => рекв. неопределенного типа: реквМой

2) Но строку длинее 22 симв. не сохранишь => нужно как-то вывернуться — придумал второй реквизит — строковый: реквМойСтрокой

3) Но пользователь просто хочет записать туда некое значение и он не должен делать выбор в какой из 2 реквизитов писать, => на форме нуно отобразить вместо этих 2 реквизитов только одну колонку.

Вот тут и загвоздка: как сделать, чтобы редактирование значения в этой колонке выполнялось максимально приближенно (для пользователя) к редактированию обычного реквизита ТЧ

   YF

23 — 17.06.08 — 16:04

(21) У меня ТЧ и без ВК …

   Sadovnikov

24 — 17.06.08 — 16:05

(23) Почему такое требование — «без ВК»?

   Ёпрст

25 — 17.06.08 — 16:05

(19) У тебя 2 реквизита, один строковый, второй неопределенный…
втыкаешь токма строковый , ставишь в свойствах колонки — педалька на …
Ловишь педальку в ПриНачалеВыбораЗначения(), назначаешь тип — выбираешь что надо …Присваиваешь в ОбработкеВыбораЗначения неопр.реквизиту нужное значение …

в ПриНачалеРедактированияСтроки, ПриРедактированииНовойСтроки(),в ПриНачалеВыбораЗначения делаешь Редактирование(0/1) для этой колонки, в зависимости от типа… чтоб строку не мог ввести, ежели агрегатный объект.

   YF

26 — 17.06.08 — 16:06

+(23) Однако если на скрытом слое обычный реквизит, то его нужно будет двигать поверх ТЧ, я правильно понял?

   YF

27 — 17.06.08 — 16:07

(24) Не люблю я ВК, хотя не считаю их однозначным злом. Поэтому, если мона без ВК, то лучше без них. Если так не удается, то мона думать и про ВК …

   Sadovnikov

28 — 17.06.08 — 16:08

(26) Да, правильно. Формекс с этим прекрасно справляется :)

Ёпрст3 тебе более простое решение подсказал.

   YF

29 — 17.06.08 — 16:09

(25) Прекрасно, но как значение неопр.реквизита будет отображаться на форме, если я там отображаю только строковую колонку? Вот о чем я говорю, при таком способе решения …

   YF

30 — 17.06.08 — 16:10

(28) Бли, это же какой гемор точно по пикселям таскать реквизит и менять передавать фокус … Страшно :-)

   Sadovnikov

31 — 17.06.08 — 16:10

(29) Поле = СокрЛП(АгрегатныйРеквизит)

:)

   Ёпрст

32 — 17.06.08 — 16:11

(29) В строковом Реквизите ! Как же еще :))

   YF

33 — 17.06.08 — 16:16

(32)

1) Т.о. в строковый реквизит пишем, например, наименование выбранного агрегатного — ОК

2) Раз это реквизит документа, то это значение при записи сохранится

3) Открыв документ через некоторое время мы видим только это самое наименование — ОК

4) Пусть прошло еще некоторое время и наименование этого элемента изменилось, и вот мзверь открыл документ и видит, что в строке совсем не тот элемент (он ведь не догадывается что это строковое представление элемента 5-ти летней давности) … Вот тут-то и есть не гут этого метода …

   Sadovnikov

34 — 17.06.08 — 16:18

(30) Зачем по пикселам? Есть хороший метод:

УстановитьКоординаты(<?>,,,)

СИНТАКСИС:

УстановитьКоординаты(<Лево>,<Верх>,<Ширина>,<Высота>)

НАЗНАЧЕНИЕ:

Устанавливает новые значения для положения и размеров атрибута. Если какой-либо параметр

при вызове метода не задан, то данный параметр не изменяется.

ПРИМЕР:

АтрФормы = СоздатьОбъект(«АтрибутФормы»);

АтрФормы.УстановитьАтрибут(Форма,3);

Высота=0;

АтрФормы.ПолучитьКоординаты(,,,Высота);

АтрФормы.УстановитьКоординаты(,,,Высота+40);

ПАРАМЕТРЫ:

<Лево> — Необязательный параметр.  Расстояние от левой границы формы до левой границы атрибута.

<Верх> — Необязательный параметр.  Расстояние от верхней границы формы до верхней границы атрибута.

<Ширина> — Необязательный параметр.  Ширина атрибута.

<Высота> — Необязательный параметр.  Высота атрибута.

   victuan1

35 — 17.06.08 — 16:20

(33) «Пусть прошло еще некоторое время и наименование этого элемента изменилось, и вот мзверь открыл документ и видит, что в строке совсем не тот элемент (он ведь не догадывается что это строковое представление элемента 5-ти летней давности) … Вот тут-то и есть не гут этого метода …»

Так ты при открытии документа предусмотри перезапись реквизита актуальными данными.

   Ёпрст

36 — 17.06.08 — 16:22

(33) Влепи еще текстовую колонку …
Если открыли токма на просмотр — показывай её, остальные скрывай.
Если на редактирование — скрывай текст, а строковую колонку перезаполняй актуальными данными.

(35) При каждом открытии документа шерстить все строки и перезаписывать? А если в документе 100 строк? А если пользователей хотя бы 10 человек?

Назначить тип для реквизита неопределенного типа.

Синтаксис

Метод НазначитьТип() имеет следующий синтаксис:

НазначитьТип(ИмяРеквизита, ИмяТипа, [Длина], [Точность])

А также альтернативный англоязычный синтаксис:

SetType(FieldName, TypeName, [Length], [Precision])

Параметры

Описание параметров метода НазначитьТип():

Имя параметра Тип Описание
ИмяРеквизита Строка наименование реквизита неопределенного типа, как он задан в конфигураторе.
ИмяТипа Строка имя типа, которое необходимо присвоить реквизиту. Например:
Строка,Число,
Справочник.Товары,
Документ.ПриходнаяНакладная
Длина Число допустимая длина значения строкового или числового типа
Точность Число допустимая точность значения числового типа
Жирным шрифтом выделены обязательные параметры

Описание

Метод НазначитьТип() назначает тип для реквизита неопределенного типа. Только после этого реквизиту можно присвоить значение нужного типа (в противном случае, поле останется пустым)Реквизит неопределенного типа в 1с 7.7

Пример использования

Пример кода с использованием метода НазначитьТип():

Товар = СоздатьОбъект("Справочник.Товары");
//создаем новый элемент справочника
Товар.Новый();

//неправильно:
Товар.ДопЗначение = 1;
Сообщить(Товар.ДопЗначение);
//рузльтат:
// <>

//правильно:
Товар.НазначитьТип("ДопЗначение", "Число", 1);
Товар.ДопЗначение = 1;
Сообщить(Товар.ДопЗначение);
//Результат:
// 1

Поделиться страницей в соц.сетях

Много задач сводится к тем, которые нельзя формализовать. Ну, например, ввод остатков. Субконто могут быть разные. Кроме того, если речь заходит о универсальных документах, например авансовый отчет, то в нем могут быть совершенно разные корреспонденции счетов, а у счетов могут быть разные субконто. Как тут поступать? Можно сделать неопределенный реквизит.

345_1.gif (7660 b)

А определять его программный путем в зависимости от корреспонденции счетов. Итак, сделаем на документ кнопку, по которой будет меняться тип реквизита. Основа всего функция Назначить тип.

НазначитьТип
Назначить тип для реквизита неопределенного вида.

Синтаксис:

НазначитьТип(<ИмяРеквизита>, <ИмяТипа>, <Длина>, <Точность>)

Англоязычный синоним:

SetType

Параметры:
<ИмяРеквизита> Строковое выражение — название реквизита документа неопределенного типа, как он назван в конфигураторе.
<ИмяТипа> Строковое выражение — название типа данных (или Вид субконто), который назначается реквизиту документа. Например: «Строка», «Число», «Справочник.Товары», «Документ.РасходнаяНакладная» и т. п.
<Длина> Необязательный параметр. Числовое выражение — длина поля представления данных. Имеет смысл только при задании числового или строкового типа.
<Точность> Необязательный параметр. Числовое выражение — число знаков числа после десятичной точки. Имеет смысл только при задании числового типа.

Описание:
Метод НазначитьТип позволяет назначить тип для реквизита, которому в конфигураторе назначен тип <Неопределенный>.

Пишем код:

Процедура Изменить()  
	Форма.Субконто.НазначитьТип("Справочник.Номенклатура");
КонецПроцедуры

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

345_2.gif (5821 b)

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

345_3.gif (13462 b)

Задача : установить значение реквизита (неопределенного типа )создаваего элемента справочника из обработки Как программно установить тип значения этого реквизита Кусок кода :

Синтаксис: НазначитьВид(<Значение>,<Вид>) Назначение: Процедура НазначитьВид используется для установки значениям типа »Документ неопределенного вида», »Справочник неопределенного вида», »Счет неопределенного вида» конкретного вида. При этом, если существующее значение не соответсвует вновь установленному виду — то оно очищается. Данная процедура может использоваться в сочетании с методом элемента формы НеИзменятьВид. Это возволяет регулировать программно собственно вид, а само значение предоставить выбирать пользователю интерактивно. Параметры: <Значение> — Значение типа документ/справочник/счет неопределенного вида — обычно реквизит документа, справочника или диалога формы. <Вид> — строковое выражение — вид значения. Может быть задан строкой, содержащей идентификатор конкретного справочника, документа, плана счетов. Вид субконто — вид значения может быть задан видом субконто, который имеет тип соответственно конкретного справочника, документа, счета.

не срабатывает , открываю элемент — там пустоые значения этих реквизитов

ТипЗначенияСтр(СчетДТ.ВидСубконто) <> «Строка»

НазначитьТип(СпрШаблон.СубконтоДт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
сообщений

Понравилась статья? Поделить с друзьями:

Вот еще несколько интересных статей нашего сайта:

  • Монгольские компании в москве
  • Мондиал бизнес консорциум ооо
  • Монетка реквизиты организации
  • Монополия на большую компанию
  • Монопольные компании в россии

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии