Как программно получить значение из строки внутреннего формата 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке в среде 1С:Предприятие программисты часто сталкиваются с ситуацией, когда настройки пользователя, параметры динамических списков или описания типов данных представляются в виде странных строк с фигурными скобками и непонятными идентификаторами (UUID). Пример такой строки: {"#",4772b3b4-f4a3-49c0-a1a5-8cb5961511a3, ...}. В этой статье мы разберем, как расшифровать такие данные, преобразовать их в понятные объекты 1С и использовать в программном коде.

Что такое внутренний формат 1С и зачем он нужен

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

Символ # в начале строки сигнализирует платформе, что далее следует описание системного объекта. Идентификатор 4772b3b4-f4a3-49c0-a1a5-8cb5961511a3 в большинстве версий платформы соответствует типу ОписаниеТипов. Таким образом, в строке закодирована информация о том, какие типы данных может принимать конкретный реквизит (в нашем случае — «Касса»).

Шаг 1: Преобразование строки в объект 1С

Для того чтобы превратить эту «абракадабру» в живой объект 1С, с которым можно работать, существует мощная встроенная функция ЗначениеИзСтрокиВнутр(). Рассмотрим подробнее, как ее применить. Если у вас есть переменная, содержащая вышеуказанную строку, вам не нужно пытаться парсить её текстовыми методами (такими как Найти() или Сред()). Это приведет к ошибкам при обновлении платформы.

Разберем правильный подход:


// Допустим, в переменной СтрокаДанных лежит тот самый текст в фигурных скобках
СтрокаДанных = " { ""#"",4772b3b4-f4a3-49c0-a1a5-8cb5961511a3, ... } ";

// Преобразуем строку в объект платформы
Попытка
    ОбъектРезультат = ЗначениеИзСтрокиВнутр(СтрокаДанных);
Исключение
    Сообщить("Ошибка при чтении внутреннего формата: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

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

Шаг 2: Получение конкретного значения из объекта

После того как мы получили объект 1С, нам нужно извлечь из него полезную информацию. Например, автор вопроса столкнулся с тем, что в списке значений лежит представление «Касса», но он не знает, как правильно сопоставить это с конкретным документом ВнутреннееПеремещениеНаличныхДенежныхСредств.

Важно понимать: если вам нужно просто получить строку-название реквизита, вы можете перебрать элементы списка. Однако, если ваша задача — программно добавить такое значение в другой список или использовать его в логике, нужно четко разделять Значение и Представление.

Рассмотрим пример правильного добавления элемента в СписокЗначений, чтобы он соответствовал формату, ожидаемому системой:


// Создаем новый список значений
СЗ = Новый СписокЗначений;

// Определяем значение и представление
// Значение - это техническое имя (например, имя документа или реквизита)
// Представление - это то, что увидит пользователь (например, "Касса")
ИмяРеквизита = "ВнутреннееПеремещениеНаличныхДенежныхСредств";
ЗаголовокРеквизита = "Касса";

// Добавляем в список по правилам 1С
СЗ.Добавить(ИмяРеквизита, ЗаголовокРеквизита);

Почему нельзя использовать Документы.ВнутреннееПеремещениеНаличныхДенежныхСредств.ПустаяСсылка().Касса? Разберем эту ошибку. Обращение через ПустаяСсылка() возвращает пустой объект метаданных. У пустой ссылки нет заполненных данных, поэтому попытка получить .Касса вернет либо Неопределено, либо пустую ссылку типа справочника «Кассы», но никак не строку «Касса», которую мы видели в сериализованном коде.

Шаг 3: Обратная операция — создание строки внутреннего формата

Иногда программисту требуется решить обратную задачу: сформировать такую строку программно, чтобы сохранить настройки в системную таблицу. Для этого используется функция ЗначениеВСтрокуВнутр(). Проанализируем ситуацию, когда нам нужно упаковать СписокЗначений обратно в текстовый вид.


// Формируем список значений с нужными данными
НастройкиВыбора = Новый СписокЗначений;
НастройкиВыбора.Добавить("Склад", "Основной склад");

// Превращаем его в системную строку
ВнутренняяСтрока = ЗначениеВСтрокуВнутр(НастройкиВыбора);

// Теперь переменную ВнутренняяСтрока можно записывать в ХранилищеСистемныхНастроек

Особенности работы с UUID и метаданными

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

Важные моменты:

  1. Никогда не пытайтесь изменять GUID вручную внутри строки, если вы не уверены на 100% в его назначении. Это может привести к повреждению структуры данных.
  2. Если функция ЗначениеИзСтрокиВнутр() возвращает Неопределено, значит формат строки нарушен (лишний пробел, пропущенная запятая или скобка).
  3. В современных конфигурациях на управляемых формах вместо внутреннего формата для обмена данными с внешними системами рекомендуется использовать JSON или XDTO, однако для работы с внутренними механизмами платформы (настройки компоновки, хранилища настроек) знание функций ЗначениеИзСтрокиВнутр и ЗначениеВСтрокуВнутр остается обязательным.

Резюме для разработчика

Для успешного решения задачи по получению реквизитов из системных строк формата {"#", ...} придерживайтесь следующего алгоритма:

  1. Используйте ЗначениеИзСтрокиВнутр() для десериализации.
  2. Определите тип полученного объекта (через ТипЗнч()).
  3. Если это СписокЗначений, обращайтесь к его элементам через индекс или метод НайтиПоЗначению().
  4. Помните, что во внутреннем формате часто хранятся имена метаданных (строки), а не ссылки на объекты базы данных, если речь идет о настройках отображения колонок или выбора реквизитов.

Этот подход гарантирует стабильную работу вашего кода и корректную обработку любых системных настроек платформы 1С.

← На главную