Как исправить функцию ПолучитьОбщиеПоказатели для корректной работы?

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Как исправить функцию ПолучитьОбщиеПоказатели для корректной работы?

Просмотр 1 ветки ответов
  • Автор
    Записи
    • #38694
      Фото аватараOdineski
      Участник

        поправь тогда Функция ПолучитьОбщиеПоказатели(Знач мДокументы) Экспорт

        ПустойРезультат = Новый Структура(«_Вес,_Объем,_Площадь», 0, 0, 0);
        Мета = мДокументы[0].Метаданные();

        Если ОбщегоНазначения.ЭтоРегистрСведений(Мета) Тогда

        мРезультат = Новый Массив;
        Для каждого Запись из мДокументы Цикл
        мРезультат.Добавить(Запись.Ссылка);
        КонецЦикла;
        мДокументы = мРезультат;
        Мета = мДокументы[0].Метаданные();

        КонецЕсли;

        Если Мета.ТабличныеЧасти.Найти(«Товары») <> Неопределено Тогда
        ИмяТЧ = «Товары»;
        ИначеЕсли Мета.ТабличныеЧасти.Найти(«ОтгружаемыеТовары») <> Неопределено Тогда
        ИмяТЧ = «ОтгружаемыеТовары»;
        Иначе
        Возврат ПустойРезультат;
        КонецЕсли;

        _Вес = 0;
        _Объем = 0;
        _Площадь = 0;

        УстановитьПривилегированныйРежим(Истина);
        Запрос = Новый Запрос;
        Запрос.УстановитьПараметр(«МассивДокументов», мДокументы);
        Шаблон = «ВЫБРАТЬ *,
        |Таблица.Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
        |Таблица.Номенклатура.НаименованиеПолное КАК НаименованиеПолное,
        |Таблица.Номенклатура.Артикул КАК Артикул,
        |Таблица.Номенклатура.ВесЧислитель КАК ВесЧислитель,
        |Таблица.Номенклатура.ВесЗнаменатель КАК ВесЗнаменатель,
        |Таблица.Номенклатура.ВесЕдиницаИзмерения КАК ВесЕдиницаИзмерения,
        |Таблица.Номенклатура.ОбъемЕдиницаИзмерения КАК ОбъемЕдиницаИзмерения,
        |Таблица.Номенклатура.ОбъемЧислитель КАК ОбъемЧислитель,
        |Таблица.Номенклатура.ОбъемЗнаменатель КАК ОбъемЗнаменатель,
        |Таблица.Номенклатура.ПлощадьЕдиницаИзмерения КАК ПлощадьЕдиницаИзмерения,
        |Таблица.Номенклатура.ПлощадьЧислитель КАК ПлощадьЧислитель,
        |Таблица.Номенклатура.ПлощадьЗнаменатель КАК ПлощадьЗнаменатель
        |ИЗ
        |Документ.%1.%2 КАК Таблица
        |ГДЕ
        |Таблица.Ссылка В (&МассивДокументов)»;

        Запрос.Текст = СтрШаблон(Шаблон, Мета.Имя, ИмяТЧ);
        РезультатЗапроса = Запрос.Выполнить();

        Если РезультатЗапроса.Пустой() Тогда
        Возврат ПустойРезультат;
        КонецЕсли;

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

        Если Выборка.Номенклатура.Пустая() Тогда
        Продолжить;
        КонецЕсли;

        Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Выборка, «Отменено»)
        И Выборка.Отменено Тогда
        Продолжить;
        КонецЕсли;

        Реквизиты = РеквизитыНоменклатуры(Выборка);
        _Вес = _Вес + ПолучитьВесВСтрокеТЧ(Выборка, Реквизиты);
        _Объем = _Объем + ПолучитьОбъемВСтрокеТЧ(Выборка, Реквизиты);
        _Площадь = _Площадь + Выборка.Количество * Реквизиты.ПлощадьЧислитель / Реквизиты.ПлощадьЗнаменатель;

        КонецЦикла;

        Возврат Новый Структура(«_Вес,_Объем,_Площадь», _Вес, _Объем, _Площадь);

        КонецФункции

      • #38695
        bot_avaOdin — Одинэсник
        Участник

          Ниже исправленный вариант функции. Основная замена:

          на получение метаданных по типу:

          Также добавлена проверка пустого массива и обработка случая, когда из формы списка передается структура с полем Ссылка.

          Но в приведенном варианте есть важный нюанс: возврат из блока Попытка до выполнения строки:

          может оставить привилегированный режим включенным до завершения серверного вызова. Поэтому лучше вынести результат в переменную и отключить привилегированный режим перед единственным возвратом.

          Более безопасный фрагмент завершения функции:

          ## Еще одна важная правка

          В вашей функции есть этот код:

          Его лучше убрать из данной функции. Функция формирует запрос к объекту:

          То есть она рассчитана именно на документы с табличными частями. Если передать туда регистр сведений, запрос с конструкцией Документ.ИмяРегистра.ТабличнаяЧасть будет некорректным.

          Функция должна получать массив:

          где элемент имеет тип:

          Для вашей формы списка правильное заполнение массива должно выглядеть примерно так:

          Если текущая строка формы уже является ссылкой, тогда достаточно:

          После исправления перед вызовом серверной функции проверьте тип:

          Ожидаемый результат:

          или другой тип ссылки на документ.

          Ключевая исправленная строка:

          А строку:

          нужно удалить полностью.

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С