1с установить тип реквизита табличной части программно

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

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

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

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

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

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

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

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


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

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

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

1с УПП, обычные формы.

В табличной части есть колонка у которой составной тип данных.

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

Делаю так:

Массив = Новый Массив();

Массив.Добавить(Тип(«СправочникСсылка.ОсновныеСредства»));

ОписаниеТипа = Новый ОписаниеТипов(Массив);

ЭлементыФормы.СписокОС.Колонки.ОсновноеСредство.ЭлементУправления.ОграничениеТипа = ОписаниеТипа;

//До этого момента все работает.

Но при выборе в ячейке все равно запрашивает тип, хотя и выбрать можно только один указанный мною.

Пробовал:

ЭлементыФормы.СписокОС.Колонки.ОсновноеСредство.ЭлементУправления.ВыбиратьТип=Ложь

Это не катит, поскольку тогда вообще ничего не происходит при выборе в ячейке.

Если написать:

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

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

 0 

   

Распечатать

1С 8.x : Как изменить, присвоить, указать Тип Значения Ячейки табличной части?

Создаем табличную часть и в ней реквизит с разными типами значений:
title

Код 1C v 8.х

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

// измененим тип значения в ячейке ТЧ
// Найдем Строку и заменим на Дату
НайденСтрока = ТабЧасть.Найти("Это строка", "РеквизитПроизвольный");
НайденСтрока.РеквизитПроизвольный = ТекущаяДата();
// Найдем Число и заменим на Пустую ссылку справочника Номенклатуры (полученную с Вида судконто)
Счет = ПланыСчетов.Хозрасчетный.ТоварыНаСкладе;
НайденСтрока = ТабЧасть.Найти(12345, "РеквизитПроизвольный");
// Получим первое субконто Номенклатура
Субконото1 = Счет.ВидыСубконто[1];
// Присвоим тип значения
НайденСтрока.РеквизитПроизвольный = Субконото1.ВидСубконто.ТипЗначения.ПривестиЗначение();

Установка типа значения для поля табличной части

Автор Tasselhof, 25 мар 2019, 15:54

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

Есть таблица с двумя колонками.
Первая колонка — «Характеристика» — это ссылка на элемент справочника Характеристик, в нем указан тип значения, например «Число»
Вторая колонка — «Значение характеристики» имеет составной тип данных.
На управляемой форме надо, чтобы поле «Значение характеристики» становилось доступным для редактирования, только если выбрано значение Характеристики и автоматически проставлялся тип этого значения, чтобы у пользователю не было возможности самостоятельно выбирать тип значения.
Пробовал делать при изменении характеристики через:
ТекСтрока = Элементы.Характеристики.ТекущиеДанные;
ТекСтрока.ЗначениеХарактеристики.Тип — недоступно.
ОграничениеТипа — для данных тоже недоступно.

Подскажите, как подступиться, пожалуйста! Застрял на ерунде =(


у себя, в форме администратора (УФ), делал так
если значение заполнено, то выбор как из текущего типа, если не определено то сначала выбор типа


&НаКлиенте
Процедура ПоляПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)

лкТекСтр = Элементы.Поля.ТекущиеДанные;
лкЗначение = лкТекСтр.Значение;
Если ЗначениеЗаполнено(лкЗначение) Тогда

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

ИначеЕсли лкЗначение = Неопределено Тогда
Элементы.ПоляЗначение.ВыбиратьТип = Истина;
Элементы.ПоляЗначение.КнопкаВыбора = Истина;

Иначе
Элементы.ПоляЗначение.ВыбиратьТип = Ложь;
Элементы.ПоляЗначение.КнопкаВыбора = Истина;

КонецЕсли;
//Элемент.ТекущийЭлемент.ВыбиратьТип = Элемент.ТекущиеДанные.Значение = Неопределено;

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

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


Цитата: LexaK от 25 мар 2019, 16:04
у себя, в форме администратора (УФ), делал так
если значение заполнено, то выбор как из текущего типа, если не определено то сначала выбор типа
&НаКлиенте
Процедура ПоляПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)

лкТекСтр = Элементы.Поля.ТекущиеДанные;
лкЗначение = лкТекСтр.Значение;
Если ЗначениеЗаполнено(лкЗначение) Тогда

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

ИначеЕсли лкЗначение = Неопределено Тогда
Элементы.ПоляЗначение.ВыбиратьТип = Истина;
Элементы.ПоляЗначение.КнопкаВыбора = Истина;

Иначе
Элементы.ПоляЗначение.ВыбиратьТип = Ложь;
Элементы.ПоляЗначение.КнопкаВыбора = Истина;

КонецЕсли;
//Элемент.ТекущийЭлемент.ВыбиратьТип = Элемент.ТекущиеДанные.Значение = Неопределено;

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

В данном случае идет процедура ПередНачаломРедактирования всей табличной части, а значение ячейки табличной части может поменяться в процессе редактирования, соответственно, надо выставлять тип или при изменении поля строки «Характеристика», или перед началом редактирования поля «Значение характеристики», последней процедуры не существует для поля.
Попробовал явно задавать значение при изменении поля «Характеристика», например, если это число — 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
сообщений

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

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

Создаем табличную часть и в ней реквизит с разными типами значений:

Код 1C v 8.х

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

// измененим тип значения в ячейке ТЧ
// Найдем Строку и заменим на Дату
НайденСтрока = ТабЧасть.Найти("Это строка", "РеквизитПроизвольный");
НайденСтрока.РеквизитПроизвольный = ТекущаяДата();
// Найдем Число и заменим на Пустую ссылку справочника Номенклатуры (полученную с Вида судконто)
Счет = ПланыСчетов.Хозрасчетный.ТоварыНаСкладе;
НайденСтрока = ТабЧасть.Найти(12345, "РеквизитПроизвольный");
// Получим первое субконто Номенклатура
Субконото1 = Счет.ВидыСубконто[1];
// Присвоим тип значения
НайденСтрока.РеквизитПроизвольный = Субконото1.ВидСубконто.ТипЗначения.ПривестиЗначение();

Информация взята с сайта http://helpf.pro

Подпишитесь на нашу рассылку новостей

Хотите узнать больше по этому вопросу?

Подпишитесь на нашу рассылку новостей

Подписаться

Чтобы задать вопрос или предложить тему статьи, нажмите на кнопку ниже:

Предложить статью

Понравилась статья? Поделить с друзьями:
  • 2 ой лихачевский переулок дом 6 ветклиника часы работы
  • 200 часов обязательных работ замена на лишение свободы
  • 200 часов обязательных работ это сколько дней работать
  • 25 навыков продаж или то чему не учат в школах бизнеса
  • 3 класс кубановедение лента времени проверочная работа