Разработка и Конфигурация · 10 мин
Как посмотреть хранилище значений в 1С
Как посмотреть хранилище значений в 1С: через конфигуратор, встроенный язык, запросы и внешние обработки. Разбор типов данных, ошибок и ограничений.
Хранилище значений (ValueStorage) в 1С — специальный тип данных, который позволяет сохранять в поле базы практически любые объекты: картинки, файлы, таблицы значений, результаты компоновки данных, сериализованные структуры. Содержимое такого поля нельзя увидеть обычным открытием формы или стандартным отчётом — платформа хранит данные в упакованном виде, и для просмотра нужно извлечь значение методом Получить().
Задача «посмотреть хранилище значений» возникает у разработчиков при отладке, у администраторов — при разборе ошибок обмена, у консультантов — когда нужно проверить, какие настройки на самом деле сохранил пользовательский отчёт или обработка. Ниже разобраны рабочие способы: от простого просмотра через консоль кода до выгрузки содержимого в файл.
Важно понимать: хранилище значений — это не отдельный объект конфигурации, а тип поля. Поэтому сначала нужно найти, в каком реквизите (справочника, документа, регистра сведений) лежат интересующие данные, и только потом извлекать их.
Что такое хранилище значений и где оно встречается
Хранилище значений — это универсальный контейнер. При записи в базу платформа сериализует объект в специальный внутренний формат, при чтении — восстанавливает его методом Получить(). В конфигураторе такой тип назначается реквизиту объекта, и в списке типов он отображается как «ХранилищеЗначения».
Типичные места, где встречается этот тип: реквизиты «Картинка» или «Файл» у номенклатуры и справочников, настройки отчётов и вариантов отчётов, данные обменов, регистрация изменений, хранение печатных форм, результаты фоновых заданий. В типовых конфигурациях хранилища значений активно используются в подсистемах БСП — например, в регистрах сведений с настройками пользователей.
Ключевое ограничение: содержимое хранилища нельзя использовать в отборах и сортировках запроса напрямую. Запросом можно лишь получить само поле, а разобрать его содержимое — только средствами встроенного языка после выполнения запроса.
Как найти реквизиты с типом «ХранилищеЗначения»
Прежде чем смотреть содержимое, нужно определить, где оно лежит. Откройте конфигуратор, найдите интересующий объект (справочник, документ, регистр сведений) и просмотрите список реквизитов: у нужного поля в колонке «Тип» будет указано «ХранилищеЗначения».
Если объект неизвестен, используйте глобальный поиск по конфигурации (Ctrl+Shift+F) по строке «ХранилищеЗначения» — так можно найти все места, где тип упоминается в модулях. Дополнительно полезно посмотреть структуру хранения базы: в конфигураторе «Администрирование → Параметры информационной базы» или через запрос к метаданным.
Программно перебрать все поля-хранилища можно через объект «Метаданные»: обойти коллекции справочников, документов, регистров и проверить тип каждого реквизита. Это удобно, когда нужно оценить, какие таблицы раздувают базу из-за хранящихся файлов.
Просмотр через консоль кода — самый быстрый способ
Для разового просмотра удобнее всего внешняя консоль кода (консоль запросов с возможностью исполнения произвольного кода или любая аналогичная обработка для управляемого приложения). Запустите её в режиме предприятия на копии базы или аккуратно на рабочей — код только читает данные, но любые эксперименты безопаснее проводить на копии.
Минимальный пример: получить ссылку на элемент, обратиться к реквизиту и вызвать Получить(). Результат зависит от того, что реально лежит внутри: если это картинка — вернётся объект «Картинка», если настройки компоновки — объект настроек, если строка или таблица значений — соответствующие типы.
Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 Данные ИЗ РегистрСведений.МоиНастройки");
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Значение = Выборка.Данные.Получить();
Сообщить(ТипЗнч(Значение));
КонецЕсли;Сначала всегда выводите тип полученного значения через ТипЗнч(). Это покажет, как дальше работать с данными: сериализовать в JSON, сохранить картинку на диск или вывести таблицу значений построчно. Попытка сразу обратиться к содержимому «вслепую» — частая причина ошибок вида «поле объекта не обнаружено».
- 1Найдите реквизит с типом «ХранилищеЗначения» в конфигураторе
- 2Откройте консоль кода в режиме предприятия
- 3Получите объект или выборку запросом по нужной записи
- 4Вызовите Получить() у реквизита-хранилища
- 5Определите тип результата через ТипЗнч()
- 6Выведите содержимое подходящим способом: Сообщить, запись в файл, вывод таблицы
Просмотр в конфигураторе и в режиме отладки
Если конфигурация выводит содержимое хранилища на форму (например, фото товара), достаточно открыть элемент в режиме предприятия — платформа сама выполнит распаковку. Но так бывает не всегда: многие хранилища служебные и на формы не выводятся.
Универсальный инструмент разработчика — отладчик. Установите точку останова в месте, где код обращается к реквизиту-хранилищу, запустите отладку и в табло (Shift+F9) вычислите выражение вида Объект.Данные.Получить(). Результат можно раскрыть как дерево: для таблиц значений видны строки и колонки, для структур — ключи и значения.
Этот способ особенно полезен, когда нужно понять, что именно сохраняет прикладной код: вы видите не только содержимое, но и контекст — на каком шаге и с какими параметрами данные формируются.
Выгрузка содержимого в файл
Когда в хранилище лежит двоичные данные — картинка, архив, документ — удобнее не смотреть их в отладчике, а сохранить на диск. Для этого результат Получить() приводится к типу «ДвоичныеДанные» и записывается методом Записать(ИмяФайла).
Если внутри таблица значений или настройки, их можно сериализовать: таблицу — выгрузить в XML или построчно в текст, настройки компоновки — сохранить через соответствующие объекты сериализации. После выгрузки файл открывается обычными средствами: картинка — просмотрщиком, XML — текстовым редактором.
Обратите внимание на объём: в хранилищах значений нередко лежат файлы большого размера. Массовая выгрузка (например, всех картинок номенклатуры) может занять заметное время и место на диске — выполняйте её порциями и контролируйте свободное пространство.
Просмотр через запрос: возможности и ограничения
В консоли запросов поле типа «ХранилищеЗначения» можно выбрать в результат, но содержимое отобразится как служебная строка вида «Хранилище значений» — самих данных запрос не показывает. Это нормально: язык запросов не умеет распаковывать сериализованные объекты.
Запросом удобно решать смежные задачи: найти записи, где хранилище заполнено или пусто, посчитать количество таких записей, отобрать объекты для последующей обработки кодом. Для проверки заполненности сравнение с пустым значением хранилища выполняется через параметр со значением Новый ХранилищеЗначения(Неопределено) или по косвенным признакам — в зависимости от конфигурации.
Стандартный отчёт «Динамический список» и универсальные отчёты типовых конфигураций также не распаковывают хранилища. Если бизнес-пользователю регулярно нужно видеть такие данные, правильное решение — доработать форму или отчёт, выводящий распакованное содержимое в читаемом виде.
Выбор способа под свою задачу
Разработчику при отладке логичнее всего точка останова и табло — это даёт максимум контекста. Администратору, которому нужно разово посмотреть настройки или вытащить файл, подойдёт консоль кода: быстро и без изменения конфигурации. Пользователю без навыков программирования доступны только те данные, которые конфигурация выводит на формы, — в остальных случаях потребуется помощь специалиста.
Если просмотр нужен регулярно, имеет смысл оформить простую внешнюю обработку: поле выбора ссылки, кнопка «Показать», вывод типа и содержимого. Это безопаснее, чем каждый раз вручную писать код, и снижает риск ошибок.
Сравнение способов просмотра
Быстрый разовый просмотр без изменения конфигурации; требует базовых навыков встроенного языка
Максимум контекста при разборе логики; нужен конфигуратор и доступ к отладке
Без программирования, но показывает только то, что предусмотрела конфигурация
Подходит для регулярного просмотра; требует однократной разработки
Частые вопросы
Можно ли посмотреть хранилище значений без конфигуратора и программирования?
Только если конфигурация сама выводит содержимое на форму — например, изображение товара или присоединённый файл. Служебные хранилища (настройки, данные обменов) без кода или специальной обработки не просмотреть.
Почему Получить() возвращает Неопределено?
Чаще всего в поле просто ничего не записано. Реже — данные повреждены или записывались нестандартным способом. Проверьте несколько записей: если Неопределено возвращается везде, вероятно, реквизит не используется или заполняется в другом месте.
Как понять, что лежит внутри хранилища, до извлечения?
Достоверно — только вызвав Получить() и проверив тип через ТипЗнч(). Косвенно помогает изучение кода, который записывает данные: поиском по имени реквизита в конфигураторе видно, какой объект туда помещается.
Можно ли отфильтровать записи запросом по содержимому хранилища?
Нет, язык запросов не распаковывает хранилища значений. Рабочий приём — выбрать записи запросом, а затем в цикле извлекать содержимое и фильтровать программно. Для больших таблиц это медленно, поэтому такие поля не стоит использовать для данных, по которым нужны отборы.
Опасно ли вызывать Получить() на рабочей базе?
Само чтение безопасно — метод только распаковывает данные в память. Риск связан с тем, что вы делаете дальше: запись изменённого значения обратно или запуск непроверенного кода. Любые эксперименты надёжнее проводить на копии базы.
Как вытащить картинку или файл из хранилища на диск?
Получите значение методом Получить(), при необходимости извлеките из него ДвоичныеДанные и вызовите метод Записать() с указанием пути к файлу. Перед массовой выгрузкой проверьте результат на одной записи и убедитесь, что на диске достаточно места.
Что важно запомнить
Хранилище значений просматривается только программно: найдите реквизит нужного типа, получите объект и вызовите Получить(), затем проверьте тип результата через ТипЗнч(). Для разового просмотра используйте консоль кода, для отладки — точку останова, файлы выгружайте на диск. Работайте на копии базы и проверяйте результат на Неопределено.