Прямые запросы к SQL серверу. Как то возникла ситуация, когда в справочник, с включенной проверкой на уникальность кода, из вне приходят элементы с такими же кодами. Отключать проверку нельзя. Пришлось делать затычку.
Подключение к SQL в общем то широко описано:
Код 1C v 8.х Функция Подключение(Сервер,БД)
cnn = Новый COMОбъект( "ADODB.Connection" ) ;
cnn. ConnectionTimeOut = 0 ;
cnn. CommandTimeOut = 0 ;
cnn. connectionString = "SERVER=" + Сервер+ "; Database=" + БД+ "; DRIVER=SQL Server; UID=sa; PWD=*****;" ;
cnn. Open( ) ;
if cnn. State( ) = 0 then
Сообщить( "Не удалось соединиться с сервером" ) ;
cnn = 0 ;
Возврат Ложь ;
endif;
cnn. Execute( "SET NOCOUNT ON" ) ;
Возврат cnn;
КонецФункции
Сервер и БД можно получить и программно, но муторно. Эти данные можно взять из свойств БД на сервере 1С.
Название таблицы и полей в SQL можно получить с помощью команды 1С:
Цитата Глобальный контекст
ПолучитьСтруктуруХраненияБазыДанных (GetDBStorageStructureInfo)
Синтаксис:
ПолучитьСтруктуруХраненияБазыДанных(<Объекты метаданных>, <Имена базы данных>)
Параметры:
<Объекты метаданных> (необязательный)
Тип: Массив. Массив имен объектов метаданных или массив объектов метаданных, для которых требуется получить структуру таблиц базы данных.
<Имена базы данных> (необязательный)
Тип: Булево. Определяет, в каких терминах выдается информация о структуре хранения.
Истина - в терминах СУБД
Ложь - в терминах SDBL.
Значение по умолчанию: Ложь
Возвращаемое значение:
Тип: ТаблицаЗначений. Возвращает таблицу значений с описаниями структуры таблиц, индексов и полей базы данных в терминах SDBL или используемой СУБД, в зависимости от значения параметра "Имена базы данных".
Если параметр не используется, то возвращаемая таблица значений содержит информацию о структуре таблиц базы данных всех объектов метаданных.
Таблица значений включает следующие колонки:
ИмяТаблицыХранения(StorageTableName) – имя таблицы SDBL или базы данных;
ИмяТаблицы(TableName) – имя таблицы в терминах языка запросов (для тех у кого оно есть);
Метаданные(Metadata) – полное имя объекта метаданных;
...
Дальше нам нужно новый элемент справочника все ж таки записать, ну например :
Код 1C v 8.х
Попытка
спр. Записать( ) ;
Исключение
Сообщить( "Не уникальный код " + стр. Код+ " у элемента " + стр. Наименование) ;
Спр. УстановитьНовыйКод( ) ;
Спр. Записать( ) ;
КонецПопытки ;
Все, делаем подмену.
Код 1C v 8.х подключение= Подключение( Сервер, База) ;
ТекстЗапроса= "UPDATE Номенклатура
|SET Номенклатура._Code=" + Формат( КодНужный, "ЧГ=0" ) + "
|FROM _Reference57 AS Номенклатура
|WHERE (CAST(Номенклатура._Folder AS int)=1)
|AND (Номенклатура._Code=" + Формат( Спр. Код, "ЧГ=0" ) + ")
|" ;
подключение. Execute( ТекстЗапроса) ;
Сообщить( "Код " + КодБыл+ " подменен на " + КодНужный) ;
Опубликовано на сайте: https://HelpF.pro Прямая ссылка: https://HelpF.pro/faq8/view/937.html