При разработке в среде 1С:Предприятие программисты часто сталкиваются с ситуацией, когда настройки пользователя, параметры динамических списков или описания типов данных представляются в виде странных строк с фигурными скобками и непонятными идентификаторами (UUID). Пример такой строки: {"#",4772b3b4-f4a3-49c0-a1a5-8cb5961511a3, ...}. В этой статье мы разберем, как расшифровать такие данные, преобразовать их в понятные объекты 1С и использовать в программном коде.
Прежде чем переходить к коду, давайте проанализируем ситуацию. То, что мы видим в фигурных скобках, — это Internal Format (внутренний формат сериализации) платформы 1С. Он используется для хранения объектов в базе данных в текстовом виде, передачи данных между сервером и клиентом или сохранения настроек в ХранилищеСистемныхНастроек.
Символ # в начале строки сигнализирует платформе, что далее следует описание системного объекта. Идентификатор 4772b3b4-f4a3-49c0-a1a5-8cb5961511a3 в большинстве версий платформы соответствует типу ОписаниеТипов. Таким образом, в строке закодирована информация о том, какие типы данных может принимать конкретный реквизит (в нашем случае — «Касса»).
Для того чтобы превратить эту «абракадабру» в живой объект 1С, с которым можно работать, существует мощная встроенная функция ЗначениеИзСтрокиВнутр(). Рассмотрим подробнее, как ее применить. Если у вас есть переменная, содержащая вышеуказанную строку, вам не нужно пытаться парсить её текстовыми методами (такими как Найти() или Сред()). Это приведет к ошибкам при обновлении платформы.
Разберем правильный подход:
// Допустим, в переменной СтрокаДанных лежит тот самый текст в фигурных скобках
СтрокаДанных = " { ""#"",4772b3b4-f4a3-49c0-a1a5-8cb5961511a3, ... } ";
// Преобразуем строку в объект платформы
Попытка
ОбъектРезультат = ЗначениеИзСтрокиВнутр(СтрокаДанных);
Исключение
Сообщить("Ошибка при чтении внутреннего формата: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
После выполнения этой функции переменная ОбъектРезультат станет объектом типа ОписаниеТипов, СписокЗначений или Структура (в зависимости от того, что было упаковано в строку изначально). В контексте нашей темы мы выяснили, что на выходе получается СписокЗначений, содержащий информацию о реквизите.
После того как мы получили объект 1С, нам нужно извлечь из него полезную информацию. Например, автор вопроса столкнулся с тем, что в списке значений лежит представление «Касса», но он не знает, как правильно сопоставить это с конкретным документом ВнутреннееПеремещениеНаличныхДенежныхСредств.
Важно понимать: если вам нужно просто получить строку-название реквизита, вы можете перебрать элементы списка. Однако, если ваша задача — программно добавить такое значение в другой список или использовать его в логике, нужно четко разделять Значение и Представление.
Рассмотрим пример правильного добавления элемента в СписокЗначений, чтобы он соответствовал формату, ожидаемому системой:
// Создаем новый список значений
СЗ = Новый СписокЗначений;
// Определяем значение и представление
// Значение - это техническое имя (например, имя документа или реквизита)
// Представление - это то, что увидит пользователь (например, "Касса")
ИмяРеквизита = "ВнутреннееПеремещениеНаличныхДенежныхСредств";
ЗаголовокРеквизита = "Касса";
// Добавляем в список по правилам 1С
СЗ.Добавить(ИмяРеквизита, ЗаголовокРеквизита);
Почему нельзя использовать Документы.ВнутреннееПеремещениеНаличныхДенежныхСредств.ПустаяСсылка().Касса? Разберем эту ошибку. Обращение через ПустаяСсылка() возвращает пустой объект метаданных. У пустой ссылки нет заполненных данных, поэтому попытка получить .Касса вернет либо Неопределено, либо пустую ссылку типа справочника «Кассы», но никак не строку «Касса», которую мы видели в сериализованном коде.
Иногда программисту требуется решить обратную задачу: сформировать такую строку программно, чтобы сохранить настройки в системную таблицу. Для этого используется функция ЗначениеВСтрокуВнутр(). Проанализируем ситуацию, когда нам нужно упаковать СписокЗначений обратно в текстовый вид.
// Формируем список значений с нужными данными
НастройкиВыбора = Новый СписокЗначений;
НастройкиВыбора.Добавить("Склад", "Основной склад");
// Превращаем его в системную строку
ВнутренняяСтрока = ЗначениеВСтрокуВнутр(НастройкиВыбора);
// Теперь переменную ВнутренняяСтрока можно записывать в ХранилищеСистемныхНастроек
Проанализируем структуру строки из первого сообщения темы. В ней встречаются ссылки на метаданные через их внутренние идентификаторы (GUID). Платформа 1С хранит связи между объектами именно через эти уникальные ключи.
Важные моменты:
ЗначениеИзСтрокиВнутр() возвращает Неопределено, значит формат строки нарушен (лишний пробел, пропущенная запятая или скобка).JSON или XDTO, однако для работы с внутренними механизмами платформы (настройки компоновки, хранилища настроек) знание функций ЗначениеИзСтрокиВнутр и ЗначениеВСтрокуВнутр остается обязательным.Для успешного решения задачи по получению реквизитов из системных строк формата {"#", ...} придерживайтесь следующего алгоритма:
ЗначениеИзСтрокиВнутр() для десериализации.ТипЗнч()).СписокЗначений, обращайтесь к его элементам через индекс или метод НайтиПоЗначению().Этот подход гарантирует стабильную работу вашего кода и корректную обработку любых системных настроек платформы 1С.