Имя: Пароль:
1C
1С v8
Преобразовать данные из запроса
0 Agent
 
14.09.11
21:11
Добрый вечер! Подскажите, пожалуйста. Необходимо в отчет «Ответственного исполнителя» вывести в следующем виде "Фамилия И. О."

Функция ФамилияИО(ФИО)
   ПервПроб = Найти(ФИО," ");
   Если ПервПроб=0 Тогда
       Возврат ФИО;
   Иначе
       Фамилия = Лев(ФИО,ПервПроб);
       ИО = Сред(ФИО,ПервПроб+1);
       ИО = СокрЛ(ИО);
       Имя = Лев(ИО,1)+".";
       ВтПроб = Найти(ИО," ");
       Если ВтПроб=0 Тогда
           Возврат Фамилия+Имя;
       Иначе
           Возврат Фамилия+Имя+" "+Лев(СокрЛ(Сред(ИО,ВтПроб+1)),1)+".";
       КонецЕсли;
   КонецЕсли;
КонецФункции

Данная функция преобразует строку в вид "Фамилия И. О." Если применить эту функцию для данных, полученных в запросе, система выдает ошибку:

!!«Преобразование значения к типу Строка не может быть выполнено»

Действия: В запросе выбираю данные ответственного исполнителя и применяю функцию  ФамилияИО(ФИО), потом данные передаю в макет.

Функция Ответственный()
   Запрос = Новый Запрос;    
   ЗапросТекст =    "ВЫБРАТЬ
                     |    ПоступлениеТоваровУслуг.Ответственный КАК Ответственный
                     |ИЗ
                     |    Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
                     |ГДЕ
                     |    ПоступлениеТоваровУслуг.Ссылка = &Ссылка";
   
   Запрос.УстановитьПараметр("Ссылка",СсылкаНаОбъект);    
   ДанныеШапкиОтветственный = Запрос.Выполнить().Выбрать();    

ДанныеШапкиОтветственный.Следующий();            
Ответственный = ФамилияИО(ДанныеШапкиОтветственный);

Возврат Ответственный;

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

................

Макет = ПолучитьМакет("Макет");
Ответственный = Ответственный();
ОбластьМакета = Макет.ПолучитьОбласть("Ответственный");
   ОбластьМакета.Параметры.Заполнить(Ответственный);
   ТабДокумент.Вывести(ОбластьМакета);

В запросе применял «Представление», «Выразить как строка», но всё равно таже ошибка.

Заранее спасибо!
1 shuhard
 
14.09.11
21:13
(0)[ФамилияИО(ДанныеШапкиОтветственный)]
сильно
2 zak555
 
14.09.11
21:14
в шаблон макета ячейки зафигачь ФамилияИО
3 cViper
 
14.09.11
21:41
ФамилияИО(ДанныеШапкиОтветственный.Ответственный);
4 Agent
 
14.09.11
21:49
Назначил функцию в макете как шаблон, ничего не выводит.
Применил вариант «Ответственный = ФамилияИО(ДанныеШапкиОтветственный.Ответственный)» система выдает ошибку

«Ошибка при вызове метода контекста (Заполнить): Несоответствие типов (параметр номер '1')»
5 shuhard
 
14.09.11
22:14
(4) используй отладчик Люк
6 hhhh
 
14.09.11
22:51
ВЫБРАТЬ
                     |    ПоступлениеТоваровУслуг.Ответственный.Наименование КАК Ответственный
                     |ИЗ
7 Agent
 
14.09.11
23:08
Таже ошибка «Несоответствие типов (параметр номер '1')»
Функция Ответственный()
   Запрос = Новый Запрос;    
   ЗапросТекст =    "ВЫБРАТЬ
                     |    ПоступлениеТоваровУслуг.Ответственный.Наименование КАК Ответственный
                     |ИЗ
                     |    Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
                     |ГДЕ
                     |    ПоступлениеТоваровУслуг.Ссылка = &Ссылка";
   
   Запрос.УстановитьПараметр("Ссылка",СсылкаНаОбъект);    
   ДанныеШапкиОтветственный = Запрос.Выполнить().Выбрать();    

ДанныеШапкиОтветственный.Следующий();            
Ответственный = ФамилияИО(ДанныеШапкиОтветственный.Ответственный);

Возврат Ответственный;

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

Разве можно вызывать на прямую в макете функцию как шаблон, указав имя?
Ведь прекрасно работает данная функция, если ёё применять не для данных полученных из запроса.
8 АСанСаныч
 
14.09.11
23:23
(7) а в ДанныеШапкиОтветственный.Ответственный точно что-то есть?
9 Фрэнки
 
14.09.11
23:32
(7) Смотри, у тебя в запросе идет Наименование - это строка, а не элемент. ФамилияИО с каким типом работает?
10 Фрэнки
 
14.09.11
23:35
не... что-то не пойму. А почему нельзя из реквизитов СсылкаНаОбъект прочитать Ответственного и его наименование?
11 Agent
 
14.09.11
23:49
В ДанныеШапкиОтветственный.Ответственный передаеться ссылка справочника пользователи. Ответственный подставляется автоматически при заведении документа.

ФамилияИО(ФИО) работает со строковым типом.
12 hhhh
 
15.09.11
00:29
ЗапросТекст =     "ВЫБРАТЬ

точки не хватает
13 Agent
 
15.09.11
00:42
А где именно точки не хватает?
14 hhhh
 
15.09.11
00:45
ЗапросУстановитьПараметр еще напиши.
ЗапросВыполнитьВыбрать;
15 zak555
 
15.09.11
00:56
в типовой БП есть специально функция из общего модуля ОбщегоНазвачения, которая как раз возвращает в виде : Фамилия И.О.


Функция ФамилияИнициалыФизЛица(Объект = "", Фамилия = " ", Имя = " ", Отчество = " ") Экспорт

   ТипОбъекта = ТипЗнч(Объект);
   Если ТипОбъекта = Тип("Строка") Тогда
       ФИО = РазложитьСтрокуВМассивПодстрок(СокрЛП(Объект)," ");
       
   ИначеЕсли ТипОбъекта = Тип("СправочникСсылка.ФизическиеЛица") или ТипОбъекта = Тип("СправочникОбъект.ФизическиеЛица") ИЛИ
             ТипОбъекта = Тип("СправочникСсылка.СотрудникиОрганизаций") или ТипОбъекта = Тип("СправочникОбъект.СотрудникиОрганизаций") Тогда
       ФИО = РазложитьСтрокуВМассивПодстрок(СокрЛП(Объект.Наименование)," ");
       
   Иначе
       
       // используем возможно переданные отдельные строки
       Возврат ?(НЕ ПустаяСтрока(Фамилия),
               Фамилия + ?(НЕ ПустаяСтрока(Имя)," " + Лев(Имя,1) + "." + ?(НЕ ПустаяСтрока(Отчество),Лев(Отчество,1)+".", ""), ""),
               "")
   КонецЕсли;
           
   КоличествоПодстрок = ФИО.Количество();
   Фамилия = ?(КоличествоПодстрок > 0,ФИО[0],"");
   Имя        = ?(КоличествоПодстрок > 1,ФИО[1],"");
   Отчество= ?(КоличествоПодстрок > 2,ФИО[2],"");
   
   Возврат ?(НЕ ПустаяСтрока(Фамилия),
               Фамилия + ?(НЕ ПустаяСтрока(Имя)," " + Лев(Имя,1) + "." + ?(НЕ ПустаяСтрока(Отчество),Лев(Отчество,1)+".", ""), ""),
               "");

КонецФункции
16 zak555
 
15.09.11
00:57
т.е. туда можно передать объект/ссылку справочников ФизическиеЛица/СотрудникиОрганизаций и всё
17 zak555
 
15.09.11
00:57
и не надо городить огород
18 Agent
 
15.09.11
01:12
Если я правильно понял это должно быть так:

   Запрос.УстановитьПараметр("Ссылка",СсылкаНаОбъект);
   Запрос.УстановитьПараметр("Ответственный",СсылкаНаОбъект.Ответственный);
   
   ДанныеШапкиОтветственный = Запрос.Выполнить().Выбрать();
   
    ДанныеШапкиОтветственный.Следующий();        
   
    Ответственный = ФамилияИО(ДанныеШапкиОтветственный.Ответственный);
19 Agent
 
15.09.11
01:12
Проверял эту функцию ФамилияИнициалыФизЛица(Объект = "", Фамилия = " ", Имя = " ", Отчество = " ") она не работает.
20 Agent
 
15.09.11
01:12
конфа упп
21 zak555
 
15.09.11
01:24
в типовой УПП есть специально функция из общего модуля ОбщегоНазвачения, которая как раз возвращает в виде : Фамилия И.О.


Функция ФамилияИнициалыФизЛица(Объект = "", Фамилия = " ", Имя = " ", Отчество = " ") Экспорт

   ТипОбъекта = ТипЗнч(Объект);
   Если ТипОбъекта = Тип("Строка") Тогда
       ФИО = РазложитьСтрокуВМассивПодстрок(СокрЛП(Объект)," ");
       
   ИначеЕсли ТипОбъекта = Тип("СправочникСсылка.ФизическиеЛица") или ТипОбъекта = Тип("СправочникОбъект.ФизическиеЛица") ИЛИ
             ТипОбъекта = Тип("СправочникСсылка.СотрудникиОрганизаций") или ТипОбъекта = Тип("СправочникОбъект.СотрудникиОрганизаций") Тогда
   
       Если ТипОбъекта = Тип("СправочникСсылка.ФизическиеЛица") или
           ТипОбъекта = Тип("СправочникСсылка.СотрудникиОрганизаций") Тогда
           Наименование = ПолучитьЗначениеРеквизита(Объект, "Наименование");
       Иначе
           Наименование = Объект.Наименование;
       КонецЕсли;
   
       // Избавление от возможных выражений в скобках, например (осн.), (вн. совм.).
       НачальнаяПозиция    = Найти(Наименование,"(");
       КонечнаяПозиция        = Найти(Наименование,")");
       ДлинаСтроки            = СтрДлина(Наименование);
       Если НачальнаяПозиция > 0 Тогда
           СтрокаДляОбработки = Лев(Наименование, НачальнаяПозиция - 1) + ?(КонечнаяПозиция > 0,Прав(Наименование, ДлинаСтроки - КонечнаяПозиция),"")
       Иначе
           СтрокаДляОбработки = Наименование;
       КонецЕсли;
       ФИО = РазложитьСтрокуВМассивПодстрок(СокрЛП(СтрокаДляОбработки)," ");
       
       
   Иначе
       
       // используем возможно переданные отдельные строки
       Возврат ?(НЕ ПустаяСтрока(Фамилия),
               Фамилия + ?(НЕ ПустаяСтрока(Имя)," " + Лев(Имя,1) + "." + ?(НЕ ПустаяСтрока(Отчество),Лев(Отчество,1)+".", ""), ""),
               "")
   КонецЕсли;
           
   КоличествоПодстрок = ФИО.Количество();
   Фамилия = ?(КоличествоПодстрок > 0,ФИО[0],"");
   Имя        = ?(КоличествоПодстрок > 1,ФИО[1],"");
   Отчество= ?(КоличествоПодстрок > 2,ФИО[2],"");
   
   Возврат ?(НЕ ПустаяСтрока(Фамилия),
               Фамилия + ?(НЕ ПустаяСтрока(Имя)," " + Лев(Имя,1) + "." + ?(НЕ ПустаяСтрока(Отчество),Лев(Отчество,1)+".", ""), ""),
               "");

КонецФункции
22 zak555
 
15.09.11
01:31
пля, Ответственный это справочник Пользователи, а тебе нужно ФизЛицо

=>

ФизЛицо = ДанныеШапкиОтветственный.ФизЛицо;
ФамилияИнициалыФизЛица = ОбщегоНазвачения.ФамилияИнициалыФизЛица(ФизЛицо);
23 zak555
 
15.09.11
01:33
+ покажи весь код заполнения макета
может ты уже запрос накропал
24 zak555
 
15.09.11
01:34
в каком фра учишься ?
25 Agent
 
15.09.11
01:44
Функция ПечатьМакета(СтрокаРасшифровки)

   ТабДокумент = Новый ТабличныйДокумент;
   Макет = ПолучитьМакет("Макет");
Ответственный = Ответственный();

ОбластьМакета = Макет.ПолучитьОбласть("Ответственный");
ОбластьМакета.Параметры.Заполнить(Ответственный);
ТабДокумент.Вывести(ОбластьМакета);
   
Возврат ТабДокумент;

КонецФункции
26 Agent
 
15.09.11
01:47
сама функция ответственный

Функция Ответственный()
   Запрос = Новый Запрос;    
   ЗапросТекст =    "ВЫБРАТЬ
                     |    ПоступлениеТоваровУслуг.Ответственный.Наименование КАК Ответственный
                     |ИЗ
                     |    Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
                     |ГДЕ
                     |    ПоступлениеТоваровУслуг.Ссылка = &Ссылка";
   
   Запрос.УстановитьПараметр("Ссылка",СсылкаНаОбъект);    
   ДанныеШапкиОтветственный = Запрос.Выполнить().Выбрать();    

ДанныеШапкиОтветственный.Следующий();            
Ответственный = ФамилияИО(ДанныеШапкиОтветственный);

Возврат Ответственный;

КонецФункции
27 Agent
 
15.09.11
01:51
Если преобразователь не использовать ФамилияИО, то в отчет выводиться ответственный полностью Фамилия, Имя, Отчество.
28 zak555
 
15.09.11
01:54
печатешь в каком модуле ?
29 zak555
 
15.09.11
01:57
ну чудак
30 zak555
 
15.09.11
01:58
Функция Ответственный()
   Запрос = Новый Запрос;    
   ЗапросТекст =     "ВЫБРАТЬ
                     |    ПоступлениеТоваровУслуг.Ответственный.ФизЛицо КАК Ответственный
                     |ИЗ
                     |    Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
                     |ГДЕ
                     |    ПоступлениеТоваровУслуг.Ссылка = &Ссылка";
   
   Запрос.УстановитьПараметр("Ссылка",СсылкаНаОбъект);    
   ДанныеШапкиОтветственный = Запрос.Выполнить().Выбрать();    

ДанныеШапкиОтветственный.Следующий();            
Ответственный = ОбщегоНазвачения.ФамилияИнициалыФизЛица(ДанныеШапкиОтветственный);

Возврат Ответственный;

КонецФункции
31 zak555
 
15.09.11
02:01
во, а так будет работать ?


Функция Ответственный()
   Запрос = Новый Запрос;    
   ЗапросТекст =     "ВЫБРАТЬ
                     |    ОбщегоНазвачения.ФамилияИнициалыФизЛица(ПоступлениеТоваровУслуг.Ответственный.ФизЛицо) КАК Ответственный
                     |ИЗ
                     |    Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
                     |ГДЕ
                     |    ПоступлениеТоваровУслуг.Ссылка = &Ссылка";
   
   Запрос.УстановитьПараметр("Ссылка",СсылкаНаОбъект);    
   Возврат Запрос.Выполнить().Выгрузить();    

Возврат Ответственный;

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


Функция ПечатьМакета(СтрокаРасшифровки)

   ТабДокумент = Новый ТабличныйДокумент;
   Макет = ПолучитьМакет("Макет");
Ответственный = Ответственный();

ОбластьМакета = Макет.ПолучитьОбласть("Ответственный");
ОбластьМакета.Параметры.Заполнить(Ответственный);
ТабДокумент.Вывести(ОбластьМакета);
   
Возврат ТабДокумент;

КонецФункции
32 zak555
 
15.09.11
02:02
только у меня подозрение, что ПечатьМакета находится в модуле менеджера
33 Agent
 
15.09.11
02:03
ПечатьМакета находиться в модуле объекта.
34 zak555
 
15.09.11
02:05
(30) или (31) заработало ?
35 zak555
 
15.09.11
02:06
только надо переписать :

Функция Ответственный()
   Запрос = Новый Запрос;    
   ЗапросТекст =     "ВЫБРАТЬ
                     |    ПоступлениеТоваровУслуг.Ответственный.ФизЛицо КАК Ответственный
                     |ИЗ
                     |    Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
                     |ГДЕ
                     |    ПоступлениеТоваровУслуг.Ссылка = &Ссылка";
   
   Запрос.УстановитьПараметр("Ссылка",Ссылка);    
   ДанныеШапкиОтветственный = Запрос.Выполнить().Выбрать();    

ДанныеШапкиОтветственный.Следующий();            
Ответственный = ОбщегоНазвачения.ФамилияИнициалыФизЛица(ДанныеШапкиОтветственный);

Возврат Ответственный;

КонецФункции
36 zak555
 
15.09.11
02:07
и следующий


Функция Ответственный()
   Запрос = Новый Запрос;    
   ЗапросТекст =     "ВЫБРАТЬ
                     |    ОбщегоНазвачения.ФамилияИнициалыФизЛица(ПоступлениеТоваровУслуг.Ответственный.ФизЛицо) КАК Ответственный
                     |ИЗ
                     |    Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
                     |ГДЕ
                     |    ПоступлениеТоваровУслуг.Ссылка = &Ссылка";
   
   Запрос.УстановитьПараметр("Ссылка",Ссылка);    
   Возврат Запрос.Выполнить().Выгрузить();    

Возврат Ответственный;

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


Функция ПечатьМакета(СтрокаРасшифровки)

   ТабДокумент = Новый ТабличныйДокумент;
   Макет = ПолучитьМакет("Макет");
Ответственный = Ответственный();

ОбластьМакета = Макет.ПолучитьОбласть("Ответственный");
ОбластьМакета.Параметры.Заполнить(Ответственный);
ТабДокумент.Вывести(ОбластьМакета);
   
Возврат ТабДокумент;

КонецФункции
37 Agent
 
15.09.11
02:15
нет не работает
38 zak555
 
15.09.11
02:22
как франч называется ?
39 Agent
 
15.09.11
02:30
упп
40 zak555
 
15.09.11
02:32
что не работает ?
41 Agent
 
15.09.11
02:40
нет :(
42 Agent
 
15.09.11
02:42
(35)Ошибка при вызове метода контекста (Выполнить): {(1, 1)}: Ожидается выражение "ВЫБРАТЬ"
43 zak555
 
15.09.11
02:43
> ЗапросТекст

заменить на
Запрос.Текст
44 Agent
 
15.09.11
02:44
(36)При компилировании
Переменная не определена (Ответственный)
   Возврат <<?>>Ответственный; (Проверка: Толстый клиент (обычное приложение))
45 zak555
 
15.09.11
02:46
> Возврат Ответственный;



убрать строку на куй
46 Agent
 
15.09.11
02:59
заменил Запрос.Текст, без изменений
(36)Картина ещё интересней. Конструктор не цепляет запрос, Синтаксическая ошибка
"ВЫБРАТЬ
                     |    ОбщегоНазвачения.ФамилияИнициалыФизЛица(ПоступлениеТоваровУслуг.Ответственный.ФизЛицо) КАК Ответственный
                     |ИЗ
                     |    Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
                     |ГДЕ
                     |    ПоступлениеТоваровУслуг.Ссылка = &Ссылка";
47 zak555
 
15.09.11
03:04
сделай так :


Функция Ответственный()
   Запрос = Новый Запрос;    
   Запрос.Текст =     "ВЫБРАТЬ
                     |    ПоступлениеТоваровУслуг.Ответственный.ФизЛицо КАК Ответственный
                     |ИЗ
                     |    Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
                     |ГДЕ
                     |    ПоступлениеТоваровУслуг.Ссылка = &Ссылка";
   
   Запрос.УстановитьПараметр("Ссылка",Ссылка);    
   ДанныеШапкиОтветственный = Запрос.Выполнить().Выбрать();    

ДанныеШапкиОтветственный.Следующий();            
Ответственный = ОбщегоНазвачения.ФамилияИнициалыФизЛица(ДанныеШапкиОтветственный);

Возврат Ответственный;

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



Функция ПечатьМакета(СтрокаРасшифровки)

   ТабДокумент = Новый ТабличныйДокумент;
   Макет = ПолучитьМакет("Макет");
Ответственный = Ответственный();

ОбластьМакета = Макет.ПолучитьОбласть("Ответственный");
ОбластьМакета.Параметры.Ответственный = Ответственный;
ТабДокумент.Вывести(ОбластьМакета);
   
Возврат ТабДокумент;

КонецФункции
48 Agent
 
15.09.11
03:12
(47)Печатная форма формируется, без отображения ответственного.Мистика просто...
49 zak555
 
15.09.11
03:16
проверь, что в отладчике на Ответственный =
50 zak555
 
15.09.11
03:20
или так :


Функция Ответственный()
     
ДанныеШапкиОтветственный = Ссылка.Ответственный.ФизЛицо;

Возврат ОбщегоНазвачения.ФамилияИнициалыФизЛица(ДанныеШапкиОтветственный);
КонецФункции



Функция ПечатьМакета(СтрокаРасшифровки)

   ТабДокумент = Новый ТабличныйДокумент;
   Макет = ПолучитьМакет("Макет");
Ответственный = Ответственный();

ОбластьМакета = Макет.ПолучитьОбласть("Ответственный");
ОбластьМакета.Параметры.Ответственный = Ответственный;
ТабДокумент.Вывести(ОбластьМакета);
   
Возврат ТабДокумент;

КонецФункции
51 Agent
 
15.09.11
03:22
отладчик показывает
ответственный = значение ""  тип строка
52 Agent
 
15.09.11
03:31
(50)Работает! Спасибо большое за помощь!
53 zak555
 
15.09.11
09:49
хотя правильно конечно получить запросом (!)
только ещё вашу 8ку не особо понимаю
Закон Брукера: Даже маленькая практика стоит большой теории.