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

Тема в разделе "1C и всё что с ней связано", создана пользователем Sangitam, 5 фев 2008.

  1. Sangitam

    Sangitam Well-Known Member

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

    По теме -- скажите хотя бы в каком направлении копать, хочу разобраться сам.
    Таблица значений заполняется наименованиями элементов справочника и их количеством.
    Модуль формы и выборку значений я уже скодил, но никак не могу сохранить результат (я знаю что таблица значений не сохраняется в БД)
     
  2. LSH

    LSH Гость

    Сделай реквизит справочника - строка неограниченной длины, далее,:
    ТаблЗн = СоздатьОбъект("ТаблицаЗначений");
    ... //заполнили всем необходимым
    Рекв_Справочника_Который создали_Выше = ЗначениеВСтроку(ТаблЗн);

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

    Sangitam Well-Known Member

    Регистрация:
    4 фев 2008
    Сообщения:
    90
    Симпатии:
    0
    ругается:
    Попытка присвоить значение недоступной для записи переменной (ТаблЗн) B)



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

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

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

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

    Sangitam Well-Known Member

    Регистрация:
    4 фев 2008
    Сообщения:
    90
    Симпатии:
    0
    Сорри, если нубствую, но я тут еще пытался пойти некоторыми другими способами.

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

    Уже вторые сутки маюсь с сохранением. Истина где-то рядом B)
     
  5. LSH

    LSH Гость

    Для: Sangitam

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

    jj_mail Гость

    Если табл. значений - это элемент диалога, то "СоздатьОбъект" применять нельзя
     
  7. kaa

    kaa Гость

    <!--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]
    Если используешь ЗначениеВСтрокуВнутр , то извлекать ЗначениеИзСтрокиВнутр
     
  8. Sangitam

    Sangitam Well-Known Member

    Регистрация:
    4 фев 2008
    Сообщения:
    90
    Симпатии:
    0
    Да-да, и с Внутр я тоже перепробовал уже, и в конце концов вернулся к варианту с подчиненным справочником, правда воз и ныне там. :)
     
  9. Isabela

    Isabela Гость

    Вот пример :
    В справочнике (Контрагенты в моем случае) есть реквизит Ответственные (Строка произвольной длины).
    Данные вводятся в таблицу значений, которая заполняется при открытии элемента справочника (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
    //********************************************************************************
    *******
     
  10. Sangitam

    Sangitam Well-Known Member

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

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