В процессе разработки в экосистеме 1С программисты часто сталкиваются с ситуацией, когда наработанные месяцами списки запросов в консоли перестают открываться. Это случается из-за использования разных версий консолей (например, при попытке открыть файл «Универсальной консоли» в консоли из «Инструментов разработчика») или аварийного завершения сеанса. Рассмотрим подробно, как реанимировать данные из файла формата .sel и что делать, если привычный инструмент выдает ошибку.
Файл с расширением .sel не является зашифрованным бинарным файлом. По своей сути — это текстовый документ, содержащий результат сериализации объекта ДеревоЗначений или ТаблицаЗначений во внутренний формат 1С (аналог того, что выдает функция ЗначениеВСтрокуВнутр()).
Разберем типичную ошибку: Поле объекта не обнаружено (Запрос). Проанализируем ситуацию: консоль при загрузке файла пытается сопоставить колонки в сохраненном файле с колонками своего внутреннего дерева запросов. Если «кривая» консоль переименовала колонку Запрос в ТекстЗапроса или изменила ее тип, основная обработка не находит ожидаемый идентификатор и прерывает работу.
В тексте файла мы можем увидеть блоки следующего вида:
{"#",e603c0f2-92fb-4d47-8f38-a44a381cf235,
{1,
{8,
{1,"ИмяЗапроса", {"Pattern", {"S"} }, "", 0},
...
Это описание метаданных таблицы. Если после этого блока вместо понятных текстов ВЫБРАТЬ... вы видите бесконечные списки GUID (типа {"#", ab011105-...}), значит, структура файла была серьезно нарушена, и колонка с текстом запроса превратилась в массив описаний типов. Однако даже в этом случае не стоит отчаиваться, пока мы не проверили временные папки.
Большинство продвинутых консолей запросов имеют механизм автосохранения. Прежде чем пытаться «лечить» поврежденный файл, нам необходимо проверить директории, куда 1С складывает временные данные сеанса. Рассмотрим пошагово, где искать:
%LOCALAPPDATA%\1C\1cv8\.ExtCompT или temp. Многие консоли (например, консоль из состава «Инструментов разработчика») сохраняют копии запросов в файлы с маской irQueryConsole_*.tmp или v8_*.tmp..sel, после чего попробуем открыть его в «здоровой» консоли.Если файл не открывается из-за ошибки Поле объекта не обнаружено, мы можем внести временные изменения в саму обработку консоли, чтобы заставить ее игнорировать отсутствие полей. Проанализируем код формы консоли. Нам нужно найти процедуру загрузки дерева (обычно это ЗагрузитьСписокЗапросов или работа с ЗначениеИзФайла).
Найдем строку, на которую указывает ошибка (в нашем примере это строка 200):
НоваяСтрока.Запрос = СтрокаДерева.Запрос;
Обернем этот фрагмент в конструкцию Попытка...Исключение, чтобы загрузить хотя бы те данные, которые сохранились:
Попытка
НоваяСтрока.Запрос = СтрокаДерева.Запрос;
Исключение
// Возможно, в вашей консоли колонка называется иначе
Попытка
НоваяСтрока.Запрос = СтрокаДерева.ТекстЗапроса;
Исключение
ЗаписьЖурналаРегистрации("Восстановление", УровеньЖурналаРегистрации.Предупреждение, , , "Не удалось восстановить текст для строки: " + СтрокаДерева.ИмяЗапроса);
КонецПопытки;
КонецПопытки;
После такой модификации запустим консоль и попробуем открыть файл. Если дерево загрузится пустым, значит, данные в файле действительно затерты метаданными.
Если файл содержит 1000 и более строк, в нем гарантированно есть полезная информация. Выясним, в каком виде она там хранится. Используем текстовый редактор с поддержкой больших файлов (Notepad++ или VS Code).
Выполним поиск (Ctrl+F) по ключевому слову ВЫБРАТЬ или SELECT. Если поиск дает результаты, мы увидим конструкцию вида:
{"S","ВЫБРАТЬ
Спр.Ссылка
ИЗ
Справочник.Номенклатура КАК Спр"}
Важный момент: В формате 1С кавычки внутри строки удваиваются, а переносы строк сохраняются «как есть». Нам нужно аккуратно скопировать текст между {"S"," и закрывающими символами "}. Это и есть наши потерянные запросы. Если запросов много, проще восстановить структуру файла, создав в консоли новый файл с одним запросом и перенеся заголовок из нового файла в старый.
Рассмотрим продвинутый способ исправления файла. Если мы понимаем, что консоль «ругается» на заголовок, мы можем заменить его.
Тест.pattern.sel.pattern.sel и наш поврежденный файл в текстовом редакторе.{1, {8, и началом блока данных) на блок из файла pattern.sel.{ должна иметь закрывающую }. Используйте плагины для редакторов, подсвечивающие скобки, чтобы не нарушить структуру сериализации.Чтобы не попадать в ситуацию, когда «Долбанный документооборот» или упавшая консоль уничтожают плоды работы, внедрим следующие правила:
Во-первых, используйте консоли запросов, которые умеют сохранять дерево в формате XML или JSON. Эти форматы гораздо устойчивее к повреждениям и легче читаются обычными редакторами. Во-вторых, старайтесь не открывать рабочие списки запросов в сомнительных или недописанных обработках. В-третьих, если вы работаете в базе «1С:Документооборот» или любой другой крупной конфигурации, помните, что тексты запросов могут сохраняться в Журнале регистрации, если в консоли было включено логирование выполненных команд.
Таким образом, даже если файл кажется «битым» и заполненным непонятным набором символов, всегда остается шанс на спасение данных через временные файлы или ручной разбор структуры. Главное — не перезаписывать оригинальный поврежденный файл до завершения всех попыток восстановления.