Имя: Пароль:
1C
1C 7.7
v7: Сохранение в справочнике значения неопределенного типа
0 Евгений Береза
 
13.11.11
06:58
Здравствуйте, уважаемые коллеги!

ПОдскажите, как хранить в элементе справочника СписокЗначений?
Реквизиту справочника назначен тип Неопределенный. В этом реквизите хочу хранить Списокзначений
1 almar
 
13.11.11
07:20
Список значений надо преобразовать в строку, а строку уже можно сохранять
2 Евгений Береза
 
13.11.11
07:34
просто преобразование? А при считывании - обратное преобразование?
3 vcv
 
13.11.11
07:39
(1) Не сохранится в реквизите неопределенного типа. Под такой реквизит выделено 22 байта. На хранение ссылок на любые объекты БД хватает, числа/даты тоже можно сохранять, а вот строки режет. Нужно делать строку очень большой или неограниченной длины, и сохранять в ней ЗначениеВСтрокуВнутр(Значение).
4 Евгений Береза
 
13.11.11
07:46
понятно! А обратное преобразование - значениеизстрокивнутр?
5 Rie
 
13.11.11
07:53
(4) Что в списке значений будет? Если ссылки - то рискуешь ссылочной целостностью.

Может, имеет смысл создать подчинённый справочник?
6 Евгений Береза
 
13.11.11
07:58
Там хранятся ссылки на фирмы. задачу не буду рассказывать полностью, долго... ПОдчиненный - думаю, не имеет смысла, слишком "жирно" для такой задачки :) А вот как обратно получить этот список значений - пока не получается
7 Евгений Береза
 
13.11.11
08:00
строказапись = значениевстрокувнутр(доступфирмы);          
фирмы=строказапись;
записать();    

ДоступФирмы - это экранный элемент
фирмы - реквизит справочника

Вот так правильно?

А обратная загрузка - вот так?
дф = значениеизстрокивнутр(фирмы);
8 vcv
 
13.11.11
08:04
(7) Правильно обратно. Только проверь значение реквизита "фирмы". Не обрезается ли он. Если оставил реквизит справочника "неопределенный" - тогда обрезается 22 символа. Нужен реквизит "строка неопределенной длины".
9 Евгений Береза
 
13.11.11
08:09
не-не, я реквизит изменил на "строка неопределенной длины".
ВОт только как теперь загрузить из строки в экранный элемент?
ПОлучается что тип переменной "дф" неопределен...
10 Rie
 
13.11.11
08:11
(6) Ну, если на ссылочную целостность начхать, то...

(9) "Экранный элемент" - это кто? Поле списка?
11 vcv
 
13.11.11
08:13
Если "дф" - это на форме элемент "Поле списка" или "Поле со списком", тогда грузить нужно так:
ЗначениеИзСтрокиВнутр(фирмы).Выгрузить(дф)
12 Евгений Береза
 
13.11.11
08:13
Да, поле списка! Може, оно у меня криво записывается... сообщить(ТипЗначенияСтр(дф)) после ситывания возвращает неопределенный тип...
13 Мимохожий Однако
 
13.11.11
08:16
Покажи код полностью. Не стесняйся.
14 Евгений Береза
 
13.11.11
08:47
код из под 1с-ки кривым шрифтом блин переносится.. не могу код показать....
15 Rie
 
13.11.11
08:49
(14) А переключиться в Конфигураторе на русский перед тем, как код копировать?
16 Евгений Береза
 
13.11.11
08:53
ф = создатьобъект("Справочник.ФИрмы");
       ф.выбрать("","ФормаСписка");
       
       доступфирмы.добавитьзначение(ф.текущийэлемент());                    
       строказапись = значениевстрокувнутр(доступфирмы);                  
       фирмы=строказапись;
       записать();
17 Евгений Береза
 
13.11.11
08:54
да... устал я видать :)
18 Евгений Береза
 
13.11.11
08:54
вот этот код - работа при добавлении в списокзначений
19 Rie
 
13.11.11
08:58
(16) Всё ж таки подумай над подчинённым справочником. Не знаю, что там вокруг, но подчинённому справочнику тут - самое место. IMHO.

доступфирмы - это кто? Поле списка или (я надеюсь на это) переменная со значением типа СписокЗначений?

Ну и код, который выполняет обратное преобразование - тоже хотелось бы видеть.
20 Евгений Береза
 
13.11.11
09:02
да, доступфирмы - это поле списка на форме
вот считывающий код
дф = значениеизстрокивнутр(фирмы);
     если ТипЗначенияСтр(дф) <>  "" тогда
         
         для i=1 по дф.размерсписка() цикл
             пром="";
             дф.получитьзначение(i,пром);  
             //сообщить(пром.наименование);
             сообщить(пром);
             доступфирмы.добавитьзначение(пром);    
         конеццикла            
     конецесли;
21 Евгений Береза
 
13.11.11
09:03
фирмы - это реквизит справочника
22 Rie
 
13.11.11
09:13
(20) Ещё раз - попробуй подчинённые справочники! :-)

Но если хочешь извращаться, то

// Туда:
перемСписок = СоздатьОбъект("СписокЗначений");
доступфирмы.Выгрузить(перемСписок);
фирмы = ЗначениеВСтроку(перемСписок);

// Оттуда:
перемСписок = ЗначениеИзСтроки(фирмы);
Если ТипЗначенияСтр(перемСписок)<>"СписокЗначений" Тогда
   Сообщить("Ой!");
Иначе
   перемСписок.Выгрузить(доступфирмы);
КонецЕсли;
23 Rie
 
13.11.11
09:17
+(22) Кстати, на форму можно бросить не просто поле списка, а поле списка с пометками. Если справочник Фирмы небольшой - то красивее будет.
24 Евгений Береза
 
13.11.11
09:21
я уже думал о пометках - красоту потом буду наводить! :)
25 Евгений Береза
 
13.11.11
09:32
Ура! Получилось! Я все забываю про использование полезных процедур "выгрузить", скорей всего из-за этого были загоны...
Спасибо, коллеги!
26 temsa
 
13.11.11
10:18
(0) сдается мне вы пытаетесь изобрести велосипед через ктоые все прошли лет 10-11 назад. Не лучше ли юзать 1с82. Или изучить возожности 1с77