Каждый разработчик 1С рано или поздно сталкивается с загадочными строками, которые начинаются с фигурных скобок и символа решетки: {"#", ...}. Этот формат используется платформой «1С:Предприятие» повсеместно — в конфигурационных файлах, файлах настроек, схемах СКД, журналах регистрации старого формата (.elf), а также при сохранении данных с помощью встроенных функций. В этой статье мы подробно разберем структуру этого формата, выясним назначение системных идентификаторов, научимся расшифровывать ссылки на объекты и разберем способы чтения этих данных.
Представленный фрагмент — это внутренний формат представления данных платформы 1С (часто называемый v8-сериализацией). Встроенный язык 1С взаимодействует с ним напрямую через функции ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр(). Когда мы сохраняем объект в строку для передачи или записи в файл, платформа преобразует его в древовидную текстовую структуру.
Проанализируем пример из сообщения автора:
{"#",51e7a0d2-530b-11d4-b98a-008048da3034,
{1144,
{"#",4238019d-7e49-4fc9-91db-b6b951d5cf8e,
{4,
{
{"S","Номенклатура"},
{"#",4b1b49cb-5430-4f80-9818-a1cef1b3d410,116:80e1b083fee00c3a11e80a59363dac8d}
},
...
Давайте разберем по шагам, что означают эти символы:
"#" указывает платформе на то, что далее объявляется сложный тип данных (объект или коллекция).51e7a0d2-530b-11d4-b98a-008048da3034 — это системный UUID типа Массив.Прежде чем переходить к сложным объектам, рассмотрим, как во внутреннем формате записываются базовые типы. Каждый примитивный тип данных представляется парой из литерала типа и значения:
{"S", "Текст"}{"N", 125.36}{"B", 1} (Истина) или {"B", 0} (Ложь){"D", YYYYMMDDhhmmss} (например, {"D", 20231024153000}){"L"}{"T", <UUID>}Платформа 1С использует фиксированные UUID для своих встроенных типов коллекций. Они неизменны в любой конфигурации и в любой информационной базе. Выясним основные из них:
51e7a0d2-530b-11d4-b98a-008048da3034 — Массив4238019d-7e49-4fc9-91db-b6b951d5cf8e — Структура3d48feae-a9c6-4c5a-a099-9eb6477630c6 — Соответствие4772b3b4-f4a3-49c0-a1a5-8cb5961511a3 — Список значенийacf6192e-81ca-46ef-93a6-5a6968b78663 — Таблица значенийe603c0f2-92fb-4d47-8f38-a44a381cf235 — Дерево значенийРассмотрим пример кода, демонстрирующий сериализацию Структуры и Соответствия с одинаковыми данными:
Карта = Новый Соответствие;
Карта.Вставить("Номенклатура", СсылкаНоменклатура);
КартаТекст = ЗначениеВСтрокуВнутр(Карта);
Словарь = Новый Структура;
Словарь.Вставить("Номенклатура", СсылкаНоменклатура);
СловарьТекст = ЗначениеВСтрокуВнутр(Словарь);
После сериализации мы получим практически идентичные структуры, за исключением главного UUID типа:
Для Соответствия:
{"#",3d48feae-a9c6-4c5a-a099-9eb6477630c6,
{1,
{
{"S","Номенклатура"},
{"#",190a7469-3325-4d33-b5ec-28a63ac83b06,215:af150015e9b8c48d11e050911643ef2e}
}
}
}
Для Структуры:
{"#",4238019d-7e49-4fc9-91db-b6b951d5cf8e,
{1,
{
{"S","Номенклатура"},
{"#",190a7469-3325-4d33-b5ec-28a63ac83b06,215:af150015e9b8c48d11e050911643ef2e}
}
}
}
В приведенном автором примере встречается сериализованная ссылка на элемент справочника:
{"#", 4b1b49cb-5430-4f80-9818-a1cef1b3d410, 116:80e1b083fee00c3a11e80a59363dac8d}
Проанализируем эту строку детально:
4b1b49cb-5430-4f80-9818-a1cef1b3d410 — уникальный UUID типа метаданных справочника (например, справочника «Номенклатура»).116 — внутренний идентификатор таблицы СУБД (например, таблица _Reference116 в базе данных SQL).80e1b083fee00c3a11e80a59363dac8d — уникальный идентификатор конкретной записи базы данных. Обратите внимание, что этот GUID находится в «переставленном» (shuffled) представлении 1С.Восстановим стандартный GUID ссылки по следующему алгоритму. Стандартный GUID состоит из 5 групп: [Группа 1]-[Группа 2]-[Группа 3]-[Группа 4]-[Группа 5].
Во внутреннем формате 1С эти группы переставлены местами: [Группа 4][Группа 5][Группа 3][Группа 2][Группа 1].
Возьмем строку 80e1b083fee00c3a11e80a59363dac8d и разобьем ее по длинам групп:
80e1b083fee00c3a11e80a59363dac8dСобираем их в стандартный порядок 1-2-3-4-5 и разделяем дефисами:
363dac8d-0a59-11e8-80e1-b083fee00c3a
Теперь, используя этот GUID, мы можем легко найти элемент в базе данных с помощью встроенного метода:
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор("363dac8d-0a59-11e8-80e1-b083fee00c3a"));
Попытка прочитать некоторые строки (например, старый журнал регистрации .elf или байт-код закрытых модулей) стандартным методом ЗначениеИзСтрокиВнутр() часто приводит к ошибке «Ошибка формата потока». Выясним причины этого поведения:
Если вам необходимо прочитать подобные структуры, не прибегая к платформенным методам 1С (например, при обработке файлов внешними скриптами), самым простым решением будет конвертация данных в формат JSON.
Для этого воспользуемся следующим подходом:
{ на квадратные [, а закрывающие } на ].{"#", <UUID>, ...} в стандартные объекты "ключ-значение" JSON.json, а в JavaScript — метод JSON.parse()).Такой подход позволяет автоматизировать чтение сложных файлов конфигурации и логов 1С на любой программной платформе быстро и эффективно.