Установить тип значения реквизита 1с программно

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

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

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

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

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

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

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

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


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

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

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

Как программно установить тип реквизита

Автор Алексей_1985_06, 24 мая 2022, 20:08

0 Пользователей и 1 гость просматривают эту тему.

Уважаемые товарищи, подскажите вот с таким вопросом:

1.   Создан реквизит «Комплекс» с составным типом данных (СправочникСсылка.ТехническиеКомплексы, СправочникСсылка.СтартовыеКомплексы)
2.   Созданы два реквизита формы ТК (булево) и СК (булево)
3.   Необходимо что бы при ТК = Истина,  реквизит «Комплекс» — имел тип СправочникСсылка.ТехническиеКомплексы, а при СК = Истина реквизит «Комплекс» — имел тип СправочникСсылка.СтартовыеКомплексы.

 :befhbt: Или кто подскажет может по другому как-то реализуется процесс определения типа данных реквизита в зависимости от значения другого реквизита (типа Булево)


Непонятно, зачем переустанавливать типы? У вас они уже назначены составным типом. При записи элементов справочника в этот реквизит, тип сам будет устанавливаться в нужный.
Я бы действовал в обратную сторону. При записи в реквизит «Комплекс» элемент из СправочникСсылка.ТехническиеКомплексы, присваивать ТК = Истина. А при записи СправочникСсылка.СтартовыеКомплексы — СК = Истина.


Алексей_1985_06, сильно зависит от того какие формы, управляемые или обычные, действительно, когда у реквизита составной тип
(и не два как у вас а десяток) до задалбывает каждый раз для перевыбора элемента того-же типа, сначала выбирать этот-же тип а затем и сам элемент
для избежания этого, использую такой код

&НаКлиенте
Процедура ТаблицаОбработкиДубльНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

лкТекушаяСтрока = Элементы.СсылкиДублей.ТекущиеДанные;
Если лкТекушаяСтрока <> Неопределено Тогда
Элемент.ВыбиратьТип = Не ЗначениеЗаполнено(лкТекушаяСтрока.Значение);
КонецЕсли;

КонецПроцедуры
в вашем случае
вообще отключите возможность выбора Типа,
а при использовании булевых переключателей в их событии ПриИзменении(..), реквизиту Комплекс присваивайте Пустую ссылку нужного справочника!
тогда по кнопке Выбор, будут выбираться элементы из этого справочника.

  • 3 пользователя сказали спасибо!

если помогло нажмите: Спасибо!


LexaK, Большое Вам спасибо за помощь!!!!


программная установка типа реквизита на вид одного из справочников

Я
   falselight

25.10.16 — 13:00

На форме документа есть реквизит типа перечисление.

2 значения. Как программно устанавливать тип другого поля,

в зависимости от выбранного перечисления типа одного или

другого справочника?

  

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

   Ёпрст

1 — 25.10.16 — 13:08

ПривыбореПеречисления устанваливай тип

   mehfk

2 — 25.10.16 — 13:09

Автору поможет только живительная эвтаназия.

   falselight

3 — 25.10.16 — 13:22

(1) я имел ввиду как задавать тип реквизита программно, какой код будет примерно

   Ёпрст

4 — 25.10.16 — 13:30

тип того

ОписаниеТипа = Новый ОписаниеТипов(«СправочникСсылка.Организации»);

ЭлементыФормы.Организация.ОграничениеТипа = ОписаниеТипа;

ЭлементыФормы.Организация.Значение = …. ОписаниеТипа.ПривестиЗначение();

ЭлементыФормы.ВыбиратьТип = Ложь;

   falselight

5 — 25.10.16 — 14:01

(4) это так обязательно?????

   Ёпрст

6 — 25.10.16 — 14:01

нет

   Альбатрос

7 — 25.10.16 — 14:02

(5) можешь просто написать: тип того

   falselight

8 — 25.10.16 — 14:02

(6) ну а можно так как то задавать

если это то

значение = тип справочник такой то ?

   falselight

9 — 25.10.16 — 14:03

(7) можете по синтаксису привести пример?

   Альбатрос

10 — 25.10.16 — 14:06

(9) Тебе в (4) чем не пример?

   Fragster

11 — 25.10.16 — 14:06

снять галочку «выбирать тип» и присваивать пустое значение нужного типа

   torgm

12 — 25.10.16 — 14:13

(8) значение = Справочники.Организации.ПустаяСсылка()

Так хотел?

   falselight

13 — 25.10.16 — 14:15

(12) ну то есть так будет присваивать тип справочника такого то реквизиту?!

(11) попробую

(10) это нужно задавать для каждого справочника???? Там для одного задано

   Альбатрос

14 — 25.10.16 — 14:16

(13) Задавть нужно в зависимости от товего перечисления, ты ж сам так сказал. Вариант (12) тоже рабочий, по-своему…

   falselight

15 — 25.10.16 — 15:07

(12) так почему то не работает. Какого типа должен быть реквизит, которому нужно задать тип?

&НаКлиенте

Процедура ВидОперацииПриИзменении(Элемент)

    УстановитьТипРеквизита(Объект.ВидОперации);

КонецПроцедуры

//

&НаСервере

Процедура УстановитьТипРеквизита(ВидОперации)

    Если Объект.ВидОперации = Перечисления.ВидОперации.Личные Тогда

        Объект.РаботникПрофессия = Справочники.Сотрудники.ПустаяСсылка();     

    Иначе

        Объект.РаботникПрофессия = Справочники.Профессии.ПустаяСсылка();

    КонецЕсли;  

КонецПроцедуры

   Fragster

16 — 25.10.16 — 15:13

(15) составного

  

falselight

17 — 25.10.16 — 15:18

(9) пример нужен для управляемого приложения, интерфейс такси

TurboConf — расширение возможностей Конфигуратора 1С

Показывать по
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
сообщений

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

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

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

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

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

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

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

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

Задание типа значения для реквизита с типом СписокЗначений в управляемых формах

В управляемых формах невозможно задать тип значения для реквизита, который имеет тип СписокЗначений, хотя в обычных формах такая возможность есть. Если реквизит с типом СписокЗначений является реквизитом формы, то здесь особых сложностей нету, достаточно в обработчике события формы ПриСозданииНаСервере написать код по установке типа для значения списка:


ТипыСписка = "Строка";
ДоступныеТипы = Новый ОписаниеТипов(ТипыСписка);
ЭтаФорма.РеквизитСписокЗначений.ТипЗначения = ДоступныеТипы;

Как видно из примера, тип значения устанавливается через свойство списка значений ТипЗначения, которое имеет тип ОписаниеТипов.

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

1. Реквизит ТЧ с типом СписокЗначений

Для этого напишем код по установке типа значения в обработчике события элемента формы НачалоВыбора:


Процедура РеквизитыТаблицыСписокДоступныхЗначенийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

ТипыСписка = "Строка";
ДоступныеТипы = Новый ОписаниеТипов(ТипыСписка);
Элемент.Родитель.ТекущиеДанные.РеквизитСписокЗначений.ТипЗначения = ДоступныеТипы;

КонецПроцедуры

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


ТипыСписка = Массив;
ТипыСписка.Добавить(Тип("Строка"));
ТипыСписка.Добавить(Тип("Число"));
ДоступныеТипы = Новый ОписаниеТипов(ТипыСписка);
ЭтаФорма.РеквизитСписокЗначений.ТипЗначения = ДоступныеТипы;

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

Понравилась статья? Поделить с друзьями:
  • Установка бачка омывателя газель бизнес в крыло
  • Установка времени работы вебасто как установить
  • Установка двухдиновой магнитолы в газель бизнес
  • Установка колонок в штатные места газель бизнес
  • Установка ремкомплекта рычага кпп газель бизнес