Через Com соединение запросом тяну данные из другой базы. Вместе с данными нужно вытянуть ГУИДы записей справочников.
Как это сделать? Можно ли это сделать?
Нужно для организации обмена данными по ГУИД.
GUID будет строкой, если нужно, его можно преобразовать в нормальный, через Новый УникальныйИдентификатор(GUIDСтрокой)
База источник - COM объект базы, к которой подключаетесь и в которой запрос создаете
Можно в Модуле внешнего соединения запросом выгрузить справочник в тз, добавить колонку ГУИД с типом строка, пройтись присвоить ГУИД и вернуть тз в базу приемник.
ЗУП.String(СтрокаТЗ.РодительСсылка); - выдает представление ссылки
ЗначениеВСтрокуВнутр(СтрокаТЗ.Ссылка); - выдает все одинаковые значения {"#",2319dcf1-f4ee-438d-b16f-6a145d6b9422}
ЗУП.String(СтрокаТЗ.Ссылка.УникальныйИдентификатор()); - вот это выдает то что нужно!!!
Если объекты требуется сравнивать по УИД, то иногда целесообразно добавить в объект реквизит GUID и в процедуре ПриЗаписи вносить в него УИД (только придется повторно вызывать запись и придумать флаг для защиты от зацикливания) или же в процедуре ПередЗаписью генерить новый GUID и его вносить в УИД.
Тогда можно и в запросе использовать. Но если задача разовая, то не стоит заморачиваться.
(23) задача не разовая, раз в час регламентное задание в БУХ тянет данные из ЗУП... БУХ нетиповая, обмен тоже нетривиальный....
переходим на ЗУП.3.1 - обмен приходится переписывать - из другой базы и немного другие источники данных...
вот заодно хочется перейти еще на на ГУИДы...
Тогда по-любому переходите. В вашем случае я бы выбрал вариант генерирования GUID'а перед записью объекта, т.е. генерите GUID и вносите его в УИД ссылки и в новый реквизит GUID.
извиняюсь за некропостинг, но такую задачу можно решить при помощи инструментов разработчика - если необходимо делать выборку, там есть кнопка в консоли запросов - "отображать идентификаторы" и заместо ссылок он будет выводить guid.
В языке запросов расширена поддержка значений следующих типов: УникальныйИдентификатор, ХранилищеЗначений.
Реализована возможность создания временных таблиц на основании таблиц значений, содержащих колонки вышеуказанных типов.
Реализована возможность использовать поля и выражения типа УникальныйИдентификатор в операции множественного В.
(31) Вполне возможно. Ставишь в параметрах консоли запросов галочку "Добавлять УИД" и рядом в выборке рядом с колонкой ссылочного типа появляется колонка с УИД.
В версии платформы 1С 8.3.22 в язык запросов (и в язык выражений СКД) доблена функция УникальныйИдентификатор(Ссылка). Функция возвращает уникальный идентификатор переданной ссылки (или NULL, если передано значение NULL). Параметр Ссылка это выражение, результатом которого является ссылка (за исключением ссылок на таблицы внешних источников данных).
Получение Уникального ИДентификатора от ссылки в запросе в 1С 8.3:
&НаСервере
Процедура УИДвЗапросе(ТЗ_МатериалыНаСкладе) // Таблица значений
// Создание выборки
Запрос = Новый Запрос("ВЫБРАТЬ
| ТЗ_МатериалыНаСкладе.Наименование КАК НаименованиеEn,
| ТЗ_МатериалыНаСкладе.УникальныйИдентификатор КАК УникальныйИдентификатор
|ПОМЕСТИТЬ ВТ_МатериалыНаСкладе
|ИЗ
| &ТЗ_МатериалыНаСкладе КАК ТЗ_МатериалыНаСкладе
|;
|
|ВЫБРАТЬ
| Материалы.Код КАК Код,
| Материалы.Наименование КАК Наименование,
| ВТ_МатериалыНаСкладе.НаименованиеEn КАК НаименованиеEn
|ИЗ
| Справочник.Материалы КАК Материалы
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_МатериалыНаСкладе КАК ВТ_МатериалыНаСкладе
| ПО УникальныйИдентификатор(Материалы.Ссылка) = ВТ_МатериалыНаСкладе.УникальныйИдентификатор");
Запрос.УстановитьПараметр("ТЗ_МатериалыНаСкладе ", ТЗ_МатериалыНаСкладе);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда // Такая проверка рекомендуется фирмой 1С
Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
Иначе // Сообщить("Данные отсутствуют!");
КонецЕсли;
КонецПроцедуры
(36) Пример запроса не однозначный. в Качестве параметра в запрос передаётся таблица значений. А что в ней? Колонки "Наименование" и "УникальныйИдентификатор"? т.е. ТЗ подготовлена и содержит UID? В каком виде, "Строка"?
Какой тип значения возвращает УникальныйИдентификатор(Материалы.Ссылка) ?
(36) Недавно тоже посмотрел последнее обновление 22 платформы, и действительно там есть такая функция в запросе, которая как раз возвращает УникальныйИдентификатор(Объект.Ссылка). Это ни много сократит написание кода. По факту в теле запроса с помощью этой функции, на стороне 1С происходит преобразование ссылки в УникальныйИдентификатор и обратно. 1С идет вперед - это радует, облегчает жизнь :)
ЗапросСОМ.Текст = "ВЫБРАТЬ
| Сотрудники.Код КАК ТабНом,
| Сотрудники.Ссылка КАК СотрудникиСсылка
|ИЗ
| Справочник.СотрудникиОрганизаций КАК Сотрудники
|ГДЕ Не Сотрудники.ЭтоГруппа";
Результат = ЗапросСОМ.Выполнить().Выгрузить();
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("СотрудникиФИО",Новый ОписаниеТипов("Строка"));
ТЗ.Колонки.Добавить("ТабНом",Новый ОписаниеТипов("Строка"));
ТЗ.Колонки.Добавить("УИДСотр", Новый ОписаниеТипов("Строка"));
Для каждого СтрокаРез Из Результат Цикл
СтрокаТЗ = ТЗ.Добавить();
СтрокаТЗ.СотрудникиФИО = СтрокаРез.СотрудникиСсылка.Наименование;
СтрокаТЗ.ТабНом = СокрЛП(СтрокаРез.ТабНом);
//вот ключевой момент
СтрокаТЗ.УИДСотр = V82.XMLString(СтрокаРез.СотрудникиСсылка.УникальныйИдентификатор());