1с как программно изменить тип реквизита формы

Как программно изменить тип реквизита формы?

Я
   KalachevDV

13.03.09 — 12:01

Задача следующая. В общей форме есть реквизит составного типа. Доступные типы реквизита заданы в конфигураторе. Можно ли программно изменить тип этого реквизита? Необходимо добавить в доступные типы этого реквизита еще несколько…

  

Партнерская программа EFSOL Oblako

   ТелепатБот

1 — 13.03.09 — 12:01

   73

2 — 13.03.09 — 12:05

ПолеВвода (TextBox)

ОграничениеТипа (TypeRestriction)

Использование:

Чтение и запись.

Описание:

Тип: ОписаниеТипов. Ограничивает состав типов вводимых значений. Может использоваться, когда данные, с которыми связан элемент управления, имеют более широкий состав типов, чем необходимо предоставить пользователю для ввода в конкретной ситуации.

   73

3 — 13.03.09 — 12:06

(2) + Упс. Ошибся. В (0) Добавить надо :(

   Stepa86

4 — 13.03.09 — 12:08

Может лучше ПланВидовХарактеристик заюзать для этого…

   Mitriy

5 — 13.03.09 — 12:11

(0) нет

   Mitriy

6 — 13.03.09 — 12:13

(0) ты не путаешь реквизиты с элементами формы?

   KalachevDV

7 — 13.03.09 — 12:13

(6) Нет, именно реквизит формы.

   Mitriy

8 — 13.03.09 — 12:17

(7) тады (5), а вообще:

Расширение элементов управления, расположенных в форме
ТипЗначения (ValueType)
Использование:
Чтение и запись.
Описание:
Тип: ОписаниеТипов. Содержит объект, описывающий допустимые типы значений для элемента управления.
Недоступно на сервере 1С:Предприятие. Не используется в модуле внешнего соединения.
Примечание:
Для элементов управления, не связанных с данными, свойство доступно для записи.
Для элементов управления, связанных с данными, свойство доступно только для чтения.

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

   KalachevDV

9 — 13.03.09 — 12:40

(8) Непрокатит… проверял.
Для элементов управления, связанных с данными, свойство доступно только для чтения. А элемент управления связан с реквизитом формы. и его тип значения = типу значения реквизита формы.
В общем похоже что сделать сабж невозможно.

   Stepa86

10 — 13.03.09 — 12:42

(9) а зачем тебе это???

   Mitriy

11 — 13.03.09 — 12:44

(9) дык и я о том же… а в (8) то, что возможно, если забить на реквизиты…

   KalachevDV

12 — 13.03.09 — 12:47

(10) Правлю типовую бухию. Изменить в конфигураторе можно и не сложно. Но, млин, 100% забуду что делал при обновлении. Шутка :) Не скажу что чисто спортивный интерес, но ради самообразования решил покопаться поглубже.
Спс, за ответы, признателен.

   Mitriy

13 — 13.03.09 — 12:51

(12) еще один совет: не правь типовую форму, а скопируй ее, сделай в копии, что хочешь, а потом подключи вместо типовой… типовую оставь, как есть… тогда проще будет обновляться…

  

KalachevDV

14 — 13.03.09 — 12:59

(13) Спс. Знаю это, поэтому и пробовал сначала сделать программно. Тогда проблем бывают редко. Форма «МониторНастроекОбмена». какой-то чудак указал только несколько планов обмена в качестве доступных для отображения в форме. А у нас свои добавлены ПО. Так что в этом случае думаю можно.

barracuda1991

1 / 1 / 1

Регистрация: 30.07.2015

Сообщений: 121

1

1C 8.x

Интерактивное изменение типа значения поля ввода на форме

07.09.2016, 12:30. Показов 17162. Ответов 4

Метки нет (Все метки)


Здравствуйте! Подскажите, можно ли программно прописать, чтобы после выбора типа значения в поле списка (на форме) автоматически менялся тип значения в поле ввода (имеющий составной тип данных в конфигураторе)?

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
Процедура ВыборТипЗначенияПриИзменении(Элемент)
    ВыбранноеЗначение = ЭлементыФормы.ВыборТипЗначения.Значение;
    Если ВыбранноеЗначение = "Строка" Тогда
        ЭлементыФормы.ПолеВвода1.ТипЗначения.ПривестиЗначение("Строка");
        Сообщить("Выбрано строка");
    ИначеЕсли ВыбранноеЗначение = "Число" Тогда
        ЭлементыФормы.ПолеВвода1.ТипЗначения.ПривестиЗначение("Число");
        Сообщить("Выбрано число");
    ИначеЕсли ВыбранноеЗначение = "СправочникСсылка.Номенклатура" Тогда
        ЭлементыФормы.ПолеВвода1.ТипЗначения.ПривестиЗначение("СправочникСсылка.Номенклатура");
        Сообщить("Выбрано СправочникСсылка.Номенклатура");
    КонецЕсли;
КонецПроцедуры

Миниатюры

Интерактивное изменение типа значения поля ввода на форме
 



0



Dethmontt

Модератор

Эксперт 1С

3708 / 2905 / 572

Регистрация: 10.03.2011

Сообщений: 11,442

Записей в блоге: 1

07.09.2016, 17:15

2

barracuda1991, да, присвоив пустое значение нужного типа полюВвода

Добавлено через 3 минуты

1C
1
2
3
4
5
6
7
Процедура ВыборТипЗначенияПриИзменении(Элемент)
       
        ОТ = Новый ОписаниеТипов(ВыборТипЗначения);
        ПолеВвода1 = ОТ.ПривестиЗначение();
        Сообщить("Выбрано "+ВыборТипЗначения+");
 
КонецПроцедуры



1



barracuda1991

1 / 1 / 1

Регистрация: 30.07.2015

Сообщений: 121

08.09.2016, 09:33

 [ТС]

3

{Форма.Форма.Форма(492)}: Поле объекта недоступно для записи (ПолеВвода1)
ЭлементыФормы.ПолеВвода1 = ОТ.ПривестиЗначение();
Получилось так:

1C
1
2
3
    Реквизит = Метаданные.Справочники.Номенклатура.Реквизиты.Найти(ЭлементыФормы.ВыборТипЗначения.Значение);
    ЭлементыФормы.ПолеВвода1.ОграничениеТипа = Новый ОписаниеТипов(Реквизит.Тип);
    ЭлементыФормы.ПолеВвода1.Значение=ЭлементыФормы.ПолеВвода1.ОграничениеТипа.ПривестиЗначение(ЭлементыФормы.ПолеВвода1.Значение);

Спасибо.



0



Модератор

Эксперт 1С

3708 / 2905 / 572

Регистрация: 10.03.2011

Сообщений: 11,442

Записей в блоге: 1

08.09.2016, 23:26

4

Цитата
Сообщение от barracuda1991
Посмотреть сообщение

ЭлементыФормы.ПолеВвода1 = ОТ.ПривестиЗначение();

зачем ЭлементыФормы ???

Цитата
Сообщение от Dethmontt
Посмотреть сообщение

ПолеВвода1 = ОТ.ПривестиЗначение();

Где я тут что то писал про элементыФормы ???

Добавлено через 39 секунд
barracuda1991, нужно было просто скопировать текст процедуры себе



0



0 / 0 / 0

Регистрация: 12.11.2015

Сообщений: 1

17.05.2017, 21:39

5

Добавлено через 24 секунды

Цитата
Сообщение от Dethmontt
Посмотреть сообщение

Сообщение от barracuda1991
ЭлементыФормы.ПолеВвода1 = ОТ.ПривестиЗначение();
зачем ЭлементыФормы ???
Сообщение от Dethmontt
ПолеВвода1 = ОТ.ПривестиЗначение();

Если ограничивать тип для ЭлементыФормы.ПолеВвода1 тогда не «слетает» значение реквизита ПолеВвода1 если она уже правильного типа,
а при ПолеВвода1 = ОТ.ПривестиЗначение(); фактически устанавливается пустая ссылка текущему значению реквизита ПолеВвода1

ИМХО лучше через ЭлементыФормы



0



Показывать по
10
20
40
сообщений

Новая тема

Ответить

Мозголом

Дата регистрации: 27.02.2007
Сообщений: 145

Платформа: 1С 8.2<br>Конфигурация: 1С УТ 10.3, 1С: Розница<br> <br>Описание: на форме имеется табличная часть, у которой есть некоторый реквизит. Он составной. По умолчанию я его делаю Номенклатурой и документом Установка Цен. При работе просто выбираю необходимый мне тип и заполняю значение в каждой строке.<br> <br>Вопрос: как программно назначать тип реквизиту. нужно чтобы обработка была универсальна, а для этого нужно чтобы для УТ типы были Номенклатура и становка Цен, а для Розницы Номенклатура и Установка цен в магазине (это документ). Вот собственно вопрос: можно ли программно в зависимости от того, какая конфигурация загружена, назначать тип выбираемого реквизита в таблице?<br> <br>P.S.: Прошу в ответе не учитывать метод определения конфигурации, это моя проблема и я ее решил.

Prikum

активный пользователь

офлайн

Дата регистрации: 18.02.2002
Сообщений: 20842

«<pre>// установим тип Справочник.Контрагенты<br>МойРеквизит = Справочники.Контрагенты.ПустаяСсылка(); <br></pre>»

Мозголом

Дата регистрации: 27.02.2007
Сообщений: 145

А если мне нужно чтобы назначалось 2 типа? справочник и документ? чтобы потом при работе уже выбирать нужный тип для каждой строки

Prikum

активный пользователь

офлайн

Дата регистрации: 18.02.2002
Сообщений: 20842

Мозголом

Дата регистрации: 27.02.2007
Сообщений: 145

При создании обработки для реквизита я могу казать, что он составного типа, и выбрать для него типы «СправочникСсылка.Номенклатура» и «ДокументСсылка.УстановкаЦенНоменклатуры». При интерактивном вводе строки я сначала выбираю значение какого типа мне нужно добавить в таблицу, а потом выбираю уже непосредственно нужный мне элемент, исходя из типа.<br>Так вот собственно вопрос: можно ли программным способом назначать, какие типы мне можно будет выбрать при добавлении строки в таблицу?<br> <br>Можно конечно просто добавить типы «СправочникСсылка» и «ДокументСсылка», но тогда конечный пользователь может запутаться при добавлении строки. Поэтому выбор типа нужно ограничить.

Мозголом

Дата регистрации: 27.02.2007
Сообщений: 145

«А все, разгадал загадку. Вот такое решение я принял:<br> <br><br><pre>Процедура ТабличнаяЧасть1Реквизит1НачалоВыбора(Элемент, СтандартнаяОбработка) // Вставить содержимое обработчика. ТипСпр = Тип(«СправочникСсылка.Номенклатура»); ТипДок = Тип(«ДокументСсылка.УстановкаЦенНоменклатуры»); Если ТипЗнч(Элемент.Значение) <> ТипСпр И ТипЗнч(Элемент.Значение) <> ТипДок Тогда       Массив = Новый Массив;       Массив.Добавить(ТипСпр);       Массив.Добавить(ТипДок);       ОписаниеТипов = Новый ОписаниеТипов(Массив);       Элемент.ОграничениеТипа = ОписаниеТипов; КонецЕсли;КонецПроцедуры </pre><br><br> <br>ТипДок могу менять в зависимости от конфигурации и настроек обработки.<br> <br>Статья, где нашел примерный метод: http://v8.1c.ru/metod/faq/answer.jsp?id=176″

Показывать по
10
20
40
сообщений

Задача.
Например, есть табличная часть с двумя колонками «ВидПоступленияДС» и «Аналитика». Поле «Аналитика» может содержать значения составного типа. Необходимо, в зависимости от введенного значения в поле «ВидПоступленияДС», установить нужный тип для поля «Аналитика».
Решение.
В событии «ПриИзменении» поля ввода «ВидПоступленияДС» пропишем следующий код:

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

Для этого можно присвоить реквизиту формы значение пустой ссылки нужного типа. Одного из тех типов, которые входят в составной тип.

Например, для поля ввода, связанного с реквизитом, который может принимать значение ссылки на справочники физических и юридических лиц, назначение нужного типа может выглядеть следующим образом:

Объект.ОтветЛицо = ПредопределенноеЗначение("Справочник.ФизическиеЛица.ПустаяСсылка");

Если запретить выбор типа в поле ввода (свойство ВыбиратьТип), то реквизиту ОтветЛицо будет назначен тип ссылки на справочник ФизическиеЛица, и для выбора будут предлагаться значения только этого справочника.

Также можно использовать свойство поля ввода ОграничениеТипа, задающее возможные типы данных, которые могут быть введены в поле ввода, и приводить значение соответствующего реквизита к нужному типу:

Массив = Новый Массив();
Массив.Добавить(Тип("СправочникСсылка.ФизическиеЛица"));
НашеОписание = Новый ОписаниеТипов(Массив);
Элементы.ОтветЛицо.ОграничениеТипа = НашеОписание;
Объект.ОтветЛицо = НашеОписание.ПривестиЗначение(Объект.ОтветЛицо);

Просматривая Волшебный форум, наткнулся на тему, в которой коллега интересовался возможностью отключения выбора типа в элементе табличной части справочника при программной установке значения в реквизите составного типа. Приведу часть своего кода, всю тему можно посмотреть здесь.

&НаКлиенте
Процедура ДобавитьВалюту(Команда)
    
    ТС = Объект.ТЧ.Добавить();
    ТС.Имя = "Валюта";
    ТС.Значение = ПредопределенноеЗначение("Справочник.Валюты.ПустаяСсылка");
    Элементы.ТЧ.ПодчиненныеЭлементы.ТЧЗначение.ВыбиратьТип = Ложь;
    
КонецПроцедуры
 

После решил добавить решению универсальности и реализовать программное формирование контекстного меню для табличной части справочника с составным реквизитом с заранее неизвестным перечнем типов.

Создаем справочник, имя произвольное. Добавляем табличную часть ТЧ, реквизиты Имя, тип Строка, Значение, тип составной. Для своего примера я установил Строка, Дата, Число, СправочникСсылка. В форме элемента добавляем реквизит ФормаТипы, тип ОписаниеТипов.

Остальное за нас сделает код:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
 
 //формируем массив типов и удаляем тип текущего справочника, 
 //поскольку у нас тип значения включает все справочники
 фТипы = РеквизитФормыВЗначение("Объект").Метаданные().ТабличныеЧасти.ТЧ.Реквизиты.Значение.Тип.Типы();
 фИндекс = фТипы.Найти(ТипЗнч(Объект.Ссылка));
 фТипы.Удалить(фИндекс);
 //помещаем новое описание типов в реквизит формы
 ФормаТипы = Новый ОписаниеТипов(фТипы);
 //формируем группу контекстного меню
 фГруппа = Элементы.Добавить("ГруппаДополнительно", Тип("ГруппаФормы"), Элементы.ТЧКонтекстноеМеню);
 фГруппа.Заголовок = "Добавить...";
 мТипы = ФормаТипы.Типы();
 Для сч = 0 По мТипы.ВГраница() Цикл
  
  //создаем команды формы, имена формируются с учетом индекса текущего типа в массиве типов
  //потом по этому индексу в имени будем определять необходимый тип данных
  ИндексКоманды = Формат(сч, "ЧН=0; ЧГ=0");
  фКоманда = Команды.Добавить("КомандаДобавитьТипСтроки_" + ИндексКоманды);
  фКоманда.Действие = "ДобавитьЭлементТипа";
  кЭлемент = Элементы.Добавить("ДобавитьТипСтроки_" + ИндексКоманды, Тип("КнопкаФормы"), фГруппа);
  кЭлемент.Заголовок = Строка(мТипы[сч]);
  кЭлемент.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели;
  кЭлемент.ИмяКоманды = фКоманда.Имя;
  
 КонецЦикла;
 
КонецПроцедуры                                     

&НаКлиенте
Процедура ДобавитьЭлементТипа(Команда)

 //определяем индекс для массива типов
 ИндексТипа = Число(СтрЗаменить(Команда.Имя, "КомандаДобавитьТипСтроки_", ""));
 сТип = ФормаТипы.Типы()[ИндексТипа];
 ТС = Объект.ТЧ.Добавить();
 ТС.Имя = Строка(сТип);
 мТипы = Новый Массив;
 мТипы.Добавить(сТип);
 //формируем новое описание типов и приводим к пустому значению этого типа
 ТипТС = Новый ОписаниеТипов(мТипы);
 ТС.Значение = ТипТС.ПривестиЗначение();
 Элементы.ТЧЗначение.ВыбиратьТип = Ложь;
 
КонецПроцедуры


&НаКлиенте
Процедура ТЧПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)

 //при добавлении через стандартную команду формы будем выбирать тип
 Элементы.ТЧЗначение.ВыбиратьТип = Истина;
 
КонецПроцедуры
 

Теперь запускаем конфигурацию и добавляем элемент нашего справочника. При использовании стандартной команды формы Добавить перед выбором значения мы будем выбирать его тип. При добавлении через программно сформированные пункты контекстного меню значение будет приводиться к необходимому типу.

Понравилась статья? Поделить с друзьями:
  • 1с как программно получить реквизит справочник
  • 1с как программно создать реквизит справочника
  • 1с как распечатать реквизиты своей организации
  • 1с как установить тип для составного реквизита
  • 1с найти все элементы справочника по реквизиту