Добрый день, форумчане! Столкнулся с проблемой, может подскажет кто, куда копать. Была у нас база на платформе 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-Номенклатура, то ищет нормально.
Для Стр из Заявка Цикл
Если Стр.НоменклатураИнт<>"" Тогда
Если ЗначениеЗаполнено(Стр.Номенклатура) Тогда
МассивРезультатаПоиска = Стр.НомерЗаказа.МатСпец.НайтиСтроки(Новый Структура ("НоменклатураИнт, Номенклатура", Стр.НоменклатураИнт, Стр.Номенклатура);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Так вот в чем суть проблемы. В МатСпец есть две строки НоменклатураИнт1 - Номенклатура1, НоменклатураИнт1-Номенклатура2. В Заявка присутствуют идентичные строки. Когда доходим в цикле до НайтиСтроки(), то по какой-то причине он их там не находит. При попытке заглянуть в точке останова в Стр.НомерЗаказа.МатСпец, мы находим эти строки, все на месте. А вот когда выделяем необходимую строку, например 912 строка(Стр.НомерЗаказа.МатСпец[912]), дабы обратиться к ней и посмотреть, что же там твориться, то обращение урезает индекс до [91] например, т.е. выходит Стр.НомерЗаказа.МатСпец[91]. Что за бес тут поселился? Предвосхищяя момент по поводу, что сделай тестирование и т.д. сделали, ноль реакции.
Но если строки сделать идентичными т.е. обе строки в заявке будут НоменклатураИнт1-Номенклатура, то ищет нормально.
По теме из базы знаний
- Повышение качества разработки. Статья 3. Ошибки программы
- БГУ 1.0.57.4: исправление ошибки обновления при заполнении корреспонденции счетов
- Разбор причины ошибки "Нарушение целостности чтения объекта базы данных из-за параллельного изменения объекта другим сеансом"
- Распространенные ошибки разработчиков, приводящие к проблемам производительности
- Обход ошибки в ЗУП 3 при начислении НДФЛ по обособленным подразделениям
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Если вы после выполнения этого цикла в котором формируется "МассивРезультатаПоиска" делаете что то с этим массивом то вы работаете с конечным результатом заполнения вашего "МассивРезультатаПоиска".
То есть "Для Каждого Стр из Заявка Цикл" обновляет ваш "МассивРезультатаПоиска", лучше пришлите полный код выполнения, а не примерный, для того чтобы можно было точнее понять в чем проблема.
То есть "Для Каждого Стр из Заявка Цикл" обновляет ваш "МассивРезультатаПоиска", лучше пришлите полный код выполнения, а не примерный, для того чтобы можно было точнее понять в чем проблема.
(4)
Для каждого Стр из Заявка цикл
Если Стр.НоменклатураИнтермех <> "" Тогда
Если ЗначениеЗаполнено(Стр.Номенклатура) Тогда
МассиРезультатПоиска = Стр.НомерЗаказа.МатериальнаяСпецификация.НайтиСтроки(Новый Структура("НоменклатураИнтермех,Номенклатура", Стр.НоменклатураИнтермех, Стр.Номенклатура));
Иначе
МассиРезультатПоиска = Стр.НомерЗаказа.МатериальнаяСпецификация.НайтиСтроки(новый Структура("НоменклатураИнтермех", Стр.НоменклатураИнтермех, Справочники.Номенклатура.ПустаяСсылка()));
КонецЕсли;
Иначе
МассиРезультатПоиска =Стр.НомерЗаказа.МатериальнаяСпецификация.НайтиСтроки(новый Структура("Номенклатура",Стр.Номенклатура));
КонецЕсли;
Норма = 0;
Если МассиРезультатПоиска.Количество() > 0
Тогда
Для каждого СтрокаМР Из МассиРезультатПоиска Цикл
Норма = Норма + СтрокаМР.Норма;
КонецЦикла;
КонецЕсли;
МассивРезультат = Неопределено;
Если Стр.НоменклатураИнтермех <> "" Тогда
Если ЗначениеЗаполнено(Стр.Номенклатура) Тогда
МассивРезультат = ДвижениеНоменклатуры.НайтиСтроки(новый Структура("НоменклатураИнтермех, Номенклатура",Стр.НоменклатураИнтермех,Стр.Номенклатура));
Иначе
МассивРезультат = ДвижениеНоменклатуры.НайтиСтроки(новый Структура("НоменклатураИнтермех", Стр.НоменклатураИнтермех));
КонецЕсли;
Иначе
МассивРезультат = ДвижениеНоменклатуры.НайтиСтроки(новый Структура("Номенклатура",Стр.Номенклатура));
КонецЕсли;
КоличествоЗаявлено = 0;
КоличествоВыдано = 0;
КоличествоРаспределено = 0;
Для каждого ЭлементОбработки из МассивРезультат Цикл
КоличествоЗаявлено = КоличествоЗаявлено + ЭлементОбработки.Заявлено;
КоличествоВыдано = КоличествоВыдано + ЭлементОбработки.Выдано;
КоличествоРаспределено = КоличествоРаспределено + ЭлементОбработки.Распределено;
КонецЦикла;
Если Норма - КоличествоЗаявлено <=0 Тогда
Сообщить("По номенклатуре, " + Стр.НоменклатураИнтермех + ", уже заявлено все количество по норме", СтатусСообщения.Важное);
Стр.Количество = 0;
Отказ = Истина;
ИначеЕсли Стр.Количество > Норма-КоличествоЗаявлено Тогда
Сообщить("По номенклатуре, " + Стр.НоменклатураИнтермех + ", максимально допустимое значение для заявки: " + Строка(Норма-КоличествоЗаявлено)+"!", СтатусСообщения.Важное);
Отказ = Истина;
КонецЕсли;
КонецЦикла;
Показать
(5)
Вот тут у вас НоменклатураИнтермех - Строка, и вы пытаетесь проверить на "Справочники.Номенклатура.ПустаяСсылка()"
Если ЗначениеЗаполнено(Стр.Номенклатура) Тогда
МассиРезультатПоиска = Стр.НомерЗаказа.МатериальнаяСпецификация.НайтиСтроки(Новый Структура("НоменклатураИнтермех,Номенклатура", Стр.НоменклатураИнтермех, Стр.Номенклатура));
Иначе
МассиРезультатПоиска = Стр.НомерЗаказа.МатериальнаяСпецификация.НайтиСтроки(новый Структура("НоменклатураИнтермех", Стр.НоменклатураИнтермех, Справочники.Номенклатура.ПустаяСсылка()));
КонецЕсли;
МассиРезультатПоиска = Стр.НомерЗаказа.МатериальнаяСпецификация.НайтиСтроки(Новый Структура("НоменклатураИнтермех,Номенклатура", Стр.НоменклатураИнтермех, Стр.Номенклатура));
Иначе
МассиРезультатПоиска = Стр.НомерЗаказа.МатериальнаяСпецификация.НайтиСтроки(новый Структура("НоменклатураИнтермех", Стр.НоменклатураИнтермех, Справочники.Номенклатура.ПустаяСсылка()));
КонецЕсли;
Вот тут у вас НоменклатураИнтермех - Строка, и вы пытаетесь проверить на "Справочники.Номенклатура.ПустаяСсылка()"
(7) Да, допускаю, что тут есть момент. Но я почему код кидал примерный т.к. я говорю про первый поиск строки
МассиРезультатПоиска = Стр.НомерЗаказа.МатериальнаяСпецификация.НайтиСтроки(Новый Структура("НоменклатураИнтермех,Номенклатура", Стр.НоменклатураИнтермех, Стр.Номенклатура));
Конкретно в этом месте загвоздка и есть
МассиРезультатПоиска = Стр.НомерЗаказа.МатериальнаяСпецификация.НайтиСтроки(Новый Структура("НоменклатураИнтермех,Номенклатура", Стр.НоменклатураИнтермех, Стр.Номенклатура));
Конкретно в этом месте загвоздка и есть
//Если Стр.НоменклатураИнтермех Не пустая строка
Если Стр.НоменклатураИнтермех <> "" Тогда
Если ЗначениеЗаполнено(Стр.Номенклатура) Тогда //Если Стр.Номенклатура заполнена
МассиРезультатПоиска = Стр.НомерЗаказа.МатериальнаяСпецификация.НайтиСтроки(Новый Структура("НоменклатураИнтермех, Номенклатура", Стр.НоменклатураИнтермех, Стр.Номенклатура));
Иначе //Если Стр.Номенклатура НЕ заполнена
МассиРезультатПоиска = Стр.НомерЗаказа.МатериальнаяСпецификация.НайтиСтроки(новый Структура("НоменклатураИнтермех", Стр.НоменклатураИнтермех));
КонецЕсли;
Иначе //Если Стр.НоменклатураИнтермех Пустая строка
Если ЗначениеЗаполнено(Стр.Номенклатура) Тогда //Если Стр.Номенклатура заполнена
МассиРезультатПоиска =Стр.НомерЗаказа.МатериальнаяСпецификация.НайтиСтроки(новый Структура("Номенклатура",Стр.Номенклатура));
КонецЕсли;
КонецЕсли;
ПоказатьВот это вставьте вместо того что у вас там до строки: "Норма = 0".
скрин 1. Содержание Заявка
скрин 2. Содержание ТЧ документа заказ
скрин 3. Содержание Стр.НомерЗаказа.МатериальнаяСпецификация с выделением, что втулка там действительно есть такая
скрин 4 . Показано, что происходит, когда выбираешь эту втулку и нажимаешь показать в отдельном окне
скрин 2. Содержание ТЧ документа заказ
скрин 3. Содержание Стр.НомерЗаказа.МатериальнаяСпецификация с выделением, что втулка там действительно есть такая
скрин 4 . Показано, что происходит, когда выбираешь эту втулку и нажимаешь показать в отдельном окне
(16) Смотри, на первом проходе после НайтиСтроки() получается пустой массив, допустим там отбиралась номенклатура с кодом 25. На втором проходе, когда в найти строки передается номенклатура с кодом 35, массив содержит две строки. НО!!! обе строки с номенклатурой под кодом 35. Если в ТЧ Заявки поменять эти номенклатуры местами, то и в данном цикле будет то же самое. На первом проходе номенклатуру 35 он не найдет, а на втором найдет две номенклатуры с кодом 25. Чудь
(22) Заявка - табличная часть документа "Заявка на получение материала". Туда подбирают из табличной части Материальная спецификация документа Заказ-спецификация нужные позиции номенклатуры. При проведение документа Заявка на получение материалов проверяется, соответствует ли заявленное кол-во тому, что указано в спецификации. В итоге и происходит такая ошибка. Переписал этот код на запрос обычный - результат тот же. Уж и не знаю уже, что за ерунда с базой
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот