Добрый день всем. Прошу помощи. Не пойму. Есть запрос (большой, но рабочий :) По результату запроса получаю следюущие поля: Сотрудник - Табельный номер - Код Физ.лица. Табельный номер - это код справочника Сотрудники ЗУП. Код Физ.лица - это код справочника Физические лица ЗУП. Запросом я получаю связь Физ.лица и Сотрудника. Мне надо по коду Физ.лица найти сотрудника.

К выборке применяю метод НайтиСледующий и вот для таб.номера он работает отлично, а для кода - выборочно (из 500 находит всегда определенные 14). Причем в другой базе все работает нормально (но там другая организация и другие нормальные коды ТН и физ.лица). Что может быть не так? Может что-то с типом там надо еще покртить.. Не пойму ((

```1c
    ВыборкаСотрудники = РезультатЗапроса.Выбрать();
    ОтборКод = новый Структура("КодФизЛица");

    ОтборКод.КодФизЛица = ТекущаяСтрока[2];
    //получаю код физ.лица из таб.документа, по которому нужно найти сотрудника). Отладкой смотрю, да, получает номер нужный

    Если ВыборкаСотрудники.НайтиСледующий(ОтборКод) Цикл
    Сотрудник = ВыборкаСотрудники.Сотрудник;
    КонецЦикла;
    ВыборкаСотрудники.Сбросить();
```

Вариант с циклом Пока и подстановкой ВыборкаСотрудники.Сбросить(); перед циклом тоже уже пробовала. Не помогает.
---
В данном случае ответ прост - коды отличаются - см.скрин.
В выборке есть пробел в конце, из-за этого не находит.

Добавьте для поля КодФизлица в запрос СокрЛП - с 8.3.20 платформа это позволяет. Должно помочь в данном случае.
https://wonderland.v8.1c.ru/blog/novye-funktsii-yazyka-zaprosov-i-sistemy-komponovki-dannykh/?sphrase_id=649009

Ну либо убрать тут:
КодВМассив= СокрЛП(Объект.ДанныеЛиста.Область(АдресР+"C2").Текст);

Третий способ - перезаписать коды в справочнике, обрезав пробелы в конце.
---
Полный код покажите.
---
код работает для 14ти штук и на другой базе, поэтому дело не в этом. Весь код сюда копировать достаточно сложно, т.к. это обработка, которая берет код физ.лица из табличного документа, ищет в запросе по коду физ.лица сотрудника и подставляет этого сотрудника в документ начисления выплаты...
---
Выгрузите в таблицу и ищите в таблице.
---
я написала обработку иначе через перебор конкретных записей в запросе (ограничила запрос по кодам), поэтому проблема у меня не в том, что мне нужно срочно решение.

Меня просто бесит, что я не понимаю почему так выборочно работает метод НайтиСледующий с кодом физ.лица из выборки.. Я уже увидела, что если отсортировать по коду физ.лица, то по коду берутся 11 человек с кодом типа 00-0000000 все, кто есть в таблице для загрузки и я бы поняла, что почему-то код воспринимает для поиска только такие коды физ.лиц (это первые по результатам запроса). Но, среди загруженных 14 человек есть 3 с кодами типа 0000000000 и 00-000000. Причем они не по порядку идут. Первые 11 по порядку, а дальше 3 откуда попало.. А табельные номера там вообще черти что с видами, но вот их код воспринимает все абсолютно без разбора.. Смотрю структуру, в структуру записывается код физ.лица строкой (для всех), как и для табельного номера. По идее со структурой не должно быть ошибки, но где-то она все-таки есть
---
меня не в том, что мне нужно срочно решение.
Вы не привели код, вы не пример воспроизведения проблемы. Значит вам вообще не нужно решение.
Или по описанию того что вы делаете вы ожидаете что кто-то скажет, где в коде (которого никто не видел) ошибка? Серьезно?

Смоделируйте ситуацию на минимальном размере данных. Сделайте самодостаточную внешнюю обработку, которая откроется в любой конфигурации, которая демонстрирует проблему.
Тогда будет шанс получить реальную помощь в решении проблемы.

А пустые рассуждения - это к психологу.
---
Благодарю за совет :)
---
Не вижу сложностей от слова совсем. По коду физлица найти Физлицо не сложно, лишь бы коды физлиц были уникальными .
А как по физлицу ищете сотрудника? Ведь у физлица может быть несколько сотрудников. По каким критериям выбираете?
ФизлицоСсылка это реквизит СотрудникСсылка. Если речь про ЗУП, или БП, или ERP, конечно.

Я писал тьму запросов, в т.ч. и поиск сотрудника всякими вариантами (для загрузки из эксель и т.д. и т.п.).
Странно, что ищете его через регистр состояний. И не через "Кадровую историю". Причем, если это ЗУП, то почему "ДАнные состояний сотрудников", а не через "Состояния сотрудников" ? Последний - интервальный, они на порядок удобнее.
А еще лучше в "Кадровая история сотрудников интервальный".
---
Спасибо. Попробую и ваш запрос. Но вопрос не в том, что не находит сотрудника по коду физ.лица. Я писала, что в целом запрос работает, да все записи получаются уникальными (повторов нет). Вопрос мой был в том, что при одном и том же запросе, где в результате я получаю таблицу с уникальными значениями Сотрудник (ссылка) - Код сотрудника (табельный номер) - Код физлица сотрудника (Код Физ.лица) при использовании метода НайтиСледующий(Структура) этот метод абсолютно замечательно работает с табельным номером и очень странно выборочно на одной базе работает с кодами физ.лиц.

Обработка для ЗУП следующего вида. Открываю, копирую в табличный документ (поле формы и реквизит обработки) данные и иду по этим данным перебирая коды физлиц и в выборке ищу нужного сотрудника, которого далее кодом подставляю в документ начисления.

И у меня ощущение, что что-то именно вот в этот момент. Почему-то табельные номера для поиска из табличного документа воспринимаются обработкой нормально, а вот коды физ.лиц (опять же повторюсь именно в одной базе, где они разнообразные по виду) подбираются только всегда определенные 14 (по которым стойкую логику почему именно они я пока не нашла).

То есть, для метода НайтиСледующий важно что-то в типе или виде значения из структуры для поиска. Буду искать дальше.
---
Вот сам запрос, параметры и начало со структурой
Запрос = Новый Запрос;
 Запрос.Текст =
  "ВЫБРАТЬ
  | РазовоеНачисление.Ссылка КАК Документ,
  | РазовоеНачисление.Дата КАК Дата,
  | РазовоеНачисление.МесяцНачисления КАК МесяцНачисления,
  | РазовоеНачисление.Организация КАК Организация,
  | РазовоеНачисление.ДатаОкончания КАК ДатаОкончания
  |ПОМЕСТИТЬ ВТ_ДанныеДокумента
  |ИЗ
  | Документ.РазовоеНачисление КАК РазовоеНачисление
  |ГДЕ
  | РазовоеНачисление.Ссылка = &ДокументНачисления
  |;
  |
  |////////////////////////////////////////////////////////////­////////////////////
  |ВЫБРАТЬ
  | ДанныеСостоянийСотрудников.Сотрудник.Наименование КАК ФИОСотрудника,
  | ДанныеСостоянийСотрудников.Сотрудник.Код КАК ТабельныйНомер,
  | ДанныеСостоянийСотрудников.Сотрудник.ФизическоеЛицо.Код КАК КодФизЛица,
  | ДанныеСостоянийСотрудников.Сотрудник.ГоловнаяОрганизация КАК ОрганизацияСотрудника,
  | ДанныеСостоянийСотрудников.Состояние КАК Состояние,
  | ДанныеСостоянийСотрудников.Начало КАК Начало,
  | ДанныеСостоянийСотрудников.Сотрудник.Ссылка КАК Сотрудник
  |ПОМЕСТИТЬ ВТ_СостояниеСотрудника
  |ИЗ
  | РегистрСведений.ДанныеСостоянийСотрудников КАК ДанныеСостоянийСотрудников
  |;
  |
  |////////////////////////////////////////////////////////////­////////////////////
  |ВЫБРАТЬ
  | МАКСИМУМ(ВТ_СостояниеСотрудника.Начало) КАК ПоследняяЗапись,
  | ВТ_СостояниеСотрудника.Сотрудник КАК Сотрудник
  |ПОМЕСТИТЬ ВТ_ПоследняяЗапись
  |ИЗ
  | ВТ_СостояниеСотрудника КАК ВТ_СостояниеСотрудника
  |
  |СГРУППИРОВАТЬ ПО
  | ВТ_СостояниеСотрудника.Сотрудник
  |;
  |
  |////////////////////////////////////////////////////////////­////////////////////
  |ВЫБРАТЬ
  | ВТ_СостояниеСотрудника.ФИОСотрудника КАК ФИОСотрудника,
  | ВТ_СостояниеСотрудника.ТабельныйНомер КАК ТабельныйНомер,
  | ВТ_СостояниеСотрудника.КодФизЛица КАК КодФизЛица,
  | ВТ_СостояниеСотрудника.ОрганизацияСотрудника КАК ОрганизацияСотрудника,
  | ВТ_СостояниеСотрудника.Состояние КАК Состояние,
  | ВТ_СостояниеСотрудника.Сотрудник КАК Сотрудник
  |ПОМЕСТИТЬ ВТ_Сотрудник
  |ИЗ
  | ВТ_СостояниеСотрудника КАК ВТ_СостояниеСотрудника
  | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПоследняяЗапись КАК ВТ_ПоследняяЗапись
  | ПО (ВТ_ПоследняяЗапись.ПоследняяЗапись = ВТ_СостояниеСотрудника.Начало)
  | И (ВТ_ПоследняяЗапись.Сотрудник = ВТ_СостояниеСотрудника.Сотрудник)
  |ГДЕ
  | ВТ_СостояниеСотрудника.Состояние <> &Состояние
  |;
  |
  |////////////////////////////////////////////////////////////­////////////////////
  |ВЫБРАТЬ РАЗЛИЧНЫЕ
  | ВТ_Сотрудник.Сотрудник КАК Сотрудник,
  | ВТ_Сотрудник.КодФизЛица КАК КодФизЛица,
  | ВТ_Сотрудник.ТабельныйНомер КАК ТабельныйНомер
  |ИЗ
  | ВТ_ДанныеДокумента КАК ВТ_ДанныеДокумента
  | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Сотрудник КАК ВТ_Сотрудник
  | ПО ВТ_ДанныеДокумента.Организация = ВТ_Сотрудник.ОрганизацияСотрудника";

 Запрос.УстановитьПараметр("ДокументНачисления", Объект.ДокументЗагрузки.Ссылка);
 Запрос.УстановитьПараметр("Состояние", Перечисления.СостоянияСотрудника.Увольнение);

 РезультатЗапроса = Запрос.Выполнить();

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

 ОтборКод = новый Структура("КодФизЛица");
 ОтборТН = новый Структура("ТабельныйНомер");
---
Судя по описанию модуль работает, а ошибка в самих данных.
Может нуля в коде не хватает, или тип разный (число/строка) или пробел...
---
я тоже склоняюсь, что вопрос где-то в самих кодах, т.к. в той базе, где все ок работает они все одинаковые и красивые. А в базе где нужно, чтобы работало там одни коды с префиксом с буквами, вторые с префиксом с цифрами, третьи вообще без префиксов... НО! и табельные номера в этой базе тоже имеют разный вид, однако с ними метод НайтиСледующий работает отлично.

Я уже пробовала и метод со структурой внутри и метод этот с поиском значения и по колонке.. И для варианта со значением и колонкой указано, что это значение может быть любым - Произвольным.. Однако, что-то не то..
---
Попробуйте отсортировать результат запроса по полю "КодФизЛица" по возрастанию
---
пробовала, не помогло. Все те же 14 человек )
---
Тут наверное описка, должно быть не Если, а Пока
 Пока ВыборкаСотрудники.НайтиСледующий(ОтборКод) Цикл
    Сотрудник = ВыборкаСотрудники.Сотрудник;
КонецЦикла;

Рекомендую выгрузить выборку в ТЗ и поискать там, может проблема в данных.
Если с ТЗ будет работать, а с поиском нет, тогда надо разбираться. Но если в ТЗ не будет работать, что то не то в данных или в коде.
---
Я сделала в целом обработку и этот код по-другому через перебор выборки, но хотелось бы понять на будущее и вообще почему метод НайтиСледующий может не работать. Анализировала данные по этим 14ти, которые всегда подбираются. У них разные виды кода (конкретно два вида: одни с префиксом 00-, одни без префикса), нет какого-то порядка (типа первые 14 или что-то еще такое), не могу у этих 14 найти какие-то отличительные характеристики, чтобы понять почему именно они ))
---
У них разные виды кода (конкретно два вида: одни с префиксом 00-, одни без префикса), нет какого-то порядка (типа первые 14 или что-то еще такое),
в таб документа должен быть такое же упорядочивание по коду как в выборке. Я Вам советовал сделать сортировку результата запроса а про таб часть не написал. ее тоже отсоритруйте таким же способом.
---
Попробуйте так

Если ВыборкаСотрудники.НайтиСледующий(ОтборКод) Цикл
    Сотрудник = ВыборкаСотрудники.Сотрудник;
ВыборкаСотрудники.Сбросить();
КонецЦикла;
---
Если ... Цикл
...
КонецЦикла;

Это не так работает.
---
Если вы имели в виду заменить на
Пока... Цикл
Сотрудник = ВыборкаСотрудники.Сотрудник;...
КонецЦикл
ВыборкаСотрудники.Сбросить();

Такое кому-то тоже на форумах по этому методу советовали и я пробовала, но тут не помогает.
---
вы же в последнем запросе выбираете данные из
|ПОМЕСТИТЬ ВТ_ДанныеДокумента
|ИЗ
| Документ.РазовоеНачисление КАК РазовоеНачисление

может в этом разовом начислении какрас и есть эти ваши 14 человек?
или такое нормальное разовое на 500 душ?
---
Не тут все норм. Я из документа беру только организацию, чтобы нужных сотрудников от физ.лиц отобрать. Если сам запрос в консоль закинуть, то он мне чисто всех моих сотрудников выдает, кто на текущий момент не уволен.
---
судя по всему символ "-" не учитывается при сортировке строк
вот что выдает консолька при запросе в базе БСП Демо
теперь живете с этим :-P
---
это да )) я тоже это уже заметила, но табельные номера у меня тоже разнообразные, но по ним метод работает, а по коду физ.лица - выборочно.
---
Если находит, но все коды, из очевидного - такого кода (который не находится) в результате запроса просто нет.
---
символ "-" не учитываетсяУчитывается. Передавай привет своей консольке запросов, теперь живете с этим.
---
О!. Вот проблема может быть где-то в этой области. Т.к. табельные номера, когда упорядочиваю по возрастанию, там все прекрасно учитывается и сортируется, а вот с кодами физ.лиц у меня тоже какая-то ерунда. Сортируется как бы по какому-то третьему знаку справа или как.. я даже хз.. Что с этим делать. В выборку то они все попадают, но вот возможно из-за этой какой-то особенности метод НайтиСледующий их и не видит. Первая колонка тут если что это таб.номер и сортировка не по нему, а вот вторая колонка - код физ.лица и сотрировка запроса сейчас как раз по нему..
---
Покажите результат запроса, в котором выполняется поиск, и код, который в нем не находится.
От сортировки поиск не зависит, т.к. вы перед поиском сбрасываете выборку, а значит поиск происходит по всей выборке.
Я же не многого прошу - просто покажите пример, когда не работает.
---
```1c
    ГДЕ
    | ВТ_Сотрудник.Состояние <> &Состояние
    | И ВТ_Сотрудник.Состояние В (&Код)
    |УПОРЯДОЧИТЬ ПО
    | ВТ_Сотрудник.КодФизЛица";

    ПерваяСтрока = Объект.ПерваяСтрока;
    МассивКод = Новый Массив;
    Для К = ПерваяСтрока по Объект.ДанныеЛиста.ВысотаТаблицы Цикл
    АдресР= "R"+К;
    КодВМассив= СокрЛП(Объект.ДанныеЛиста.Область(АдресР+"C2").Текст);
    МассивКод.Добавить(КодВМассив);
    КонецЦикла;

    Запрос.УстановитьПараметр("ДокументНачисления", Объект.ДокументЗагрузки.Ссылка);
    Запрос.УстановитьПараметр("Состояние", Перечисления.СостоянияСотрудника.Увольнение);
    Запрос.УстановитьПараметр("Код", МассивКод);
```

Вот переделала запрос, чтобы в его выборку попали только два сотрудника тестовых (один попадет, другой - нет)

Часть кода с отбором кода и подбором в выборке физ.лица

```1c
    ОтборКод.КодФизЛица = ТекущаяСтрока[2];

    Если ВыборкаСотрудники.НайтиСледующий(ОтборКод) Тогда
    Сотрудник = ВыборкаСотрудники.Сотрудник;
    КонецЕсли;
    ВыборкаСотрудники.Сбросить();
```
---
и не рабочий
---
В данном случае ответ прост - коды отличаются - см.скрин.
В выборке есть пробел в конце, из-за этого не находит.

Добавьте для поля КодФизлица в запрос СокрЛП - с 8.3.20 платформа это позволяет. Должно помочь в данном случае.
https://wonderland.v8.1c.ru/blog/novye-funktsii-yazyka-zaprosov-i-sistemy-komponovki-dannykh/?sphrase_id=649009

Ну либо убрать тут:
КодВМассив= СокрЛП(Объект.ДанныеЛиста.Область(АдресР+"C2").Текст);

Третий способ - перезаписать коды в справочнике, обрезав пробелы в конце.
---
и вот смотрела же.. и куда смотрела. Да, добавила в запрос СокрЛП и все ок. Спасибо большое. Видимо уже вообще так с этой задачей взгляд замылился, что очевидного не увидела ((
---
Пожалуйста
---
Сортируется как бы по какому-то третьему знаку справаВыброси консоль запросов, напиши три строчки кода с "сообщить" и убедись, что там все работает.
---
Вот только консоль дает ровно тот результат, который вы получите сделав запрос встроенным языком 1С
а значит ваша "правильная" сортировка только запутает разработчика
---
Вот только консоль дает ровно тот результат, который вы получите сделав запрос встроенным языком 1С Не трынди, не вырастешь.

```1c
    &НаКлиенте
    Процедура Команда1(Команда)
    Команда1НаСервере();
    КонецПроцедуры

    &НаСервереБезКонтекста
    Процедура Команда1НаСервере()

    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    | _ДемоНоменклатура.Код КАК Код,
    | _ДемоНоменклатура.Наименование КАК Наименование
    |ИЗ
    | Справочник._ДемоНоменклатура КАК _ДемоНоменклатура
    |
    |УПОРЯДОЧИТЬ ПО
    | Код";
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    Пока Выборка.Следующий() Цикл
    Сообщить(Выборка.Код + " " + Выборка.Наименование);
    КонецЦикла;

    КонецПроцедуры
```
---
Это особенность сортировки MSSQL

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

но вы и дальше можете думать что ваш случай (файловая база?) единственный верный
---
Поменяйте табельные номера между собой у двух сотрудников, один из них чтобы был из попадающих в выборку, второй не попадающий. Посмотрите скажется это на результате?
---
```1c
    ВыборкаСотрудники.Сбросить();
    Если ВыборкаСотрудники.НайтиСледующий(...
```
---
```1c
    Если ВыборкаСотрудники.НайтиСледующий(ОтборКод) Цикл
    Сотрудник = ВыборкаСотрудники.Сотрудник;
    Иначе
```

ставите точку останова
смотрите, что у Вас в
```1c
    ОтборКод.КодФизЛица
```

выгружаете результат и смотрите есть ли там эта строка
```1c
    РезультатЗапроса.Выгрузить()
```

если в таблице есть такой код - значить сравните строку выгруженного результата с ОтборКод.КодФизЛица
если там покажет ложь - значить у Вас в коде физлица есть некий символ, которого визуально не видно (непрерывный пробел, G2 или еще какая-то муть)
можете даже скопировать и вставить в notepad++ и посмотрите из чего реально состоит код физ лица

еще проверьте свои кода физ лиц на недопустимые симолы... что в справочнике, что в том от куда Вы берете данные для отбора
```1c
    НайтиНедопустимыеСимволыXML
```