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

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 15 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 15 31.03.23 13:16 Сейчас в теме
(5)
Если ЗначениеЗаполнено(Стр.Номенклатура) Тогда
МассиРезультатПоиска = Стр.НомерЗаказа.МатериальнаяСпецификация.НайтиСтроки(Новый Структура("НоменклатураИнтермех,Номенклатура", Стр.НоменклатураИнтермех, Стр.Номенклатура));
Иначе
МассиРезультатПоиска = Стр.НомерЗаказа.МатериальнаяСпецификация.НайтиСтроки(новый Структура("НоменклатураИнтермех", Стр.НоменклатураИнтермех, Справочники.Номенклатура.ПустаяСсылка()));
КонецЕсли;

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

Вот это вставьте вместо того что у вас там до строки: "Норма = 0".
10. DENSKR 15 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 15 31.03.23 14:12 Сейчас в теме
(12) А что в этот момент покажет выражение Стр.НомерЗаказа.МатериальнаяСпецификация.Количество() ?
14. DeIVIiurg 31.03.23 14:15 Сейчас в теме
(13)1851. Что соответствует числу строк в ТЧ заказа
16. DENSKR 15 31.03.23 14:34 Сейчас в теме
(14) А что в МассиРезультатПоиска находится в этот момент?
17. DeIVIiurg 31.03.23 14:40 Сейчас в теме
(16) Смотри, на первом проходе после НайтиСтроки() получается пустой массив, допустим там отбиралась номенклатура с кодом 25. На втором проходе, когда в найти строки передается номенклатура с кодом 35, массив содержит две строки. НО!!! обе строки с номенклатурой под кодом 35. Если в ТЧ Заявки поменять эти номенклатуры местами, то и в данном цикле будет то же самое. На первом проходе номенклатуру 35 он не найдет, а на втором найдет две номенклатуры с кодом 25. Чудь
19. DENSKR 15 31.03.23 15:00 Сейчас в теме
(17) НоменклатураИнтермех - всегда "Строка" или может иметь тип "Справочники.Номенклатура" ?
20. DeIVIiurg 31.03.23 15:02 Сейчас в теме
21. DENSKR 15 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) А в чем проблема была?
Оставьте свое сообщение
Вакансии
Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

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

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

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)

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