8.х Как обратиться к значению программно созданного реквизита

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем АлексейВМ, 19 июн 2017.

  1. TopicStarter Overlay
    АлексейВМ
    Offline

    АлексейВМ

    Регистрация:
    25 май 2017
    Сообщения:
    19
    Симпатии:
    0
    Баллы:
    1
    Добрый день.
    Программно создаю реквизит и элемент формы, после ввода значений хочу, записать введенные данные в регистр сведений, не пойму как это сделать.
    При нажатии на кнопку формы справочника "добавить реквизит" открывается ПВХ, там ввожу наименование и при записи передаю значения на форму справочника. На форме справочника создается реквизит с указанным в пвх наименованием. Далее при записи элемента справочника мне надо записать эти данные в РС. Не могу понять как взять значение созданного реквизита? Попробовал создать реквизит "РеквизитДляРС" не программно, а потом в него внести, ничего не получается.
    Код модуля формы элемента справочника:
    Код:
    &НаКлиенте
    Процедура ДобавитьРеквизит(Команда)
        Закрытие = Новый ОписаниеОповещения("ОписаниеЗакрытия",ЭтаФорма);
        ОткрытьФорму("ПланВидовХарактеристик.СвойстваКошельков.Форма.ФормаЭлемента",,ЭтаФорма,,,,Закрытие);
    КонецПроцедуры
    
    &НаСервере
    Процедура ОписаниеЗакрытия(Результат,Параметры) экспорт
        Если ТипЗнч(Результат) = Тип("Структура") Тогда
            НовыеРеквизиты = Новый Массив;
            НовыйРеквизит = Новый РеквизитФормы(Результат.Имя,Результат.Тип,,,Истина);
            НовыеРеквизиты.Добавить(НовыйРеквизит);
            ИзменитьРеквизиты (НовыеРеквизиты);  
      
            Элемент = Элементы.Добавить(Результат.Имя,Тип("ПолеФормы"),ЭтаФорма);
            Элемент.Вид = ВидПоляФормы.ПолеВвода;
            Элемент.ПутьКДанным = Результат.Имя;   
            РеквизитДляРС = Новый Структура;
            РеквизитДляРС.Вставить("Имя", Результат.Имя);
        КонецЕсли;
    КонецПроцедуры    
    
    &НаКлиенте
    Процедура ПослеЗаписи(ПараметрыЗаписи)
            РеквизитДляРС.Вставить ("Тип",????); // Вот тут вместо ???? как мне обратиться к реквизиту?
            ЗаписьВРегистр();      
    КонецПроцедуры
    
    &НаСервере
    Процедура ЗаписьВРегистр()
            МенеджерЗаписи = РегистрыСведений.ЗначенияСвойствКошельков.СоздатьМенеджерЗаписи();
            МенеджерЗаписи.Кошелек = Объект.Ссылка;
            МенеджерЗаписи.ВидСвойства = РеквизитДляРС.Имя;
            МенеджерЗаписи.Значение = РеквизитДляРС.Тип;
            МенеджерЗаписи.Записать();
    КонецПроцедуры
    
    Код модуля формы элемента ПВХ:

    Код:
    &НаКлиенте
    Процедура ПослеЗаписи(ПараметрыЗаписи)
        ВыбранноеЗначение = Новый Структура;
        ВыбранноеЗначение.Вставить("Имя",Объект.Ссылка);
        ВыбранноеЗначение.Вставить("Тип",Объект.ТипЗначения);
        ОповеститьОВыборе(ВыбранноеЗначение);
    КонецПроцедуры
    
    В процедуре формы справочника послезаписи как мне обратиться к реквизиту вместо "????" или я вообще не правильно делаю?
    Последнее редактирование: 19 июн 2017
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.128
    Симпатии:
    953
    Баллы:
    204
    ЭтаФорма.<ИмяРеквизита>
  3. TopicStarter Overlay
    АлексейВМ
    Offline

    АлексейВМ

    Регистрация:
    25 май 2017
    Сообщения:
    19
    Симпатии:
    0
    Баллы:
    1
    ЭтаФорма.НовыйРеквизит пробовал, поле объекта не обнаружено "НовыйРеквизит"
    --- Объединение сообщений, 19 июн 2017 ---
    Может я просто пишу не там?
  4. 1с-ник
    Offline

    1с-ник Профессионал в 1С Заблокирован

    Регистрация:
    5 окт 2014
    Сообщения:
    998
    Симпатии:
    162
    Баллы:
    104
    Как создавали так и обращайтесь :)
    Код:
    Результат.Имя
    Только вот область видимости переменной "Результат" - в пределах процедуры ОписаниеЗакрытия().
    Т.е. либо запоминайте имя реквизита, либо делайте перебор всех реквизитов формы (вряд ли у программно-созданного имеется признак, хотя можно к имени указывать префикс "СозданныйПрограммно_"), наверняка последний из них - как раз ваш.
  5. TopicStarter Overlay
    АлексейВМ
    Offline

    АлексейВМ

    Регистрация:
    25 май 2017
    Сообщения:
    19
    Симпатии:
    0
    Баллы:
    1
    Вот в этом то и проблема. Если бы я сразу знал имя реквизита (например: цвет), то я бы сразу писал этаформа.цвет, а проблема в том, что название реквизита приходит из ПВХ, поэтому помимо этой процедуры, не знаю как обратиться к нему
    --- Объединение сообщений, 19 июн 2017 ---
    А через результат.Имя, я же получу имя реквизита, а не его значение?
  6. TopicStarter Overlay
    АлексейВМ
    Offline

    АлексейВМ

    Регистрация:
    25 май 2017
    Сообщения:
    19
    Симпатии:
    0
    Баллы:
    1
    а как мне его запомнить, чтобы передать потом в другую процедуру? В отладчике открываю ЭтаФорма, вижу созданный реквизит и значение, а как вытащить его не знаю. Поэтому я и создавал реквизит не программно, в который пытался записать имя реквизита и потом уже пробовал обратиться через него, но ничего не вышло

    Код:
    РеквизитДляРС = Новый Структура;
            РеквизитДляРС.Вставить("Имя", Результат.Имя); 
    Код:
        МенеджерЗаписи.Значение = ЭтаФорма.РеквизитДляРС;
    
    Получаю только имя, как всегда
  7. 1с-ник
    Offline

    1с-ник Профессионал в 1С Заблокирован

    Регистрация:
    5 окт 2014
    Сообщения:
    998
    Симпатии:
    162
    Баллы:
    104
    Объект[ИмяРеквизита] - его значение;
    Элементы[ИмяРеквизита] - его элемент формы, поле ввода.
    У вас могут быть несколько добавленных реквизитов? И что вы с ними собираетесь делать?
    Ууу, совсем все плохо.
  8. TopicStarter Overlay
    АлексейВМ
    Offline

    АлексейВМ

    Регистрация:
    25 май 2017
    Сообщения:
    19
    Симпатии:
    0
    Баллы:
    1
    Я программирую меньше месяца, конечно еще все плохо :(, да может быть несколько добавленных реквизитов. Просто надо чтоб при записи элемента справочника все созданные реквизиты с их значениями записывались в независимый регистр сведений. (пример: Справочник Кошельки, , создаю кошелек1, нажимаю добавить реквизит, открывается ПВХ, создаю характеристику "Тип карты", нажимаю записать, на форме справочника создается реквизит "Тип карты", далее я открываю список значений (справочник ДополнительныеСвойстваКошельков), ввожу туда например "MasterCard", "Visa", выбираю нужный мне, например "Visa", нажимаю записать, в регистр сведений записывается Кошелек1 ТипКарты Visa) Если создал 2 реквизита, то соответственно 2 строки (например: Кошелек1 Цвет Белый) и т.д., Вот не могу разобраться как это все реализовать, начал так как выложил выше и остановился на этом значении реквизита
  9. 1с-ник
    Offline

    1с-ник Профессионал в 1С Заблокирован

    Регистрация:
    5 окт 2014
    Сообщения:
    998
    Симпатии:
    162
    Баллы:
    104
    Даже не хочется знать, зачем это все.
    Попробуй при создании реквизита формы сохранять его, добавив, к примеру, в некую коллекцию (массив/список значений).
    Для этого создай переменную в форме и инициализируй при создании, либо создай новый реквизит формы.
    А запись значений в регистр уже будет в цикле по элементам этой коллекции.
    Код:
         
    МенеджерЗаписи = РегистрыСведений.ЗначенияСвойствКошельков.СоздатьМенеджерЗаписи();
    Для Каждого Стр Из СозданныеРеквизиты Цикл
            // Заполнение
            МенеджерЗаписи.Записать();
    КонецЦикла;
    
  10. TopicStarter Overlay
    АлексейВМ
    Offline

    АлексейВМ

    Регистрация:
    25 май 2017
    Сообщения:
    19
    Симпатии:
    0
    Баллы:
    1
    Вроде бы проблему решил, сделал по-другому чуть чуть, при нажатии кнопки сразу открывается форма РС, заполняю ее, записываю, дальше запросом вытаскиваю значения из РС и на основе их создаю реквизит и элемент формы, заполняю их данными с РС.
    Код формы элемента справочника:
    Код:
    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
        СозданиеРеквизита();
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ДобавитьРеквизит(Команда)
        ПараметрыОткрытия = Новый Структура;
        ПараметрыОткрытия.Вставить("Кошелек", Объект.Ссылка);
        Закрытие = Новый ОписаниеОповещения ("ОписаниеЗакрытия", ЭтаФорма);
        ОткрытьФорму("РегистрСведений.ЗначенияСвойствКошельков.ФормаЗаписи",ПараметрыОткрытия,,,,,Закрытие);
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ОписаниеЗакрытия(Результат,Параметры) Экспорт
        Если ТипЗнч(Результат) = Тип("Структура") Тогда
            СозданиеРеквизита();   
        КонецЕсли;
    КонецПроцедуры     
    
    &НаСервере
    Процедура СозданиеРеквизита() Экспорт
        Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ
            |    ЗначенияСвойствКошельков.Свойство.Наименование КАК Наименование,
            |    ЗначенияСвойствКошельков.Свойство КАК Свойство,
            |    ЗначенияСвойствКошельков.Значение КАК Значение,
            |    СвойстваКошельков.ТипЗначения КАК ТипЗначения
            |ИЗ
            |    РегистрСведений.ЗначенияСвойствКошельков КАК ЗначенияСвойствКошельков
            |        ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.СвойстваКошельков КАК СвойстваКошельков
            |        ПО ЗначенияСвойствКошельков.Свойство = СвойстваКошельков.Ссылка
            |ГДЕ
            |    ЗначенияСвойствКошельков.Кошелек = &Кошелек";
        Запрос.УстановитьПараметр("Кошелек", Объект.Ссылка);
        РезультатЗапроса = Запрос.Выполнить();
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
        ГлобСвойство = Новый СписокЗначений;
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            Если Элементы.Найти(СтрЗаменить(ВыборкаДетальныеЗаписи.Наименование," ","")) = Неопределено  Тогда
                НовыеРеквизиты = Новый Массив;
                НовыйРеквизит = Новый РеквизитФормы(СтрЗаменить(ВыборкаДетальныеЗаписи.Наименование," ",""),ВыборкаДетальныеЗаписи.ТипЗначения,"",ВыборкаДетальныеЗаписи.Наименование,Истина);
                НовыеРеквизиты.Добавить(НовыйРеквизит);
                ИзменитьРеквизиты (НовыеРеквизиты);
                Элемент = ЭтаФорма.Элементы.Добавить(СтрЗаменить(ВыборкаДетальныеЗаписи.Наименование," ",""),Тип("ПолеФормы"));
                Элемент.Вид = ВидПоляФормы.ПолеВвода;
                Элемент.ПутьКДанным = СтрЗаменить(НовыйРеквизит.Имя," ","");
                ЭтаФорма[СтрЗаменить(ВыборкаДетальныеЗаписи.Наименование," ","")] = ВыборкаДетальныеЗаписи.Значение;
               
            КонецЕсли;       
        КонецЦикла;
    КонецПроцедуры
    
    Код модуля формы записи РС:

    Код:
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        Если Параметры.Свойство("Кошелек") Тогда
            Запись.Кошелек = Параметры.Кошелек;
        КонецЕсли;
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ПослеЗаписи(ПараметрыЗаписи)
        СписокПараметров = Новый Структура;
        СписокПараметров.Вставить("Свойство", Запись.Свойство);
        СписокПараметров.Вставить("Значение", Запись.Значение);
        ОповеститьОВыборе(СписокПараметров);
    КонецПроцедуры
    Проблема в том, как в элементе формы мне сделать отбор? Например я создал реквизит "цвет" (в ПВХ), создал значения для него "белый" и "черный" (в справочнике Доп.св-ва), а также создал реквизит "тип карты" со значениями "виза" и "мастеркард". На форме создались оба реквизита, а в поле ввода видно все 4 значения для обоих реквизитов(так как просто ссылается).
    Как мне ограничить выбор в поле ввода? Примерно так, чтобы из справочника Доп.св-ва брались только те значения, у которых свойство соответствует выбранному реквизиту.
  11. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.349
    Симпатии:
    87
    Баллы:
    54
    Доброго,
    в типовых решениях (БУ 3.0, УТ11, ЗУП 3.0) при добавлении "нового реквизита" (доп. реквизиты) на форму используется ГУИд при формировании его имени, соответственно, зная (имея возможность его получить) ГУИд доп. реквизита, совершенно спокойно можно найти нужный объект (элемент) формы :) и сделать с ним все, что необходимо
  12. TopicStarter Overlay
    АлексейВМ
    Offline

    АлексейВМ

    Регистрация:
    25 май 2017
    Сообщения:
    19
    Симпатии:
    0
    Баллы:
    1
    Начинал делать так, создал список значений "добавленныеРеквизиты", попытался сделать отбор через СвязьПараметровВыбора, но не получилось.

    код в конце условия процедуры созданиереквизита:
    Код:
                ДобавленныеРеквизиты.Добавить(ВыборкаДетальныеЗаписи.Свойство); 
                СвязьПараметра = Новый СвязьПараметраВыбора("Отбор.Владелец", "ДобавленныеРеквизиты");
                МассивПараметров = Новый Массив();
                МассивПараметров.Добавить(СвязьПараметра); 
                НовыеСвязи = Новый ФиксированныйМассив(МассивПараметров); 
                Элемент.СвязиПараметровВыбора = НовыеСвязи;
    
    Не получилось, т.к. в ДобавленныеРеквизиты записываются имена всех реквизитов, далее в поле выбора каждого реквизита я вижу характеристики, которые соответствуют всем этим созданным реквизитам. Работает правильно, только если я создаю 1 реквизит, как мне это исправить?

Поделиться этой страницей