Получить из хранилища значений 1с
ХранилищеЗначения (хранилище значений 1С) – это объект в языке 1С, который позволяет хранить в базе данных прочие значения, например картинки и файлы, структуры и таблицы значений.
Сначала мы создаем значение, например:
Знч = Новый ТаблицаЗначений();
Потом помещаем его в хранилище значений 1С:
Хранилище = Новый ХранилищеЗначения(Знч, Новый СжатиеДанных(9));
Сжатие данных в хранилище значений 1С с параметром «9» означает, что данные будут храниться в архивированном виде, с максимальной степенью сжатия.
Чтобы сохранить такое значение в базу данных, нужно создать объект конфигурации (справочник, документ и т.п.), у которого добавить реквизит с типом ХранилищеЗначения.
СправочникСсылка = Справочники.Хранилище.СоздатьЭлемент();
СправочникСсылка.ХранилищеЗначения = Хранилище;
СправочникСсылка.Записать();
Кроме хранения таких значений в базе данных, с помощью хранилища значений 1С, мы также можем сохранить такое значение в файл, например:
Настройки = Новый Структура();
Настройки.Вставить("ПоУмолчанию", Истина);
Настройки.Вставить("Наименование", "Наименование1");
Хранилище = Новый ХранилищеЗначения(Настройки, Новый СжатиеДанных(9));
ЗначениеВФайл("C:\", Хранилище);
Пример – сохранение значения из файла
//Значение - картинка из файла
Файл = Новый Картинка("C:\ФайлКартинки.jpg");
Хранилище = Новый ХранилищеЗначения(Файл, Новый СжатиеДанных(9));
//Значение - произвольный файл
Файл = Новый ДвоичныеДанные("C:\ИсполняемыйФайл.exe");
Хранилище = Новый ХранилищеЗначения(Файл, Новый СжатиеДанных(9));
//Значение - текстовый файл
Файл = Новый ЧтениеТекста("C:\ТекстовыйФайл.txt");
ТекстовыеДанные = Файл.Прочитать();
Хранилище = Новый ХранилищеЗначения(ТекстовыеДанные, Новый СжатиеДанных(9));
Значение, помещенное в хранилище значений 1С нельзя использовать, пока оно там находится. Чтобы работать с ним, его нужно «распаковать» обратно, например:
Знч = Хранилище.Получить();
Если Знч = Неопределено Тогда
Сообщить("Ошибка получения значения из хранилища");
КонецЕсли;
// Сохранение значения в реквизит объекта конфигурации (тип: ХранилищеЗначения)
СправочникСтранаСсылка = Справочники . Страны . НайтиПоНаименованию ( "Испания" );
СправочникСтранаСсылка . ХранилищеЗначения = Хранилище_Зн ;
СправочникСтранаСсылка . Записать ();
// *** 2.Пример (Табличный документ):
ЗначенияТабДок =Новый ТабличныйДокумент ;
ЗначенияТабДок . Вывести ( ЭлементыФормы . ПолеТабличногоДокумента1 );
Хранилище_ТабДок =Новый ХранилищеЗначения ( ЗначенияТабДок );
// *** 3.Пример (Структура):
ЗначенияСтр = Новый Структура (); // Создание значения "Структура"
ЗначенияСтр . Вставить ( "Код" , "34" );
ЗначенияСтр . Вставить ( "Наименование" , "Испания" );
ЗначенияСтр . Вставить ( "Описание" , "Европейская страна, расположенная на Пиренейском полуострове" );
ЗначенияСтр . Вставить ( "Население" , 46600000 );
// Вставка в хранилище значений
Хранилище_Стр = Новый ХранилищеЗначения ( ЗначенияСтр , Новый СжатиеДанных ( 9 )); // "9" - макс.степень сжатия
ЗначениеВФайл ( "D:\import\" , Хранилище_Стр ); // Сохранение значения в файл
// *** 4.Пример (Любой файл) :
ФайлДвоичныеДанные = Новый ДвоичныеДанные ( "D:\import\КлиентБанк_РБ.exe" );
Хранилище_Файл = Новый ХранилищеЗначения ( ФайлДвоичныеДанные , Новый СжатиеДанных ( 0 )); // "0" - без сжатия
// *** 5.Пример (Файл картинка) :
ФайлФото = Новый Картинка ( "D:\import\ФотоСотрудника.jpg" );
Хранилище_Фото = Новый ХранилищеЗначения ( ФайлФото , Новый СжатиеДанных ( 5 )); // "5" - средн.степень сжатия
// *** 6.Пример (Текстовый файл) :
ФайлТекст = Новый ЧтениеТекста ( "D:\import\Война_и_мир.txt" );
ТекстИзФайла = ФайлТекст . Прочитать ();
Хранилище_Текст = Новый ХранилищеЗначения ( ТекстИзФайла , Новый СжатиеДанных ( 1 )); // "1" - мин.степень сжатия
// *** 7.Пример (Отчет/обработка 1С) :
Хранилище_Epf = Новый ХранилищеЗначения (Новый ДвоичныеДанные ( "D:\import\Otchet_realizacija_2020.epf" , СтепеньСжатия ));
// Двоичные данные можно восстановить из хранилища значения методом Получить и записать в файл методом Записать()
Если ТипЗнч ( РеквизитХранилище ) = Тип ( "ДвоичныеДанные" ) Тогда
// Хранилище.Получить()<>Неопределено Тогда // Процедура извлекает данные из хранилища (требует времени)
// Для больших объемов данных рекомендуется использовать доп.реквизит (Например: Булево) Содержит данные - Истина
ДанныеХранилища = РеквизитХранилище . Получить ();
Если ДанныеХранилища = Неопределено Тогда
Сообщить ( "Ошибка получения данных из хранилища значений 1С" );
КонецЕсли;
ДанныеХранилища . Записать ( ИмяФайла ); // Записываем восстановленые данные в файл
// Восстановление Табличного документа
ЭлементыФормы . ПолеТабличногоДокумента1 . Вывести ( ДанныеХранилища );
// Восстановление и запуск Отчета/обработки 1С
ИмяФайла_Epf = "D:\import\Otchet_realizacija_2020.epf" ;
ДвоичныеДанные = РеквизитХранилище . Получить ();
ДвоичныеДанные . Записать ( ИмяФайла_Epf );
Epf = ВнешниеОбработки . Создать ( ИмяФайла_Epf );
Epf . ПолучитьФорму (). Открыть ();
Иначе
ДанныеХранилища = РеквизитХранилище ;
КонецЕсли;
Можно ли присвоить объекту основного типа значение объекта пользовательского типа?
Правильно ли я понимаю, что SomeClass obj; int x = obj; или SomeClass obj; int x = 5 +.
Присвоение объекту типа string рандомный элемент из массива типа string
Добрый вечер, дорогие форумчане. Я столкнулся с проблемой. Как присвоить объекту типа string.
Привязка текстового поля к объекту типа Дробь
Здравствуйте! Мне нужно создать поле ввода для дроби написал библиотеку для работы с дробями.
Объекту типа делегата не присваивается адрес функции
почему объекту типа делегата: string del(object obj); не присваивается адрес функции string.
Использование литерала Неопределено в запросе допустимо, работает так-же как и везде в коде.
Есть в языке запросов слово ВЫРАЗИТЬ. Но не знаю как им пользоваться.<div folded clickable">Описание оператора ВЫРАЗИТЬ</div></div><div /> Поля исходных таблиц могут иметь составной тип. Для таких полей возникает необходимость привести значения поля к какому-либо определенному типу.
<Приведение типа>
|
ВЫРАЗИТЬ ( <Выражение> КАК <Тип значения> )
|
БУЛЕВО |
ЧИСЛО [(Длина[, Точность])] |
СТРОКА [(Длина)] |
ДАТА |
<Имя таблицы>
<Длина> - ЧИСЛО; <Точность> - ЧИСЛО
<Выражение> приводится к одному из примитивных типов, или к ссылочному типу данных; в последнем случае <Имя таблицы> указывает на соответствующую таблицу информационной базы.
Если <Выражение> содержит в составном типе требуемый <Тип значения>, то приведение типа считается осуществимым, и для каждого значения указанного типа результатом будет это самое значение. Для значений других типов результатом приведения типа будет значение NULL.
Если <Выражение> не содержит в составном типе требуемый <Тип значения>, то выполнение данного запроса завершится ошибкой из-за принципиальной невозможности совершить приведение типов.
Для <Тип значения> СТРОКА с указанием длины максимальный размер строки составляет 1024.
Ну, и по сути вопроса: ;)
Использование литерала Неопределено в запросе допустимо, работает так-же как и везде в коде.Не, друже, не прокатило.
Написал в запросе:
|ГДЕ
| Док.Содержимое <> Неопределено
Выдал гадость:
Неверные параметры в операции сравнения. Нельзя сравнивать поля
неограниченной длины и поля несовместимых типов.
Ссылкой тоже непонятно. Там вопрос задан а ответа нет.
ХранилищеЗначения - это ХранилищеЗначения, а не Неопределено. И сравнивать XЗ с Неопределено нельзя.
Неопределено может содержаться в хранилище значения, то есть, ХЗ.Получить() может выдать Неопределено.
Насколько я знаю, средств получить значение из хранилища значения в запросе нет. И ВЫРАЗИТЬ здесь, увы!, не поможет.
Теперь увидел - буквы слишком маленькие. Кирилл, так бы и сказал! А то там далее всякая чушь отвлекла внимание. А с помощью СКД сделать нельзя? Скд может работать с функциями общих модулей в которых будет идти проверка является ли Док.Содержимое .Получить()= Неопределено?А как? Мне же нужен не просто отчет, а результаты запроса пихнуть в ТЗ и с ней работать на диалоге обработки.
Сейчас сделал, что результаты запроса обхожу и отсеиваю строки, где Хранилище пустое.
Абыдно, да?
- Было такое красивое выражение:
ЭтотОбъект.ТаблицаДокументов.Загрузить(Запрос.Выполнить().Вы грузить());
Пришлось переделать в цикл по запросу и добавлять в Таблицу каждую строчечку.
- Запрос из тысячи документов отсеял штук 100. Но из этих 100 заполненными могут оказаться только 10. Выходит лишняя куча передается в клиент.
- А еще обидно, что мне же не нужен анализ содержимого. Только наличие/отсутствие информации.
Может конечно и ошибаюсь но примерно так(код проверял - работает):
В общем модуле создал глобальную функцию
Код ( (Unknown Language)):
Функция ОпределитьЗаполненостьХранилища(Хранилище) Экспорт
Если Хранилище.Получить()= Неопределено Тогда Возврат Ложь; Иначе Возврат Истина; КонецЕсли;
КонецФункции
Далее создал справочник "Номенклатура" с одним реквизитом "Хранилище" - тип Хранилище значений;
Добавил в справочник несколько элементов. Далее создал отчет.
В отчете создал макет СКД с именем "Макет".В макете скд в качестве набора данных запрос, текст запроса:
Код ( (Unknown Language)):
ВЫБРАТЬ
Номенклатура.Ссылка,
Номенклатура.Хранилище
ИЗ
Справочник.Номенклатура КАК Номенклатура
В вычисляемых полях добавил переменную "ПустотаХранилища" у которой выражение ОпределитьЗаполненостьХранилища(Хранилище);
В настройках выбрал все поля для вывода, детальные записи.
Создал форму обработки, на нее кинул ПолеТабличногоДокумента с именем "Результат". Обработчик кнопки выполнить следующий:
Код ( (Unknown Language)):
Процедура КнопкаВыполнитьНажатие(Кнопка)
// Сгенерируем макет компоновки данных при помощи компоновщика макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
// В качестве схемы компоновки будет выступать схема самого отчета
// В качестве настроек отчета - текущие настройки отчета
// Данные расшифровки будем помещать в свойство расширения формы - ДанныеРасшифровки
СхемаКомпоновкиДанных= ПолучитьМакет("Макет");
ДанныеРасшифровки = "";
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
// Создадим и инициализируем процессор компоновки
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки. Истина);
// Создадим и инициализируем процессор вывода результата
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ЭлементыФормы.Результат);
// Обозначим начало вывода
ПроцессорВывода.НачатьВывод();
//ПроцессорВывода.Вывести(ЭлементыФормы.Результат);
// Основной цикл вывода отчета
Пока Истина Цикл
// Получим следующий элемент результата компоновки
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
Если ЭлементРезультата = Неопределено Тогда
// Следующий элемент не получен - заканчиваем цикл вывода
Прервать;
Иначе
// Элемент получен - выведем его при помощи процессора вывода
ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
ЭлементыФормы.Результат.ПоказатьУровеньГруппировокСтрок(1) // уровень сорачивания
КонецЕсли;
// Обозначем завершение вывода
ПроцессорВывода.ЗакончитьВывод();
КонецПроцедуры
В результате отобразил все записи в указанием какая содержит полное, а какая пустое хранилище. В нашем случае можно все это дело было бы вывести в ТЗ и сделать НайтиСтроки по нужному составу хранилища. Как то так ;))
Читайте также: