Имя: Пароль:
1C
1С v8
Автоматическое заполнение наименования товара и характеристики
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 = 'Невозможно рассчитать наименование по заданному для вида номенклатуры ""%ВидНоменклатуры%"" шаблону. Проверьте правильность шаблона.'");
           Если ТипЗнч(ОбъектСправочник) = Тип("СправочникОбъект.Номенклатура") Тогда
               ВидНоменклатуры = ОбъектСправочник.ВидНоменклатуры
           Иначе
               Если ТипЗнч(ОбъектСправочник.Владелец) = Тип("СправочникСсылка.Номенклатура") Тогда
                   СтруктураРеквизита = Новый Структура("ВидНоменклатуры", "ВидНоменклатуры");
                   ЗначениеРеквизита  = ОбщегоНазначенияУТ.ПолучитьЗначенияРеквизитовОбъекта(ОбъектСправочник.Владелец, СтруктураРеквизита);
                   ВидНоменклатуры    = ЗначениеРеквизита.ВидНоменклатуры;
               ИначеЕсли ТипЗнч(ОбъектСправочник.Владелец) = Тип("СправочникСсылка.ВидыНоменклатуры") Тогда
                   ВидНоменклатуры = ОбъектСправочник.Владелец;
               КонецЕсли;
           КонецЕсли;
           
           СообщениеОбОшибке = СтрЗаменить(ШаблонСообщенияОбОшибке, "%ВидНоменклатуры%", ВидНоменклатуры);
           ВызватьИсключение СообщениеОбОшибке;
       КонецПопытки;
   КонецЕсли;
   
   Возврат Наименование;
   
КонецФункции

Также рекомендую отключить проверку формулы при сохранении шаблона в общей форме КонструкторФормул
AdBlock убивает бесплатный контент. 1Сергей