1c переданное значение не может быть помещено в хранилищезначения поскольку не сериализуется
Начиная с версии технологической платформы 8.3.9 средства для работы с двоичными данными претерпели существенные изменения. В этой статье я постараюсь рассказать как о старых, так и о новых инструментах для работы с двоичными данными. При написании статьи использовалась версия технологической платформы 8.3.12
Общая информация
Если раньше, до версии технологической платформы 8.3.9, мы располагали только объектом ДвоичныеДанные, то к настоящему времени у нас имеется целый набор объектов, которые серьезно расширяют наши возможности по манипуляциям с двоичными данными. Рассмотрим все эти объекты чуточку подробнее.
Двоичные данные
Экземпляры объекта ДвоичныеДанные содержат двоичные данные, которые считываются из файла. При это объект ДвоичныеДанные является достаточно многофункциональным — мы можем:
- читать двоичные данные из файла и записывать их в файл;
- передавать их между клиентом и сервером при помощи временного хранилища;
- передавать и получать их по сети;
- хранить их базе данных в реквизитах вида ХранилищеЗначения;
- превратить двоичные данные в объект вида Картинка (при определенных условиях конечно);
- хранить двоичные данные в макетах;
- шифровать и расшифровывать, подписывать и проверять подписи;
Наверняка я что-то пропустил, но главное должно быть понятно — несмотря на значительное развитие средств работы с двоичными данными, объект ДвоичныеДанные остается ключевым.
Потоки
Это группа объектов назначение которых заключается в работе с потоками данных.
Поток — этот объект представляет собой поток данных из которого можно читать и/или записывать в него данные. Данный объект не имеет конструктора, а получить экземпляр объекта можно при помощи различных методов других объектов.
ФайловыйПоток — специализированный вариант объекта Поток, предназначенный для работы с данными находящимися в файлах на диске.
ПотокВПамяти — специализированный вариант объекта Поток, предназначенный для работы с данными находящимися в оперативной памяти.
МенеджерФайловыхПотоков — этот объект предоставляет типовые методы для работы с файлами (открытие и создание). Создать экземпляр этого объекта нельзя — имеется объект глобального контекста ФайловыеПотоки который и предоставляет доступ к методам менеджера.
Чтение и запись
ЧтениеДанных — этот объект предназначен для чтения различных типов данных из различных источников (потоки, файлы, двоичные данные).
РезультатЧтенияДанных — этот объект содержит описание результата чтения данных из потока. Объект не имеет конструктора, получить экземпляр объекта можно при помощи методов других объектов.
БуферДвоичныхДанных — этот объект представляет собой коллекцию байтов фиксированного размера, имеется возможность произвольного доступа и изменения по месту.
ЗаписьДанных — этот объект предназначен для записи различных типов данных в приемник.
Практическая часть
Итак, у нас достаточно много различных объектов, которые, в свою очередь, имеют много разных свойств и методов. Разобраться во всем этом более подробно помогут практические примеры, к ним и перейдем.
Многие объекты — ДвоичныеДанные, Поток, ФайловыйПоток, ПотокВПамяти, ЧтениеДанных, ЗаписьДанных, РезультатЧтенияДанных имеют пары синхронных и асинхронных методов, например: Записать — НачатьЗапись, Закрыть — НачатьЗакрытие. Асинхронные методы нужны для обеспечения возможности одинаковой работы и в тонком клиенте, и в веб-клиенте.
Подробнее про синхронные и асинхронные методы можно прочесть в этой статье.
Двоичные данные
Ниже приведены примеры основных операций с объектом ДвоичныеДанные.
Известно, что в хранилище значений можно поместить только переменные сериализуемого типа. В документации по встроенному языку и в синтакс-помощнике в описании объектов возможность сериализации указывается отметкой "Сериализуется".
При помещении во временное хранилище значений, сериализация которых не поддерживается, возникает ошибка. Текст ошибки зависит от типа переменной. Рассмотрим подробнее каждый из типов.
Хранилище значения
При помещении значения в хранилище конструктором Новый ХранилищеЗначения(<Значение>, <АлгоритмСжатияДанных>) может возникать ошибка "Переданное значение не может быть помещено в ХранилищеЗначения, поскольку не сериализуется или содержит вложенный несериализуемый элемент".
Если в качестве помещаемого значения выступает несериализуемый элемент, то проблем не возникает - мы сразу видим, что он не сериализуется и предпринимаем необходимые действия в зависимости от потребности автоматизации.
Если в качестве помещаемого значения выступает сериализуемая коллекция (например, Структура) с вложенными элементами, то поиск конкретного не сериализуемого значения может принести немало хлопот.
Ниже представлена функция, позволяющая определить, где в коллекциях находятся несериализуемые элементы.
Временное хранилище
При помещении значения во временное хранилище методом ПоместитьВоВременноеХранилище(<Данные>, <Адрес>) может возникать ошибка " Переданное значение не может быть помещено во временное хранилище ".
Здесь казалось бы все по аналогии с хранилищем значения, но возник нюанс: если в качестве данных выступает сериализуемая коллекция с вложенными элементами, сериализация которых не поддерживается, то ошибки не возникает.
Т.е. вот такой код выдает ошибку:
Не знаю, это баг или фича, пока отправил письмо на v8 с просьбой признать ошибку. По результатам ответа, пополню статью.
В нижепредставленной функции организована проверка и на помещение во временное хранилище. Т.к. механизм очевидно другой, то реализован специальный параметр, который явно указывает какое хранилище проверяем.
Функции поиска несериалиуемого значения
Их две. Первая - собственно вызов с передачей проверяемого объекта:
Вторая - служебная рекурсия для определения путей несериализуемых объектов:
Поставил Торговлю 11 версию. При запуске базы в режиме 1с:предприятие программа ругается: "переданное значение не может быть помещено во временное хранилище". Соответсвтенно я не могу войти в базу. Что делать?
Сравнить рекомендуюемый и существующий у тебя релизы платформы?
Я не спрашивал про последний релиз. Открой и почитай описание поставки. Что там пишут? Если и на нём то же самое, тогда либо ищи доработки, или прямым проводом в ТП 1с.
Релиз самой конфы древний попробую более ранние платформы.
мы сейчас догадаться должны, какой релиз платформы ты пробовал?
В "1С:Предприятии 8.3" при помещении во временное хранилище значений, сериализация которых не поддерживается (например, ДокументОбъект.<Имя документа>, СправочникОбъект.<Имя справочника> и пр.), возникает ошибка "Переданное значение не может быть помещено во временное хранилище". Для устранения несовместимости необходимо: Выявить все места помещения значений во временное хранилище (поиском метода глобального контекста ПоместитьВоВременноеХранилище); Проверить, что возможна сериализация типов значений объектов, помещаемых во временное хранилище. Для этого необходимо свериться с синтакс-помощником, убедившись, что в группе "Доступность" явно указана фраза "Сериализуется". При этом следует отличать сериализацию от XDTO-сериализации и XML-сериализации. Например, для типов СправочникОбъект.<Имя справочника> сериализация не поддерживается, хотя поддерживается XDTO-сериализация и XML-сериализация. Если во временное хранилище значений помещается несериализуемое значение, следует пересмотреть проектное решение.
посмотрите, какой релиз платформы необходим под вашу версию конфигурации. Это пишут в файлах с поставкой(откуда вы УТ разворачивали, файл ReadMe.txt)
может и не быть обратной совместимости для каких-то вещей(т.е. очень древняя конфа может на самой последней платформе и не пойти). Какой смысл тыкать пальцем в небо? Если нет файла, посмотрите на сайте техподдержки 1С для нужного релиза инфу.
В данной статье я хочу рассказать о сериализации данных в 1С.
А сейчас немного о самом определении: Сериализация (в программировании) — процесс перевода какой-либо структуры данных в последовательность битов. Обратной к операции сериализации является операция десериализации (структуризации) — восстановление начального состояния структуры данных из битовой последовательности.
Уточним, что серилиазация может применятся не только в рамках одной информационной базы, но и о XML – сериализация. Последняя является отдельной возможностью, и применяется между различными информационными базами данных.
Для начала, рассмотрим сериализацию в рамках одной информационной базы.
Для сохранения значений во время сеанса работы в ИБ используются методы ЗначениеВФайл() и ЗначениеИзФайла().
Пример кода
Пример кода
Если же нам требуется сохранить данные между сеансами, что удобно для пользователя, чтобы не вводить данные каждый раз на форме, то мы будем использовать методы СохранитьЗначение() и ВосстановитьЗначение(), но стоит обратить внимание что данные методы работают только при корректном завершении работы в программе, если вдруг пк будет обесточен, то значения не сохранятся. Также не стоит забывать о сохранении значений в объекте типа ХранилищеЗначений. Подобный тип используется для картинок, образов файлов, так как для них в конфигурации нет соответствующих типов полей.
Пример кода
Пример кода
Если необходимо сохранить значения в строку и восстановить значения из строки, то для этого используются методы ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр(). Эти методы реализованы в основном для сохранения функциональной совместимости с 1С:Предприятием 7.7. Использовать их в большинстве случаев не рекомендуется. Для сохранения значений в базу данных рекомендуется использовать, описанный выше, объект типа ХранилищеЗначения, а для получения некоторого строкового идентификатора ссылочного значения можно использовать возможность получения уникального идентификатора ссылки (метод УникальныйИдентификатор()) и соответственно преобразование его к строке.
Пример кода
Пример кода
А теперь немного о XML–сериализации.
Рассмотрим сериализацию на примере объектов xml, потому что они используются чаще всего.
Есть глобальный метод ЗаписатьXML() предназначенный для этого.
Стоит отметить, что значения не всех типов могут быть записаны в формате XML данным методом.Доступные для записи типы данных делятся на на два типа: простые и сложные.
К простым типам данных относятся типы, значения которых представляются подсистемой XML-сериализации в виде элементов XML только с текстовым содержимым:
К первому относятся:
- Число;
- Строка;
- Дата;
- Булево;
- ДвоичныеДанные;
- Null;
- УникальныйИдентификатор;
- ХранилищеЗначения;
- все ссылки на объекты базы данных;
- ссылки на перечисления, определяемые в метаданных.
Значения сложных типов представляются в виде элементов XML, содержащих вложенные элементы:
- Тип;
- ОписаниеТипов;
- КонстантаМенеджерЗначения.<имя константы>;
- все объекты базы данных;
- наборы записей регистров, последовательностей, перерасчетов;
- УдалениеОбъекта;
Пример кода
Читайте также: