|
Автоматическое заполнение наименования товара и характеристики | ☑ | ||
---|---|---|---|---|
0
frutty
11.10.11
✎
15:07
|
проблема с нулевыми значениями, т.е. если тип доп.характеристики число и оно равно нулю, то 1С никак не хочет его выводить как "0", (про "ЧН=" знаю!), пытаюсь переписать стнд.функцию, но никак не могу сравнить типы, т.к. ДопРеквизит.ТипЗначения имеет тип "ОписаниеТипов" и сравнить с Тип("Число") не получается, есть у кого-нибудь идеи?
|
|||
1
Axel2009
11.10.11
✎
15:10
|
ОписаниеТипов.СодержитТип(Тип("Число"))
|
|||
2
frutty
12.10.11
✎
11:24
|
(1) Спасибо, помогло.
Ещё вопрос по теме, есть те кто смог победить заполнение наименований по шаблону? Пример: Шаблон: "sph "+?(ЗначениеЗаполнено([Сфера (дптр)]),?(Формат([Сфера (дптр)], "ЧН='0'")<"0","","+")+Формат([Сфера (дптр)] , "ЧЦ='4'; ЧДЦ='2'; ЧРД=','; ЧН=''; ЧО='1'"),"+0,00") Значение [Сфера (дптр)]: -5 На выходе наименование заполняется так: sph -5 А по шаблону должно выйти так: sph -5,00 Что я сделал не так? |
|||
3
frutty
13.10.11
✎
09:50
|
Вообщем изменил конфигурацию УТ11, теперь шаблоны наименований корректно работают с числами:
Модуль менеджера справочника номенклатуры, функция СформироватьНаименованиеПоШаблону // Формирует наименование элемента справочника по заданному для вида номенклатуры шаблону. // // Возвращаемое значение: // Строка - Наименование полученное по алгоритму расчета // Пустая строка - если не удалось сформировать наименование или не заполнены операнды алгоритма // Функция СформироватьНаименованиеПоШаблону (Знач ФормулаНаименования, ОбъектСправочник) Экспорт АлгоритмРасчета = ФормулаНаименования; МетаданныеОбъекта = ОбъектСправочник.Метаданные(); МассивСтандартныхРеквизитов = Новый Массив; Для Каждого СтандартныйРеквизит Из МетаданныеОбъекта.СтандартныеРеквизиты Цикл МассивСтандартныхРеквизитов.Добавить(СтандартныйРеквизит.Имя); КонецЦикла; РеквизитыСправочника = МетаданныеОбъекта.Реквизиты; Пока Истина Цикл ПервыйСимвол = Найти(АлгоритмРасчета, "["); ПоследнийСимвол = Найти(АлгоритмРасчета, "]"); Если ПервыйСимвол = 0 Или ПоследнийСимвол = 0 Тогда Прервать; Иначе ИмяОперанда = Сред(АлгоритмРасчета, ПервыйСимвол + 1, ПоследнийСимвол - ПервыйСимвол - 1); // Изменение для нормальной работы с числами // ============================================== // ============================================== //ЗначениеОперанда = ""; // ============================================== КонецИмениРеквизита = Найти(ИмяОперанда, "."); Если КонецИмениРеквизита > 0 Тогда ИмяРеквизита = Лев(ИмяОперанда, КонецИмениРеквизита - 1); ПутьКДаннымОперанда = Прав(ИмяОперанда, СтрДлина(ИмяОперанда) - СтрДлина(ИмяРеквизита)-1); Иначе ИмяРеквизита = ИмяОперанда; КонецЕсли; ЭтоРеквизит = РеквизитыСправочника.Найти(ИмяРеквизита) <> Неопределено Или МассивСтандартныхРеквизитов.Найти(ИмяРеквизита) <> Неопределено; // Если ЭтоРеквизит Тогда Если ИмяРеквизита = ИмяОперанда Тогда ЗначениеОперанда = Строка(ОбъектСправочник[ИмяОперанда]); Иначе ЗначенияРеквизитов = ОбщегоНазначенияУТ.ПолучитьЗначенияРеквизитовОбъекта(ОбъектСправочник[ИмяРеквизита], Новый Структура("ИмяОперанда", ПутьКДаннымОперанда)); ЗначениеОперанда = Строка(ЗначенияРеквизитов.ИмяОперанда); КонецЕсли; Иначе ДопРеквизит = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(ИмяРеквизита); СтрокаДопРеквизита = ОбъектСправочник.ДополнительныеРеквизиты.Найти(ДопРеквизит, "Свойство"); Если СтрокаДопРеквизита <> Неопределено Тогда Если ИмяРеквизита = ИмяОперанда Тогда // Изменение для нормальной работы с числами // ============================================== ЗначениеОперанда = СтрокаДопРеквизита.Значение; // ============================================== //ЗначениеОперанда = Строка(СтрокаДопРеквизита.Значение); // ============================================== Иначе ЗначенияРеквизитов = ОбщегоНазначенияУТ.ПолучитьЗначенияРеквизитовОбъекта(СтрокаДопРеквизита.Значение, Новый Структура("ИмяОперанда", ПутьКДаннымОперанда)); // Изменение для нормальной работы с числами // ============================================== ЗначениеОперанда = ЗначенияРеквизитов.ИмяОперанда; // ============================================== //ЗначениеОперанда = Строка(ЗначенияРеквизитов.ИмяОперанда); // ============================================== КонецЕсли; Иначе // Изменение для нормальной работы с числами // ============================================== Если ДопРеквизит <> Неопределено Тогда Если ДопРеквизит.ТипЗначения.СодержитТип(Тип("Число")) Тогда ЗначениеОперанда = 0; Иначе ЗначениеОперанда = ""; КонецЕсли; Иначе ЗначениеОперанда = ""; КонецЕсли; // ============================================== //ЗначениеОперанда = ""; // ============================================== КонецЕсли; КонецЕсли; // Изменение для нормальной работы с числами // ============================================== Если ДопРеквизит <> Неопределено Тогда Если ДопРеквизит.ТипЗначения.СодержитТип(Тип("Число")) Тогда ФормулаНаименования = СтрЗаменить(ФормулаНаименования, "[" + ИмяОперанда + "]", Строка(Формат(ЗначениеОперанда, "ЧН=; ЧРД='.'"))); Иначе ЗначениеОперанда = СтрЗаменить(ЗначениеОперанда, """", """"""); ФормулаНаименования = СтрЗаменить(ФормулаНаименования, "[" + ИмяОперанда + "]", ("""" + ЗначениеОперанда + """")); КонецЕсли; Иначе ЗначениеОперанда = СтрЗаменить(ЗначениеОперанда, """", """"""); ФормулаНаименования = СтрЗаменить(ФормулаНаименования, "[" + ИмяОперанда + "]", ("""" + ЗначениеОперанда + """")); КонецЕсли; // ============================================== //ЗначениеОперанда = СтрЗаменить(ЗначениеОперанда, """", """"""); //ФормулаНаименования = СтрЗаменить(ФормулаНаименования, "[" + ИмяОперанда + "]", ("""" + ЗначениеОперанда + """")); // ============================================== АлгоритмРасчета = СтрЗаменить(АлгоритмРасчета, "[" + ИмяОперанда + "]", ""); КонецЕсли; КонецЦикла; Наименование = ""; Если ЗначениеЗаполнено(ФормулаНаименования) Тогда Попытка Выполнить("Наименование = """" + " + ФормулаНаименования); Исключение ШаблонСообщенияОбОшибке = НСтр("ru = 'Невозможно рассчитать наименование по заданному для вида номенклатуры ""%ВидНоменклатуры%"" шаблону. Проверьте правильность шаблона.'"); Если ТипЗнч(ОбъектСправочник) = Тип("СправочникОбъект.Номенклатура") Тогда ВидНоменклатуры = ОбъектСправочник.ВидНоменклатуры Иначе Если ТипЗнч(ОбъектСправочник.Владелец) = Тип("СправочникСсылка.Номенклатура") Тогда СтруктураРеквизита = Новый Структура("ВидНоменклатуры", "ВидНоменклатуры"); ЗначениеРеквизита = ОбщегоНазначенияУТ.ПолучитьЗначенияРеквизитовОбъекта(ОбъектСправочник.Владелец, СтруктураРеквизита); ВидНоменклатуры = ЗначениеРеквизита.ВидНоменклатуры; ИначеЕсли ТипЗнч(ОбъектСправочник.Владелец) = Тип("СправочникСсылка.ВидыНоменклатуры") Тогда ВидНоменклатуры = ОбъектСправочник.Владелец; КонецЕсли; КонецЕсли; СообщениеОбОшибке = СтрЗаменить(ШаблонСообщенияОбОшибке, "%ВидНоменклатуры%", ВидНоменклатуры); ВызватьИсключение СообщениеОбОшибке; КонецПопытки; КонецЕсли; Возврат Наименование; КонецФункции Также рекомендую отключить проверку формулы при сохранении шаблона в общей форме КонструкторФормул |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |