Как восстановить список запросов из поврежденного файла .sel

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

В процессе разработки в экосистеме 1С программисты часто сталкиваются с ситуацией, когда наработанные месяцами списки запросов в консоли перестают открываться. Это случается из-за использования разных версий консолей (например, при попытке открыть файл «Универсальной консоли» в консоли из «Инструментов разработчика») или аварийного завершения сеанса. Рассмотрим подробно, как реанимировать данные из файла формата .sel и что делать, если привычный инструмент выдает ошибку.

Анализ структуры файла .sel и причин ошибки

Файл с расширением .sel не является зашифрованным бинарным файлом. По своей сути — это текстовый документ, содержащий результат сериализации объекта ДеревоЗначений или ТаблицаЗначений во внутренний формат 1С (аналог того, что выдает функция ЗначениеВСтрокуВнутр()).

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

В тексте файла мы можем увидеть блоки следующего вида:


{"#",e603c0f2-92fb-4d47-8f38-a44a381cf235,
{1,
{8,
{1,"ИмяЗапроса", {"Pattern", {"S"} }, "", 0},
...

Это описание метаданных таблицы. Если после этого блока вместо понятных текстов ВЫБРАТЬ... вы видите бесконечные списки GUID (типа {"#", ab011105-...}), значит, структура файла была серьезно нарушена, и колонка с текстом запроса превратилась в массив описаний типов. Однако даже в этом случае не стоит отчаиваться, пока мы не проверили временные папки.

Метод 1: Поиск резервных копий и временных файлов

Большинство продвинутых консолей запросов имеют механизм автосохранения. Прежде чем пытаться «лечить» поврежденный файл, нам необходимо проверить директории, куда 1С складывает временные данные сеанса. Рассмотрим пошагово, где искать:

  1. Перейдем в каталог локальных настроек пользователя 1С. Обычно он находится по пути: %LOCALAPPDATA%\1C\1cv8\.
  2. Внутри этой папки расположены каталоги с уникальными идентификаторами информационных баз. Проанализируем папки, измененные за последние сутки.
  3. Ищем папку ExtCompT или temp. Многие консоли (например, консоль из состава «Инструментов разработчика») сохраняют копии запросов в файлы с маской irQueryConsole_*.tmp или v8_*.tmp.
  4. Попробуем отсортировать файлы по дате изменения. Если мы нашли файл подходящего размера, создадим его копию и заменим расширение на .sel, после чего попробуем открыть его в «здоровой» консоли.

Метод 2: Программный обход ошибки загрузки

Если файл не открывается из-за ошибки Поле объекта не обнаружено, мы можем внести временные изменения в саму обработку консоли, чтобы заставить ее игнорировать отсутствие полей. Проанализируем код формы консоли. Нам нужно найти процедуру загрузки дерева (обычно это ЗагрузитьСписокЗапросов или работа с ЗначениеИзФайла).

Найдем строку, на которую указывает ошибка (в нашем примере это строка 200):

НоваяСтрока.Запрос = СтрокаДерева.Запрос;

Обернем этот фрагмент в конструкцию Попытка...Исключение, чтобы загрузить хотя бы те данные, которые сохранились:


Попытка
    НоваяСтрока.Запрос = СтрокаДерева.Запрос;
Исключение
    // Возможно, в вашей консоли колонка называется иначе
    Попытка
        НоваяСтрока.Запрос = СтрокаДерева.ТекстЗапроса; 
    Исключение
        ЗаписьЖурналаРегистрации("Восстановление", УровеньЖурналаРегистрации.Предупреждение, , , "Не удалось восстановить текст для строки: " + СтрокаДерева.ИмяЗапроса);
    КонецПопытки;
КонецПопытки;

После такой модификации запустим консоль и попробуем открыть файл. Если дерево загрузится пустым, значит, данные в файле действительно затерты метаданными.

Метод 3: Ручное извлечение текста запроса через текстовый редактор

Если файл содержит 1000 и более строк, в нем гарантированно есть полезная информация. Выясним, в каком виде она там хранится. Используем текстовый редактор с поддержкой больших файлов (Notepad++ или VS Code).

Выполним поиск (Ctrl+F) по ключевому слову ВЫБРАТЬ или SELECT. Если поиск дает результаты, мы увидим конструкцию вида:


{"S","ВЫБРАТЬ
    Спр.Ссылка
ИЗ
    Справочник.Номенклатура КАК Спр"}

Важный момент: В формате 1С кавычки внутри строки удваиваются, а переносы строк сохраняются «как есть». Нам нужно аккуратно скопировать текст между {"S"," и закрывающими символами "}. Это и есть наши потерянные запросы. Если запросов много, проще восстановить структуру файла, создав в консоли новый файл с одним запросом и перенеся заголовок из нового файла в старый.

Метод 4: Восстановление через восстановление структуры (Header Swap)

Рассмотрим продвинутый способ исправления файла. Если мы понимаем, что консоль «ругается» на заголовок, мы можем заменить его.

  1. Откроем рабочую консоль и создадим в ней «пустышку» — один запрос с именем Тест.
  2. Сохраним этот запрос в файл pattern.sel.
  3. Откроем pattern.sel и наш поврежденный файл в текстовом редакторе.
  4. Заменим блок описания колонок в поврежденном файле (всё, что находится между первым упоминанием {1, {8, и началом блока данных) на блок из файла pattern.sel.
  5. Внимание: Следите за парностью фигурных скобок. Каждая открывающая скобка { должна иметь закрывающую }. Используйте плагины для редакторов, подсвечивающие скобки, чтобы не нарушить структуру сериализации.

Профилактика потери данных в будущем

Чтобы не попадать в ситуацию, когда «Долбанный документооборот» или упавшая консоль уничтожают плоды работы, внедрим следующие правила:

Во-первых, используйте консоли запросов, которые умеют сохранять дерево в формате XML или JSON. Эти форматы гораздо устойчивее к повреждениям и легче читаются обычными редакторами. Во-вторых, старайтесь не открывать рабочие списки запросов в сомнительных или недописанных обработках. В-третьих, если вы работаете в базе «1С:Документооборот» или любой другой крупной конфигурации, помните, что тексты запросов могут сохраняться в Журнале регистрации, если в консоли было включено логирование выполненных команд.

Таким образом, даже если файл кажется «битым» и заполненным непонятным набором символов, всегда остается шанс на спасение данных через временные файлы или ручной разбор структуры. Главное — не перезаписывать оригинальный поврежденный файл до завершения всех попыток восстановления.

← На главную