Ошибка с НайтиСтроки()

1. DeIVIiurg 31.03.23 09:37 Сейчас в теме
Добрый день, форумчане! Столкнулся с проблемой, может подскажет кто, куда копать. Была у нас база на платформе 8.2.19.90, переехала база благополучно на 8.3.21.1624 в режиме совместимости с 8.2.13. Бухгалтерия 1.6, обычные формы. Все работает, все стреляет уже месяца 3. Неделю назад решили в базе минимальную границу итогов поднять, заодно перевели на режим совместимости 8.3.8. Провели, реиндексировали, сжали, все ок. И тут вылезло невесть откуда странная штука. Дано: цикл пробегает по табличной части документа, для каждой позиции ищет в другой табличной части строки согласно отбору. НоменклатураИнт - строка, Номенклатура- ссылка на соотв. справочник, НомерЗаказа.МатСпец - табличная часть документа Заказ. Примерный код прилагаю:
Для Стр из Заявка Цикл
                Если Стр.НоменклатураИнт<>"" Тогда
                     Если ЗначениеЗаполнено(Стр.Номенклатура) Тогда
                         МассивРезультатаПоиска = Стр.НомерЗаказа.МатСпец.НайтиСтроки(Новый Структура ("НоменклатураИнт, Номенклатура", Стр.НоменклатураИнт, Стр.Номенклатура);
                     КонецЕсли;
                КонецЕсли;
КонецЦикла;

Так вот в чем суть проблемы. В МатСпец есть две строки НоменклатураИнт1 - Номенклатура1, НоменклатураИнт1-Номенклатура2. В Заявка присутствуют идентичные строки. Когда доходим в цикле до НайтиСтроки(), то по какой-то причине он их там не находит. При попытке заглянуть в точке останова в Стр.НомерЗаказа.МатСпец, мы находим эти строки, все на месте. А вот когда выделяем необходимую строку, например 912 строка(Стр.НомерЗаказа.МатСпец[912]), дабы обратиться к ней и посмотреть, что же там твориться, то обращение урезает индекс до [91] например, т.е. выходит Стр.НомерЗаказа.МатСпец[91]. Что за бес тут поселился? Предвосхищяя момент по поводу, что сделай тестирование и т.д. сделали, ноль реакции.
Но если строки сделать идентичными т.е. обе строки в заявке будут НоменклатураИнт1-Номенклатура, то ищет нормально.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
15. spacecraft 31.03.23 14:21 Сейчас в теме
(1) после всех манипуляций с базой кэш почистили?
18. DeIVIiurg 31.03.23 14:43 Сейчас в теме
(15)да. Данная ошибка была выявлена, как на оригинальной базе, так и на локальной копии, после тестирований и исправлений. Сейчас даже еще раз почистил у себя, ноль результатов
2. aka Любитель XML 31.03.23 10:20 Сейчас в теме
(1) в любой непонятной ситуации я начинаю с очистки кэша
3. aka Любитель XML 31.03.23 10:21 Сейчас в теме
А вообще я бы на запрос переписал такой поиск
4. DENSKR 16 31.03.23 13:06 Сейчас в теме
Если вы после выполнения этого цикла в котором формируется "МассивРезультатаПоиска" делаете что то с этим массивом то вы работаете с конечным результатом заполнения вашего "МассивРезультатаПоиска".
То есть "Для Каждого Стр из Заявка Цикл" обновляет ваш "МассивРезультатаПоиска", лучше пришлите полный код выполнения, а не примерный, для того чтобы можно было точнее понять в чем проблема.
5. DeIVIiurg 31.03.23 13:11 Сейчас в теме
(4)
Для каждого Стр из Заявка цикл 	
Если Стр.НоменклатураИнтермех <> "" Тогда 
		Если ЗначениеЗаполнено(Стр.Номенклатура) Тогда
			МассиРезультатПоиска = Стр.НомерЗаказа.МатериальнаяСпецификация.НайтиСтроки(Новый Структура("НоменклатураИнтермех,Номенклатура", Стр.НоменклатураИнтермех, Стр.Номенклатура));
		Иначе
			МассиРезультатПоиска = Стр.НомерЗаказа.МатериальнаяСпецификация.НайтиСтроки(новый Структура("НоменклатураИнтермех", Стр.НоменклатураИнтермех, Справочники.Номенклатура.ПустаяСсылка()));
		КонецЕсли;
	Иначе
			МассиРезультатПоиска =Стр.НомерЗаказа.МатериальнаяСпецификация.НайтиСтроки(новый Структура("Номенклатура",Стр.Номенклатура));
	КонецЕсли;
	Норма = 0;	
	
	Если МассиРезультатПоиска.Количество() > 0 
		Тогда
			Для каждого СтрокаМР Из МассиРезультатПоиска Цикл
				Норма = Норма + СтрокаМР.Норма;
			КонецЦикла;
	КонецЕсли;
		
		МассивРезультат = Неопределено;
		
		Если Стр.НоменклатураИнтермех <> "" Тогда
			Если ЗначениеЗаполнено(Стр.Номенклатура) Тогда
				МассивРезультат = ДвижениеНоменклатуры.НайтиСтроки(новый Структура("НоменклатураИнтермех, Номенклатура",Стр.НоменклатураИнтермех,Стр.Номенклатура));
			Иначе
				МассивРезультат = ДвижениеНоменклатуры.НайтиСтроки(новый Структура("НоменклатураИнтермех", Стр.НоменклатураИнтермех));
			КонецЕсли;
		Иначе
			МассивРезультат = ДвижениеНоменклатуры.НайтиСтроки(новый Структура("Номенклатура",Стр.Номенклатура));
		КонецЕсли;
		
		КоличествоЗаявлено = 0;
		КоличествоВыдано = 0;
		КоличествоРаспределено = 0;
		
		Для каждого ЭлементОбработки из МассивРезультат Цикл 
			КоличествоЗаявлено = КоличествоЗаявлено + ЭлементОбработки.Заявлено;	
			КоличествоВыдано = КоличествоВыдано + ЭлементОбработки.Выдано;
			КоличествоРаспределено = КоличествоРаспределено + ЭлементОбработки.Распределено;
		КонецЦикла;
		Если Норма - КоличествоЗаявлено <=0 Тогда
				Сообщить("По  номенклатуре, " + Стр.НоменклатураИнтермех + ", уже заявлено все количество по норме", СтатусСообщения.Важное);
				Стр.Количество = 0;
				Отказ = Истина;
			ИначеЕсли Стр.Количество > Норма-КоличествоЗаявлено Тогда
				Сообщить("По  номенклатуре, " + Стр.НоменклатураИнтермех + ", максимально допустимое значение для заявки: " + Строка(Норма-КоличествоЗаявлено)+"!", СтатусСообщения.Важное);
				Отказ = Истина;
		КонецЕсли;
		
КонецЦикла;		
Показать
6. DeIVIiurg 31.03.23 13:14 Сейчас в теме
(4) ДвижениеНоменклатуры в данном случае результат запроса, но там ничего нет. Т.е. не было заявок, выдач и распределения
7. DENSKR 16 31.03.23 13:16 Сейчас в теме
(5)
Если ЗначениеЗаполнено(Стр.Номенклатура) Тогда
МассиРезультатПоиска = Стр.НомерЗаказа.МатериальнаяСпецификация.НайтиСтроки(Новый Структура("НоменклатураИнтермех,Номенклатура", Стр.НоменклатураИнтермех, Стр.Номенклатура));
Иначе
МассиРезультатПоиска = Стр.НомерЗаказа.МатериальнаяСпецификация.НайтиСтроки(новый Структура("НоменклатураИнтермех", Стр.НоменклатураИнтермех, Справочники.Номенклатура.ПустаяСсылка()));
КонецЕсли;

Вот тут у вас НоменклатураИнтермех - Строка, и вы пытаетесь проверить на "Справочники.Номенклатура.ПустаяСсылка()"
9. DeIVIiurg 31.03.23 13:26 Сейчас в теме
(7) Да, допускаю, что тут есть момент. Но я почему код кидал примерный т.к. я говорю про первый поиск строки
МассиРезультатПоиска = Стр.НомерЗаказа.МатериальнаяСпецификация.НайтиСтроки(Новый Структура("НоменклатураИнтермех,Номенклатура", Стр.НоменклатураИнтермех, Стр.Номенклатура));
Конкретно в этом месте загвоздка и есть
8. DENSKR 16 31.03.23 13:26 Сейчас в теме
//Если Стр.НоменклатураИнтермех Не пустая строка 
	Если Стр.НоменклатураИнтермех <> "" Тогда 
		Если ЗначениеЗаполнено(Стр.Номенклатура) Тогда //Если Стр.Номенклатура заполнена
			МассиРезультатПоиска = Стр.НомерЗаказа.МатериальнаяСпецификация.НайтиСтроки(Новый Структура("НоменклатураИнтермех, Номенклатура", Стр.НоменклатураИнтермех, Стр.Номенклатура));
		Иначе //Если Стр.Номенклатура НЕ заполнена
			МассиРезультатПоиска = Стр.НомерЗаказа.МатериальнаяСпецификация.НайтиСтроки(новый Структура("НоменклатураИнтермех", Стр.НоменклатураИнтермех));
		КонецЕсли;
	Иначе //Если Стр.НоменклатураИнтермех Пустая строка
		Если ЗначениеЗаполнено(Стр.Номенклатура) Тогда //Если Стр.Номенклатура заполнена
			МассиРезультатПоиска =Стр.НомерЗаказа.МатериальнаяСпецификация.НайтиСтроки(новый Структура("Номенклатура",Стр.Номенклатура));
		КонецЕсли;
	КонецЕсли;
Показать

Вот это вставьте вместо того что у вас там до строки: "Норма = 0".
10. DENSKR 16 31.03.23 13:29 Сейчас в теме
(5) Пришлите скрин или описание колонок в "Стр.НомерЗаказа.МатериальнаяСпецификация"
11. DeIVIiurg 31.03.23 13:47 Сейчас в теме
(10)
Прикрепленные файлы:
12. DeIVIiurg 31.03.23 13:49 Сейчас в теме
скрин 1. Содержание Заявка
скрин 2. Содержание ТЧ документа заказ
скрин 3. Содержание Стр.НомерЗаказа.МатериальнаяСпецификация с выделением, что втулка там действительно есть такая
скрин 4 . Показано, что происходит, когда выбираешь эту втулку и нажимаешь показать в отдельном окне
13. DENSKR 16 31.03.23 14:12 Сейчас в теме
(12) А что в этот момент покажет выражение Стр.НомерЗаказа.МатериальнаяСпецификация.Количество() ?
14. DeIVIiurg 31.03.23 14:15 Сейчас в теме
(13)1851. Что соответствует числу строк в ТЧ заказа
16. DENSKR 16 31.03.23 14:34 Сейчас в теме
(14) А что в МассиРезультатПоиска находится в этот момент?
17. DeIVIiurg 31.03.23 14:40 Сейчас в теме
(16) Смотри, на первом проходе после НайтиСтроки() получается пустой массив, допустим там отбиралась номенклатура с кодом 25. На втором проходе, когда в найти строки передается номенклатура с кодом 35, массив содержит две строки. НО!!! обе строки с номенклатурой под кодом 35. Если в ТЧ Заявки поменять эти номенклатуры местами, то и в данном цикле будет то же самое. На первом проходе номенклатуру 35 он не найдет, а на втором найдет две номенклатуры с кодом 25. Чудь
19. DENSKR 16 31.03.23 15:00 Сейчас в теме
(17) НоменклатураИнтермех - всегда "Строка" или может иметь тип "Справочники.Номенклатура" ?
20. DeIVIiurg 31.03.23 15:02 Сейчас в теме
21. DENSKR 16 31.03.23 15:09 Сейчас в теме
(20) А вы сделали как я написал в (8) ?
26. DeIVIiurg 06.04.23 13:04 Сейчас в теме
22. volex 31.03.23 15:11 Сейчас в теме
Заявка, что за объект и как получается? В коде я так понимаю она потом меняется?
23. DeIVIiurg 06.04.23 11:58 Сейчас в теме
(22) Заявка - табличная часть документа "Заявка на получение материала". Туда подбирают из табличной части Материальная спецификация документа Заказ-спецификация нужные позиции номенклатуры. При проведение документа Заявка на получение материалов проверяется, соответствует ли заявленное кол-во тому, что указано в спецификации. В итоге и происходит такая ошибка. Переписал этот код на запрос обычный - результат тот же. Уж и не знаю уже, что за ерунда с базой
24. volex 06.04.23 12:05 Сейчас в теме
(23) У вас начало кода написано:
Для каждого Стр из Заявка цикл


Заявка, как он получается, приведите код выше, вплоть до запроса. Текст запроса можете не показывать.
25. DeIVIiurg 06.04.23 13:01 Сейчас в теме
(24) Заявка - так и называется табличная часть документа. Т.е.
Для каждого Стр из Заявка цикл
просто обходит табличную часть документа
27. volex 06.04.23 13:34 Сейчас в теме
(25) Дело происходит внутри документа? В модуле или обработчик табличной части?
28. DeIVIiurg 06.04.23 13:45 Сейчас в теме
(27) модуль объекта, конфигурация старая еще, Бухгалтерия 1.6 для Беларуси. В обработке проведения вызывается процедура, которая с этого кода собственно и начинается
29. volex 06.04.23 13:52 Сейчас в теме
(28) База файловая или СУБД?
30. DeIVIiurg 06.04.23 14:07 Сейчас в теме
(29) основная база - СУБД. Тесты проводили как на оригинальной базе на SQL, так и на копии файловой. Результат идентичный
31. volex 06.04.23 14:20 Сейчас в теме
(30) Я сталкивался с подобной ситуацией, но не помню как с ней разобрался, вроде бы дело было с разрядностью программы или неудачной версией платформы, точно не скажу, почему то не запомнилось.
32. DeIVIiurg 10.04.23 12:15 Сейчас в теме
Тема закрыта, проблема найдена
33. kako1toxren 22.09.23 15:42 Сейчас в теме
(32) А в чем проблема была?
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот