Как добавить одинаковый реквизит в две базы 1С 7.7 для выполнения прямых SQL-запросов

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При работе с базами данных 1С:Предприятие 7.7 на SQL-версии разработчики часто сталкиваются с проблемой: при добавлении одного и того же реквизита в рабочую и тестовую базы конфигуратор присваивает им разные внутренние идентификаторы (например, SP12345 в одной базе и SP12350 в другой). Это делает невозможным использование одного и того же текста прямого SQL-запроса для обеих баз. Рассмотрим подробнее, как синхронизировать эти данные и упростить разработку прямых запросов.

Причина возникновения проблемы

В системе 1С 7.7 имена колонок в таблицах SQL формируются на основе внутренних счетчиков объектов, хранящихся в файле конфигурации 1cv7.md. Идентификатор состоит из префикса (например, SP для реквизитов справочников и документов) и порядкового номера в 36-ричной системе исчисления. Если базы развивались независимо или тестовая база была восстановлена из архива значительное время назад, счетчики объектов в них неизбежно разойдутся. Разберем основные стратегии решения этой задачи.

Способ 1: Синхронизация через загрузку конфигурации

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

  1. Добавим необходимый реквизит в основную (рабочую) базу через Конфигуратор.
  2. Сохраним изменения и позволим системе выполнить реструктуризацию таблиц SQL.
  3. Выгрузим файл конфигурации (1cv7.md).
  4. В тестовой базе выполним команду "Загрузить измененную конфигурацию" (а не объединение).

Важный нюанс: при полной загрузке MD-файла из другой базы вы должны быть уверены, что в тестовой базе нет своих уникальных доработок, которые отсутствуют в рабочей. Если конфигурации сильно различаются, этот метод приведет к потере изменений в тестовой базе.

Способ 2: Ручная правка идентификаторов через gcomp

Если нам нужно точечно изменить идентификатор конкретного реквизита, не затрагивая остальную часть конфигурации, проанализируем возможность использования инструментов для декомпиляции MD-файла, таких как gcomp. Рассмотрим последовательность действий:

  1. Распакуем файл 1cv7.md с помощью gcomp в текстовый формат.
  2. Найдем в текстовых файлах описание нашего реквизита.
  3. Вручную изменим его внутренний идентификатор (ID) на нужный (тот, который уже существует в другой базе).
  4. Соберем MD-файл обратно.
  5. После подмены MD-файла в каталоге базы данных необходимо вручную добавить соответствующую колонку в таблицу SQL через команду ALTER TABLE и обновить файл словаря 1cv7.dds.

Этот метод требует глубокого понимания структуры метаданных и осторожности, так как некорректная правка может привести к неработоспособности всей конфигурации.

Способ 3: Использование SQL-представлений (Views)

Наиболее элегантный и современный подход, позволяющий вообще не заботиться о том, какой идентификатор SPXXXXX присвоила система. Мы создадим в SQL виртуальную таблицу (View), где колонки будут иметь понятные человекочитаемые имена (например, "Артикул" вместо SP12345). Проанализируем пример кода на языке 1С 7.7, который автоматически генерирует такие представления для документов:


Функция СоздатьПредставление_Документ(МетаДок, фПересоздавать)
    ИмяДокумента = МетаДок.Идентификатор;
    ИмяТаблицы = МетаДанныеРабота.ИмяТаблицыШапки(ИмяДокумента);
    ИмяТаблицыТЧ = МетаДанныеРабота.ИмяТаблицыТабличнойЧасти(ИмяДокумента);
    
    сзРеквизиты = СоздатьОбъект("СписокЗначений");
    сзРеквизиты.ДобавитьЗначение("IDDoc");
    
    // Перебираем общие реквизиты
    Для н = 1 По Метаданные.ОбщийРеквизитДокумента() Цикл
        МетаРекв = Метаданные.ОбщийРеквизитДокумента(н);
        ИмяРекв = МетаРекв.Идентификатор;
        КолонкаРекв = "SP" + МетаДанныеРабота.ИДОбъекта(МетаРекв);
        сзРеквизиты.ДобавитьЗначение(КолонкаРекв + " " + ИмяРекв);
    КонецЦикла;

    // Реквизиты шапки
    Для н = 1 По МетаДок.РеквизитШапки() Цикл
        МетаРекв = МетаДок.РеквизитШапки(н);
        ИмяРекв = МетаРекв.Идентификатор;
        КолонкаРекв = "SP" + МетаДанныеРабота.ИДОбъекта(МетаРекв);
        сзРеквизиты.ДобавитьЗначение(КолонкаРекв + " " + ИмяРекв);
    КонецЦикла;

    стрРеквизиты = СписокВСтроку(сзРеквизиты, "," + РазделительСтрок);
    ИмяПредставления = "v_док_" + ИмяДокумента;
    ТекстЗапроса = "CREATE VIEW " + ИмяПредставления + " AS SELECT " + стрРеквизиты + " FROM " + ИмяТаблицы + " (NoLock)";
    
    // Выполнение SQL-команды через ADO или 1С++
    SQLСервис.Выполнить(ТекстЗапроса);
    Возврат 1;
КонецФункции

Преимущества этого метода:

Способ 4: Динамический парсинг метаимен (Метапарсер)

Если вы выполняете запросы из 1С 8.x к базе 7.7, вы можете реализовать алгоритм метапарсера. Суть заключается в том, чтобы перед отправкой запроса к SQL заменять "человеческие" имена в квадратных скобках на реальные имена колонок из файла 1cv7.dds или таблицы _1cschema (если используется компонента 1С++).

Рассмотрим, как это работает:

  1. Ваш запрос выглядит так: SELECT $Справочник.Товары.Цена FROM $Справочник.Товары.
  2. Программа-посредник считывает файл 1cv7.dds конкретной базы.
  3. Находит, что для Справочник.Товары таблица называется SC123, а для реквизита Цена колонка — SP456.
  4. Заменяет метаимена в тексте и отправляет в SQL реальный запрос: SELECT SP456 FROM SC123.

Для реализации этого в 1С 8.x можно использовать объект Соответствие, ключами которого будут полные метаимена 1С 7.7, а значениями — их SQL-эквиваленты, полученные при парсинге DDS-файла конкретной базы. Выясним причину, почему это надежнее: даже если вы добавите реквизит и он получит случайный ID, ваш парсер всегда найдет актуальное имя колонки при запуске.

Рекомендации по выбору решения

Если ваша задача разовая и базы практически идентичны — используйте Способ 1. Если вы планируете долгосрочную поддержку интеграции между 1С 8 и несколькими базами 1С 7.7, самым надежным решением будет создание SQL Views (Способ 3) или внедрение Метапарсера (Способ 4). Это избавит вас от необходимости вручную синхронизировать идентификаторы объектов при каждом изменении конфигурации.

← На главную