При работе с базами данных 1С:Предприятие 7.7 на SQL-версии разработчики часто сталкиваются с проблемой: при добавлении одного и того же реквизита в рабочую и тестовую базы конфигуратор присваивает им разные внутренние идентификаторы (например, SP12345 в одной базе и SP12350 в другой). Это делает невозможным использование одного и того же текста прямого SQL-запроса для обеих баз. Рассмотрим подробнее, как синхронизировать эти данные и упростить разработку прямых запросов.
В системе 1С 7.7 имена колонок в таблицах SQL формируются на основе внутренних счетчиков объектов, хранящихся в файле конфигурации 1cv7.md. Идентификатор состоит из префикса (например, SP для реквизитов справочников и документов) и порядкового номера в 36-ричной системе исчисления. Если базы развивались независимо или тестовая база была восстановлена из архива значительное время назад, счетчики объектов в них неизбежно разойдутся. Разберем основные стратегии решения этой задачи.
Самый простой и штатный метод — обеспечить полную идентичность файлов конфигурации. Если базы изначально были идентичны, выполним следующие действия:
1cv7.md).Важный нюанс: при полной загрузке MD-файла из другой базы вы должны быть уверены, что в тестовой базе нет своих уникальных доработок, которые отсутствуют в рабочей. Если конфигурации сильно различаются, этот метод приведет к потере изменений в тестовой базе.
Если нам нужно точечно изменить идентификатор конкретного реквизита, не затрагивая остальную часть конфигурации, проанализируем возможность использования инструментов для декомпиляции MD-файла, таких как gcomp. Рассмотрим последовательность действий:
1cv7.md с помощью gcomp в текстовый формат.ALTER TABLE и обновить файл словаря 1cv7.dds.Этот метод требует глубокого понимания структуры метаданных и осторожности, так как некорректная правка может привести к неработоспособности всей конфигурации.
Наиболее элегантный и современный подход, позволяющий вообще не заботиться о том, какой идентификатор SPXXXXX присвоила система. Мы создадим в SQL виртуальную таблицу (View), где колонки будут иметь понятные человекочитаемые имена (например, "Артикул" вместо SP12345). Проанализируем пример кода на языке 1С 7.7, который автоматически генерирует такие представления для документов:
Функция СоздатьПредставление_Документ(МетаДок, фПересоздавать)
ИмяДокумента = МетаДок.Идентификатор;
ИмяТаблицы = МетаДанныеРабота.ИмяТаблицыШапки(ИмяДокумента);
ИмяТаблицыТЧ = МетаДанныеРабота.ИмяТаблицыТабличнойЧасти(ИмяДокумента);
сзРеквизиты = СоздатьОбъект("СписокЗначений");
сзРеквизиты.ДобавитьЗначение("IDDoc");
// Перебираем общие реквизиты
Для н = 1 По Метаданные.ОбщийРеквизитДокумента() Цикл
МетаРекв = Метаданные.ОбщийРеквизитДокумента(н);
ИмяРекв = МетаРекв.Идентификатор;
КолонкаРекв = "SP" + МетаДанныеРабота.ИДОбъекта(МетаРекв);
сзРеквизиты.ДобавитьЗначение(КолонкаРекв + " " + ИмяРекв);
КонецЦикла;
// Реквизиты шапки
Для н = 1 По МетаДок.РеквизитШапки() Цикл
МетаРекв = МетаДок.РеквизитШапки(н);
ИмяРекв = МетаРекв.Идентификатор;
КолонкаРекв = "SP" + МетаДанныеРабота.ИДОбъекта(МетаРекв);
сзРеквизиты.ДобавитьЗначение(КолонкаРекв + " " + ИмяРекв);
КонецЦикла;
стрРеквизиты = СписокВСтроку(сзРеквизиты, "," + РазделительСтрок);
ИмяПредставления = "v_док_" + ИмяДокумента;
ТекстЗапроса = "CREATE VIEW " + ИмяПредставления + " AS SELECT " + стрРеквизиты + " FROM " + ИмяТаблицы + " (NoLock)";
// Выполнение SQL-команды через ADO или 1С++
SQLСервис.Выполнить(ТекстЗапроса);
Возврат 1;
КонецФункции
Преимущества этого метода:
SELECT Артикул FROM v_Номенклатура.Если вы выполняете запросы из 1С 8.x к базе 7.7, вы можете реализовать алгоритм метапарсера. Суть заключается в том, чтобы перед отправкой запроса к SQL заменять "человеческие" имена в квадратных скобках на реальные имена колонок из файла 1cv7.dds или таблицы _1cschema (если используется компонента 1С++).
Рассмотрим, как это работает:
SELECT $Справочник.Товары.Цена FROM $Справочник.Товары.1cv7.dds конкретной базы.Справочник.Товары таблица называется SC123, а для реквизита Цена колонка — SP456.SELECT SP456 FROM SC123.Для реализации этого в 1С 8.x можно использовать объект Соответствие, ключами которого будут полные метаимена 1С 7.7, а значениями — их SQL-эквиваленты, полученные при парсинге DDS-файла конкретной базы. Выясним причину, почему это надежнее: даже если вы добавите реквизит и он получит случайный ID, ваш парсер всегда найдет актуальное имя колонки при запуске.
Если ваша задача разовая и базы практически идентичны — используйте Способ 1. Если вы планируете долгосрочную поддержку интеграции между 1С 8 и несколькими базами 1С 7.7, самым надежным решением будет создание SQL Views (Способ 3) или внедрение Метапарсера (Способ 4). Это избавит вас от необходимости вручную синхронизировать идентификаторы объектов при каждом изменении конфигурации.