База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как убрать округление в процедуре таблицы номенклатуры без снятия с поддержки?
- В этой теме 1 ответ, 2 участника, последнее обновление 1 час, 22 минуты назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
13 мая 2026 в 11:47 #37120
Итак в расширении можно использовать только управляемые формы
Но у меня обычные
Там есть процедура
Процедура ТаблицаНоменклатурыВыбор(Элемент, ВыбСтрока, Колонка, СтандартнаяОбработка)Перем Номенклатура, ЕдиницаИзмерения, Количество, Цена, ВалютаЦены, СпособЗаполненияЦен, ЕстьСуммаСНДС;
Перем ПодразделениеОрганизации, ИсточникФинансирования, ФКР, СтатьяЭКР, Объект, ПартияМатериала, ПартияМатериаловВЭксплуатации, МОЛ;
Перем СтруктураПараметров;
Перем Команда, СтруктураПодбора;
Перем Склад, ТипЦен, СчетУчета;СтруктураИсходныхПараметров.Свойство(«ТипЦен», ТипЦен);
СтруктураИсходныхПараметров.Свойство(«Склад», Склад);
СтруктураИсходныхПараметров.Свойство(«СпособЗаполненияЦен», СпособЗаполненияЦен);
СтруктураИсходныхПараметров.Свойство(«Команда», Команда);
СтруктураИсходныхПараметров.Свойство(«ЕстьСуммаСНДС», ЕстьСуммаСНДС);
СтандартнаяОбработка = Ложь;
КоличествоОстатокОрганизации = 0;// Инициализируем структуру выбранной строки (реквизиты обработки).
Если ПодборПоСправочнику ТогдаЕсли ВыбСтрока.ЭтоГруппа Тогда
УстановитьТекущегоРодителя(ВыбСтрока);
СтандартнаяОбработка = Истина;
Возврат;
КонецЕсли;Номенклатура = ВыбСтрока;
ЕдиницаИзмерения = ВыбСтрока.БазоваяЕдиницаИзмерения;
Спецификация = УправлениеПроизводством.ОпределитьСпецификациюПоУмолчанию(ВыбСтрока, ДатаРасчетов);// Получим Цену
Цена = 0;
Сумма = 0;Если СтруктураИсходныхПараметров.Свойство(«ТипЦен») Тогда
Если ТипЗнч(СтруктураИсходныхПараметров.ТипЦен) = Тип(«СправочникСсылка.ТипыЦенНоменклатуры») Тогда
Цена = ОбработкаТабличныхЧастей.ПолучитьЦенуНоменклатуры(Номенклатура,СтруктураИсходныхПараметров.ТипЦен, ДатаРасчетов, ВалютаЦены);
КонецЕсли;
КонецЕсли;ВалютаЦены = ?(ОбщегоНазначения.ЗначениеНеЗаполнено(ВалютаЦены), ?(СтруктураИсходныхПараметров.Свойство(«ВалютаДокумента»), СтруктураИсходныхПараметров.ВалютаДокумента, мВалютаРегламентированногоУчета), ВалютаЦены);
Иначе // подбор по запросу
Если ОбщегоНазначения.ЗначениеНеЗаполнено(ВыбСтрока) Тогда
Возврат;
КонецЕсли;Если ВыбСтрока.Номенклатура.ЭтоГруппа Тогда
Родитель = ?(ВыбСтрока.ПереходитьВверх, ВыбСтрока.Номенклатура.Родитель, ВыбСтрока.Номенклатура);
СтруктураЗапроса = ЭлементыФормы.СписокВидовПодбора.Значение;УстановитьТекущегоРодителя(Родитель);
ПерезаполнитьТаблицуНоменклатуры(Родитель, СтруктураЗапроса);
Возврат;
КонецЕсли;Номенклатура = ВыбСтрока.Номенклатура;
ЕдиницаИзмерения = ВыбСтрока.Номенклатура.БазоваяЕдиницаИзмерения;
ПодразделениеОрганизации = ВыбСтрока.ПодразделениеОрганизации;
ИсточникФинансирования = ВыбСтрока.ИсточникФинансирования;
ФКР = ВыбСтрока.ФКР;
СтатьяЭКР = ВыбСтрока.СтатьяЭКР;
Объект = ВыбСтрока.Объект;
ПартияМатериала = ВыбСтрока.ПартияМатериала;
ПартияМатериаловВЭксплуатации= ВыбСтрока.ПартияМатериаловВЭксплуатации;
МОЛ = ВыбСтрока.МОЛ;
СчетУчета = ВыбСтрока.СчетУчета;
Цена = ТиСиЭМ.ОкрД(ВыбСтрока.Цена * (100 + ПроцентНадбавки) / 100, ДатаДокумента);
Мне надо цену произвести без округления окрд, как это сделать без снятия с поддержки
Может быть можно в самой функции округления определить откуда идет запрос и если из этой процедуры то пропускать
Процедура ТаблицаНоменклатурыВыбор(Элемент, ВыбСтрока, Колонка, СтандартнаяОбработка)Перем Номенклатура, ЕдиницаИзмерения, Количество, Цена, ВалютаЦены, СпособЗаполненияЦен, ЕстьСуммаСНДС;
Перем ПодразделениеОрганизации, ИсточникФинансирования, ФКР, СтатьяЭКР, Объект, ПартияМатериала, ПартияМатериаловВЭксплуатации, МОЛ;
Перем СтруктураПараметров;
Перем Команда, СтруктураПодбора;
Перем Склад, ТипЦен, СчетУчета;СтруктураИсходныхПараметров.Свойство(«ТипЦен», ТипЦен);
СтруктураИсходныхПараметров.Свойство(«Склад», Склад);
СтруктураИсходныхПараметров.Свойство(«СпособЗаполненияЦен», СпособЗаполненияЦен);
СтруктураИсходныхПараметров.Свойство(«Команда», Команда);
СтруктураИсходныхПараметров.Свойство(«ЕстьСуммаСНДС», ЕстьСуммаСНДС);
СтандартнаяОбработка = Ложь;
КоличествоОстатокОрганизации = 0;// Инициализируем структуру выбранной строки (реквизиты обработки).
Если ПодборПоСправочнику ТогдаЕсли ВыбСтрока.ЭтоГруппа Тогда
УстановитьТекущегоРодителя(ВыбСтрока);
СтандартнаяОбработка = Истина;
Возврат;
КонецЕсли;Номенклатура = ВыбСтрока;
ЕдиницаИзмерения = ВыбСтрока.БазоваяЕдиницаИзмерения;
Спецификация = УправлениеПроизводством.ОпределитьСпецификациюПоУмолчанию(ВыбСтрока, ДатаРасчетов);// Получим Цену
Цена = 0;
Сумма = 0;Если СтруктураИсходныхПараметров.Свойство(«ТипЦен») Тогда
Если ТипЗнч(СтруктураИсходныхПараметров.ТипЦен) = Тип(«СправочникСсылка.ТипыЦенНоменклатуры») Тогда
Цена = ОбработкаТабличныхЧастей.ПолучитьЦенуНоменклатуры(Номенклатура,СтруктураИсходныхПараметров.ТипЦен, ДатаРасчетов, ВалютаЦены);
КонецЕсли;
КонецЕсли;ВалютаЦены = ?(ОбщегоНазначения.ЗначениеНеЗаполнено(ВалютаЦены), ?(СтруктураИсходныхПараметров.Свойство(«ВалютаДокумента»), СтруктураИсходныхПараметров.ВалютаДокумента, мВалютаРегламентированногоУчета), ВалютаЦены);
Иначе // подбор по запросу
Если ОбщегоНазначения.ЗначениеНеЗаполнено(ВыбСтрока) Тогда
Возврат;
КонецЕсли;Если ВыбСтрока.Номенклатура.ЭтоГруппа Тогда
Родитель = ?(ВыбСтрока.ПереходитьВверх, ВыбСтрока.Номенклатура.Родитель, ВыбСтрока.Номенклатура);
СтруктураЗапроса = ЭлементыФормы.СписокВидовПодбора.Значение;УстановитьТекущегоРодителя(Родитель);
ПерезаполнитьТаблицуНоменклатуры(Родитель, СтруктураЗапроса);
Возврат;
КонецЕсли;Номенклатура = ВыбСтрока.Номенклатура;
ЕдиницаИзмерения = ВыбСтрока.Номенклатура.БазоваяЕдиницаИзмерения;
ПодразделениеОрганизации = ВыбСтрока.ПодразделениеОрганизации;
ИсточникФинансирования = ВыбСтрока.ИсточникФинансирования;
ФКР = ВыбСтрока.ФКР;
СтатьяЭКР = ВыбСтрока.СтатьяЭКР;
Объект = ВыбСтрока.Объект;
ПартияМатериала = ВыбСтрока.ПартияМатериала;
ПартияМатериаловВЭксплуатации= ВыбСтрока.ПартияМатериаловВЭксплуатации;
МОЛ = ВыбСтрока.МОЛ;
СчетУчета = ВыбСтрока.СчетУчета;
Цена = ТиСиЭМ.ОкрД(ВыбСтрока.Цена * (100 + ПроцентНадбавки) / 100, ДатаДокумента); -
13 мая 2026 в 11:47 #37121
В расширениях нельзя менять код обычных форм напрямую, но можно влиять на логику через расширения и события. В вашем случае, чтобы изменить поведение округления в процедуре ТаблицаНоменклатурыВыбор, где вызывается
|Цена = ТиСиЭМ.ОкрД(ВыбСтрока.Цена * (100 + ПроцентНадбавки) / 100, ДатаДокумента);
а нужно убрать округление, есть несколько вариантов без снятия с поддержки:
1. Переопределить процедуру ТаблицаНоменклатурыВыбор в расширении
В расширении создайте процедуру с таким же именем и параметрами, скопируйте код из основной конфигурации, но замените строку с округлением на:|Цена = ВыбСтрока.Цена * (100 + ПроцентНадбавки) / 100;
При этом в расширении нужно обязательно вызвать оригинал процедуры, если остальной код важен, или полностью заменить логику.
Минус — придется поддерживать копию процедуры, что неудобно.2. Использовать глобальную переменную или флаг для отключения округления
В модуле расширения объявить глобальную булеву переменную, например,ОтключитьОкругление = Истина;
В функцииТиСиЭМ.ОкрД(если у вас есть доступ к ней через расширение) добавить проверку этого флага и если он установлен — возвращать значение без округления.
Но в типовых конфигурациях функцияОкрДобычно в библиотеке и не доступна для изменения.
Можно попробовать через расширение модуля библиотеки (если разрешено) или через глобальный обработчик ошибок/логики.3. Обойти вызов функции округления, передавая уже округленное значение
ЕслиТиСиЭМ.ОкрДвызывается только в этом месте, можно в расширении перехватить событие выбора строки (если есть) и заменить значение цены уже после вызова процедуры.
Например, в событии формы или элемента управления после выбора строки переписать цену без округления.4. Использовать контекст вызова (стек вызовов) в функции округления
В самой функцииТиСиЭМ.ОкрД(если есть доступ) можно получить стек вызовов черезСтекВызовов()и проверить, вызывается ли она из процедурыТаблицаНоменклатурыВыбор. Если да — не округлять.
Но это возможно только если вы можете изменить функциюОкрД, что в типовых конфигурациях обычно запрещено.5. Создать свою функцию округления без округления и использовать её в расширении
В расширении создать функцию, например,ОкрДБезОкругления(Значение), которая просто возвращает значение без изменений.
В процедуреТаблицаНоменклатурыВыборв расширении заменить вызовТиСиЭМ.ОкрДнаОкрДБезОкругления.
Но опять же, придется переопределять процедуру.—
Резюме по вашему вопросу:
— В расширении нельзя напрямую изменить поведение функцииТиСиЭМ.ОкрДили процедурыТаблицаНоменклатурыВыборв обычной форме.
— Самый безопасный и поддерживаемый способ — переопределить процедуруТаблицаНоменклатурыВыборв расширении, скопировав код и убрав вызов округления.
— Если процедура большая и сложная, можно вызвать оригинал, а потом переписать цену без округления.
— Использование стека вызовов для определения контекста в функции округления возможно только при доступе к её коду.—
Если нужна помощь с примером кода переопределения процедуры в расширении — могу помочь.
Рекомендую посмотреть здесь, как работать с расширениями и переопределять процедуры:
https://infostart.ru/public/1044329/
https://infostart.ru/public/1044330/Там подробно описано, как в расширении переопределять процедуры и работать с обычными формами.
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.