Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
13 апр 2024, 04:42

Из ТЗ в форму документа

Автор Dimkostav, 28 окт 2010, 15:35

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

Dimkostav

Добрый день. Помогите новичку.
Есть документ ПередачаВСалоны. У этого документа есть ФормаДокумента. На ФормаДокумента есть поле ввода, данные которого <Реквизит табличной части> этого документа. Сам же  <Реквизит табличной части> имеет тип СправочникСсылка.<ИмяСправочника>.
При нажатии на поле ввода открывается ФормаВыбора из соответствующего справочника. На этой ФормаВыбора есть ТаблицаЗначений. В ней данные из запроса. Как же вернуть выбранное значение из этой ТаблицаЗначений в ФормаДокумента? :dfbbdrfb:

Dimkostav

Cейчас примерно такая ситуация получается:

В модуле формы документа

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


А в модуле ФормыВыбора так:


Процедура ПриОткрытии()
Если ЭтаФорма.Вызывает = "1" Тогда
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               | Картриджи.Код КАК Код,
               | Картриджи.Наименование КАК Модель
               |ИЗ
               | Справочник.Картриджи КАК Картриджи";
Результат = Запрос.Выполнить();
       ТЗ = Результат.Выгрузить();
         ЭлементыФормы.ТЗ.СоздатьКолонки();
         
//////////////////////////////////////////////////////////////////////////////////
ИначеЕсли ЭтаФорма.Вызывает = "2" Тогда
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
   | Картриджи.Код КАК Код,
   | Картриджи.УникальныйНомерКартриджа,
   | Картриджи.Наименование,
   | Картриджи.ЮрЛицо.Наименование
   |ИЗ
   | Справочник.Картриджи КАК Картриджи";
Результат = Запрос.Выполнить();
   ЭлементыФормы.ТЗ.СоздатьКолонки();
КонецЕсли
КонецПроцедуры


Процедура КоманднаяПанель1Действие1(Кнопка)
Закрыть(ЭлементыФормы.ТЗ.ТекущиеДанные.Код);
Сообщить(ЭлементыФормы.ТЗ.ТекущиеДанные.Код);
КонецПроцедуры


Но ругается на: ЭтотОбъект.Метаданные().ТабличныеЧасти.Картриджи.Реквизиты.Картридж = ТЗСтрока.Код;
Поле объекта недоступно для записи (Картридж)

mdv

В форме документа, в обработчике выбора значения свойства картридж надо писать как то так:
Форма = Справочник.Катриджи.ПолучитьФормуВыбора();
ТекКатридж = Форма.ОткрытьМодально(мКатридж);

А в форме выбора использовать обработчик табличной части "Выбор", через параметры обработчика получить значение выбранного элемента и написать так:
ЭтаФорма.Закрыть(ЗначениеВыбранногоЭлемента);

Таким образом в переменную ТекКатридж получите значение выбора.

Dimkostav

Да, так намного красивее получается. Только попадает в переменную. А как записать значение в реквизит табличной части?

Форма документа:

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

Форма выбора:

Процедура ПриОткрытии()

ЭтаФорма.РежимВыбора = Истина;

Если ЭтаФорма.Вызывает = "1" Тогда
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
   | Картриджи.Код КАК Код,
   | Картриджи.УникальныйНомерКартриджа КАК УникальныйНомерКартриджа,
   | Картриджи.Наименование КАК Наименование,
   | Картриджи.ЮрЛицо.Наименование КАК ЮрЛицо
   |ИЗ
   | Справочник.Картриджи КАК Картриджи";
   Результат = Запрос.Выполнить();
   ТЗ = Результат.Выгрузить();
   ЭлементыФормы.ТЗ.СоздатьКолонки();
КонецПроцедуры

Процедура ТЗВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
ЭтаФорма.Закрыть(ВыбраннаяСтрока.Код);
КонецПроцедуры


mdv

Элемент.Значение = ТекКатридж;


Dimkostav

У ТекСтрока есть необходимое значение. А вот в Элемент.Значение ничего не падает. В отладчике оно пустое :(

mdv

Надо вместо вот этого
ЭтотОбъект.Метаданные().ТабличныеЧасти.Картриджи.Реквизиты.Картридж = ТекСтрока;

написать вот это:
Элемент.Значение = ТекСтрока;

Dimkostav


mdv

Процедура ТЗВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
   ЭтаФорма.Закрыть(ВыбраннаяСтрока.Код);
КонецПроцедуры

В переменную текСтрока попадает код справочника (тип строка), а тебе надо ссылку получить на элемент

Dimkostav

Тогда так?
Процедура ТЗВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
   ЭтаФорма.Закрыть(Элемент);
КонецПроцедуры

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск