Платформа: 8.3.16.1876 Режим БД: клиент-серверный Конфигурация. Название: Управление производственным предприятием для Украины, редакция 1.3 (1.3.85.1) Конфигурация. Основной режим запуска: Обычное приложение Конфигурация. Вариант встроенного языка: Русский Конфигурация. Режим управления блокировкой данных: Управляемый Конфигурация. Режим совместимости: Версия8_3_10 Конфигурация. Режим использования синхронных вызовов: Использовать Конфигурация. Версия БСП: 102 Инструменты разработчика. Версия: Портативный 7.50.1p Инструменты разработчика. Инструмент: Консоль кода Инструменты разработчика. Перехват клавиатурного ввода: Да Инструменты разработчика. Объекты на сервере: Нет Инструменты разработчика. Серверный модуль БСП: Нет Клиент. Приложение: Обычное приложение 32б Клиент. Проверка модальных вызовов: Нет Клиент. Язык интерфейса конфигурации: ru Клиент. Язык интерфейса системы: ru_UA Клиент. Отладка разрешена: Да Клиент. Постоянный кэш метаданных: Да Клиент. ОС: Майкрософт Windows 10 Корпоративная LTSC 64-разрядная Русский Клиент. ОС от имени администратора: Да Клиент. ОС выполнение BAT: Да Клиент. ОС ’ҐЄгй п Є®¤®ў п бва Ёж : 866 Клиент-Сервер. Пинг: 0мс
При попытке добавить параметр либо в начале, либо в цикле - вылетает ошибка Когда комментирую использование этой структуры вообще далеко внизу по коду - ошибка исчезает Видео в прикрепленном архиве
{ВнешняяОбработка.ирКлсПолеТекстаПрограммы.МодульОбъекта(15465)}: Индекс находится за границами массива СтрокаПараметра = ПараметрыМетодаМодуля[мНомерПараметра - 1];
Дата = Дата(2024, 08, 01); Градус = Справочники.Склады.НайтиПоНаименованию("Градус", Истина); //Ниже нужно вставить СерияНоменклатуры Параметры = Новый Структура("Дата1, Дата2, Градус, Качество, Организация, Номенклатура, ХарактеристикаНоменклатуры, ", НачалоМесяца(Дата), КонецМесяца(Дата), Градус, Справочники.Качество.Новый, Константы.ОрганизацияФорма1.Получить()); Минуса = Запрос("ВЫБРАТЬ | Склад КАК Склад, | Номенклатура КАК Номенклатура, | ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры, | СерияНоменклатуры КАК СерияНоменклатуры, | МИНИМУМ(КоличествоКонечныйОстаток) КАК Количество | ИЗ | РегистрНакопления.ТоварыОрганизаций.ОстаткиИОбороты(&Дата1, &Дата2, Регистратор, Движения, | Склад В ИЕРАРХИИ (&Градус) | И Организация = &Организация | И Качество = &Качество | ) | СГРУППИРОВАТЬ ПО | Номенклатура, | ХарактеристикаНоменклатуры, | СерияНоменклатуры, | Склад |ИМЕЮЩИЕ МИНИМУМ(КоличествоКонечныйОстаток)<0 |УПОРЯДОЧИТЬ ПО Номенклатура, ХарактеристикаНоменклатуры, СерияНоменклатуры, Количество УБЫВ |", Параметры, 2); Список = ТаблицаУникальных(Минуса, "Номенклатура, ХарактеристикаНоменклатуры, СерияНоменклатуры"); Для Каждого Строка ИЗ Список Цикл //Тут нужно вставить Строка.Номенклатура Параметры.Вставить("Номенклатура", Ст Доноры = Запрос("ВЫБРАТЬ | ТоварыОрганизаций.Склад КАК Склад, | ТоварыОрганизаций.Номенклатура КАК Номенклатура, | ТоварыОрганизаций.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры, | ТоварыОрганизаций.СерияНоменклатуры КАК СерияНоменклатуры, | ТоварыОрганизаций.Количество-ТоварыНаСкладах.Количество КАК Разница |ИЗ( ВЫБРАТЬ | Склад КАК Склад, | Номенклатура КАК Номенклатура, | ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры, | СерияНоменклатуры КАК СерияНоменклатуры, | МИНИМУМ(КоличествоКонечныйОстаток) КАК Количество | ИЗ | РегистрНакопления.ТоварыОрганизаций.ОстаткиИОбороты(&Дата1, &Дата2, Регистратор, Движения, | Склад В (&Склады) | И Организация = &Организация | И Качество = &Качество | //И Номенклатура = &Номенклатура | ) | СГРУППИРОВАТЬ ПО | Номенклатура, | ХарактеристикаНоменклатуры, | СерияНоменклатуры, | Склад |ИМЕЮЩИЕ МИНИМУМ(КоличествоКонечныйОстаток)>0) КАК ТоварыОрганизаций |ЛЕВОЕ СОЕДИНЕНИЕ | (ВЫБРАТЬ | Склад КАК Склад, | Номенклатура КАК Номенклатура, | ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры, | СерияНоменклатуры КАК СерияНоменклатуры, | МИНИМУМ(КоличествоКонечныйОстаток) КАК Количество | ИЗ | РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&Дата1, &Дата2, Регистратор, Движения, | Склад В (&Склады) | И Качество = &Качество | // И Номенклатура = &Номенклатура | ) | СГРУППИРОВАТЬ ПО | Номенклатура, | ХарактеристикаНоменклатуры, | СерияНоменклатуры, | Склад) КАК ТоварыНаСкладах |ПО ТоварыНаСкладах.Склад = ТоварыОрганизаций.Склад | И ТоварыНаСкладах.Номенклатура = ТоварыОрганизаций.Номенклатура | И ТоварыНаСкладах.ХарактеристикаНоменклатуры = ТоварыОрганизаций.ХарактеристикаНоменклатуры | И ТоварыНаСкладах.СерияНоменклатуры = ТоварыОрганизаций.СерияНоменклатуры |ГДЕ ТоварыОрганизаций.Количество>ТоварыНаСкладах.Количество |УПОРЯДОЧИТЬ ПО | ТоварыОрганизаций.Номенклатура, ТоварыОрганизаций.ХарактеристикаНоменклатуры, ТоварыОрганизаций.СерияНоменклатуры, ТоварыНаСкладах.Количество-ТоварыОрганизаций.Количество |", Параметры, 2); КонецЦикла;
вдруг нужно будет... сама функция Запрос (там по цепочке вызывается ещё куча функций, закомментируйте их для теста)
//ZDN 28.07.20 Функция для получения объекта(-ов) базы по заданному запросу //ZDN 07.06.23 Добавляем возможность в качестве шаблона использовать уже существующий запрос //Примеры: // Запрос("ВЫБРАТЬ Первые 1 Регистратор // |ИЗ РегистрНакопления.ОплатаСчетовИЗаказов // |ГДЕ СчетНаОплату=&Заказ // | И СуммаАванса>0 // |УПОРЯДОЧИТЬ ПО Период", Новый Структура("Заказ", Строка.Заказ)); // // Запрос("Выбрать * из РегистрНакопления.ЗапасыНаСкладах.ОстаткиИОбороты(, &д, Регистратор) // |ГДЕ СтруктурнаяЕдиница=&с и Номенклатура=&н и Регистратор<>&р", // Новый Структура("д, с, н, р", // Объект.Дата, Объект.СтруктурнаяЕдиницаЗапасов, Строка.Номенклатура, Объект.Ссылка), 2); // // Запрос("Выбрать Сумма(ЕдиницаИзмерения.Вес*Количество) ИЗ Документ.ПеремещениеТоваров.Товары // |ГДЕ Ссылка = &Перемещение", Строка, 1); Функция Запрос(Запрос_ТекстЗапроса, Параметры1=Неопределено, ТипРезультата=0, Поле="", Параметры2=Неопределено, Параметры3=Неопределено) Экспорт
//ZDN 07.06.23 Добавляем возможность в качестве шаблона использовать уже существующий запрос Если ТипЗнч(Запрос_ТекстЗапроса) = Тип("Запрос") Тогда //ZDN 07.06.23 Для существующего Запроса нужно заполнение с проверкой (чтобы не обнулить существующие параметры) Запрос = Новый Запрос(Запрос_ТекстЗапроса.Текст); //ZDN 21.11.23 Так же перенесём МенеджерВременныхТаблиц Запрос.МенеджерВременныхТаблиц = Запрос_ТекстЗапроса.МенеджерВременныхТаблиц; //ZDN 07.06.23 Используем заполнение через функцию Копия() //Для Каждого Параметр Из Запрос_ТекстЗапроса.Параметры Цикл Запрос.Параметры.Вставить(Параметр.Ключ, Параметр.Значение) КонецЦикла; //Для Каждого Параметр Из Запрос.НайтиПараметры() Цикл Если НЕ Запрос.Параметры.Свойство(Параметр.Имя) Тогда Запрос.Параметры.Вставить(Параметр.Имя) КонецЕсли КонецЦикла; Копия(Запрос_ТекстЗапроса.Параметры, 2, Запрос.Параметры); Копия(Запрос.НайтиПараметры(), 3, Запрос.Параметры); ИначеЕсли ТипЗнч(Запрос_ТекстЗапроса) = Тип("Строка") Тогда ТекстЗапроса = Запрос_ТекстЗапроса; //ZDN 22.03.23 Очистим текст запроса от символов перевода строки (если вызов из конфигуратора) Если Найти(ТекстЗапроса, "¶") Тогда Пока Найти(ТекстЗапроса, "¶" + Символы.Таб + Символы.Таб) Цикл ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "¶" + Символы.Таб + Символы.Таб, "¶" + Символы.Таб) КонецЦикла; ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "¶" + Символы.Таб, Символы.ПС); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "¶", Символы.ПС); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "|", ""); КонецЕсли; Запрос = Новый Запрос(ТекстЗапроса); Для Каждого Параметр Из Запрос.НайтиПараметры() Цикл Запрос.Параметры.Вставить(Параметр.Имя) КонецЦикла; Иначе //ZDN 07.06.23 Возвращаем текст ошибки, если ТекстЗапроса указан неверно Возврат "Ошибка: ТекстЗапроса не указан |Вместо него можно указать уже существующий Запрос" КонецЕсли;
//ZDN 07.06.23 Переносим заполнение параметров выше, так как для существующего Запроса нужно заполнение с проверкой (чтобы не обнулить существующие параметры) //ZDN 12.10.20 Теперь в качестве источника параметров можно передавать любой объект (не только структуру) //Если Параметры<>Неопределено Тогда // Для Каждого Параметр Из Параметры Цикл Запрос.УстановитьПараметр(Параметр.Ключ, Параметр.Значение) КонецЦикла; //КонецЕсли; //Для Каждого Параметр Из Запрос.НайтиПараметры() Цикл Запрос.Параметры.Вставить(Параметр.Имя) КонецЦикла;
//ZDN 28.07.21 Для исключительных случаев добавляем ещё два источника параметров (приоритет с конца) //Если Параметры3<>Неопределено Тогда ЗаполнитьЗначенияСвойств(Запрос.Параметры, Параметры3) КонецЕсли; //Если Параметры2<>Неопределено Тогда ЗаполнитьЗначенияСвойств(Запрос.Параметры, Параметры2) КонецЕсли; //Если Параметры <>Неопределено Тогда ЗаполнитьЗначенияСвойств(Запрос.Параметры, Параметры ) КонецЕсли;
//ZDN 04.05.22 Добавляем возможность обращаться к самому параметру через &П1, &П2, &П3 Если Параметры3<>Неопределено Тогда ЗаполнитьСвойства(Запрос.Параметры, Параметры3) КонецЕсли; Если Параметры2<>Неопределено Тогда ЗаполнитьСвойства(Запрос.Параметры, Параметры2) КонецЕсли; Если Параметры1<>Неопределено Тогда ЗаполнитьСвойства(Запрос.Параметры, Параметры1) КонецЕсли; ЗаполнитьЗначенияСвойств(Запрос.Параметры, Новый Структура("П1, П2, П3", Параметры1, Параметры2, Параметры3));
Результат=Запрос.Выполнить(); //---------------------------------------------------------------- Если ТипРезультата=-1 Тогда //-1 = Запрос.Выполнить() ИначеЕсли ТипРезультата=-2 Тогда //-2 = Запрос.Выполнить().Выбрать() Результат=Результат.Выбрать(); ИначеЕсли ТипРезультата=0 Тогда // 0 = Первая строка результата или указанное поле из неё Результат=Результат.Выбрать(); Результат=?(Результат.Следующий(), ?(Поле<>"", Результат[Поле], Результат), Неопределено); ИначеЕсли ТипРезультата=1 Тогда // 1 = Первое или указанное поле из первой строки результата Результат=Результат.Выбрать(); Результат=?(Результат.Следующий(), ?(Поле<>"", Результат[Поле], Результат.Получить(0)), Неопределено); ИначеЕсли ТипРезультата=2 Тогда // 2 = Таблица значений Результат=Результат.Выгрузить(); ИначеЕсли ТипРезультата=3 Тогда // 3 = Массив значений (по умолчанию выгружается первая колонка) Результат=Результат.Выгрузить(); Если Поле="" Тогда Поле=Результат.Колонки[0].Имя КонецЕсли; Результат=?(Результат.Колонки.Найти(Поле)=Неопределено, Новый Массив, Результат.ВыгрузитьКолонку(Поле)); ИначеЕсли ТипРезультата=4 Тогда // 4 = Список значений (по умолчанию выгружается первая колонка) Результат=Результат.Выгрузить(); //ZDN 07.06.23 Дорабатываем получение представления списка //Если Поле="" Тогда Поле=Результат.Колонки[0].Имя КонецЕсли; // ////ZDN 21.09.21 Добавляем определение представления //Если Результат.Колонки.Количество()>1 Тогда // Представление = ?(Результат.Колонки.Найти(Поле + "Представление")=Неопределено, Неопределено, Результат.ВыгрузитьКолонку(Поле + "Представление")); //КонецЕсли; // //Результат=?(Результат.Колонки.Найти(Поле)=Неопределено, Новый Массив, Результат.ВыгрузитьКолонку(Поле)); //СписокЗначений=Новый СписокЗначений; //СписокЗначений.ЗагрузитьЗначения(Результат); // ////ZDN 21.09.21 Заполняем представления //Если Представление <> Неопределено Тогда // ДляКаждого(СписокЗначений,, "Элемент.Представление = П1[П]; П = П + 1", 0, Представление); //КонецЕсли; СписокЗначений = Новый СписокЗначений; ПрисвоитьЕслиРавно(Поле, "", Результат.Колонки[0].Имя); Представление = ЕслиОпределено(Результат.Колонки.Найти(Поле + "Представление"), "Имя",, ?(Результат.Колонки.Количество()>1, Результат.Колонки[1].Имя, "")); Если Представление = "" Тогда СписокЗначений.ЗагрузитьЗначения(Результат.ВыгрузитьКолонку(Поле)) Иначе Для Каждого Строка ИЗ Результат Цикл СписокЗначений.Добавить(Строка[Поле], Строка[Представление]) КонецЦикла; КонецЕсли; Результат=СписокЗначений; Иначе //ZDN 07.06.23 При указании другого значения типа результата - возвращаем строку описания типов //Результат = Неопределено // * = Неопределено Результат = "Ошибка: не верно указан ТипРезультата | |-1 = Запрос.Выполнить() |-2 = Запрос.Выполнить().Выбрать() | 0 = Первая строка результата или указанное ""Поле"" из неё | 1 = Первое или указанное ""Поле"" из первой строки результата | 2 = Таблица значений | 3 = Массив значений (первая либо указанная в ""Поле"" колонка) | 4 = Список значений (первая либо указанная в ""Поле"" колонка с представлением в Поле+""Представление"" либо второй колонке)"; КонецЕсли; Возврат Результат КонецФункции
Сообщение отредактировал GetNight - Пятница, 01.11.2024, 17:43
У меня не воспроизводится. Нужен текстовый файл с текстом алгоритма и точное описание действия пользователя непосредственно перед появлением окна ошибки.
Ошибку воспроизвел https://www.hostedredmine.com/issues/995280 Снова прошу стараться готовить независимый от конфигурации тест. В данном случае нужно было в чистой конфигурации открыть консоль кода, включить флажок "Модуль" у алгоритма и добавить в алгоритм функцию Запрос().
Снова прошу стараться готовить независимый от конфигурации тест.В данном случае нужно было в чистой конфигурации открыть консоль кода, включить флажок "Модуль" у алгоритма и добавить в алгоритм функцию Запрос().
Хотел прислать вам все используемые модули, но по цепочке потянулся их с десяток... Иногда ошибка перестаёт возникать, когда начинаешь упрощать (я вам уже прислал максимально упрощенный от исходного).
Цитатаtormozit ()
Нужен текстовый файл с текстом алгоритма и точное описание действия пользователя непосредственно перед появлением окна ошибки
Я же вроде все тексты забросил под спойлер?.. плюс повесил видео, где видны все мои действия и реакция иР...
П.С. Спасибо за реагирование, буду ждать обновления.