Имя: Пароль:
1C
1С v8
Реквизит справочника типа Хранилище значения
,
0 247tsm
 
08.11.14
22:32
Вопрос для знатоков 1С81 простой.

Есть справочник с реквизитом ЦветТ типа хранилище значения.
Я пытаюсь записать в него цвет текста но не получается.
Я делаю так:

Процедура Кнопка5Нажатие(Элемент)
    Диалог = Новый ДиалогВыбораЦвета;
    Если Диалог.Выбрать() Тогда
        ЦветТ = Диалог.Цвет;
    КонецЕсли;
КонецПроцедуры

Процедура ПриОткрытии()
    Если ЦветТ<>Неопределено Тогда
        ЭтаФорма.ЭлементыФормы.текстRO.ЦветТекстаПоля = ЦветТ;
    КонецЕсли;
КонецПроцедуры

Но в отладчике вижу что при открытии формы ЦветТ=Неопределено.

Почему? Реквизиты типа Хранилище значения особые и работать с ними нужно по особому?
Как мне изменить текст модуля чтобы всё работало?
1 wertyu
 
08.11.14
22:35
только через Новый
2 wertyu
 
08.11.14
22:36
ты можешь выбрать Красный, Зелёный, Синий, но там ещё есть вид цвета
3 wertyu
 
08.11.14
22:40
+ всё, что надо определять через Новый (конструктор), надо так и определять
4 247tsm
 
08.11.14
22:41
Конечно, для хранения цвета можно использовать реквизит типа строка:

Реквизит1 = ЗначениеВСтрокуВнутр(ЦветТ);

а при открытии:

Если ЗначениеЗаполнено(Реквизит1) Тогда
        ЭтаФорма.ЭлементыФормы.текстRO.ЦветТекстаПоля = ЗначениеИзСтрокиВнутр(Реквизит1);
КонецЕсли;

Но, наверно, проще использовать реквизит типа Хранилище значения без всяких функций, преобразований?
5 247tsm
 
08.11.14
22:42
(1) Я не совсем понял. Что "только через Новый". Ведь для определения цвета я использую
    Диалог = Новый ДиалогВыбораЦвета;
6 247tsm
 
08.11.14
22:43
(3) А как это будет в коде?
7 wertyu
 
08.11.14
22:43
Функция ПолучитьСтатьиБюджетирования(Бюджет) Экспорт
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    СтатьиБюджета.Ссылка КАК Ссылка,
    |    СтатьиБюджета.Шрифт,
    |    СтатьиБюджета.ЦветФона
    |ИЗ
    |    Справочник.СтатьиБюджета КАК СтатьиБюджета
    |ГДЕ
    |    СтатьиБюджета.Владелец = &Бюджет
    |    И СтатьиБюджета.ПометкаУдаления = ЛОЖЬ";
                  
    Запрос.УстановитьПараметр("Бюджет", Бюджет);
    Результат = Запрос.Выполнить();
    ТаблицаСтатейБюджетирования = Результат.Выгрузить();
    
    Возврат ТаблицаСтатейБюджетирования;
    
КонецФункции // ПолучитьСтатьиБюджетирования()
8 wertyu
 
08.11.14
22:44
ТаблицаСтатейБюджетирования = ПолучитьСтатьиБюджетирования(Бюджет);
    
    Настройки.УсловноеОформление.Элементы.Очистить();
    Для Каждого СтрокаТаблицаСтатейБюджетирования Из ТаблицаСтатейБюджетирования Цикл
        Шрифт0 = ЗначениеИзСтрокиВнутр(СтрокаТаблицаСтатейБюджетирования.Шрифт);
        ЦветФона0 = ЗначениеИзСтрокиВнутр(СтрокаТаблицаСтатейБюджетирования.ЦветФона);
        НовыйЭлементОформления = Настройки.УсловноеОформление.Элементы.Добавить();
        НовыйОтбор = НовыйЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        НовыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Статья");
        НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
        НовыйОтбор.ПравоеЗначение = СтрокаТаблицаСтатейБюджетирования.Ссылка;
        ШрифтОформление = НовыйЭлементОформления.Оформление.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Шрифт"));
        ЦветФонаОформление = НовыйЭлементОформления.Оформление.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ЦветФона"));
        УдалитьЭлементОформления = Истина;
        Если Не ШрифтОформление.Значение = Шрифт0 Тогда
            ШрифтОформление.Значение = Шрифт0;
            ШрифтОформление.Использование = Истина;
            УдалитьЭлементОформления = Ложь;
        КонецЕсли;
        Если Не ЦветФона0 = Новый Цвет(255, 255, 255) Тогда
            ЦветФонаОформление.Значение = ЦветФона0;
            ЦветФонаОформление.Использование = Истина;
            УдалитьЭлементОформления = Ложь;
        КонецЕсли;
        Если УдалитьЭлементОформления Тогда
            Настройки.УсловноеОформление.Элементы.Удалить(НовыйЭлементОформления);
        КонецЕсли;
    КонецЦикла;
9 wertyu
 
08.11.14
22:48
ТабДок.Область(НС + 1, НК, НС + 1, НК).ГраницаСнизу =
                    Новый Линия(ТабДок.Область(НС, НК, НС, НК).ГраницаСнизу.ТипЛинии, ТабДок.Область(НС, НК, НС, НК).ГраницаСнизу.Толщина, ТабДок.Область(НС, НК, НС, НК).ГраницаСнизу.Отступ);
10 wertyu
 
08.11.14
22:48
это примерно тоже самое
11 247tsm
 
08.11.14
22:51
(8) Из примера я понял, что реквизиты справочника СтрокаТаблицаСтатейБюджетирования.Шрифт типа строка и СтрокаТаблицаСтатейБюджетирования.ЦветФона тоже типа строка.
А у меня же типа Хранилище значения. Пример со строкой я уже и сам привёл.
Меня интересует, можно ли делать проще, используя реквизит типа Хранилище значения и как обычный реквизит его сохранять, а затем считывать?
12 wertyu
 
08.11.14
22:51
ну т.е. и ГраницаСнизу надо присваивать значения только через конструктор, понятно?
13 wertyu
 
08.11.14
22:53
(11) в Скд можно приваивать готовое, иначе только через конструктор
14 247tsm
 
08.11.14
22:54
(12) У меня не записывается значение в реквизит типа Хранилище значения, поэтому до присваивания далеко.
15 wertyu
 
08.11.14
22:54
и надо платформу поменять на 82 минимум
16 wertyu
 
08.11.14
22:57
(14) я тебе пытался показать, что не надо хранить само значение, если не получается потом извлечь, а можно хранить его составляющие
17 Chameleon1980
 
08.11.14
22:59
а у хз есть метод получить вроде
18 247tsm
 
08.11.14
23:00
(13) + (15) У меня речь не идет ни про СКД, ни про конструктор. У меня 1С81, где есть реквизиты типа Хранилище значения.
У меня просто форма справочника, на ней кнопка для выбора цвета текста и его записи в реквизит типа хранилище значения. Это не работает. Вот я и прошу подсказать, почему, где ошибка в приведённом мной коде?
(16) Но я знаю, как можно выкрутиться, используя реквизит типа строка и функцию ЗначениеВСтрокуВнутр().
Но я хочу понять, почему нельзя напрямую пользоваться реквизитом типа Хранилище значения?
19 Chameleon1980
 
08.11.14
23:00
ХранилищеЗначения.Получить (ValueStorage.Get)
ХранилищеЗначения (ValueStorage)
Получить (Get)
Синтаксис:

Получить()
Возвращаемое значение:

Тип: Произвольный.
Значение, содержащееся в хранилище.
Описание:

Получает из хранилища сохраненное в нем значение.

Доступность:

Сервер, толстый клиент, внешнее соединение.
Пример:

МояКартинка = ХранилищеКартинки.Получить();
20 Chameleon1980
 
08.11.14
23:03
ну и при сохранении чтото типа

Хранилище=Новый ХранилищеЗначения(ЗначениеВСтрокуВнутр(ЗдесьВашиДАнные))
21 wertyu
 
08.11.14
23:04
(18) да можно, только через конструктор, что тут непонятно?
22 wertyu
 
08.11.14
23:04
Новый - это конструктор
23 247tsm
 
08.11.14
23:05
(20) Если использовать функцию ЗначениеВСтрокуВнутр(), то зачем использовать для цвета реквизит типа Хранилище значения? Проще использовать реквизит типа строка!
24 Chameleon1980
 
08.11.14
23:10
да по быстрому просто выдернул кусок из старого отчета
у меня там просто тз сохранялась
25 Chameleon1980
 
08.11.14
23:11
так то просто уж точно что хочешь (практически) сохранишь
26 247tsm
 
08.11.14
23:14
(25) А можешь подправить текст процедур из (0), чтобы всё получилось?
27 Chameleon1980
 
08.11.14
23:17
Процедура Кнопка5Нажатие(Элемент)
    Диалог = Новый ДиалогВыбораЦвета;
    Если Диалог.Выбрать() Тогда
        ЦветТ = Новый ХранилищеЗначения(ЗначениеВСтрокуВнутр(Диалог.Цвет));
    КонецЕсли;
КонецПроцедуры

Процедура ПриОткрытии()
    Если ЦветТ<>Неопределено Тогда
        ЭтаФорма.ЭлементыФормы.текстRO.ЦветТекстаПоля = ЦветТ.Получить();
    КонецЕсли;
КонецПроцедуры

может так?
28 Chameleon1980
 
08.11.14
23:19
даже

Процедура ПриОткрытии()
    _Цвет=ЦветТ.Получить();
    Если _Цвет<>Неопределено Тогда
        ЭтаФорма.ЭлементыФормы.текстRO.ЦветТекстаПоля = _Цвет;
    КонецЕсли;
КонецПроцедуры

вот так наверное
29 247tsm
 
08.11.14
23:22
(27) Нет, в отладчике вижу, что ЦветТ=Неопределено
30 247tsm
 
08.11.14
23:24
(28) На строку

    _Цвет=ЦветТ.Получить();

дает

Значение не является значением объектного типа (Получить)
31 247tsm
 
08.11.14
23:27
(27) И всё же, зачем использовать функцию ЗначениеВСтрокуВнутр()?
В этом случае не нужен реквизит типа Хранилище значения!!!
А просто нужен просто типа строка.
32 Chameleon1980
 
08.11.14
23:33
ЗначениеВСтрокуВнутр чтобы, например тз (таб. зн.) сохранять
ЦветТ - реквизит справочника типа ХЗ (хран. зн.) ???
33 Chameleon1980
 
08.11.14
23:35
скажите мне тип значения ЦветТ
34 247tsm
 
08.11.14
23:37
(32) да, и по-моему, здесь функция ЗначениеВСтрокуВнутр() не нужна, либо если использовать эту функцию, то не нужен тип реквизита Хранилище значения, а нужен тип строка.
Но я хочу добиться работы с типом Хранилище значения.
35 247tsm
 
08.11.14
23:38
(33) ЦветТ = Диалог.Цвет
36 247tsm
 
08.11.14
23:41
(33) Уточняю: в справочнике есть реквизит ЦветТ с типом Хранилище значения. Я в него хочу записать Диалог.Цвет
37 Chameleon1980
 
08.11.14
23:41
а как тогда называется реквизит у которого тип хз (хр.зн.) ???

капеч. мы даже не там запнулись.
38 247tsm
 
08.11.14
23:42
(33) в (0) описана задача ;)
39 247tsm
 
08.11.14
23:43
(37) ???
У реквизита ЦветТ тип Хранилище значения. Я в него хочу записать Диалог.Цвет
40 Chameleon1980
 
08.11.14
23:44
а что угадывать буду
просто скажите как у вас называется

Реквизит справочника типа Хранилище значения

имя его
41 247tsm
 
08.11.14
23:44
(40) ЦветТ
42 Chameleon1980
 
08.11.14
23:45
он бы не ругался как в 30 т.к. у Хран. зн. есть метод Получить() который "Получает из хранилища сохраненное в нем значение" (C) СП
43 Chameleon1980
 
08.11.14
23:46
где-то вы врете уважаемый
44 247tsm
 
08.11.14
23:47
(43) Хорошо, смотрю в конфу ещё раз ;)
45 247tsm
 
08.11.14
23:51
Реквизит ЦветТ, тип - ХранилищеЗначения.

У меня процедура:

Диалог = Новый ДиалогВыбораЦвета;
Если Диалог.Выбрать() Тогда
        ЦветТ = Новый ХранилищеЗначения(Диалог.Цвет);
КонецЕсли;

Процедура ПриОткрытии()
    _Цвет=ЦветТ.Получить();
    Если _Цвет<>Неопределено Тогда
        ЭтаФорма.ЭлементыФормы.текстRO.ЦветТекстаПоля = _Цвет;
    КонецЕсли;
КонецПроцедуры

При открытии формы ругается:
{Справочник.Меню.Форма.ФормаЭлемента1(16)}: Значение не является значением объектного типа (Получить)
    _Цвет=ЦветТ.Получить();
46 247tsm
 
08.11.14
23:52
(43) Так что я не вру ;)
47 247tsm
 
08.11.14
23:55
Более того, в отладчике я вижу, что после строки:

        ЦветТ = Новый ХранилищеЗначения(Диалог.Цвет);

значение ЦветТ.Получить() - это значение выбранного цвета.

Но ... это значение или "теряется" или я его не могу прочитать при открытии формы справочника.
48 Chameleon1980
 
09.11.14
00:09
а после

Процедура Кнопка5Нажатие(Элемент)
    Диалог = Новый ДиалогВыбораЦвета;
    Если Диалог.Выбрать() Тогда
        ЦветТ = Диалог.Цвет;
    КонецЕсли;
КонецПроцедуры

объект чей реквизит сохраняется?

ну и проверьте перед _Цвет=ЦветТ.Получить();
типзначения(ЦветТ)

что за конфа? большая? может кинете куданить?
А то что-то надоело чуть в темноте ходить
49 247tsm
 
09.11.14
00:16
(48) в отладчике ЦветТ имеет значение цвета, выбранного в Диалог.Цвет

А при открытии ЦветТ имеет значение Неопределено!

Поэтому и получить значение не удается.
50 Chameleon1980
 
09.11.14
00:19
пилят
как зовут реквизита справочника (какогото) в который мы хотим сохранить значение у которого тип хран.зн. ????????????????????????????
51 247tsm
 
09.11.14
00:23
Справочник Меню.
Реквизит ЦветТ, тип - Хранилище значения
52 247tsm
 
09.11.14
00:25
(50) Я в этот реквизит ЦветТ хочу сохранить цвет, а не "значение у которого тип хран.зн."
53 Chameleon1980
 
09.11.14
00:27
конфа большая.
просто конфа - без данных.
а то мы видать на ночь глядя ходим вокруг да около
54 Chameleon1980
 
09.11.14
00:27
большая???
55 247tsm
 
09.11.14
00:33
(50) Да, большая.
Но, по-моему, в (0) я всё описал достаточно ясно и максимально подробно, с текстом процедур.
Вот последний вариант процедур:

Процедура Кнопка5Нажатие(Элемент)
    Диалог = Новый ДиалогВыбораЦвета;
    Если Диалог.Выбрать() Тогда
        ЦветТ = Новый ХранилищеЗначения(Диалог.Цвет);
    КонецЕсли;
КонецПроцедуры

Процедура ПриОткрытии()
    Если ЦветТ<>Неопределено Тогда
        ЭтаФорма.ЭлементыФормы.текстRO.ЦветТекстаПоля = ЦветТ.Получить();
    КонецЕсли;
КонецПроцедуры

Но почему-то при открытии ЦветТ=Неопределено.
Вот в этом и вопрос.
56 Chameleon1980
 
09.11.14
00:44
счас не ругается на получить?
57 Chameleon1980
 
09.11.14
00:44
Процедура Кнопка5Нажатие(Элемент)
    Диалог = Новый ДиалогВыбораЦвета;
    Если Диалог.Выбрать() Тогда
        ЦветТ = Новый ХранилищеЗначения(Диалог.Цвет);
    КонецЕсли;
КонецПроцедуры

а вот тут сам справочник сохранить?
58 247tsm
 
09.11.14
00:49
(56) Так до получить() не доходит.
59 Chameleon1980
 
09.11.14
00:55
уьрать Если ЦветТ<>Неопределено Тогда

и после
    Диалог = Новый ДиалогВыбораЦвета;
    Если Диалог.Выбрать() Тогда
        ЦветТ = Новый ХранилищеЗначения(Диалог.Цвет);
    КонецЕсли;
сохранить справочник
60 Chameleon1980
 
09.11.14
00:57
сохраните конфу в файл и выложьте куданить
мне данные не нужны
61 Chameleon1980
 
09.11.14
00:59
или есть TeamViewer ?
в почту номер с паролем если что
Nickolay_Mulko собака Mail.ru
62 247tsm
 
09.11.14
01:15
(61) Отправил
63 Chameleon1980
 
09.11.14
01:16
под какую платформу?
64 Chameleon1980
 
09.11.14
01:16
все вижу
65 247tsm
 
09.11.14
01:17
(63) 1С:Предприятие 8.1 (8.1.15.14)
66 Chameleon1980
 
09.11.14
01:33
пля странно. я походу сплю
Тут видимо проблема в том что присваеваем значения реквизиту прямо в форме элемента. Но почему. Пипец
67 Chameleon1980
 
09.11.14
01:49
ну поправить то я поправил
тока почему диалог выбора цвета возращает в аттрибут цвет всегда 0,0,0
не обращал внимания?
68 Chameleon1980
 
09.11.14
01:50
плин точно сплю все норм
счас пришлю
69 Chameleon1980
 
09.11.14
01:57
ушло
70 247tsm
 
09.11.14
01:58
(69) получил, смотрю
71 Chameleon1980
 
09.11.14
02:06
я наверное спать - пяты час пошел
72 247tsm
 
09.11.14
02:12
(71) ОК
73 247tsm
 
09.11.14
02:12
(71) У нас только второй час пошел. ;)
74 247tsm
 
09.11.14
02:13
(71) Да, работает, буду разбираться и сравнивать с моей "стряпниной".
75 247tsm
 
09.11.14
02:26
Очень странно.

Я заменил твои реквизиты ЦветТекста, ЦветФона и Шрифт на аналогичные по типу свои ЦветТ, ФонТ и ШрифтТ.
Подправил в процедурах и... работать перестало!?
Заменил обратно и... заработало!?
Все - и твои и мои реквизиты в справочнике присутствуют одновременно. Они отличаются только названиями (по крайней мере визуально).

Наверно, какой-то глюк в конфе или...
76 247tsm
 
09.11.14
02:29
Всё, тоже пошёл спать.
77 Chameleon1980
 
09.11.14
02:30
хз
:)
може какая казявка в свойствах закралась
78 247tsm
 
09.11.14
02:36
(77) В свойствах, вроде, визуально всё одинаковое, кроме имён реквизитов.
79 247tsm
 
09.11.14
02:38
(77) Что-то, наверняка, есть. Или, на самом деле, глюк конфы - почему-то для моих реквизитов в Хранилище значений поиск не находит значения.
80 247tsm
 
09.11.14
02:49
Всё, нашёл. ;)

У меня были реквизиты формы с такими же именами, что и мои реквизиты справочника: ЦветТ, ФонТ и ШрифтТ.
Я их, очевидно, добавил во время своих "экспериментов".

Убрал реквизиты формы и заработало и с моими реквизитами справочника.
81 Chameleon1980
 
09.11.14
02:49
:)
82 Chameleon1980
 
09.11.14
02:54
не понял где:?
83 247tsm
 
09.11.14
02:57
(82) В реквизитах формы.
При редактировании формы у тебя есть вкладки: Диалог, Модуль и Реквизиты.
Вот на вкладке Реквизиты у меня и были эти реквизиты формы, совпадающие по именам с реквизитами справочника.
84 247tsm
 
09.11.14
02:58
А вообще, мне кажется, что такие значения, как цвет, шрифт гораздо проще хранить в реквизитах типа строка, используя функции ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр().
Кода получается меньше.
85 Chameleon1980
 
09.11.14
10:16
а вообще, сейчас, сидя в ванной, я вспомнил что цвет вообще одним числом хранить нужно/можно/лучше