Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
28 мар 2024, 19:50

"ПОДОБНО" в условие связи запроса

Автор Станиславъ Зверевъ, 11 мая 2016, 14:02

0 Пользователей и 1 гость просматривают эту тему.

Станиславъ Зверевъ

Всем привет! Уже второй день не могу разобраться с тем, почему внешняя таблица значений не связываются по условию ПОДОБНО с виртуальной, хотя при аналогичном запросе в консоли всё отрабатывается правильно. Все нужные записи по регистру находятся, если посмотреть через полное соединение, но нет именно самой связи. Прилагаю ниже код. Кто сможет помочь?

        ТЗЗапрос = ТЗДоки.Скопировать();
        Для Каждого СтрокаТЗЗапрос ИЗ ТЗЗапрос Цикл
СтрокаТЗЗапрос.Сотрудник = "%" + СокрЛП(СтрокаТЗЗапрос.Сотрудник) + "%";
СтрокаТЗЗапрос.СотрудникКод = "%" + СокрЛП(СтрокаТЗЗапрос.СотрудникКод) + "%";
КонецЦикла;

Запрос.УстановитьПараметр("ДатаК", КонецМесяца(НачПериода));
Запрос.УстановитьПараметр("ТаблицаЗначений", ТЗЗапрос);

Запрос.Текст =
"ВЫБРАТЬ
| ВЫРАЗИТЬ(ТЗ.Сотрудник КАК СТРОКА(100)) КАК СотрудникНаименование,
| ВЫРАЗИТЬ(ТЗ.СотрудникКод КАК СТРОКА(11)) КАК СотрудникКод,
| ТЗ.ОтработаноДней,
| ТЗ.ОтработаноЧасов,
| ТЗ.ОплаченоДнейЧасов,
| ТЗ.НормаДней,
| ТЗ.НормаЧасов,
| ТЗ.СуммаТП8,
| ТЗ.ВидЗарплаты
|ПОМЕСТИТЬ ВТ_ТЗ
|ИЗ
| &ТаблицаЗначений КАК ТЗ
|ГДЕ
| ТЗ.Загрузить = ИСТИНА
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВЫБОР
| КОГДА РаботникиОрганизацийСрезПоследних.ПериодЗавершения <= &ДатаК
| И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА РаботникиОрганизацийСрезПоследних.ПериодЗавершения
| ИНАЧЕ РаботникиОрганизацийСрезПоследних.Период
| КОНЕЦ КАК Период,
| ВЫБОР
| КОГДА РаботникиОрганизацийСрезПоследних.ПериодЗавершения <= &ДатаК
| И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА РаботникиОрганизацийСрезПоследних.ДолжностьЗавершения
| ИНАЧЕ РаботникиОрганизацийСрезПоследних.Должность
| КОНЕЦ КАК Должность,
| ВЫБОР
| КОГДА РаботникиОрганизацийСрезПоследних.ПериодЗавершения <= &ДатаК
| И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизацииЗавершения
| ИНАЧЕ РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации
| КОНЕЦ КАК ПодразделениеОрганизации,
| ВЫБОР
| КОГДА РаботникиОрганизацийСрезПоследних.ПериодЗавершения <= &ДатаК
| И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостоянияЗавершения
| ИНАЧЕ РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния
| КОНЕЦ КАК ПричинаИзмененияСостояния,
| РаботникиОрганизацийСрезПоследних.Сотрудник.Наименование КАК СотрудникНаименование,
| РаботникиОрганизацийСрезПоследних.Сотрудник.Код КАК СотрудникКод,
| РаботникиОрганизацийСрезПоследних.Сотрудник
|ПОМЕСТИТЬ ВТ_РаботникиОрганизации
|ИЗ
| РегистрСведений.РаботникиОрганизаций.СрезПоследних(&ДатаК, ) КАК РаботникиОрганизацийСрезПоследних
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_РаботникиОрганизации.Период,
| ВТ_РаботникиОрганизации.Должность,
| ВТ_РаботникиОрганизации.ПричинаИзмененияСостояния,
| ВТ_РаботникиОрганизации.ПодразделениеОрганизации,
| ВТ_ТЗ.ОтработаноДней,
| ВТ_ТЗ.ОтработаноЧасов,
| ВТ_ТЗ.ОплаченоДнейЧасов,
| ВТ_ТЗ.НормаДней,
| ВТ_ТЗ.НормаЧасов,
| ВТ_ТЗ.СуммаТП8 КАК Результат,
| ВЫБОР
| КОГДА НЕ ВТ_РаботникиОрганизации.Сотрудник ЕСТЬ NULL
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК СотрудникНайден,
| ВТ_ТЗ.ВидЗарплаты,
| ЕСТЬNULL(ВТ_РаботникиОрганизации.Сотрудник, ВТ_ТЗ.СотрудникНаименование) КАК Сотрудник
|ИЗ
| ВТ_ТЗ КАК ВТ_ТЗ
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_РаботникиОрганизации КАК ВТ_РаботникиОрганизации
| ПО (ВТ_РаботникиОрганизации.СотрудникНаименование ПОДОБНО ВТ_ТЗ.СотрудникНаименование)
| И (ВТ_РаботникиОрганизации.СотрудникКод ПОДОБНО ВТ_ТЗ.СотрудникКод)";

ВыборкаСотрудники = Запрос.Выполнить().Выбрать();



vitasw

Какие длины строк у ТЗ перед помещением в запрос?

Станиславъ Зверевъ

vitasw, 100 и 11 соответственно. Уже проверил, что все символы помещаются.

LexaK

а зачем вы по Подобно что-то связываете?
у вас же есть Сотрудник это ссылочный элемент!!!
делайте однозначную связь по ссылке! и у вас все отлично получится! 
если помогло нажмите: Спасибо!

Станиславъ Зверевъ

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

vitasw

Цитата: Станиславъ Зверевъ от 11 мая 2016, 14:22100 и 11 соответственно. Уже проверил, что все символы помещаются.

т.е. у вас в источнике наименование=98 символов, а код - 9 символов?

Станиславъ Зверевъ

vitasw, код - 9, а наименование 100. С наименованием тоже может быть проблема (лучше сделать 102, верно), но не в этом случае, так как пока строки больше 40 символов не попадались.

vitasw

1. Советую убрать "Выразить ... как строка" в запросе
2. Если у вас при создании ТЗ жестко задается длина строки - тоже уберите.

LexaK

вообще по подобно так ссылки искать не очень хорошо
например у вас ТЗ код = "103"
при вашем подобно
Спр.Код Подобно "%103%"

будут найдены и
"...1103..."
"...103"
"...1031..."
и т.д.

если у вас может быть / не быть префикса еще надо учитывать лидирующие нули
например код
"ПР01-0000103"
"ПР01-0001103"


в этом случае что бы найти Код="103"
необходима такая конструкция в запросе

Спр.Код Подобно "%[^1-9][^1-9][^1-9]" + СтрокТЗ.СотрудникКод

многое конечно зависит от ваших реальных данных, которые мы не видим, возможна куча вариантов для решения, такой задачи.
в общем без программиста вам не обойтись :fdbsdfbsd:   

если помогло нажмите: Спасибо!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск