Справочник с реквизитом хранилище значений

Хранилище значений 1с

Хранилище Значений 1с используется для хранения значений различных типов в сериализованном виде. Этот вид позволяет записывать данные и потом восстанавливать их. В документации по встроенному языку в описании объектов возможность сериализации указывается отметкой “Сериализуется”. 

Хранение происходит в самой базе данных или файле 1Cv8.1CD в случае файловой базы данных или в таблицах на SQL-сервере в случае серверной . Соответственно при выгрузки конфигурации, данные используемые хранилищем значений будут включены в архив базы (резервную копию). 

С помощью этого объекта можно хранить такие данные как:

  • файлы,
  • картинки (фотографии),
  • внешние обработки,
  • таблицы значений,
  • структуры…

Важно понимать, что хранение данных в таком виде будет существенно замедлять работу базы данных.

Хранилище Значения 1с

Сам тип Хранилище Значения имеет только один Метод и один конструктор.

Информация о методах и конструкторах из Синтаксис-Помошника.

Хранилище Значения Метод Хранилища Значения
Хранилище значения в Синтаксис-Помощнике

Большинство объектов, которые имеют неизменяемое значение, а также универсальные коллекции, могут быть помещены в ХранилищеЗначения. К значению, хранящемуся в объекте, нельзя обращаться, его можно только извлечь из хранилища.

Хранилище значений 1с может применяется для хранения таблицы значений.

Создадим Регистр сведений

Хранилище значений 1с
Регистр сведений

Регистр Сведений будет иметь следующие измерения и ресурсы.

хранилище значений 1с
Измерения и Ресурсы Регистра Сведений

Создадим Справочник Дни. Реквизиты Справочника:

  • КурсДня-тип Хранилище Значений
  • Дата -тип Дата
Хранилище значений 1с
Справочник с Реквизитом Типа Хранилище Значений.

На форме Элемента Справочника Дни разместим Кнопку. Код кнопки будет выполняться на Сервере и помещать Таблицу значений в Реквизит КурсДня.

Условно код можно разделить на три блока.

Во-первых блок извлекающий информацию из Регистра Сведений

Запрос=новый Запрос;
	Запрос.Текст="ВЫБРАТЬ
	             |	КурсыВалютСрезПоследних.Валюта КАК Валюта,
	             |	КурсыВалютСрезПоследних.Курс КАК Курс
	             |ИЗ
	             |	РегистрСведений.КурсыВалют.СрезПоследних(&Период, ) КАК КурсыВалютСрезПоследних";
	Запрос.УстановитьПараметр("Период",Дата(ТекущаяДата()));

Во-вторых блок записи результата запроса в таблицу значений.


ТЗ=запрос.Выполнить().Выгрузить();

В третьих блок записи информации из Хранилища Значения в Справочник Дни

День=справочники.Дни.СоздатьЭлемент();
	Хранилище=новый ХранилищеЗначения(ТЗ,новый СжатиеДанных(9));
	день.Дата=Дата(ТекущаяДата());
	День.КурсДня=Хранилище;
	День.Записать();

Для проверки правильности извлечения информации из Регистра Сведений можно использовать проверку, которую впоследствии закоментируем.

//проверка запроса
	//РЗ=запрос.Выполнить().Выбрать();
	//пока РЗ.Следующий() цикл
	//Сообщить("курс"+РЗ.Валюта+"  "+РЗ.Курс);	
	//конеццикла;

Полный код представлен ниже:

Хранилище значений 1с

Полный код

Для извлечения информации из Хранилища значений 1с создадим обработку.

Хранилище Значения
Внешняя обработка

В качестве Реквизита сделаем ссылку на наш Справочник Дни.

На форму обработки добавим Кнопку. Код процедуры кнопки следующий:

Хранилище значений 1с

Код процедуры извлечения информации из Хранилища значений

Ссылка на обработку(Ссылка). Код внешней обработки:

&НаСервере
Процедура Команда1НаСервере()
	Тз=новый ТаблицаЗначений;
	Хранилище=новый ХранилищеЗначения(ТЗ,новый СжатиеДанных(9));
	Хранилище=объект.Объект.КурсДня.Получить();
	для каждого строка из Хранилище цикл 
		сообщить(Строка.Курс);
		сообщить(Строка.Валюта);
	 конеццикла;
	
КонецПроцедуры

&НаКлиенте
Процедура Команда1(Команда)
	Команда1НаСервере();
КонецПроцедуры

Сохранение и восстановление данных Табличного документа в Хранилище значений.

Объект Табличный документ используется при проектировании Печатных форм. Передача данных выполняется с использованием Хранилища значений.

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

Процедура ВосстановитьИзХранилищаНажатие(Элемент)
    ТабДок=Хранилище.Получить();
    Если ТабДок<>Неопределено Тогда
        ЭлементыФормы.ПолеТабличногоДокумента1.Вывести(ТабДок);
    КонецЕсли;
КонецПроцедуры   

  • Главная
  • О сайте
  • Главная
  • Содержание

Рукопашный бой Карташ

Категории

—>

рубрики: Платформа 8.3 | Дата: 13 июля, 2018

Платформа 1С:Предприятия предоставляет массу возможностей для хранения данных всевозможных типов.
Но зачастую этих возможностей не хватает. И тогда нам на помощь приходит специальный объект — ХранилищеЗначения. Этот объект позволяет хранить в специальном формате как стандартные объекты 1С:Предприятия, например, таблица значений, так и нестандартные, для которых тип в платформе не предусмотрен. К нестандартным типам могут быть отнесены файлы. Так, например, с помощью хранилища значений в базе данных 1С можно хранить фотографии сотрудников, сканы документов, внешние обработки и т.д. Преимуществом здесь является то, что все эти объекты храняться в самой базе. Соответственно при развертывании новой базы из резервной копии все эти объекты также будут присутствовать в новой базе. С другой стороны если хранить в базе файлы большого размера это может значительно увеличить ее объем и отрицательно сказаться на работоспособности. Поэтому здесь необходимо соблюдать разумный баланс.

Рассмотрим работу с хранилищем значений на примере. Создадим в конфигураторе специальный справочник — назовем его ВнешниеОбъекты, а у справочника в свою очередь создадим реквизит Объект с типом ХранилищеЗначения
Реквизит с типом хранилище значений
И теперь мы можем создавать в этом справочнике элементы, а в реквизит Объект каждого элемента записывать файл.

Работа с хранилищем значений очень проста. Если мы заглянем в синтакс-помощник, то увидим, что у этого объекта всего лишь один метод и один конструктор.
Хранилище значений в синтакс-помощнике

А теперь для демонстрации напишем простейший код, который будет записывать файл в реквизит Объект ранее созданного элемента справочника, а затем читать этот файл из реквизита и записывать его на диск, но уже под другим именем.


&НаСервере
Процедура ЗагрузитьВыгрузитьФайл(ЭлементСправочника)

	ОбъектСправочника = ЭлементСправочника.ПолучитьОбъект();

	//Помещаем картинку в хранилище значений
	ЯрлыкЗагрузка = Новый Картинка("g:musorfavicon.ico");
	ХранилищеЗагрузка = Новый ХранилищеЗначения(ЯрлыкЗагрузка);

	//Записываем элемент справочника
	ОбъектСправочника.Объект = ХранилищеЗагрузка;
	ОбъектСправочника.Записать();

	//Выгружаем картинку из хранилища значений в файл
	ИмяФайла = "g:musorfavicon_1.ico";
	ЯрлыкВыгрузка = ОбъектСправочника.Объект.Получить();
	ЯрлыкВыгрузка.Записать(ИмяФайла);

КонецПроцедуры

И несколько пояснений к коду.

  • Объект помещается в хранилище непосредственно при создании хранилища с помощью конструктора.
  • Нельзя просто прочитать объект из хранилища просто обратившись к реквизиту справочника как мы всегда привыкли это делать с другими типами данных. Вместо этого нужно использовать метод Получить() хранилища значений.

Чтобы сохранять в хранилище другие типы файлов, отличные от картинок, можно использовать объект ДвоичныеДанные. Чисто теоретически в хранилище значений можно даже хранить элементы справочников, документы и т.д. Но на практике это не имеет никакого смысла. А вот использовать хранилище значений для хранения таблицы значений, дерева значений и других универсальных коллекций иногда можно.

ХранилищеЗначения (хранилище значений 1С) – это объект в языке 1С, который позволяет хранить в базе данных прочие значения, например картинки и файлы, структуры и таблицы значений.

Сначала мы создаем значение, например:
Знч = Новый ТаблицаЗначений();

Потом помещаем его в хранилище значений 1С:
Хранилище = Новый ХранилищеЗначения(Знч, Новый СжатиеДанных(9));

Сжатие данных в хранилище значений 1С с параметром «9» означает, что данные будут храниться в архивированном виде, с максимальной степенью сжатия.

Чтобы сохранить такое значение в базу данных, нужно создать объект конфигурации (справочник, документ и т.п.), у которого добавить реквизит с типом ХранилищеЗначения.
СправочникСсылка = Справочники.Хранилище.СоздатьЭлемент();
СправочникСсылка.ХранилищеЗначения = Хранилище;
СправочникСсылка.Записать();

Кроме хранения таких значений в базе данных, с помощью хранилища значений 1С, мы также можем сохранить такое значение в файл, например:
Настройки = Новый Структура();
Настройки.Вставить("ПоУмолчанию", Истина);
Настройки.Вставить("Наименование", "Наименование1");


Хранилище = Новый ХранилищеЗначения(Настройки, Новый СжатиеДанных(9));
ЗначениеВФайл("C:", Хранилище);

Пример – сохранение значения из файла
//Значение - картинка из файла
Файл = Новый Картинка("C:ФайлКартинки.jpg");
Хранилище = Новый ХранилищеЗначения(Файл, Новый СжатиеДанных(9));

//Значение - произвольный файл
Файл = Новый ДвоичныеДанные("C:ИсполняемыйФайл.exe");
Хранилище = Новый ХранилищеЗначения(Файл, Новый СжатиеДанных(9));


//Значение - текстовый файл
Файл = Новый ЧтениеТекста("C:ТекстовыйФайл.txt");
ТекстовыеДанные = Файл.Прочитать();
Хранилище = Новый ХранилищеЗначения(ТекстовыеДанные, Новый СжатиеДанных(9));

Значение, помещенное в хранилище значений 1С нельзя использовать, пока оно там находится. Чтобы работать с ним, его нужно «распаковать» обратно, например:
Знч = Хранилище.Получить();
Если Знч = Неопределено Тогда
Сообщить("Ошибка получения значения из хранилища");
КонецЕсли;

Проголосовать за этот пост:

Загрузка…

Posted in Язык 1С

Хранилище значений в 1С 8.3 это объект, который позволяет хранить в сериализованном виде почти любые типы данных (включая двоичные). Хранение происходит в самой базе данных (файле 1Cv8.1CD или на SQL-сервере в таблицах). Соответственно при выгрузки конфигурации, данные используемые хранилищем значений будут включены в архив базы (резервную копию). С помощью этого объекта можно хранить такие данные как: файлы, картинки (фотографии), внешние обработки, таблицы значений, структуры… Важно понимать, что хранение данных в таком виде будет существенно замедлять работу базы данных. Поэтому данную технологию хранения рекомендуется использовать в крайних случаях, если отсутствует альтернатива решения для имеющейся задачи.

Оглавление:

Сохранение в Хранилище Значений в 1С 8.3:

&НаСервере
Процедура СохранениеВХранилищеЗначений();

   // *** 1.Пример (Таблица значений):
   ЗначенияТЗ = Новый ТаблицаЗначений(); // Создание значения «ТЗ»

   // Вставка в хранилище значений
   Хранилище_Зн = Новый ХранилищеЗначения(ЗначенияТЗ, Новый СжатиеДанных(9));// «9» — макс.степень сжатия

   // Сохранение значения в реквизит объекта конфигурации (тип: ХранилищеЗначения)
   СправочникСтранаСсылка = Справочники.Страны.НайтиПоНаименованию(«Испания»);
   Если Не СправочникСтранаСсылка.Пустая() Тогда
       // Изменим и запишем численность жителей в стране
       СтранаИспания = СправочникСтранаСсылка.ПолучитьОбъект();
       СтранаИспания.ХранилищеЗначения = Хранилище_Зн;
       СтранаИспания.Записать();
   КонецЕсли;

   // *** 2.Пример (Табличный документ):
   ЗначенияТабДок=Новый ТабличныйДокумент;
   ЗначенияТабДок.Вывести(ЭлементыФормы.ПолеТабличногоДокумента1);
   Хранилище_ТабДок=Новый ХранилищеЗначения(ЗначенияТабДок);

   // *** 3.Пример (Структура):
   ЗначенияСтр = Новый Структура(); // Создание значения «Структура»
   ЗначенияСтр.Вставить(«Код», «34»);
   ЗначенияСтр.Вставить(«Наименование», «Испания»);
   ЗначенияСтр.Вставить(«Описание», «Европейская страна, расположенная на Пиренейском полуострове»);
   ЗначенияСтр.Вставить(«Население», 46600000);
   // Вставка в хранилище значений
   Хранилище_Стр = Новый ХранилищеЗначения(ЗначенияСтр, Новый СжатиеДанных(9));// «9» — макс.степень сжатия
   ЗначениеВФайл(«D:import», Хранилище_Стр); // Сохранение значения в файл

   // *** 4.Пример (Любой файл) :
   ФайлДвоичныеДанные = Новый ДвоичныеДанные(«D:importКлиентБанк_РБ.exe»);
   Хранилище_Файл = Новый ХранилищеЗначения(ФайлДвоичныеДанные, Новый СжатиеДанных(0));// «0» — без сжатия

   // *** 5.Пример (Файл картинка) :
   ФайлФото = Новый Картинка(«D:importФотоСотрудника.png»);
   Хранилище_Фото = Новый ХранилищеЗначения(ФайлФото, Новый СжатиеДанных(5));// «5» — средн.степень сжатия

   // *** 6.Пример (Текстовый файл) :
   ФайлТекст = Новый ЧтениеТекста(«D:importВойна_и_мир.txt»);
   ТекстИзФайла = ФайлТекст.Прочитать();
   Хранилище_Текст = Новый ХранилищеЗначения(ТекстИзФайла, Новый СжатиеДанных(1));// «1» — мин.степень сжатия

   // *** 7.Пример (Отчет/обработка 1С) :
   Хранилище_Epf = Новый ХранилищеЗначения(Новый ДвоичныеДанные(«D:importOtchet_realizacija_2020.epf», СтепеньСжатия));

КонецПроцедуры

Восстановление из Хранилище Значений в 1С 8.3:

&НаСервере
Процедура ВосстановлениеИзХранилищеЗначений();ИмяФайла = «D:importВойна_и_мир.txt»;// Двоичные данные можно восстановить из хранилища значения методом Получить и записать в файл методом Записать()
   
Если ТипЗнч(РеквизитХранилище) = Тип(«ДвоичныеДанные») Тогда// Хранилище.Получить()<>Неопределено Тогда // Процедура извлекает данные из хранилища (требует времени)
        // Для больших объемов данных рекомендуется использовать доп.реквизит (Например: Булево) Содержит данные — Истина
       
ДанныеХранилища = РеквизитХранилище.Получить();
        Если
ДанныеХранилища = Неопределено Тогда
           
Сообщить(«Ошибка получения данных из хранилища значений 1С»);
        КонецЕсли;
       
ДанныеХранилища.Записать(ИмяФайла); // Записываем восстановленые данные в файл

        // Восстановление Табличного документа

ЭлементыФормы.ПолеТабличногоДокумента1.Вывести(ДанныеХранилища);// Восстановление и запуск Отчета/обработки 1С
       
ИмяФайла_Epf = «D:importOtchet_realizacija_2020.epf»;
       
ДвоичныеДанные = РеквизитХранилище.Получить();
       
ДвоичныеДанные.Записать(ИмяФайла_Epf);
       
Epf = ВнешниеОбработки.Создать(ИмяФайла_Epf);
       
Epf.ПолучитьФорму().Открыть();

    Иначе

ДанныеХранилища = РеквизитХранилище;
    КонецЕсли;
// Файлы зарегистрированного типа (doc, xls, pdf, jpg, txt, exe…)
   
ЗапуститьПриложение(ИмяФайла);

КонецПроцедуры

Очистка реквизита Хранилище Значений в 1С 8.3:

&НаКлиенте
Процедура ОчисткаРеквизитаХранилищеЗначений();РеквизитХранилище = Неопределено;

КонецПроцедуры

Проверка значения Хранилище Значений в 1С 8.3:

&НаКлиенте
Процедура ПроверкаЗначенияХранилищеЗначений();Значение = РеквизитХранилище.Получить();
    Если
Значение <> Неопределено Тогда
        Если
ТипЗнч(Значение) = Тип(«Строка») Тогда
           
Сообщить(«Это строка»);
        ИначеЕсли
ТипЗнч(Значение) = Тип(«Картинка») Тогда
           
Сообщить(«Это фотография (картинка)»);
        КонецЕсли;
    КонецЕсли;

КонецПроцедуры

💡 Шаблоны (готовые модели) кода 1С 8.3 с тегом «Хранилище значений» 1С:

Copyright©, «Программист 1С в г.Минске», 22.09.2020

Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник

Хранилище значения

Хранение данных в полях типа ХранилищеЗначения

В 1С:Предприятии 8 существует возможность хранения различных данных в полях
типа ХранилищеЗначения. В этих полях могут храниться значения
типа ХранилищеЗначения. Сам тип
ХранилищеЗначения предназначен, прежде всего, для хранения
значений различных типов в сериализованном виде, то есть в том виде, который
позволяет записывать данные и потом восстанавливать их. В документации по
встроенному языку в описании объектов возможность сериализации указывается
отметкой “Сериализуется”. Эти значения, а также значения примитивных типов,
могут помещаться в хранилище значения и таким образом могут записываться в поля
базы данных с типом ХранилищеЗначения. Важной особенностью
хранилища значений является возможность хранения данных в сжатом виде. Это
позволяет существенно сократить объем хранимой информации для больших
объектов.

Таким образом, с помощью полей типа ХранилищеЗначения
существует возможность хранения в базе данных существенно более широкого перечня
типов данных, по сравнению с тем, который может быть в явном виде указан для
полей. Однако следует учитывать, что такой способ хранения и возможности
манипулирования такими данными существенно отличаются от обычного хранения
данных в полях базы данных. Для таких полей система не поддерживает практически
никакой функциональности, кроме собственно записи и чтения. Для таких полей не
может использоваться индексирование, по ним нельзя упорядочивать данные в
запросах и выборках, такие поля не могут суммироваться и т.д. Можно считать, что
в этом случае механизм базы данных хранит некоторую информацию, ничего не зная о
ее природе.

Соответственно поля типа ХранилищеЗначения следует
использовать только в тех случаях, когда это соответствует их назначению и
технологическим особенностям.

Важно! В системе не поддерживается ссылочная целостность по объектам, сохраненным в базе данных в полях типа ХранилищеЗначения. Это означает, что при попытке удаления, например, элементов справочников система не контролирует ссылки на эти элементы, сохраненные в ХранилищеЗначения.

Одним из основных применений полей типа ХранилищеЗначения
является хранение изображений и образов файлов. Для этого используются типа
Картинка и ДвоичныеДанные. Это позволяет
сохранять в базе данных фотографии сотрудников, документы созданные в различных
форматах и т.д. При реализации хранения такой информации можно рекомендовать
создавать структуры данных, которые обеспечат отдельное хранение этих полей от
основной информации. Например, для хранения фотографий сотрудников можно
реализовать отдельный справочник или регистр сведений, а не помещать поля типа
ХранилищеЗначения в сами объекты, хранящие список физических
лиц. Следует учитывать, что объекты (например, элементы справочника) считываются
системой всегда целиком. Поэтому хранение больших объемов информации
непосредственно в полях объектов может существенно замедлить работу системы.

В полях типа ХранилищеЗначения допускается, например,
хранение таблиц значений и структур. При этом в таблицах значений и структурах
могут храниться любые типы данных, в том числе и ссылочные типы. Заметим, что
в ХранилищеЗначения  коллекция может быть помещена, если в ней
содержатся только сериализуемые значения. Однако следует учитывать, что этот
вариант хранения данных существенно отличается, от явного хранения значений в
отдельных полях и от хранения информации в табличных частях или регистрах
сведений. Система не будет поддерживать для таких полей ссылочную целостность,
не будет обеспечивать поиск данных в запросах и т.д. Таким образом, хранение
коллекций в таких полях нельзя применять для реализации существенных частей
прикладного решения отвечающих за бизнес логику. Такое хранение может
допускаться только для вспомогательных данных, не имеющих существенного значения
для бизнес-логики прикладного решения, например, для хранения каких-либо
настроек работы пользователей.

Хотя в системе не существует явного ограничения на размер данных,
хранящихся в полях типа ХранилищеЗначения, следует все-таки
осмотрительно относиться к объемам хранимой информации. Следует учитывать, что
помещение больших объемов в такие поля увеличивает общий объем информационной
базы, и это будет негативно сказываться на работе системы при выполнении
различных административных операций, таких как создание резервной копии базы
данных. Например, при хранении образов файлов, можно рекомендовать хранить в
таких полях данные, действительно необходимые в работе, но не использовать их
для хранения больших объемов файлов, не используемых в решаемой прикладной
задаче.

Объект типа ХранилищеЗначения создается следующей конструкцией

 Хранилище = Новый ХранилищеЗначения(<Значение>, <АлгоритмСжатияДанных>)  

Параметры:

  • <Значение> (обязательный)Тип: Произвольный. Значение, которое должно быть помещено в хранилище.
  • <АлгоритмСжатияДанных> (необязательный)Тип: СжатиеДанных. Задает степень сжатия данных.
  • Если параметр не установлен, сжатие не используется.

Пример 1:

 МояКартинка = Новый Картинка("C:Мои документыКартинка1.bmp");
Сжатие = Новый СжатиеДанных(6);
ХранилищеКартинки = Новый ХранилищеЗначения(МояКартинка, Сжатие);
НовНоменклатура.Изображение = ХранилищеКартинки;
НовНоменклатура.Записать();

Пример 2: Метод получить – К значению, хранящемуся в объекте, нельзя обращаться, его можно только извлечь из хранилища.

//  Двоичные Данные текстового файла, сохраняемого в реквизите МоеХранилище документа
 Хранилище= Заявка.МоеХранилище.Получить();  
  ВременныйФайл = ПолучитьИмяВременногоФайла("txt"); 
 Хранилище.Записать(ВременныйФайл); 
 ТекстовыйДок= Новый ТекстовыйДокумент;
  ТекстовыйДок.Прочитать(ВременныйФайл, КодировкаТекста.UTF8);

Пример 3 : Использование объект ДвоичныеДанные , значение которого считывается из файла и может быть сохранено в ХранилищеЗначения. Хранимые данные могут быть записаны в файл.

МояКартинка = Новый ДвоичныеДанные("C:Мои документыКартинка1.bmp");
ХранилищеКартинки = Новый ХранилищеЗначения(МояКартинка);
// сохранение значения типа ХранилищеЗначения в базе данных
НовНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НовНоменклатура.Наименование = "Диван ""Маргарита""";
// реквизит Изображение имеет тип ХранилищеЗначения
НовНоменклатура.Изображение = ХранилищеКартинки;
НовНоменклатура.Записать();

Пример 4 . Выгрузка значения типа ДвоичныеДанные из хранилища значений в файл

ИмяФайла = "C:Мои документыКартинка2.bmp";
Хранилище = НовНоменклатура.Изображение.Получить();
Хранилище.Записать(ИмяФайла);

Хранилище значений — это тип, который появился в 8-ой версии 1С позволяющий сохранять прямо в базе различные данные, включая двоичные данные (произвольные файлы). Например, так можно хранить в базе данных JPG-картинки, Word-документы и т.д. Причем данные будут храниться в самой базе (файле 1CD или в таблицах на SQL-сервере) и будут включены в штатную выгрузку базы или резервную копию средствами SQL Server.

Тип Хранилище значения может быть назначен реквизиту справочника, документа, ресурсу регистра сведений и т.д.

Примеры:

Код 1C v 8.х

 //Изображение, картинки (фотки):

ТекИзображение.Объект = СпрТкани.Ссылка;
ТекИзображение.ВидДанных = Перечисления.ВидыДополнительнойИнформацииОбъектов.Изображение;
Хранилище = Новый ХранилищеЗначения(НоваяКартинка, Новый СжатиеДанных());
ТекИзображение.Хранилище = Хранилище.Получить();

// в этом месте он все выводит ...

ЭлементыФормы.ПолеКартинки1.Картинка = Хранилище.Получить();
ТекИзображение.Записать();

Код 1C v 8.х

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

Процедура ВосстановитьИзХранилищаНажатие(Элемент)
ТабДок=Хранилище.Получить();
Если ТабДок<>Неопределено Тогда
ЭлементыФормы.ПолеТабличногоДокумента1.Вывести(ТабДок);
КонецЕсли;
КонецПроцедуры

Код 1C v 8.х

  //Произвольные файлы (двоичные данные):

ХЗ = Новый ХранилищеЗначения(Новый ДвоичныеДанные(файл));

Восьмерка поддерживает сжатие данных, помещаемых в хранилище:

Код 1C v 8.х

 ХЗ = Новый ХранилищеЗначения(Новый ДвоичныеДанные(файл),Новый СжатиеДанных(9));

Код 1C v 8.х

 //Внешние обработки и отчеты:

Процедура ЗагрузитьОбработкуВХранилище(РеквизитТипХранилище)
СтепеньСжатия = Новый СжатиеДанных(9); //9 максимум
РеквизитТипХранилище = Новый ХранилищеЗначения(Новый ДвоичныеДанные("c:отчетыотчет.epf", СтепеньСжатия));
КонецПроцедуры

Процедура ЗапуститьОбработкуИзХранилища(РеквизитТипХранилище)
ИмяВременногоФайла = КаталогВременныхФайлов()+"отчет.epf";
ДвоичныеДанные = РеквизитТипХранилище.Получить();
ДвоичныеДанные.Записать(ИмяВременногоФайла);
ВнешняяОбработка = ВнешниеОбработки.Создать(ИмяВременногоФайла);
ВнешняяОбработка.ПолучитьФорму().Открыть();
КонецПроцедуры

Если это были ДвоичныеДанные, то их можно восстановить из хранилища значения методом Получить и записать в файл методом Записать().

Код 1C v 8.х

 Если ТипЗнч(Хранилище) <> Тип("ДвоичныеДанные") Тогда
ДвоичныеДанные = Хранилище.Получить();
Иначе
ДвоичныеДанные = Хранилище;
КонецЕсли;
ДвоичныеДанные.Записать(ИмяФайла);

Если это был, например, Word-документ (doc-файл, или другой файл зарегистрированного типа), то его можно открыть так:

Код 1C v 8.х

 ЗапуститьПриложение(ИмяФайла);   

Чтобы очистить поле типа Хранилище значения, нужно присвоить ему Неопределено:

Код 1C v 8.х

  РеквизитХранилище = Неопределено;   

Если в Хранилище значений содержались какие-то ссылки, то они не будут контролироваться при контроле ссылочной целостности (операция Удаление помеченных объектов или метод НайтиПоСсылкам).

К сожалению, 1С не содержит встроенных методов для проверки того, заполнено хранилище или нет.
Такой вариант не работает:

Код 1C v 8.х

 фл=Хранилище<>Неопределено;   

Работает только такой вариант:

Код 1C v 8.х

 фл=Хранилище.Получить()<>Неопределено;   

Но он требует затрат времени на извлечение данных из хранилища.
Поэтому, если это критично, нужно заводить еще один флаг, который указывает, содержит ли хранилище значение.

Источник

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

Я
   247tsm

08.11.14 — 22:32

Вопрос для знатоков 1С81 простой.

Есть справочник с реквизитом ЦветТ типа хранилище значения.

Я пытаюсь записать в него цвет текста но не получается.

Я делаю так:

Процедура Кнопка5Нажатие(Элемент)

    Диалог = Новый ДиалогВыбораЦвета;

    Если Диалог.Выбрать() Тогда

        ЦветТ = Диалог.Цвет;

    КонецЕсли;

КонецПроцедуры

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

    Если ЦветТ<>Неопределено Тогда

        ЭтаФорма.ЭлементыФормы.текстRO.ЦветТекстаПоля = ЦветТ;

    КонецЕсли;

КонецПроцедуры

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

Почему? Реквизиты типа Хранилище значения особые и работать с ними нужно по особому?

Как мне изменить текст модуля чтобы всё работало?

  

Партнерская программа EFSOL Oblako

   wertyu

1 — 08.11.14 — 22:35

только через Новый

   wertyu

2 — 08.11.14 — 22:36

ты можешь выбрать Красный, Зелёный, Синий, но там ещё есть вид цвета

   wertyu

3 — 08.11.14 — 22:40

+ всё, что надо определять через Новый (конструктор), надо так и определять

   247tsm

4 — 08.11.14 — 22:41

Конечно, для хранения цвета можно использовать реквизит типа строка:

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

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

Если ЗначениеЗаполнено(Реквизит1) Тогда

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

КонецЕсли;

Но, наверно, проще использовать реквизит типа Хранилище значения без всяких функций, преобразований?

   247tsm

5 — 08.11.14 — 22:42

(1) Я не совсем понял. Что «только через Новый». Ведь для определения цвета я использую

    Диалог = Новый ДиалогВыбораЦвета;

   247tsm

6 — 08.11.14 — 22:43

(3) А как это будет в коде?

   wertyu

7 — 08.11.14 — 22:43

Функция ПолучитьСтатьиБюджетирования(Бюджет) Экспорт

    
    Запрос = Новый Запрос;

    Запрос.Текст =

    «ВЫБРАТЬ

    |    СтатьиБюджета.Ссылка КАК Ссылка,

    |    СтатьиБюджета.Шрифт,

    |    СтатьиБюджета.ЦветФона

    |ИЗ

    |    Справочник.СтатьиБюджета КАК СтатьиБюджета

    |ГДЕ

    |    СтатьиБюджета.Владелец = &Бюджет

    |    И СтатьиБюджета.ПометкаУдаления = ЛОЖЬ»;

                  
    Запрос.УстановитьПараметр(«Бюджет», Бюджет);

    Результат = Запрос.Выполнить();

    ТаблицаСтатейБюджетирования = Результат.Выгрузить();

    
    Возврат ТаблицаСтатейБюджетирования;

    
КонецФункции // ПолучитьСтатьиБюджетирования()

   wertyu

8 — 08.11.14 — 22:44

ТаблицаСтатейБюджетирования = ПолучитьСтатьиБюджетирования(Бюджет);

    
    Настройки.УсловноеОформление.Элементы.Очистить();

    Для Каждого СтрокаТаблицаСтатейБюджетирования Из ТаблицаСтатейБюджетирования Цикл

        Шрифт0 = ЗначениеИзСтрокиВнутр(СтрокаТаблицаСтатейБюджетирования.Шрифт);

        ЦветФона0 = ЗначениеИзСтрокиВнутр(СтрокаТаблицаСтатейБюджетирования.ЦветФона);

        НовыйЭлементОформления = Настройки.УсловноеОформление.Элементы.Добавить();

        НовыйОтбор = НовыйЭлементОформления.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

        НовыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«Статья»);

        НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

        НовыйОтбор.ПравоеЗначение = СтрокаТаблицаСтатейБюджетирования.Ссылка;

        ШрифтОформление = НовыйЭлементОформления.Оформление.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(«Шрифт»));

        ЦветФонаОформление = НовыйЭлементОформления.Оформление.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(«ЦветФона»));

        УдалитьЭлементОформления = Истина;

        Если Не ШрифтОформление.Значение = Шрифт0 Тогда

            ШрифтОформление.Значение = Шрифт0;

            ШрифтОформление.Использование = Истина;

            УдалитьЭлементОформления = Ложь;

        КонецЕсли;

        Если Не ЦветФона0 = Новый Цвет(255, 255, 255) Тогда

            ЦветФонаОформление.Значение = ЦветФона0;

            ЦветФонаОформление.Использование = Истина;

            УдалитьЭлементОформления = Ложь;

        КонецЕсли;

        Если УдалитьЭлементОформления Тогда

            Настройки.УсловноеОформление.Элементы.Удалить(НовыйЭлементОформления);

        КонецЕсли;

    КонецЦикла;

   wertyu

9 — 08.11.14 — 22:48

ТабДок.Область(НС + 1, НК, НС + 1, НК).ГраницаСнизу =

                    Новый Линия(ТабДок.Область(НС, НК, НС, НК).ГраницаСнизу.ТипЛинии, ТабДок.Область(НС, НК, НС, НК).ГраницаСнизу.Толщина, ТабДок.Область(НС, НК, НС, НК).ГраницаСнизу.Отступ);

   wertyu

10 — 08.11.14 — 22:48

это примерно тоже самое

   247tsm

11 — 08.11.14 — 22:51

(8) Из примера я понял, что реквизиты справочника СтрокаТаблицаСтатейБюджетирования.Шрифт типа строка и СтрокаТаблицаСтатейБюджетирования.ЦветФона тоже типа строка.

А у меня же типа Хранилище значения. Пример со строкой я уже и сам привёл.

Меня интересует, можно ли делать проще, используя реквизит типа Хранилище значения и как обычный реквизит его сохранять, а затем считывать?

   wertyu

12 — 08.11.14 — 22:51

ну т.е. и ГраницаСнизу надо присваивать значения только через конструктор, понятно?

   wertyu

13 — 08.11.14 — 22:53

(11) в Скд можно приваивать готовое, иначе только через конструктор

   247tsm

14 — 08.11.14 — 22:54

(12) У меня не записывается значение в реквизит типа Хранилище значения, поэтому до присваивания далеко.

   wertyu

15 — 08.11.14 — 22:54

и надо платформу поменять на 82 минимум

   wertyu

16 — 08.11.14 — 22:57

(14) я тебе пытался показать, что не надо хранить само значение, если не получается потом извлечь, а можно хранить его составляющие

   Chameleon1980

17 — 08.11.14 — 22:59

а у хз есть метод получить вроде

   247tsm

18 — 08.11.14 — 23:00

(13) + (15) У меня речь не идет ни про СКД, ни про конструктор. У меня 1С81, где есть реквизиты типа Хранилище значения.

У меня просто форма справочника, на ней кнопка для выбора цвета текста и его записи в реквизит типа хранилище значения. Это не работает. Вот я и прошу подсказать, почему, где ошибка в приведённом мной коде?

(16) Но я знаю, как можно выкрутиться, используя реквизит типа строка и функцию ЗначениеВСтрокуВнутр().

Но я хочу понять, почему нельзя напрямую пользоваться реквизитом типа Хранилище значения?

   Chameleon1980

19 — 08.11.14 — 23:00

ХранилищеЗначения.Получить (ValueStorage.Get)

ХранилищеЗначения (ValueStorage)

Получить (Get)

Синтаксис:

Получить()

Возвращаемое значение:

Тип: Произвольный.

Значение, содержащееся в хранилище.

Описание:

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

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

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

Пример:

МояКартинка = ХранилищеКартинки.Получить();

   Chameleon1980

20 — 08.11.14 — 23:03

ну и при сохранении чтото типа

Хранилище=Новый ХранилищеЗначения(ЗначениеВСтрокуВнутр(ЗдесьВашиДАнные))

   wertyu

21 — 08.11.14 — 23:04

(18) да можно, только через конструктор, что тут непонятно?

   wertyu

22 — 08.11.14 — 23:04

Новый — это конструктор

   247tsm

23 — 08.11.14 — 23:05

(20) Если использовать функцию ЗначениеВСтрокуВнутр(), то зачем использовать для цвета реквизит типа Хранилище значения? Проще использовать реквизит типа строка!

   Chameleon1980

24 — 08.11.14 — 23:10

да по быстрому просто выдернул кусок из старого отчета

у меня там просто тз сохранялась

   Chameleon1980

25 — 08.11.14 — 23:11

так то просто уж точно что хочешь (практически) сохранишь

   247tsm

26 — 08.11.14 — 23:14

(25) А можешь подправить текст процедур из (0), чтобы всё получилось?

   Chameleon1980

27 — 08.11.14 — 23:17

Процедура Кнопка5Нажатие(Элемент)

    Диалог = Новый ДиалогВыбораЦвета;

    Если Диалог.Выбрать() Тогда

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

    КонецЕсли;

КонецПроцедуры

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

    Если ЦветТ<>Неопределено Тогда

        ЭтаФорма.ЭлементыФормы.текстRO.ЦветТекстаПоля = ЦветТ.Получить();

    КонецЕсли;

КонецПроцедуры

может так?

   Chameleon1980

28 — 08.11.14 — 23:19

даже

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

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

    Если _Цвет<>Неопределено Тогда

        ЭтаФорма.ЭлементыФормы.текстRO.ЦветТекстаПоля = _Цвет;

    КонецЕсли;

КонецПроцедуры

вот так наверное

   247tsm

29 — 08.11.14 — 23:22

(27) Нет, в отладчике вижу, что ЦветТ=Неопределено

   247tsm

30 — 08.11.14 — 23:24

(28) На строку

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

дает

Значение не является значением объектного типа (Получить)

   247tsm

31 — 08.11.14 — 23:27

(27) И всё же, зачем использовать функцию ЗначениеВСтрокуВнутр()?

В этом случае не нужен реквизит типа Хранилище значения!!!

А просто нужен просто типа строка.

   Chameleon1980

32 — 08.11.14 — 23:33

ЗначениеВСтрокуВнутр чтобы, например тз (таб. зн.) сохранять

ЦветТ — реквизит справочника типа ХЗ (хран. зн.) ???

   Chameleon1980

33 — 08.11.14 — 23:35

скажите мне тип значения ЦветТ

   247tsm

34 — 08.11.14 — 23:37

(32) да, и по-моему, здесь функция ЗначениеВСтрокуВнутр() не нужна, либо если использовать эту функцию, то не нужен тип реквизита Хранилище значения, а нужен тип строка.

Но я хочу добиться работы с типом Хранилище значения.

   247tsm

35 — 08.11.14 — 23:38

(33) ЦветТ = Диалог.Цвет

   247tsm

36 — 08.11.14 — 23:41

(33) Уточняю: в справочнике есть реквизит ЦветТ с типом Хранилище значения. Я в него хочу записать Диалог.Цвет

   Chameleon1980

37 — 08.11.14 — 23:41

а как тогда называется реквизит у которого тип хз (хр.зн.) ???

капеч. мы даже не там запнулись.

   247tsm

38 — 08.11.14 — 23:42

(33) в (0) описана задача ;)

   247tsm

39 — 08.11.14 — 23:43

(37) ???

У реквизита ЦветТ тип Хранилище значения. Я в него хочу записать Диалог.Цвет

   Chameleon1980

40 — 08.11.14 — 23:44

а что угадывать буду

просто скажите как у вас называется

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

имя его

   247tsm

41 — 08.11.14 — 23:44

(40) ЦветТ

   Chameleon1980

42 — 08.11.14 — 23:45

он бы не ругался как в 30 т.к. у Хран. зн. есть метод Получить() который «Получает из хранилища сохраненное в нем значение» (C) СП

   Chameleon1980

43 — 08.11.14 — 23:46

где-то вы врете уважаемый

   247tsm

44 — 08.11.14 — 23:47

(43) Хорошо, смотрю в конфу ещё раз ;)

   247tsm

45 — 08.11.14 — 23:51

Реквизит ЦветТ, тип — ХранилищеЗначения.

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

Диалог = Новый ДиалогВыбораЦвета;

Если Диалог.Выбрать() Тогда

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

КонецЕсли;

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

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

    Если _Цвет<>Неопределено Тогда

        ЭтаФорма.ЭлементыФормы.текстRO.ЦветТекстаПоля = _Цвет;

    КонецЕсли;

КонецПроцедуры

При открытии формы ругается:

{Справочник.Меню.Форма.ФормаЭлемента1(16)}: Значение не является значением объектного типа (Получить)

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

   247tsm

46 — 08.11.14 — 23:52

(43) Так что я не вру ;)

   247tsm

47 — 08.11.14 — 23:55

Более того, в отладчике я вижу, что после строки:

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

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

Но … это значение или «теряется» или я его не могу прочитать при открытии формы справочника.

   Chameleon1980

48 — 09.11.14 — 00:09

а после

Процедура Кнопка5Нажатие(Элемент)

    Диалог = Новый ДиалогВыбораЦвета;

    Если Диалог.Выбрать() Тогда

        ЦветТ = Диалог.Цвет;

    КонецЕсли;

КонецПроцедуры

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

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

типзначения(ЦветТ)

что за конфа? большая? может кинете куданить?

А то что-то надоело чуть в темноте ходить

   247tsm

49 — 09.11.14 — 00:16

(48) в отладчике ЦветТ имеет значение цвета, выбранного в Диалог.Цвет

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

Поэтому и получить значение не удается.

   Chameleon1980

50 — 09.11.14 — 00:19

пилят

как зовут реквизита справочника (какогото) в который мы хотим сохранить значение у которого тип хран.зн. ????????????????????????????

   247tsm

51 — 09.11.14 — 00:23

Справочник Меню.

Реквизит ЦветТ, тип — Хранилище значения

   247tsm

52 — 09.11.14 — 00:25

(50) Я в этот реквизит ЦветТ хочу сохранить цвет, а не «значение у которого тип хран.зн.»

   Chameleon1980

53 — 09.11.14 — 00:27

конфа большая.

просто конфа — без данных.

а то мы видать на ночь глядя ходим вокруг да около

   Chameleon1980

54 — 09.11.14 — 00:27

большая???

   247tsm

55 — 09.11.14 — 00:33

(50) Да, большая.

Но, по-моему, в (0) я всё описал достаточно ясно и максимально подробно, с текстом процедур.

Вот последний вариант процедур:

Процедура Кнопка5Нажатие(Элемент)

    Диалог = Новый ДиалогВыбораЦвета;

    Если Диалог.Выбрать() Тогда

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

    КонецЕсли;

КонецПроцедуры

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

    Если ЦветТ<>Неопределено Тогда

        ЭтаФорма.ЭлементыФормы.текстRO.ЦветТекстаПоля = ЦветТ.Получить();

    КонецЕсли;

КонецПроцедуры

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

Вот в этом и вопрос.

   Chameleon1980

56 — 09.11.14 — 00:44

счас не ругается на получить?

   Chameleon1980

57 — 09.11.14 — 00:44

Процедура Кнопка5Нажатие(Элемент)

    Диалог = Новый ДиалогВыбораЦвета;

    Если Диалог.Выбрать() Тогда

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

    КонецЕсли;

КонецПроцедуры

а вот тут сам справочник сохранить?

   247tsm

58 — 09.11.14 — 00:49

(56) Так до получить() не доходит.

   Chameleon1980

59 — 09.11.14 — 00:55

уьрать Если ЦветТ<>Неопределено Тогда

и после

    Диалог = Новый ДиалогВыбораЦвета;

    Если Диалог.Выбрать() Тогда

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

    КонецЕсли;

сохранить справочник

   Chameleon1980

60 — 09.11.14 — 00:57

сохраните конфу в файл и выложьте куданить

мне данные не нужны

   Chameleon1980

61 — 09.11.14 — 00:59

или есть TeamViewer ?

в почту номер с паролем если что

Nickolay_Mulko собака Mail.ru

   247tsm

62 — 09.11.14 — 01:15

(61) Отправил

   Chameleon1980

63 — 09.11.14 — 01:16

под какую платформу?

   Chameleon1980

64 — 09.11.14 — 01:16

все вижу

   247tsm

65 — 09.11.14 — 01:17

(63) 1С:Предприятие 8.1 (8.1.15.14)

   Chameleon1980

66 — 09.11.14 — 01:33

пля странно. я походу сплю

Тут видимо проблема в том что присваеваем значения реквизиту прямо в форме элемента. Но почему. Пипец

   Chameleon1980

67 — 09.11.14 — 01:49

ну поправить то я поправил

тока почему диалог выбора цвета возращает в аттрибут цвет всегда 0,0,0

не обращал внимания?

   Chameleon1980

68 — 09.11.14 — 01:50

плин точно сплю все норм

счас пришлю

   Chameleon1980

69 — 09.11.14 — 01:57

ушло

   247tsm

70 — 09.11.14 — 01:58

(69) получил, смотрю

   Chameleon1980

71 — 09.11.14 — 02:06

я наверное спать — пяты час пошел

   247tsm

72 — 09.11.14 — 02:12

(71) ОК

   247tsm

73 — 09.11.14 — 02:12

(71) У нас только второй час пошел. ;)

   247tsm

74 — 09.11.14 — 02:13

(71) Да, работает, буду разбираться и сравнивать с моей «стряпниной».

   247tsm

75 — 09.11.14 — 02:26

Очень странно.

Я заменил твои реквизиты ЦветТекста, ЦветФона и Шрифт на аналогичные по типу свои ЦветТ, ФонТ и ШрифтТ.

Подправил в процедурах и… работать перестало!?

Заменил обратно и… заработало!?

Все — и твои и мои реквизиты в справочнике присутствуют одновременно. Они отличаются только названиями (по крайней мере визуально).

Наверно, какой-то глюк в конфе или…

   247tsm

76 — 09.11.14 — 02:29

Всё, тоже пошёл спать.

   Chameleon1980

77 — 09.11.14 — 02:30

хз

:)

може какая казявка в свойствах закралась

   247tsm

78 — 09.11.14 — 02:36

(77) В свойствах, вроде, визуально всё одинаковое, кроме имён реквизитов.

   247tsm

79 — 09.11.14 — 02:38

(77) Что-то, наверняка, есть. Или, на самом деле, глюк конфы — почему-то для моих реквизитов в Хранилище значений поиск не находит значения.

   247tsm

80 — 09.11.14 — 02:49

Всё, нашёл. ;)

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

Я их, очевидно, добавил во время своих «экспериментов».

Убрал реквизиты формы и заработало и с моими реквизитами справочника.

   Chameleon1980

81 — 09.11.14 — 02:49

:)

   Chameleon1980

82 — 09.11.14 — 02:54

не понял где:?

   247tsm

83 — 09.11.14 — 02:57

(82) В реквизитах формы.

При редактировании формы у тебя есть вкладки: Диалог, Модуль и Реквизиты.

Вот на вкладке Реквизиты у меня и были эти реквизиты формы, совпадающие по именам с реквизитами справочника.

   247tsm

84 — 09.11.14 — 02:58

А вообще, мне кажется, что такие значения, как цвет, шрифт гораздо проще хранить в реквизитах типа строка, используя функции ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр().

Кода получается меньше.

  

Chameleon1980

85 — 09.11.14 — 10:16

а вообще, сейчас, сидя в ванной, я вспомнил что цвет вообще одним числом хранить нужно/можно/лучше

Понравилась статья? Поделить с друзьями:
  • Сравнение золотодобывающих компаний россии
  • Сравнение компаний по рыночным показателям
  • Сравнение металлургических компаний россии
  • Сравнение сетевых компаний в виде таблички
  • Сравнительная таблица компаний конкурентов