Добрый день всем. Прошу помощи. Не пойму. Есть запрос (большой, но рабочий :) По результату запроса получаю следюущие поля: Сотрудник - Табельный номер - Код Физ.лица. Табельный номер - это код справочника Сотрудники ЗУП. Код Физ.лица - это код справочника Физические лица ЗУП. Запросом я получаю связь Физ.лица и Сотрудника. Мне надо по коду Физ.лица найти сотрудника.
К выборке применяю метод НайтиСледующий и вот для таб.номера он работает отлично, а для кода - выборочно (из 500 находит всегда определенные 14). Причем в другой базе все работает нормально (но там другая организация и другие нормальные коды ТН и физ.лица). Что может быть не так? Может что-то с типом там надо еще покртить.. Не пойму ((
ВыборкаСотрудники = РезультатЗапроса.Выбрать();
ОтборКод = новый Структура("КодФизЛица");
ОтборКод.КодФизЛица = ТекущаяСтрока[2];
//получаю код физ.лица из таб.документа, по которому нужно найти сотрудника). Отладкой смотрю, да, получает номер нужный
Если ВыборкаСотрудники.НайтиСледующий(ОтборКод) Цикл
Сотрудник = ВыборкаСотрудники.Сотрудник;
КонецЦикла;
ВыборкаСотрудники.Сбросить();
Показать
Вариант с циклом Пока и подстановкой ВыборкаСотрудники.Сбросить(); перед циклом тоже уже пробовала. Не помогает.
(2) код работает для 14ти штук и на другой базе, поэтому дело не в этом. Весь код сюда копировать достаточно сложно, т.к. это обработка, которая берет код физ.лица из табличного документа, ищет в запросе по коду физ.лица сотрудника и подставляет этого сотрудника в документ начисления выплаты...
(9) я написала обработку иначе через перебор конкретных записей в запросе (ограничила запрос по кодам), поэтому проблема у меня не в том, что мне нужно срочно решение.
Меня просто бесит, что я не понимаю почему так выборочно работает метод НайтиСледующий с кодом физ.лица из выборки.. Я уже увидела, что если отсортировать по коду физ.лица, то по коду берутся 11 человек с кодом типа 00-0000000 все, кто есть в таблице для загрузки и я бы поняла, что почему-то код воспринимает для поиска только такие коды физ.лиц (это первые по результатам запроса). Но, среди загруженных 14 человек есть 3 с кодами типа 0000000000 и 00-000000. Причем они не по порядку идут. Первые 11 по порядку, а дальше 3 откуда попало.. А табельные номера там вообще черти что с видами, но вот их код воспринимает все абсолютно без разбора.. Смотрю структуру, в структуру записывается код физ.лица строкой (для всех), как и для табельного номера. По идее со структурой не должно быть ошибки, но где-то она все-таки есть
Вы не привели код, вы не пример воспроизведения проблемы. Значит вам вообще не нужно решение.
Или по описанию того что вы делаете вы ожидаете что кто-то скажет, где в коде (которого никто не видел) ошибка? Серьезно?
Смоделируйте ситуацию на минимальном размере данных. Сделайте самодостаточную внешнюю обработку, которая откроется в любой конфигурации, которая демонстрирует проблему.
Тогда будет шанс получить реальную помощь в решении проблемы.
(4) Не вижу сложностей от слова совсем. По коду физлица найти Физлицо не сложно, лишь бы коды физлиц были уникальными .
А как по физлицу ищете сотрудника? Ведь у физлица может быть несколько сотрудников. По каким критериям выбираете?
ФизлицоСсылка это реквизит СотрудникСсылка. Если речь про ЗУП, или БП, или ERP, конечно.
Я писал тьму запросов, в т.ч. и поиск сотрудника всякими вариантами (для загрузки из эксель и т.д. и т.п.).
Странно, что ищете его через регистр состояний. И не через "Кадровую историю". Причем, если это ЗУП, то почему "ДАнные состояний сотрудников", а не через "Состояния сотрудников" ? Последний - интервальный, они на порядок удобнее.
А еще лучше в "Кадровая история сотрудников интервальный".
(18) Спасибо. Попробую и ваш запрос. Но вопрос не в том, что не находит сотрудника по коду физ.лица. Я писала, что в целом запрос работает, да все записи получаются уникальными (повторов нет). Вопрос мой был в том, что при одном и том же запросе, где в результате я получаю таблицу с уникальными значениями Сотрудник (ссылка) - Код сотрудника (табельный номер) - Код физлица сотрудника (Код Физ.лица) при использовании метода НайтиСледующий(Структура) этот метод абсолютно замечательно работает с табельным номером и очень странно выборочно на одной базе работает с кодами физ.лиц.
Обработка для ЗУП следующего вида. Открываю, копирую в табличный документ (поле формы и реквизит обработки) данные и иду по этим данным перебирая коды физлиц и в выборке ищу нужного сотрудника, которого далее кодом подставляю в документ начисления.
И у меня ощущение, что что-то именно вот в этот момент. Почему-то табельные номера для поиска из табличного документа воспринимаются обработкой нормально, а вот коды физ.лиц (опять же повторюсь именно в одной базе, где они разнообразные по виду) подбираются только всегда определенные 14 (по которым стойкую логику почему именно они я пока не нашла).
То есть, для метода НайтиСледующий важно что-то в типе или виде значения из структуры для поиска. Буду искать дальше.
(2) Вот сам запрос, параметры и начало со структурой
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РазовоеНачисление.Ссылка КАК Документ,
| РазовоеНачисление.Дата КАК Дата,
| РазовоеНачисление.МесяцНачисления КАК МесяцНачисления,
| РазовоеНачисление.Организация КАК Организация,
| РазовоеНачисление.ДатаОкончания КАК ДатаОкончания
|ПОМЕСТИТЬ ВТ_ДанныеДокумента
|ИЗ
| Документ.РазовоеНачисление КАК РазовоеНачисление
|ГДЕ
| РазовоеНачисление.Ссылка = &ДокументНачисления
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ДанныеСостоянийСотрудников.Сотрудник.Наименование КАК ФИОСотрудника,
| ДанныеСостоянийСотрудников.Сотрудник.Код КАК ТабельныйНомер,
| ДанныеСостоянийСотрудников.Сотрудник.ФизическоеЛицо.Код КАК КодФизЛица,
| ДанныеСостоянийСотрудников.Сотрудник.ГоловнаяОрганизация КАК ОрганизацияСотрудника,
| ДанныеСостоянийСотрудников.Состояние КАК Состояние,
| ДанныеСостоянийСотрудников.Начало КАК Начало,
| ДанныеСостоянийСотрудников.Сотрудник.Ссылка КАК Сотрудник
|ПОМЕСТИТЬ ВТ_СостояниеСотрудника
|ИЗ
| РегистрСведений.ДанныеСостоянийСотрудников КАК ДанныеСостоянийСотрудников
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| МАКСИМУМ(ВТ_СостояниеСотрудника.Начало) КАК ПоследняяЗапись,
| ВТ_СостояниеСотрудника.Сотрудник КАК Сотрудник
|ПОМЕСТИТЬ ВТ_ПоследняяЗапись
|ИЗ
| ВТ_СостояниеСотрудника КАК ВТ_СостояниеСотрудника
|
|СГРУППИРОВАТЬ ПО
| ВТ_СостояниеСотрудника.Сотрудник
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_СостояниеСотрудника.ФИОСотрудника КАК ФИОСотрудника,
| ВТ_СостояниеСотрудника.ТабельныйНомер КАК ТабельныйНомер,
| ВТ_СостояниеСотрудника.КодФизЛица КАК КодФизЛица,
| ВТ_СостояниеСотрудника.ОрганизацияСотрудника КАК ОрганизацияСотрудника,
| ВТ_СостояниеСотрудника.Состояние КАК Состояние,
| ВТ_СостояниеСотрудника.Сотрудник КАК Сотрудник
|ПОМЕСТИТЬ ВТ_Сотрудник
|ИЗ
| ВТ_СостояниеСотрудника КАК ВТ_СостояниеСотрудника
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПоследняяЗапись КАК ВТ_ПоследняяЗапись
| ПО (ВТ_ПоследняяЗапись.ПоследняяЗапись = ВТ_СостояниеСотрудника.Начало)
| И (ВТ_ПоследняяЗапись.Сотрудник = ВТ_СостояниеСотрудника.Сотрудник)
|ГДЕ
| ВТ_СостояниеСотрудника.Состояние <> &Состояние
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВТ_Сотрудник.Сотрудник КАК Сотрудник,
| ВТ_Сотрудник.КодФизЛица КАК КодФизЛица,
| ВТ_Сотрудник.ТабельныйНомер КАК ТабельныйНомер
|ИЗ
| ВТ_ДанныеДокумента КАК ВТ_ДанныеДокумента
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Сотрудник КАК ВТ_Сотрудник
| ПО ВТ_ДанныеДокумента.Организация = ВТ_Сотрудник.ОрганизацияСотрудника";
(3) я тоже склоняюсь, что вопрос где-то в самих кодах, т.к. в той базе, где все ок работает они все одинаковые и красивые. А в базе где нужно, чтобы работало там одни коды с префиксом с буквами, вторые с префиксом с цифрами, третьи вообще без префиксов... НО! и табельные номера в этой базе тоже имеют разный вид, однако с ними метод НайтиСледующий работает отлично.
Я уже пробовала и метод со структурой внутри и метод этот с поиском значения и по колонке.. И для варианта со значением и колонкой указано, что это значение может быть любым - Произвольным.. Однако, что-то не то..
(1) Тут наверное описка, должно быть не Если, а Пока
Пока ВыборкаСотрудники.НайтиСледующий(ОтборКод) Цикл
Сотрудник = ВыборкаСотрудники.Сотрудник;
КонецЦикла;
Рекомендую выгрузить выборку в ТЗ и поискать там, может проблема в данных.
Если с ТЗ будет работать, а с поиском нет, тогда надо разбираться. Но если в ТЗ не будет работать, что то не то в данных или в коде.
Я сделала в целом обработку и этот код по-другому через перебор выборки, но хотелось бы понять на будущее и вообще почему метод НайтиСледующий может не работать. Анализировала данные по этим 14ти, которые всегда подбираются. У них разные виды кода (конкретно два вида: одни с префиксом 00-, одни без префикса), нет какого-то порядка (типа первые 14 или что-то еще такое), не могу у этих 14 найти какие-то отличительные характеристики, чтобы понять почему именно они ))
У них разные виды кода (конкретно два вида: одни с префиксом 00-, одни без префикса), нет какого-то порядка (типа первые 14 или что-то еще такое),
в таб документа должен быть такое же упорядочивание по коду как в выборке. Я Вам советовал сделать сортировку результата запроса а про таб часть не написал. ее тоже отсоритруйте таким же способом.
(16) Не тут все норм. Я из документа беру только организацию, чтобы нужных сотрудников от физ.лиц отобрать. Если сам запрос в консоль закинуть, то он мне чисто всех моих сотрудников выдает, кто на текущий момент не уволен.
(24) О!. Вот проблема может быть где-то в этой области. Т.к. табельные номера, когда упорядочиваю по возрастанию, там все прекрасно учитывается и сортируется, а вот с кодами физ.лиц у меня тоже какая-то ерунда. Сортируется как бы по какому-то третьему знаку справа или как.. я даже хз.. Что с этим делать. В выборку то они все попадают, но вот возможно из-за этой какой-то особенности метод НайтиСледующий их и не видит. Первая колонка тут если что это таб.номер и сортировка не по нему, а вот вторая колонка - код физ.лица и сотрировка запроса сейчас как раз по нему..
(26)Покажите результат запроса, в котором выполняется поиск, и код, который в нем не находится.
От сортировки поиск не зависит, т.к. вы перед поиском сбрасываете выборку, а значит поиск происходит по всей выборке.
Я же не многого прошу - просто покажите пример, когда не работает.
ГДЕ
| ВТ_Сотрудник.Состояние <> &Состояние
| И ВТ_Сотрудник.Состояние В (&Код)
|УПОРЯДОЧИТЬ ПО
| ВТ_Сотрудник.КодФизЛица";
ПерваяСтрока = Объект.ПерваяСтрока;
МассивКод = Новый Массив;
Для К = ПерваяСтрока по Объект.ДанныеЛиста.ВысотаТаблицы Цикл
АдресР= "R"+К;
КодВМассив= СокрЛП(Объект.ДанныеЛиста.Область(АдресР+"C2").Текст);
МассивКод.Добавить(КодВМассив);
КонецЦикла;
Запрос.УстановитьПараметр("ДокументНачисления", Объект.ДокументЗагрузки.Ссылка);
Запрос.УстановитьПараметр("Состояние", Перечисления.СостоянияСотрудника.Увольнение);
Запрос.УстановитьПараметр("Код", МассивКод);
Показать
Вот переделала запрос, чтобы в его выборку попали только два сотрудника тестовых (один попадет, другой - нет)
Часть кода с отбором кода и подбором в выборке физ.лица
ОтборКод.КодФизЛица = ТекущаяСтрока[2];
Если ВыборкаСотрудники.НайтиСледующий(ОтборКод) Тогда
Сотрудник = ВыборкаСотрудники.Сотрудник;
КонецЕсли;
ВыборкаСотрудники.Сбросить();
(35) и вот смотрела же.. и куда смотрела. Да, добавила в запрос СокрЛП и все ок. Спасибо большое. Видимо уже вообще так с этой задачей взгляд замылился, что очевидного не увидела ((
(24) Вот только консоль дает ровно тот результат, который вы получите сделав запрос встроенным языком 1С
а значит ваша "правильная" сортировка только запутает разработчика
SEL ECT Code
FR OM (SELECT
'00-0001' AS Code
UNI ON SELECT
'00-0002'
UNI ON SEL ECT
'00-0003'
UNI ON SEL ECT
'0000001'
UNI ON SEL ECT
'0000002'
UNI ON SEL ECT
'0000011'
UNI ON SEL ECT
'0000012'
UNI ON SEL ECT
'0000021'
UNION SEL ECT
'0000022') AS T1 ORDER BY Code
но вы и дальше можете думать что ваш случай (файловая база?) единственный верный
Поменяйте табельные номера между собой у двух сотрудников, один из них чтобы был из попадающих в выборку, второй не попадающий. Посмотрите скажется это на результате?
Если ВыборкаСотрудники.НайтиСледующий(ОтборКод) Цикл
Сотрудник = ВыборкаСотрудники.Сотрудник;
Иначе
ставите точку останова
смотрите, что у Вас в
ОтборКод.КодФизЛица
выгружаете результат и смотрите есть ли там эта строка
РезультатЗапроса.Выгрузить()
если в таблице есть такой код - значить сравните строку выгруженного результата с ОтборКод.КодФизЛица
если там покажет ложь - значить у Вас в коде физлица есть некий символ, которого визуально не видно (непрерывный пробел, G2 или еще какая-то муть)
можете даже скопировать и вставить в notepad++ и посмотрите из чего реально состоит код физ лица
еще проверьте свои кода физ лиц на недопустимые симолы... что в справочнике, что в том от куда Вы берете данные для отбора