Добрый день.
Программно создаю реквизит и элемент формы, после ввода значений хочу, записать введенные данные в регистр сведений, не пойму как это сделать.
При нажатии на кнопку открывается ПВХ, там ввожу наименование и при закрытии формы передаю на форму справочника. На форме справочника создается реквизит с указанным в пвх наименованием.
Код формы элемента справочника
Код формы элемента ПВХ
Вот эти 2 строки ничего не записывают
ВидСвойства тип "ПВХСсылка", а вот у "Значение" почему-то неопределено.
Программно создаю реквизит и элемент формы, после ввода значений хочу, записать введенные данные в регистр сведений, не пойму как это сделать.
При нажатии на кнопку открывается ПВХ, там ввожу наименование и при закрытии формы передаю на форму справочника. На форме справочника создается реквизит с указанным в пвх наименованием.
Код формы элемента справочника
&НаКлиенте
Процедура ДобавитьРеквизит(Команда)
Закрытие = Новый ОписаниеОповещения("ОписаниеЗакрытия",ЭтаФорма);
ОткрытьФорму("ПланВидовХарактеристик.СвойстваКошельков.Форма.ФормаЭлемента",,ЭтаФорма,,,,Закрытие);
КонецПроцедуры
&НаСервере
Процедура ОписаниеЗакрытия(Результат,Параметры) экспорт
НовыеРеквизиты = Новый Массив;
НовыйРеквизит = Новый РеквизитФормы(Результат.Имя,Новый ОписаниеТипов (Результат.Тип),,,Истина);
НовыеРеквизиты.Добавить(НовыйРеквизит);
ИзменитьРеквизиты (НовыеРеквизиты);
Элемент = Элементы.Добавить(Результат.Имя,Тип("ПолеФормы"),ЭтаФорма);
Элемент.Вид = ВидПоляФормы .ПолеВвода;
Элемент.ПутьКДанным = Результат.Имя;
МенеджерЗаписи = РегистрыСведений.ЗначенияСвойствКошельков.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Кошелек = Объект.Ссылка;
МенеджерЗаписи.ВидСвойства = Результат.Имя;
МенеджерЗаписи.Значение = Объект.НовыеРеквизиты;
МенеджерЗаписи.Записать();
КонецПроцедуры
ПоказатьКод формы элемента ПВХ
&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
ВыбранноеЗначение = Новый Структура;
ВыбранноеЗначение.Вставить("Имя",Объект.Наименование);
ВыбранноеЗначение.Вставить("Тип",Объект.ТипЗначения);
ОповеститьОВыборе(ВыбранноеЗначение);
КонецПроцедуры
МенеджерЗаписи.ВидСвойства = Результат.Имя;
МенеджерЗаписи.Значение = Объект.НовыеРеквизиты;
Вот эти 2 строки ничего не записывают
ВидСвойства тип "ПВХСсылка", а вот у "Значение" почему-то неопределено.
По теме из базы знаний
- Быстрый поиск дублей с четким/нечетким поиском по любому сочетанию реквизитов/реквизитов таб. частей с отбором и быстрой заменой значений в ЛЮБЫХ базах 8.1-8.3 (УТ 10.3, БП 2, ЗУП 2.5, КА 1.1, УТ 11, БП 3, УНФ 1.6/3.0, КА 2, ЗУП 3 и т.д.)
- Перенос данных из УПП 1.3 / КА 1.1 в БП 3. Переносятся документы, справочники и начальные остатки
- Универсальные функции ЗУП 3.1 / ЗКГУ 3.1, которые помогут в разработке
- Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов
- Версионирование объектов VS История данных
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Вид свойства исправил, в ПВХ передавал наименование, а не ссылку
а как вот теперь значение поля ввода внести в РС?
ВыбранноеЗначение.Вставить("Имя",Объект.Ссылка);
а как вот теперь значение поля ввода внести в РС?
Сейчас уже решил делать по-другому. Создал не программно реквизит формы, решил в него передавать значения, а оттуда уже в РС, но все равно ничего не изменилось
Почти все работает, но есть один конкретный вопрос - Как мне достать значение программно созданного реквизита? Пробовал по разному и через объект. и через элементы. и через этаформа.новыйреквизит, но везде не находит его
&НаКлиенте
Процедура ДобавитьРеквизит(Команда)
Закрытие = Новый ОписаниеОповещения("ОписаниеЗакрытия",ЭтаФорма);
ОткрытьФорму("ПланВидовХарактеристик.СвойстваКошельков.Форма.ФормаЭлемента",,ЭтаФорма,,,,Закрытие);
КонецПроцедуры
&НаСервере
Процедура ОписаниеЗакрытия(Результат,Параметры) экспорт
Если ТипЗнч(Результат) = Тип("Структура") Тогда
НовыеРеквизиты = Новый Массив;
НовыйРеквизит = Новый РеквизитФормы(Результат.Имя,Результат.Тип,,,Истина);
НовыеРеквизиты.Добавить(НовыйРеквизит);
ИзменитьРеквизиты (НовыеРеквизиты);
Элемент = Элементы.Добавить(Результат.Имя,Тип("ПолеФормы"),ЭтаФорма);
Элемент.Вид = ВидПоляФормы.ПолеВвода;
Элемент.ПутьКДанным = НовыйРеквизит.Имя;
РеквизитДляРС = Новый Структура;
РеквизитДляРС.Вставить("Имя", Результат.Имя);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
РеквизитДляРС.Вставить ("Тип",ЭтаФорма.НовыйРеквизит);
ЗаписьВРегистр();
КонецПроцедуры
&НаСервере
Процедура ЗаписьВРегистр()
МенеджерЗаписи = РегистрыСведений.ЗначенияСвойствКошельков.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Кошелек = Объект.Ссылка;
МенеджерЗаписи.ВидСвойства = РеквизитДляРС.Имя;
МенеджерЗаписи.Значение = РеквизитДляРС.Тип;
МенеджерЗаписи.Записать();
КонецПроцедуры
ПоказатьПочти все работает, но есть один конкретный вопрос - Как мне достать значение программно созданного реквизита? Пробовал по разному и через объект. и через элементы. и через этаформа.новыйреквизит, но везде не находит его
я вот например пробовал сделать так
И создавал в ПВХ запись "Цвет", тогда в отладчике я нормально вижу значение, которое ввожу в поле ввода. А как вот сделать, чтобы брало значение параметра независимо от его имени? не могу же написать ЭтаФорма.Новыйреквизит, а как тогда, я вообще не пойму.
Внутри процедуры ОписаниеЗакрытия я могу получить только имя реквизита через результат.имя
МенеджерЗаписи.Значение = ЭтаФорма.Цвет;
И создавал в ПВХ запись "Цвет", тогда в отладчике я нормально вижу значение, которое ввожу в поле ввода. А как вот сделать, чтобы брало значение параметра независимо от его имени? не могу же написать ЭтаФорма.Новыйреквизит, а как тогда, я вообще не пойму.
Внутри процедуры ОписаниеЗакрытия я могу получить только имя реквизита через результат.имя
Вроде бы проблему решил, сделал по-другому чуть чуть, при нажатии кнопки сразу открывается форма РС, заполняю ее, записываю, дальше запросом вытаскиваю значения из РС и на основе их создаю реквизит и элемент формы, заполняю их данными с РС.
Код формы элемента справочника:
Код модуля формы записи РС:
Проблема в том, как в элементе формы мне сделать отбор? Например я создал реквизит "цвет" (в ПВХ), создал значения для него "белый" и "черный" (в справочнике Доп.св-ва), а также создал реквизит "тип карты" со значениями "виза" и "мастеркард". На форме создались оба реквизита, а в поле ввода видно все 4 значения для обоих реквизитов(так как просто ссылается).
Как мне ограничить выбор в поле ввода? Примерно так, чтобы из справочника Доп.св-ва брались только те значения, у которых свойство соответствует выбранному реквизиту.
Код формы элемента справочника:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
СозданиеРеквизита();
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьРеквизит(Команда)
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("Кошелек", Объект.Ссылка);
Закрытие = Новый ОписаниеОповещения ("ОписаниеЗакрытия", ЭтаФорма);
ОткрытьФорму("РегистрСведений.ЗначенияСвойствКошельков.ФормаЗаписи",ПараметрыОткрытия,,,,,Закрытие);
КонецПроцедуры
&НаКлиенте
Процедура ОписаниеЗакрытия(Результат,Параметры) Экспорт
Если ТипЗнч(Результат) = Тип("Структура") Тогда
СозданиеРеквизита();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура СозданиеРеквизита() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗначенияСвойствКошельков.Свойство.Наименование КАК Наименование,
| ЗначенияСвойствКошельков.Свойство КАК Свойство,
| ЗначенияСвойствКошельков.Значение КАК Значение,
| СвойстваКошельков.ТипЗначения КАК ТипЗначения
|ИЗ
| РегистрСведений.ЗначенияСвойствКошельков КАК ЗначенияСвойствКошельков
| ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.СвойстваКошельков КАК СвойстваКошельков
| ПО ЗначенияСвойствКошельков.Свойство = СвойстваКошельков.Ссылка
|ГДЕ
| ЗначенияСвойствКошельков.Кошелек = &Кошелек";
Запрос.УстановитьПараметр("Кошелек", Объект.Ссылка);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
ГлобСвойство = Новый СписокЗначений;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если Элементы.Найти(СтрЗаменить(ВыборкаДетальныеЗаписи.Наименование," ","")) = Неопределено Тогда
НовыеРеквизиты = Новый Массив;
НовыйРеквизит = Новый РеквизитФормы(СтрЗаменить(ВыборкаДетальныеЗаписи.Наименование," ",""),ВыборкаДетальныеЗаписи.ТипЗначения,"",ВыборкаДетальныеЗаписи.Наименование,Истина);
НовыеРеквизиты.Добавить(НовыйРеквизит);
ИзменитьРеквизиты (НовыеРеквизиты);
Элемент = ЭтаФорма.Элементы.Добавить(СтрЗаменить(ВыборкаДетальныеЗаписи.Наименование," ",""),Тип("ПолеФормы"));
Элемент.Вид = ВидПоляФормы.ПолеВвода;
Элемент.ПутьКДанным = СтрЗаменить(НовыйРеквизит.Имя," ","");
ЭтаФорма[СрЗаменить(ВыборкаДетальныеЗаписи.Наименование," ","")] = ВыборкаДетальныеЗаписи.Значение;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
ПоказатьКод модуля формы записи РС:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("Кошелек") Тогда
Запись.Кошелек = Параметры.Кошелек;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
СписокПараметров = Новый Структура;
СписокПараметров.Вставить("Свойство", Запись.Свойство);
СписокПараметров.Вставить("Значение", Запись.Значение);
ОповеститьОВыборе(СписокПараметров);
КонецПроцедуры
ПоказатьПроблема в том, как в элементе формы мне сделать отбор? Например я создал реквизит "цвет" (в ПВХ), создал значения для него "белый" и "черный" (в справочнике Доп.св-ва), а также создал реквизит "тип карты" со значениями "виза" и "мастеркард". На форме создались оба реквизита, а в поле ввода видно все 4 значения для обоих реквизитов(так как просто ссылается).
Как мне ограничить выбор в поле ввода? Примерно так, чтобы из справочника Доп.св-ва брались только те значения, у которых свойство соответствует выбранному реквизиту.
Создал список значений "добавленныеРеквизиты", попытался сделать отбор через СвязьПараметровВыбора, но не получилось
Не получилось, т.к. в ДобавленныеРеквизиты записываются имена всех реквизитов, далее в поле выбора каждого реквизита я вижу характеристики, которые соответствуют всем этим созданным реквизитам. Работает правильно, только если я создаю 1 реквизит, как мне это исправить?
&НаСервере
Процедура СозданиеРеквизита() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗначенияСвойствКошельков.Свойство.Наименование КАК Наименование,
| ЗначенияСвойствКошельков.Свойство КАК Свойство,
| ЗначенияСвойствКошельков.Значение КАК Значение,
| СвойстваКошельков.ТипЗначения КАК ТипЗначения,
| ЗначенияСвойствКошельков.Свойство.Ссылка КАК СвойствоСсылка
|ИЗ
| РегистрСведений.ЗначенияСвойствКошельков КАК ЗначенияСвойствКошельков
| ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.СвойстваКошельков КАК СвойстваКошельков
| ПО ЗначенияСвойствКошельков.Свойство = СвойстваКошельков.Ссылка
|ГДЕ
| ЗначенияСвойствКошельков.Кошелек = &Кошелек";
Запрос.УстановитьПараметр("Кошелек", Объект.Ссылка);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если Элементы.Найти(СтрЗаменить(ВыборкаДетальныеЗаписи.Наименование," ","")) = Неопределено Тогда
НовыеРеквизиты = Новый Массив;
НовыйРеквизит = Новый РеквизитФормы(СтрЗаменить(ВыборкаДетальныеЗаписи.Наименование," ",""),ВыборкаДетальныеЗаписи.ТипЗначения,"",ВыборкаДетальныеЗаписи.Наименование,Истина);
НовыеРеквизиты.Добавить(НовыйРеквизит);
ИзменитьРеквизиты (НовыеРеквизиты);
Элемент = ЭтаФорма.Элементы.Добавить(СтрЗаменить(ВыборкаДетальныеЗаписи.Наименование," ",""),Тип("ПолеФормы"));
Элемент.Вид = ВидПоляФормы.ПолеВвода;
Элемент.ПутьКДанным = СтрЗаменить(НовыйРеквизит.Имя," ","");
ЭтаФорма[СтрЗаменить(ВыборкаДетальныеЗаписи.Наименование," ","")] = ВыборкаДетальныеЗаписи.Значение;
ДобавленныеРеквизиты.Добавить(ВыборкаДетальныеЗаписи.Свойство);
СвязьПараметра = Новый СвязьПараметраВыбора("Отбор.Владелец", "ДобавленныеРеквизиты");
МассивПараметров = Новый Массив();
МассивПараметров.Добавить(СвязьПараметра);
НовыеСвязи = Новый ФиксированныйМассив(МассивПараметров);
Элемент.СвязиПараметровВыбора = НовыеСвязи;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
ПоказатьНе получилось, т.к. в ДобавленныеРеквизиты записываются имена всех реквизитов, далее в поле выбора каждого реквизита я вижу характеристики, которые соответствуют всем этим созданным реквизитам. Работает правильно, только если я создаю 1 реквизит, как мне это исправить?
Внимание! Тема сдана в архив
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот