Не работает метод НайтиСледующий

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

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

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

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

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


Вариант с циклом Пока и подстановкой ВыборкаСотрудники.Сбросить(); перед циклом тоже уже пробовала. Не помогает.
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
35. Sashares 34 20.09.23 17:54 Сейчас в теме +0.05 $m
(33) В данном случае ответ прост - коды отличаются - см.скрин.
В выборке есть пробел в конце, из-за этого не находит.

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

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

Третий способ - перезаписать коды в справочнике, обрезав пробелы в конце.
Прикрепленные файлы:
user1768842; Spurk; +2 Ответить
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. Sashares 34 18.09.23 16:52 Сейчас в теме
4. user1768842 19.09.23 06:36 Сейчас в теме
(2) код работает для 14ти штук и на другой базе, поэтому дело не в этом. Весь код сюда копировать достаточно сложно, т.к. это обработка, которая берет код физ.лица из табличного документа, ищет в запросе по коду физ.лица сотрудника и подставляет этого сотрудника в документ начисления выплаты...
9. Sashares 34 19.09.23 09:41 Сейчас в теме
(4)Выгрузите в таблицу и ищите в таблице.
14. user1768842 19.09.23 16:29 Сейчас в теме
(9) я написала обработку иначе через перебор конкретных записей в запросе (ограничила запрос по кодам), поэтому проблема у меня не в том, что мне нужно срочно решение.

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

Вы не привели код, вы не пример воспроизведения проблемы. Значит вам вообще не нужно решение.
Или по описанию того что вы делаете вы ожидаете что кто-то скажет, где в коде (которого никто не видел) ошибка? Серьезно?

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

А пустые рассуждения - это к психологу.
17. user1768842 19.09.23 19:08 Сейчас в теме
18. Vinzor 71 19.09.23 22:06 Сейчас в теме
(4) Не вижу сложностей от слова совсем. По коду физлица найти Физлицо не сложно, лишь бы коды физлиц были уникальными .
А как по физлицу ищете сотрудника? Ведь у физлица может быть несколько сотрудников. По каким критериям выбираете?
ФизлицоСсылка это реквизит СотрудникСсылка. Если речь про ЗУП, или БП, или ERP, конечно.

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

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

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

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

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

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

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

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

Я уже пробовала и метод со структурой внутри и метод этот с поиском значения и по колонке.. И для варианта со значением и колонкой указано, что это значение может быть любым - Произвольным.. Однако, что-то не то..
8. Vadim_174 2 19.09.23 09:40 Сейчас в теме
(1)Попробуйте отсортировать результат запроса по полю "КодФизЛица" по возрастанию
10. user1768842 19.09.23 09:51 Сейчас в теме
(8) пробовала, не помогло. Все те же 14 человек )
30. fixin 4218 20.09.23 15:45 Сейчас в теме
(1) Тут наверное описка, должно быть не Если, а Пока
Пока ВыборкаСотрудники.НайтиСледующий(ОтборКод) Цикл
Сотрудник = ВыборкаСотрудники.Сотрудник;
КонецЦикла;


Рекомендую выгрузить выборку в ТЗ и поискать там, может проблема в данных.
Если с ТЗ будет работать, а с поиском нет, тогда надо разбираться. Но если в ТЗ не будет работать, что то не то в данных или в коде.
7. user1768842 19.09.23 06:43 Сейчас в теме
Я сделала в целом обработку и этот код по-другому через перебор выборки, но хотелось бы понять на будущее и вообще почему метод НайтиСледующий может не работать. Анализировала данные по этим 14ти, которые всегда подбираются. У них разные виды кода (конкретно два вида: одни с префиксом 00-, одни без префикса), нет какого-то порядка (типа первые 14 или что-то еще такое), не могу у этих 14 найти какие-то отличительные характеристики, чтобы понять почему именно они ))
23. Vadim_174 2 20.09.23 11:32 Сейчас в теме
(7)
У них разные виды кода (конкретно два вида: одни с префиксом 00-, одни без префикса), нет какого-то порядка (типа первые 14 или что-то еще такое),

в таб документа должен быть такое же упорядочивание по коду как в выборке. Я Вам советовал сделать сортировку результата запроса а про таб часть не написал. ее тоже отсоритруйте таким же способом.
11. Vasas2007 19.09.23 09:56 Сейчас в теме
Попробуйте так

Если ВыборкаСотрудники.НайтиСледующий(ОтборКод) Цикл
Сотрудник = ВыборкаСотрудники.Сотрудник;
ВыборкаСотрудники.Сбросить();
КонецЦикла;
12. Sashares 34 19.09.23 10:50 Сейчас в теме
(11)
Если ... Цикл
...
КонецЦикла;


Это не так работает.
13. user1768842 19.09.23 16:21 Сейчас в теме
(11) Если вы имели в виду заменить на
Пока... Цикл
Сотрудник = ВыборкаСотрудники.Сотрудник;...
КонецЦикл
ВыборкаСотрудники.Сбросить();

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

может в этом разовом начислении какрас и есть эти ваши 14 человек?
или такое нормальное разовое на 500 душ?
21. user1768842 20.09.23 08:22 Сейчас в теме
(16) Не тут все норм. Я из документа беру только организацию, чтобы нужных сотрудников от физ.лиц отобрать. Если сам запрос в консоль закинуть, то он мне чисто всех моих сотрудников выдает, кто на текущий момент не уволен.
19. Oldsad 20.09.23 02:41 Сейчас в теме
судя по всему символ "-" не учитывается при сортировке строк
вот что выдает консолька при запросе в базе БСП Демо
теперь живете с этим :-P
Прикрепленные файлы:
22. user1768842 20.09.23 08:24 Сейчас в теме
(19) это да )) я тоже это уже заметила, но табельные номера у меня тоже разнообразные, но по ним метод работает, а по коду физ.лица - выборочно.
25. Sashares 34 20.09.23 12:27 Сейчас в теме
(22)Если находит, но все коды, из очевидного - такого кода (который не находится) в результате запроса просто нет.
24. user1936667 20.09.23 12:06 Сейчас в теме
(19)
символ "-" не учитывается
Учитывается. Передавай привет своей консольке запросов, теперь живете с этим.
Прикрепленные файлы:
26. user1768842 20.09.23 14:14 Сейчас в теме
(24) О!. Вот проблема может быть где-то в этой области. Т.к. табельные номера, когда упорядочиваю по возрастанию, там все прекрасно учитывается и сортируется, а вот с кодами физ.лиц у меня тоже какая-то ерунда. Сортируется как бы по какому-то третьему знаку справа или как.. я даже хз.. Что с этим делать. В выборку то они все попадают, но вот возможно из-за этой какой-то особенности метод НайтиСледующий их и не видит. Первая колонка тут если что это таб.номер и сортировка не по нему, а вот вторая колонка - код физ.лица и сотрировка запроса сейчас как раз по нему..
Прикрепленные файлы:
27. Sashares 34 20.09.23 14:58 Сейчас в теме
(26)Покажите результат запроса, в котором выполняется поиск, и код, который в нем не находится.
От сортировки поиск не зависит, т.к. вы перед поиском сбрасываете выборку, а значит поиск происходит по всей выборке.
Я же не многого прошу - просто покажите пример, когда не работает.
33. user1768842 20.09.23 17:45 Сейчас в теме
(27)
ГДЕ
		|	ВТ_Сотрудник.Состояние <> &Состояние
		|   И ВТ_Сотрудник.Состояние В (&Код)
		|УПОРЯДОЧИТЬ ПО
		|	ВТ_Сотрудник.КодФизЛица";
		
	ПерваяСтрока = Объект.ПерваяСтрока;
	МассивКод = Новый Массив;
	Для К = ПерваяСтрока по Объект.ДанныеЛиста.ВысотаТаблицы Цикл
		АдресР= "R"+К;
		КодВМассив= СокрЛП(Объект.ДанныеЛиста.Область(АдресР+"C2").Текст);
		МассивКод.Добавить(КодВМассив);
	КонецЦикла;
	
	Запрос.УстановитьПараметр("ДокументНачисления", Объект.ДокументЗагрузки.Ссылка);
	Запрос.УстановитьПараметр("Состояние", Перечисления.СостоянияСотрудника.Увольнение);
	Запрос.УстановитьПараметр("Код", МассивКод);
Показать


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

Часть кода с отбором кода и подбором в выборке физ.лица
ОтборКод.КодФизЛица = ТекущаяСтрока[2];
						
		Если ВыборкаСотрудники.НайтиСледующий(ОтборКод) Тогда
			Сотрудник = ВыборкаСотрудники.Сотрудник;
		КонецЕсли;
		ВыборкаСотрудники.Сбросить();
Прикрепленные файлы:
34. user1768842 20.09.23 17:47 Сейчас в теме
(27)и не рабочий
Прикрепленные файлы:
35. Sashares 34 20.09.23 17:54 Сейчас в теме +0.05 $m
(33) В данном случае ответ прост - коды отличаются - см.скрин.
В выборке есть пробел в конце, из-за этого не находит.

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

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

Третий способ - перезаписать коды в справочнике, обрезав пробелы в конце.
Прикрепленные файлы:
user1768842; Spurk; +2 Ответить
38. user1768842 21.09.23 09:18 Сейчас в теме
(35) и вот смотрела же.. и куда смотрела. Да, добавила в запрос СокрЛП и все ок. Спасибо большое. Видимо уже вообще так с этой задачей взгляд замылился, что очевидного не увидела ((
40. Sashares 34 21.09.23 09:24 Сейчас в теме
29. user1936667 20.09.23 15:18 Сейчас в теме
(26)
Сортируется как бы по какому-то третьему знаку справа
Выброси консоль запросов, напиши три строчки кода с "сообщить" и убедись, что там все работает.
36. Oldsad 21.09.23 01:55 Сейчас в теме
(24) Вот только консоль дает ровно тот результат, который вы получите сделав запрос встроенным языком 1С
а значит ваша "правильная" сортировка только запутает разработчика
37. user1936667 21.09.23 08:02 Сейчас в теме
(36)
Вот только консоль дает ровно тот результат, который вы получите сделав запрос встроенным языком 1С
Не трынди, не вырастешь.

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

&НаСервереБезКонтекста
Процедура Команда1НаСервере()
	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	               |	_ДемоНоменклатура.Код КАК Код,
	               |	_ДемоНоменклатура.Наименование КАК Наименование
	               |ИЗ
	               |	Справочник._ДемоНоменклатура КАК _ДемоНоменклатура
	               |
	               |УПОРЯДОЧИТЬ ПО
	               |	Код";
	Результат = Запрос.Выполнить();
	Выборка = Результат.Выбрать();
	Пока Выборка.Следующий() Цикл
		Сообщить(Выборка.Код + " " + Выборка.Наименование);
	КонецЦикла;
	
КонецПроцедуры
Показать
Прикрепленные файлы:
39. Oldsad 21.09.23 09:19 Сейчас в теме
(37)
Это особенность сортировки 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

но вы и дальше можете думать что ваш случай (файловая база?) единственный верный
Прикрепленные файлы:
28. уля 3 20.09.23 15:03 Сейчас в теме
Поменяйте табельные номера между собой у двух сотрудников, один из них чтобы был из попадающих в выборку, второй не попадающий. Посмотрите скажется это на результате?
31. starik-2005 2903 20.09.23 16:04 Сейчас в теме
ВыборкаСотрудники.Сбросить();
Если ВыборкаСотрудники.НайтиСледующий(...
32. Dr.HiHi 3 20.09.23 16:31 Сейчас в теме
Если ВыборкаСотрудники.НайтиСледующий(ОтборКод) Цикл
    Сотрудник = ВыборкаСотрудники.Сотрудник;
Иначе

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

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

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

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

Программист 1С
Киров (Кировская обл.)
зарплата от 100 000 руб.
Полный день

Программист 1С
Санкт-Петербург
зарплата от 150 000 руб.
Полный день

Архитектор 1С
Москва
зарплата от 250 000 руб.
Полный день

1С-Программист (интегратор Битрикс24)
Санкт-Петербург
зарплата от 150 000 руб. до 250 000 руб.
Полный день