Как программно установить тип реквизита
Автор Алексей_1985_06, 24 мая 2022, 20:08
0 Пользователей и 1 гость просматривают эту тему.
Уважаемые товарищи, подскажите вот с таким вопросом:
1. Создан реквизит «Комплекс» с составным типом данных (СправочникСсылка.ТехническиеКомплексы, СправочникСсылка.СтартовыеКомплексы)
2. Созданы два реквизита формы ТК (булево) и СК (булево)
3. Необходимо что бы при ТК = Истина, реквизит «Комплекс» — имел тип СправочникСсылка.ТехническиеКомплексы, а при СК = Истина реквизит «Комплекс» — имел тип СправочникСсылка.СтартовыеКомплексы.
Или кто подскажет может по другому как-то реализуется процесс определения типа данных реквизита в зависимости от значения другого реквизита (типа Булево)
Непонятно, зачем переустанавливать типы? У вас они уже назначены составным типом. При записи элементов справочника в этот реквизит, тип сам будет устанавливаться в нужный.
Я бы действовал в обратную сторону. При записи в реквизит «Комплекс» элемент из СправочникСсылка.ТехническиеКомплексы, присваивать ТК = Истина. А при записи СправочникСсылка.СтартовыеКомплексы — СК = Истина.
Алексей_1985_06, сильно зависит от того какие формы, управляемые или обычные, действительно, когда у реквизита составной тип
(и не два как у вас а десяток) до задалбывает каждый раз для перевыбора элемента того-же типа, сначала выбирать этот-же тип а затем и сам элемент
для избежания этого, использую такой код
&НаКлиенте
в вашем случае
Процедура ТаблицаОбработкиДубльНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
лкТекушаяСтрока = Элементы.СсылкиДублей.ТекущиеДанные;
Если лкТекушаяСтрока <> Неопределено Тогда
Элемент.ВыбиратьТип = Не ЗначениеЗаполнено(лкТекушаяСтрока.Значение);
КонецЕсли;
КонецПроцедуры
вообще отключите возможность выбора Типа,
а при использовании булевых переключателей в их событии ПриИзменении(..), реквизиту Комплекс присваивайте Пустую ссылку нужного справочника!
тогда по кнопке Выбор, будут выбираться элементы из этого справочника.
- 3 пользователя сказали спасибо!
если помогло нажмите: Спасибо!
LexaK, Большое Вам спасибо за помощь!!!!
17.09.10 — 16:02
Есть документ налоговая накладная. В шапке имеется реквизит Сделка, который имеет множество типов —
ДокументСсылка.ПлатежныйОрдерСписаниеДенежныхСредств, ДокументСсылка.ПередачаОС, ДокументСсылка.АвансовыйОтчет, ДокументСсылка.ГТДИмпорт, ДокументСсылка.ПлатежноеПоручениеИсходящее, ДокументСсылка.ДокументРасчетовСКонтрагентом, ДокументСсылка.ПлатежныйОрдерПоступлениеДенежныхСредств, ДокументСсылка.РасходныйКассовыйОрдер, ДокументСсылка.АктОбОказанииПроизводственныхУслуг, ДокументСсылка.ПоступлениеНМА, ДокументСсылка.КорректировкаДолга, ДокументСсылка.ПоступлениеТоваровУслуг, ДокументСсылка.ВозвратТоваровОтПокупателя, ДокументСсылка.СчетНаОплатуПокупателю, ДокументСсылка.ПередачаТоваров, ДокументСсылка.ПлатежноеПоручениеВходящее, ДокументСсылка.ОтчетКомиссионераОПродажах, ДокументСсылка.ОтчетКомитентуОПродажах, ДокументСсылка.ПередачаНМА, ДокументСсылка.ПриходныйКассовыйОрдер, ДокументСсылка.ПоступлениеИзПереработки, ДокументСсылка.РеализацияУслугПоПереработке, ДокументСсылка.РеализацияТоваровУслуг, ДокументСсылка.ВозвратТоваровПоставщику, ДокументСсылка.СчетНаОплатуПоставщика, ДокументСсылка.ПоступлениеДопРасходов
Создаю программно документ
НалНакСозд=Документы.НалоговаяНакладная.СоздатьДокумент();
НалНакСозд.Дата = ПеремДат;
НалНакСозд.Организация = ОргИмя;
НалНакСозд.Контрагент = СтрТабВыб.ИмяКонтр;
НалНакСозд.Комментарий = «Документ создан автоматически»;
НалНакСозд.Сделка = ДокВыб;
…..
НалНакСозд.Записать();
После чего документ нормально создается, но с не заполненным реквизитом Сделка.
Смотрю отладчиком как до ходит до НалНакСозд.Сделка вычисляю выражение смотрю на тип определился как неопределенный. Думаю поэтому и не присвоилась переменная ДокВыб реквизиту Сделка.
Переменная ДокВыб имеет тип «ДокументСсылка.ДокументРасчетовСКонтрагентом»
Знаю что надо как то программно присвоить тип для реквизита Сделки «ДокументСсылка.ДокументРасчетовСКонтрагентом», но не пойму как. Если кто то знает, подскажите, пожалуйста. Заранее спасибо.
Просматривая Волшебный форум, наткнулся на тему, в которой коллега интересовался возможностью отключения выбора типа в элементе табличной части справочника при программной установке значения в реквизите составного типа. Приведу часть своего кода, всю тему можно посмотреть здесь.
&НаКлиенте Процедура ДобавитьВалюту(Команда) ТС = Объект.ТЧ.Добавить(); ТС.Имя = "Валюта"; ТС.Значение = ПредопределенноеЗначение("Справочник.Валюты.ПустаяСсылка"); Элементы.ТЧ.ПодчиненныеЭлементы.ТЧЗначение.ВыбиратьТип = Ложь; КонецПроцедуры
После решил добавить решению универсальности и реализовать программное формирование контекстного меню для табличной части справочника с составным реквизитом с заранее неизвестным перечнем типов.
Создаем справочник, имя произвольное. Добавляем табличную часть ТЧ, реквизиты Имя, тип Строка, Значение, тип составной. Для своего примера я установил Строка, Дата, Число, СправочникСсылка. В форме элемента добавляем реквизит ФормаТипы, тип ОписаниеТипов.
Остальное за нас сделает код:
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) //формируем массив типов и удаляем тип текущего справочника, //поскольку у нас тип значения включает все справочники фТипы = РеквизитФормыВЗначение("Объект").Метаданные().ТабличныеЧасти.ТЧ.Реквизиты.Значение.Тип.Типы(); фИндекс = фТипы.Найти(ТипЗнч(Объект.Ссылка)); фТипы.Удалить(фИндекс); //помещаем новое описание типов в реквизит формы ФормаТипы = Новый ОписаниеТипов(фТипы); //формируем группу контекстного меню фГруппа = Элементы.Добавить("ГруппаДополнительно", Тип("ГруппаФормы"), Элементы.ТЧКонтекстноеМеню); фГруппа.Заголовок = "Добавить..."; мТипы = ФормаТипы.Типы(); Для сч = 0 По мТипы.ВГраница() Цикл //создаем команды формы, имена формируются с учетом индекса текущего типа в массиве типов //потом по этому индексу в имени будем определять необходимый тип данных ИндексКоманды = Формат(сч, "ЧН=0; ЧГ=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
сообщений
Задача.
Например, есть табличная часть с двумя колонками «ВидПоступленияДС» и «Аналитика». Поле «Аналитика» может содержать значения составного типа. Необходимо, в зависимости от введенного значения в поле «ВидПоступленияДС», установить нужный тип для поля «Аналитика».
Решение.
В событии «ПриИзменении» поля ввода «ВидПоступленияДС» пропишем следующий код:
&НаКлиенте
Процедура ОсновнаяВидПоступленияДСПриИзменении(Элемент)
ТекСтрока = Элементы.Основная.ТекущиеДанные;
Если ТекСтрока.ВидПоступленияДС = ПредопределенноеЗначение("Перечисление.ВидыПоступленияДС.ОплатаОтКлиента") Тогда
ОписаниеТипов = Новый ОписаниеТипов("СправочникСсылка.Контрагенты");
ИначеЕсли ТекСтрока.ВидПоступленияДС = ПредопределенноеЗначение("Перечисление.ВидыПоступленияДС.ПрочиеПоступленияДС") Тогда
ОписаниеТипов = Новый ОписаниеТипов("СправочникСсылка.СтатьиПриходаДС");
Иначе
ТекСтрока.Аналитика = Неопределено;
Возврат;
КонецЕсли;
ТекСтрока.Аналитика = ОписаниеТипов.ПривестиЗначение(ТекСтрока.Аналитика);
КонецПроцедуры
Для этого можно присвоить реквизиту формы значение пустой ссылки нужного типа. Одного из тех типов, которые входят в составной тип.
Например, для поля ввода, связанного с реквизитом, который может принимать значение ссылки на справочники физических и юридических лиц, назначение нужного типа может выглядеть следующим образом:
Объект.ОтветЛицо = ПредопределенноеЗначение("Справочник.ФизическиеЛица.ПустаяСсылка");
Если запретить выбор типа в поле ввода (свойство ВыбиратьТип), то реквизиту ОтветЛицо будет назначен тип ссылки на справочник ФизическиеЛица, и для выбора будут предлагаться значения только этого справочника.
Также можно использовать свойство поля ввода ОграничениеТипа, задающее возможные типы данных, которые могут быть введены в поле ввода, и приводить значение соответствующего реквизита к нужному типу:
Массив = Новый Массив(); Массив.Добавить(Тип("СправочникСсылка.ФизическиеЛица")); НашеОписание = Новый ОписаниеТипов(Массив);
Элементы.ОтветЛицо.ОграничениеТипа = НашеОписание; Объект.ОтветЛицо = НашеОписание.ПривестиЗначение(Объект.ОтветЛицо);
Задание типа значения для реквизита с типом СписокЗначений в управляемых формах
В управляемых формах невозможно задать тип значения для реквизита, который имеет тип СписокЗначений, хотя в обычных формах такая возможность есть. Если реквизит с типом СписокЗначений является реквизитом формы, то здесь особых сложностей нету, достаточно в обработчике события формы ПриСозданииНаСервере написать код по установке типа для значения списка:
ТипыСписка = "Строка";
ДоступныеТипы = Новый ОписаниеТипов(ТипыСписка);
ЭтаФорма.РеквизитСписокЗначений.ТипЗначения = ДоступныеТипы;
Как видно из примера, тип значения устанавливается через свойство списка значений ТипЗначения, которое имеет тип ОписаниеТипов.
Другое дело, когда форма содержит таблицу значений, у которой имеется реквизит с типом СписокЗначений. В такой ситуации через обработчики событий формы к этому реквизиту не достучаться, поэтому нужно использовать обработчики событий элемента формы, связанного с данным реквизитом.
1. Реквизит ТЧ с типом СписокЗначений |
Для этого напишем код по установке типа значения в обработчике события элемента формы НачалоВыбора:
Процедура РеквизитыТаблицыСписокДоступныхЗначенийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ТипыСписка = "Строка";
ДоступныеТипы = Новый ОписаниеТипов(ТипыСписка);
Элемент.Родитель.ТекущиеДанные.РеквизитСписокЗначений.ТипЗначения = ДоступныеТипы;
КонецПроцедуры
Что бы для типа значения задать составной тип, необходимо в конструктор объекта ОписаниеТипов передать первым параметром массив типов:
ТипыСписка = Массив;
ТипыСписка.Добавить(Тип("Строка"));
ТипыСписка.Добавить(Тип("Число"));
ДоступныеТипы = Новый ОписаниеТипов(ТипыСписка);
ЭтаФорма.РеквизитСписокЗначений.ТипЗначения = ДоступныеТипы;
Единственный минус составного типа в списке значений — это отсутствие множественного выбора (кнопки Подбор), придется добавлять по одному значению в список. а это просто печалит.