Как убрать округление в процедуре таблицы номенклатуры без снятия с поддержки?

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

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #37120
      Фото аватараOdineski
      Участник

        Итак в расширении можно использовать только управляемые формы
        Но у меня обычные
        Там есть процедура
        Процедура ТаблицаНоменклатурыВыбор(Элемент, ВыбСтрока, Колонка, СтандартнаяОбработка)

        Перем Номенклатура, ЕдиницаИзмерения, Количество, Цена, ВалютаЦены, СпособЗаполненияЦен, ЕстьСуммаСНДС;
        Перем ПодразделениеОрганизации, ИсточникФинансирования, ФКР, СтатьяЭКР, Объект, ПартияМатериала, ПартияМатериаловВЭксплуатации, МОЛ;
        Перем СтруктураПараметров;
        Перем Команда, СтруктураПодбора;
        Перем Склад, ТипЦен, СчетУчета;

        СтруктураИсходныхПараметров.Свойство(«ТипЦен», ТипЦен);
        СтруктураИсходныхПараметров.Свойство(«Склад», Склад);
        СтруктураИсходныхПараметров.Свойство(«СпособЗаполненияЦен», СпособЗаполненияЦен);
        СтруктураИсходныхПараметров.Свойство(«Команда», Команда);
        СтруктураИсходныхПараметров.Свойство(«ЕстьСуммаСНДС», ЕстьСуммаСНДС);
        СтандартнаяОбработка = Ложь;
        КоличествоОстатокОрганизации = 0;

        // Инициализируем структуру выбранной строки (реквизиты обработки).
        Если ПодборПоСправочнику Тогда

        Если ВыбСтрока.ЭтоГруппа Тогда
        УстановитьТекущегоРодителя(ВыбСтрока);
        СтандартнаяОбработка = Истина;
        Возврат;
        КонецЕсли;

        Номенклатура = ВыбСтрока;
        ЕдиницаИзмерения = ВыбСтрока.БазоваяЕдиницаИзмерения;
        Спецификация = УправлениеПроизводством.ОпределитьСпецификациюПоУмолчанию(ВыбСтрока, ДатаРасчетов);

        // Получим Цену
        Цена = 0;
        Сумма = 0;

        Если СтруктураИсходныхПараметров.Свойство(«ТипЦен») Тогда
        Если ТипЗнч(СтруктураИсходныхПараметров.ТипЦен) = Тип(«СправочникСсылка.ТипыЦенНоменклатуры») Тогда
        Цена = ОбработкаТабличныхЧастей.ПолучитьЦенуНоменклатуры(Номенклатура,СтруктураИсходныхПараметров.ТипЦен, ДатаРасчетов, ВалютаЦены);
        КонецЕсли;
        КонецЕсли;

        ВалютаЦены = ?(ОбщегоНазначения.ЗначениеНеЗаполнено(ВалютаЦены), ?(СтруктураИсходныхПараметров.Свойство(«ВалютаДокумента»), СтруктураИсходныхПараметров.ВалютаДокумента, мВалютаРегламентированногоУчета), ВалютаЦены);

        Иначе // подбор по запросу

        Если ОбщегоНазначения.ЗначениеНеЗаполнено(ВыбСтрока) Тогда
        Возврат;
        КонецЕсли;

        Если ВыбСтрока.Номенклатура.ЭтоГруппа Тогда
        Родитель = ?(ВыбСтрока.ПереходитьВверх, ВыбСтрока.Номенклатура.Родитель, ВыбСтрока.Номенклатура);
        СтруктураЗапроса = ЭлементыФормы.СписокВидовПодбора.Значение;

        УстановитьТекущегоРодителя(Родитель);
        ПерезаполнитьТаблицуНоменклатуры(Родитель, СтруктураЗапроса);
        Возврат;
        КонецЕсли;

        Номенклатура = ВыбСтрока.Номенклатура;
        ЕдиницаИзмерения = ВыбСтрока.Номенклатура.БазоваяЕдиницаИзмерения;
        ПодразделениеОрганизации = ВыбСтрока.ПодразделениеОрганизации;
        ИсточникФинансирования = ВыбСтрока.ИсточникФинансирования;
        ФКР = ВыбСтрока.ФКР;
        СтатьяЭКР = ВыбСтрока.СтатьяЭКР;
        Объект = ВыбСтрока.Объект;
        ПартияМатериала = ВыбСтрока.ПартияМатериала;
        ПартияМатериаловВЭксплуатации= ВыбСтрока.ПартияМатериаловВЭксплуатации;
        МОЛ = ВыбСтрока.МОЛ;
        СчетУчета = ВыбСтрока.СчетУчета;
        Цена = ТиСиЭМ.ОкрД(ВыбСтрока.Цена * (100 + ПроцентНадбавки) / 100, ДатаДокумента);
        Мне надо цену произвести без округления окрд, как это сделать без снятия с поддержки
        Может быть можно в самой функции округления определить откуда идет запрос и если из этой процедуры то пропускать
        Процедура ТаблицаНоменклатурыВыбор(Элемент, ВыбСтрока, Колонка, СтандартнаяОбработка)

        Перем Номенклатура, ЕдиницаИзмерения, Количество, Цена, ВалютаЦены, СпособЗаполненияЦен, ЕстьСуммаСНДС;
        Перем ПодразделениеОрганизации, ИсточникФинансирования, ФКР, СтатьяЭКР, Объект, ПартияМатериала, ПартияМатериаловВЭксплуатации, МОЛ;
        Перем СтруктураПараметров;
        Перем Команда, СтруктураПодбора;
        Перем Склад, ТипЦен, СчетУчета;

        СтруктураИсходныхПараметров.Свойство(«ТипЦен», ТипЦен);
        СтруктураИсходныхПараметров.Свойство(«Склад», Склад);
        СтруктураИсходныхПараметров.Свойство(«СпособЗаполненияЦен», СпособЗаполненияЦен);
        СтруктураИсходныхПараметров.Свойство(«Команда», Команда);
        СтруктураИсходныхПараметров.Свойство(«ЕстьСуммаСНДС», ЕстьСуммаСНДС);
        СтандартнаяОбработка = Ложь;
        КоличествоОстатокОрганизации = 0;

        // Инициализируем структуру выбранной строки (реквизиты обработки).
        Если ПодборПоСправочнику Тогда

        Если ВыбСтрока.ЭтоГруппа Тогда
        УстановитьТекущегоРодителя(ВыбСтрока);
        СтандартнаяОбработка = Истина;
        Возврат;
        КонецЕсли;

        Номенклатура = ВыбСтрока;
        ЕдиницаИзмерения = ВыбСтрока.БазоваяЕдиницаИзмерения;
        Спецификация = УправлениеПроизводством.ОпределитьСпецификациюПоУмолчанию(ВыбСтрока, ДатаРасчетов);

        // Получим Цену
        Цена = 0;
        Сумма = 0;

        Если СтруктураИсходныхПараметров.Свойство(«ТипЦен») Тогда
        Если ТипЗнч(СтруктураИсходныхПараметров.ТипЦен) = Тип(«СправочникСсылка.ТипыЦенНоменклатуры») Тогда
        Цена = ОбработкаТабличныхЧастей.ПолучитьЦенуНоменклатуры(Номенклатура,СтруктураИсходныхПараметров.ТипЦен, ДатаРасчетов, ВалютаЦены);
        КонецЕсли;
        КонецЕсли;

        ВалютаЦены = ?(ОбщегоНазначения.ЗначениеНеЗаполнено(ВалютаЦены), ?(СтруктураИсходныхПараметров.Свойство(«ВалютаДокумента»), СтруктураИсходныхПараметров.ВалютаДокумента, мВалютаРегламентированногоУчета), ВалютаЦены);

        Иначе // подбор по запросу

        Если ОбщегоНазначения.ЗначениеНеЗаполнено(ВыбСтрока) Тогда
        Возврат;
        КонецЕсли;

        Если ВыбСтрока.Номенклатура.ЭтоГруппа Тогда
        Родитель = ?(ВыбСтрока.ПереходитьВверх, ВыбСтрока.Номенклатура.Родитель, ВыбСтрока.Номенклатура);
        СтруктураЗапроса = ЭлементыФормы.СписокВидовПодбора.Значение;

        УстановитьТекущегоРодителя(Родитель);
        ПерезаполнитьТаблицуНоменклатуры(Родитель, СтруктураЗапроса);
        Возврат;
        КонецЕсли;

        Номенклатура = ВыбСтрока.Номенклатура;
        ЕдиницаИзмерения = ВыбСтрока.Номенклатура.БазоваяЕдиницаИзмерения;
        ПодразделениеОрганизации = ВыбСтрока.ПодразделениеОрганизации;
        ИсточникФинансирования = ВыбСтрока.ИсточникФинансирования;
        ФКР = ВыбСтрока.ФКР;
        СтатьяЭКР = ВыбСтрока.СтатьяЭКР;
        Объект = ВыбСтрока.Объект;
        ПартияМатериала = ВыбСтрока.ПартияМатериала;
        ПартияМатериаловВЭксплуатации= ВыбСтрока.ПартияМатериаловВЭксплуатации;
        МОЛ = ВыбСтрока.МОЛ;
        СчетУчета = ВыбСтрока.СчетУчета;
        Цена = ТиСиЭМ.ОкрД(ВыбСтрока.Цена * (100 + ПроцентНадбавки) / 100, ДатаДокумента);

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

          В расширениях нельзя менять код обычных форм напрямую, но можно влиять на логику через расширения и события. В вашем случае, чтобы изменить поведение округления в процедуре ТаблицаНоменклатурыВыбор, где вызывается

          |Цена = ТиСиЭМ.ОкрД(ВыбСтрока.Цена * (100 + ПроцентНадбавки) / 100, ДатаДокумента);

          а нужно убрать округление, есть несколько вариантов без снятия с поддержки:

          1. Переопределить процедуру ТаблицаНоменклатурыВыбор в расширении
          В расширении создайте процедуру с таким же именем и параметрами, скопируйте код из основной конфигурации, но замените строку с округлением на:

          |Цена = ВыбСтрока.Цена * (100 + ПроцентНадбавки) / 100;

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

          2. Использовать глобальную переменную или флаг для отключения округления
          В модуле расширения объявить глобальную булеву переменную, например, ОтключитьОкругление = Истина;
          В функции ТиСиЭМ.ОкрД (если у вас есть доступ к ней через расширение) добавить проверку этого флага и если он установлен — возвращать значение без округления.
          Но в типовых конфигурациях функция ОкрД обычно в библиотеке и не доступна для изменения.
          Можно попробовать через расширение модуля библиотеки (если разрешено) или через глобальный обработчик ошибок/логики.

          3. Обойти вызов функции округления, передавая уже округленное значение
          Если ТиСиЭМ.ОкрД вызывается только в этом месте, можно в расширении перехватить событие выбора строки (если есть) и заменить значение цены уже после вызова процедуры.
          Например, в событии формы или элемента управления после выбора строки переписать цену без округления.

          4. Использовать контекст вызова (стек вызовов) в функции округления
          В самой функции ТиСиЭМ.ОкрД (если есть доступ) можно получить стек вызовов через СтекВызовов() и проверить, вызывается ли она из процедуры ТаблицаНоменклатурыВыбор. Если да — не округлять.
          Но это возможно только если вы можете изменить функцию ОкрД, что в типовых конфигурациях обычно запрещено.

          5. Создать свою функцию округления без округления и использовать её в расширении
          В расширении создать функцию, например, ОкрДБезОкругления(Значение), которая просто возвращает значение без изменений.
          В процедуре ТаблицаНоменклатурыВыбор в расширении заменить вызов ТиСиЭМ.ОкрД на ОкрДБезОкругления.
          Но опять же, придется переопределять процедуру.

          Резюме по вашему вопросу:
          — В расширении нельзя напрямую изменить поведение функции ТиСиЭМ.ОкрД или процедуры ТаблицаНоменклатурыВыбор в обычной форме.
          — Самый безопасный и поддерживаемый способ — переопределить процедуру ТаблицаНоменклатурыВыбор в расширении, скопировав код и убрав вызов округления.
          — Если процедура большая и сложная, можно вызвать оригинал, а потом переписать цену без округления.
          — Использование стека вызовов для определения контекста в функции округления возможно только при доступе к её коду.

          Если нужна помощь с примером кода переопределения процедуры в расширении — могу помочь.
          Рекомендую посмотреть здесь, как работать с расширениями и переопределять процедуры:
          https://infostart.ru/public/1044329/
          https://infostart.ru/public/1044330/

          Там подробно описано, как в расширении переопределять процедуры и работать с обычными формами.

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