Как таблицу значений сохранить в качестве реквизита элемента справочни

Sangitam

Well-known member
04.02.2008
90
0
#1
Используется 7.70.266 (демо).
Изучать 1С посредством только учебников, синтакс-помощника и аналитического склада ума конечно занятие жутко интересное :) , но все-таки в отдельных местах попадаешь в полную прострацию :)
Тем не менее, уже до многого доковырялся сам, чем чрезвычайно горжусь :)

По теме -- скажите хотя бы в каком направлении копать, хочу разобраться сам.
Таблица значений заполняется наименованиями элементов справочника и их количеством.
Модуль формы и выборку значений я уже скодил, но никак не могу сохранить результат (я знаю что таблица значений не сохраняется в БД)
 
L
#2
Сделай реквизит справочника - строка неограниченной длины, далее,:
ТаблЗн = СоздатьОбъект("ТаблицаЗначений");
... //заполнили всем необходимым
Рекв_Справочника_Который создали_Выше = ЗначениеВСтроку(ТаблЗн);

Чтобы извлечь таблицу зи реквизита:
ТаблЗн = ЗначениеИзСтроки(Рекв_Справочника_Который создали_Выше);
 

Sangitam

Well-known member
04.02.2008
90
0
#3
Чтобы извлечь таблицу из реквизита:
ТаблЗн = ЗначениеИзСтроки(Рекв_Справочника_Который создали_Выше);
ругается:
Попытка присвоить значение недоступной для записи переменной (ТаблЗн) B)



Создание таблицы имеет вид:
В диалог формы вставлена таблица с именем ТаблЗн

..//почикано
Процедура СоздТаблЗнач()
ТаблЗн.НоваяКолонка("Товар","Строка",20, ,"Товар",20);
ТаблЗн.НоваяКолонка("Количество","Число",3, ,"Количество",15);
ТаблЗн.НоваяСтрока();
КонецПроцедуры
..//почикано

Далее посредством процедур Добавить(), Изменить() и Удалить(), забитыми на соответствующие кнопки, заполняю таблицу.
..//почикано
Процедура Добавить()
Ном = ТаблЗн.ТекущаяСтрока();
Если Ном = 0 Тогда
Возврат;
КонецЕсли;
Кол = ТаблЗн.ТекущаяКолонка();
Если Кол = "Товар" Тогда
Стр = ТаблЗн.Товар;
Дл = 20;
Элем = СоздатьОбъект("Справочник.ТМЦ");
Если Элем.Выбрать("Выберите товар", "") > 0 Тогда
Стр = Элем.ПолучитьАтрибут("Наименование");
ТаблЗн.УстановитьЗначение(Ном, Кол, Стр);
КонецЕсли;
Иначе
Если Кол = "Количество" Тогда
Стр = ТаблЗн.Количество;
Дл = 3;
ВвестиСтроку(Стр,"Введите " + нРег(Кол), Дл);
ТаблЗн.УстановитьЗначение(Ном, Кол, Стр);
КонецЕсли;
КонецЕсли;
РеквизитЗаписиТаблицыЗначений = ЗначениеВСтроку(ТаблЗн);
ТаблЗн.НоваяСтрока();
КонецПроцедуры
..//почикано

Рекв_Справочника_Который создали_Выше = ЗначениеВСтрокуВнутр(ТаблЗн) -- записывает все ок, а вот назад никак.
 

Sangitam

Well-known member
04.02.2008
90
0
#4
Сорри, если нубствую, но я тут еще пытался пойти некоторыми другими способами.

В частности, через создание подчиненного справочника к редактируемому элементу, в который собственно вносятся данные о наименовании и количестве. Этот вариант стоит рассматривать или нет?

Уже вторые сутки маюсь с сохранением. Истина где-то рядом B)
 
L
#5
Для: Sangitam

Если применим вариант с созданием подчиненного справочника - то этот вариант будет наилучшим.
 
J

jj_mail

#6
Если табл. значений - это элемент диалога, то "СоздатьОбъект" применять нельзя
 
K
#7
<!--QuoteBegin-Sangitam+6:02:2008, 01:07 -->
<span class="vbquote">(Sangitam @ 6:02:2008, 01:07 )</span><!--QuoteEBegin-->Рекв_Справочника_Который создали_Выше = ЗначениеВСтрокуВнутр(ТаблЗн) -- записывает все ок, а вот назад никак.
[snapback]96738" rel="nofollow" target="_blank[/snapback]​
[/quote]
Если используешь ЗначениеВСтрокуВнутр , то извлекать ЗначениеИзСтрокиВнутр
 

Sangitam

Well-known member
04.02.2008
90
0
#8
Да-да, и с Внутр я тоже перепробовал уже, и в конце концов вернулся к варианту с подчиненным справочником, правда воз и ныне там. :)
 
I

Isabela

#9
Вот пример :
В справочнике (Контрагенты в моем случае) есть реквизит Ответственные (Строка произвольной длины).
Данные вводятся в таблицу значений, которая заполняется при открытии элемента справочника (OnOpen()) и сохраняются при закрытии формы в строке Ответственные с разделителями. Otv - таблица значений в форме элемента. Все работает
Procedure ClearSotr()
Otv.NewColumn("F",,,,"Фирма",20);
Otv.NewColumn("FC",,,,"Code",30);
Otv.NewColumn("S",,,,"Сотрудник",40);
Otv.NewColumn("SC",,,,"Code",13);
Otv.ColumnVisibility("FC,SC",0);
EndProcedure
//********************************************************************************
*******
Procedure InputSotr()
CurLine = Otv.CurrentLine();
if Otv.CurrentLine() = 0 then
Return;
endif;

CurrentColumn = Otv.CurrentColumn();
if CurrentColumn = "S" then
Prompt = "Введите сотрудника ";
Type = "Reference.Сотрудники";
ColumnCode = "SC"
endif;


GD = Otv.GetValue(CurLine,CurrentColumn);
if InputValue(GD,Prompt,Type) = 1 then
Otv.SetValue(CurLine,CurrentColumn,GD);
Otv.SetValue(CurLine,ColumnCode,GD.Code);
Otv.SetValue(CurLine,"F",GD.Parent.Description);
endif;
Otv.CurrentLine(CurLine);
EndProcedure
//********************************************************************************
*******
Procedure OnWrite()
Ответственные = ""; CurLine = 0;
Otv.SelectLines();
While Otv.GetLine() = 1 do
CurLine = CurLine + 1;
FC = TrimAll(Otv.GetValue(CurLine,2));
Ответственные = Ответственные + FC +"~";
SC = TrimAll(Otv.GetValue(CurLine,4));
Ответственные = Ответственные + SC +"~|"
enddo;
EndProcedure
//********************************************************************************
*******
Procedure OnOpen()
ClearSotr();
if EmptyValue(Ответственные) = 0 then
ОстатокКонтакта = Ответственные;
ВсегоОтветственных = StrCountOccur(Ответственные,"|");
ДлинаКонтакта = StrLen(Ответственные);

Firm = CreateObject("Reference.Фирмы");
Sotr = CreateObject("Reference.Сотрудники");

for k = 1 to ВсегоОтветственных do
Otv.NewLine();
ОграничительКонтакта = Find(ОстатокКонтакта,"|");
ОчереднойОтветственный = Left(остатокКонтакта,ОграничительКонтакта-1);
Длина = StrLen(ОстатокКонтакта);
ОстатокКонтакта = Right(Ответственные,Длина-ОграничительКонтакта);

for R = 1 to 2 do
ОграничительКолонки = Find(ОчереднойОтветственный,"~");
Cod = Left(ОчереднойОтветственный,ОграничительКолонки-1);
if R = 1 then
else // R = 2
if Sotr.FindByCode(Cod) = 1 then
Otv.SetValue(k,3,Sotr.CurrentItem());
Otv.SetValue(k,4,Sotr.Code);
Otv.SetValue(k,1,Sotr.Parent.Description);
endif;
endif;
ДлинаСтроки = StrLen(ОчереднойОтветственный);
ОчереднойОтветственный = Right(ОчереднойОтветственный,ДлинаСтроки-ОграничительКолонки);
enddo;
enddo;
EndProcedure
//********************************************************************************
*******
 

Sangitam

Well-known member
04.02.2008
90
0
#10
Спасибо! Я в принципе понял. Запомню на будущее. Если есть анкета на мамбе -- могу подарить валентинку за участие :)
Уже реализовал все через подчиненный справочник (спасибо одному из гуру за подсказку в синтаксисе).