А подскажите пож. как для УФ это реализовать?
Сделал так.
Модуль формы:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПриОткрытииНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПриОткрытииНаСервере()
Обработка = РеквизитФормыВЗначение(«Объект»);
Обработка.УстановитьТипыРеквизитов();
КонецПроцедуры
Модуль объекта:
&НаСервере
Процедура ПриОткрытииНаСервере()
Обработка = РеквизитФормыВЗначение(«Объект»);
Обработка.УстановитьТипыРеквизитов();
КонецПроцедуры
Процедура УстановитьТипыРеквизитов() Экспорт
//установка типов реквизитов в зависимости от конфигураций
Если Метаданные.Справочники.Найти(«ТипыЦенНоменклатуры») <> Неопределено Тогда
ТипЦенРозничная = Справочники[«ТипыЦенНоменклатуры»].ПустаяСсылка();
ТипЦенОптовая = Справочники[«ТипыЦенНоменклатуры»].ПустаяСсылка();
ТипЦенЗаказов = Справочники[«ТипыЦенНоменклатуры»].ПустаяСсылка();
ИначеЕсли Метаданные.Справочники.Найти(«ВидыЦен») <> Неопределено Тогда
ТипЦенРозничная = Справочники[«ВидыЦен»].ПустаяСсылка();
ТипЦенОптовая = Справочники[«ВидыЦен»].ПустаяСсылка();
ТипЦенЗаказов = Справочники[«ВидыЦен»].ПустаяСсылка();
КонецЕсли;
КонецПроцедуры
Отладчиком вижу, что отрабатывает.
Но на форму при выборе значения дает все типы справочников.
Программное изминение Типа реквизита
Автор |R|U|D|E|N, 02 июн 2011, 12:42
0 Пользователей и 1 гость просматривают эту тему.
Добрый день
У меня есть реквизит документа «Контрагент» который имеет составной тип данных Строка и СправочникСсылка.Контрагенты. Этот реквизит вынесен на управляемую форму документа.
Когда выбераешь этот реквизит формы, вылазит окошко и предлогает выбрать тип Строка или Контрагенты. Выбрав Тип = Строка я могу вводить произвольный текст. А как, уже после выбора типа Строка и ввода текста можно программно установить Тип поля = Контрагенты и заполнить его одним изи объектов справочника?
Надеюсь объеснил понятно)
У уважением, Александр.
Отправил обработку на почту….
Она под управляемые формы сделана. На основе её сделаешь все остальное.
Возможно такой вариант:
Если ТипЗнч(Реквизит1) = Тип(«Строка») и ЗначениеЗаполнено(Реквизит1) Тогда
// Заполнить одним из объектов справочника можно к примеру так
Реквизит1 = Справочники.Контрагенты.НайтиПоКоду(«000024159»);
КонецЕсли;
Спасибо bugs и chuevsf но не сробатывает не один из предложенных вариантов..
Вот как я делаю…
В управляемой форме я выбераю Тип = строка и ввожу в это поле нужный мне текст(какое то имя клиента).
После этого, нажимается кнопка которая создает нового контрагента(с указанным в поле именем) в справочнике.
В конце процедуры, которая создает нового контрагента в справочнике я пишу
Объект.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(ИмяКонтрагента);
Тойсть, я хочу чтоб в это же поле установилось то же имя контрагента только уже ссылочного типа…
Но поле как было строкового типа так и осталось..
Гы…. Ты хочешь и на липку влезть и задницу не ободрать!
Такого не бывает!!!
Вот это:
—————————
Тойсть, я хочу чтоб в это же поле установилось то же имя контрагента только уже ссылочного типа…
Но поле как было строкового типа так и осталось..
—————————
Не возможно!!!
Если бы это:
Тойсть, я хочу чтоб в это же поле установилось то же имя контрагента только уже ссылочного типа…
Тогда запросто!
Не совсем Вас понял…
Получается, не возможно в управляемой форме(программно), сменить тип поля и заполнить его не текстом а ссылкой на объект?
Яб даже сказал, не сменить а как бы очистить, выбрать другой и заполнить?
Тип поля сменить можно! И это я уже показал.
А вот ссылка на объект не может быть строкой.
Так мне и не нужно, чтоб ссылка на объект была стракой.
Мне нужно сменить Тип со Строки на Контрогенты и найти в справочнике нужного контрагента и подставить его в это поле которое после смены типа по идее имет Тип Контрагенты.
Цитата: |R|U|D|E|N от 02 июн 2011, 15:48
Спасибо bugs и chuevsf но не сробатывает не один из предложенных вариантов..Вот как я делаю…
В управляемой форме я выбераю Тип = строка и ввожу в это поле нужный мне текст(какое то имя клиента).
После этого, нажимается кнопка которая создает нового контрагента(с указанным в поле именем) в справочнике.
В конце процедуры, которая создает нового контрагента в справочнике я пишуОбъект.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(ИмяКонтрагента);
Тойсть, я хочу чтоб в это же поле установилось то же имя контрагента только уже ссылочного типа…
Но поле как было строкового типа так и осталось..
А вот тут ты говорил совершенно другое…
Ты уж определись с тем, что хочешь.
Цитата: |R|U|D|E|N от 02 июн 2011, 16:50
Так мне и не нужно, чтоб ссылка на объект была стракой.Мне нужно сменить Тип со Строки на Контрогенты и найти в справочнике нужного контрагента и подставить его в это поле которое после смены типа по идее имет Тип Контрагенты.
А вот этот вариант можно реализовать.
Теги:
- Форум 1С
-
►
Форум 1С — ПРЕДПРИЯТИЕ 8.0 8.1 8.2 8.3 8.4 -
►
Конфигурирование, программирование в 1С Предприятие 8 -
►
Программное изминение Типа реквизита
Похожие темы (5)
Поиск
barracuda1991 1 / 1 / 1 Регистрация: 30.07.2015 Сообщений: 121 |
||||
1 |
||||
1C 8.x Интерактивное изменение типа значения поля ввода на форме07.09.2016, 12:30. Показов 17149. Ответов 4 Метки нет (Все метки)
Здравствуйте! Подскажите, можно ли программно прописать, чтобы после выбора типа значения в поле списка (на форме) автоматически менялся тип значения в поле ввода (имеющий составной тип данных в конфигураторе)?
Миниатюры
0 |
Dethmontt Модератор 3708 / 2905 / 572 Регистрация: 10.03.2011 Сообщений: 11,442 Записей в блоге: 1 |
||||
07.09.2016, 17:15 |
2 |
|||
barracuda1991, да, присвоив пустое значение нужного типа полюВвода Добавлено через 3 минуты
1 |
barracuda1991 1 / 1 / 1 Регистрация: 30.07.2015 Сообщений: 121 |
||||
08.09.2016, 09:33 [ТС] |
3 |
|||
{Форма.Форма.Форма(492)}: Поле объекта недоступно для записи (ПолеВвода1)
Спасибо.
0 |
Модератор 3708 / 2905 / 572 Регистрация: 10.03.2011 Сообщений: 11,442 Записей в блоге: 1 |
|
08.09.2016, 23:26 |
4 |
ЭлементыФормы.ПолеВвода1 = ОТ.ПривестиЗначение(); зачем ЭлементыФормы ???
ПолеВвода1 = ОТ.ПривестиЗначение(); Где я тут что то писал про элементыФормы ??? Добавлено через 39 секунд
0 |
0 / 0 / 0 Регистрация: 12.11.2015 Сообщений: 1 |
|
17.05.2017, 21:39 |
5 |
Добавлено через 24 секунды
Сообщение от barracuda1991 Если ограничивать тип для ЭлементыФормы.ПолеВвода1 тогда не «слетает» значение реквизита ПолеВвода1 если она уже правильного типа, ИМХО лучше через ЭлементыФормы
0 |
Просматривая Волшебный форум, наткнулся на тему, в которой коллега интересовался возможностью отключения выбора типа в элементе табличной части справочника при программной установке значения в реквизите составного типа. Приведу часть своего кода, всю тему можно посмотреть здесь.
&НаКлиенте Процедура ДобавитьВалюту(Команда) ТС = Объект.ТЧ.Добавить(); ТС.Имя = "Валюта"; ТС.Значение = ПредопределенноеЗначение("Справочник.Валюты.ПустаяСсылка"); Элементы.ТЧ.ПодчиненныеЭлементы.ТЧЗначение.ВыбиратьТип = Ложь; КонецПроцедуры
После решил добавить решению универсальности и реализовать программное формирование контекстного меню для табличной части справочника с составным реквизитом с заранее неизвестным перечнем типов.
Создаем справочник, имя произвольное. Добавляем табличную часть ТЧ, реквизиты Имя, тип Строка, Значение, тип составной. Для своего примера я установил Строка, Дата, Число, СправочникСсылка. В форме элемента добавляем реквизит ФормаТипы, тип ОписаниеТипов.
Остальное за нас сделает код:
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) //формируем массив типов и удаляем тип текущего справочника, //поскольку у нас тип значения включает все справочники фТипы = РеквизитФормыВЗначение("Объект").Метаданные().ТабличныеЧасти.ТЧ.Реквизиты.Значение.Тип.Типы(); фИндекс = фТипы.Найти(ТипЗнч(Объект.Ссылка)); фТипы.Удалить(фИндекс); //помещаем новое описание типов в реквизит формы ФормаТипы = Новый ОписаниеТипов(фТипы); //формируем группу контекстного меню фГруппа = Элементы.Добавить("ГруппаДополнительно", Тип("ГруппаФормы"), Элементы.ТЧКонтекстноеМеню); фГруппа.Заголовок = "Добавить..."; мТипы = ФормаТипы.Типы(); Для сч = 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
сообщений
Задача.
Например, есть табличная часть с двумя колонками «ВидПоступленияДС» и «Аналитика». Поле «Аналитика» может содержать значения составного типа. Необходимо, в зависимости от введенного значения в поле «ВидПоступленияДС», установить нужный тип для поля «Аналитика».
Решение.
В событии «ПриИзменении» поля ввода «ВидПоступленияДС» пропишем следующий код:
&НаКлиенте
Процедура ОсновнаяВидПоступленияДСПриИзменении(Элемент)
ТекСтрока = Элементы.Основная.ТекущиеДанные;
Если ТекСтрока.ВидПоступленияДС = ПредопределенноеЗначение("Перечисление.ВидыПоступленияДС.ОплатаОтКлиента") Тогда
ОписаниеТипов = Новый ОписаниеТипов("СправочникСсылка.Контрагенты");
ИначеЕсли ТекСтрока.ВидПоступленияДС = ПредопределенноеЗначение("Перечисление.ВидыПоступленияДС.ПрочиеПоступленияДС") Тогда
ОписаниеТипов = Новый ОписаниеТипов("СправочникСсылка.СтатьиПриходаДС");
Иначе
ТекСтрока.Аналитика = Неопределено;
Возврат;
КонецЕсли;
ТекСтрока.Аналитика = ОписаниеТипов.ПривестиЗначение(ТекСтрока.Аналитика);
КонецПроцедуры
0
1С 8.x : Как изменить, присвоить, указать Тип Значения Ячейки табличной части?
Создаем табличную часть и в ней реквизит с разными типами значений:
Код 1C v 8.х
//Создадим строки с разним типом значения
НовСтрока = ТабЧасть.Добавить();
НовСтрока.РеквизитПроизвольный = 12345;
НовСтрока = ТабЧасть.Добавить();
НовСтрока.РеквизитПроизвольный = "Это строка";
НовСтрока = ТабЧасть.Добавить();
НовСтрока.РеквизитПроизвольный = ТекущаяДата();
НовСтрока = ТабЧасть.Добавить();
НовСтрока.РеквизитПроизвольный = Истина;
// измененим тип значения в ячейке ТЧ
// Найдем Строку и заменим на Дату
НайденСтрока = ТабЧасть.Найти("Это строка", "РеквизитПроизвольный");
НайденСтрока.РеквизитПроизвольный = ТекущаяДата();
// Найдем Число и заменим на Пустую ссылку справочника Номенклатуры (полученную с Вида судконто)
Счет = ПланыСчетов.Хозрасчетный.ТоварыНаСкладе;
НайденСтрока = ТабЧасть.Найти(12345, "РеквизитПроизвольный");
// Получим первое субконто Номенклатура
Субконото1 = Счет.ВидыСубконто[1];
// Присвоим тип значения
НайденСтрока.РеквизитПроизвольный = Субконото1.ВидСубконто.ТипЗначения.ПривестиЗначение();