Имя: Пароль:
1C
1С v8
Ввод на основании из ОС в Номенклатуру
,
0 Tanis
 
17.04.13
16:15
Добрый вечер!
Подскажите, пожалуйста.
Есть следующие данные:
ОбъектИсточник (объект документа источника)
ДанныеСтроки (строка табличной части)
Результат.

Необходимо написать код, по поиску номенклатуры.
Источник - это передача ОС, там ТЧ - ОС - строка (столбец) справочник ОС.
А приемник - поступление ТиУ там необходимо заполнить номенклатуру.

Как написать, чтоб вычислить наименование Источника, и потом по поиску из справочника номенклатуры его найти, и постаить в приемник.
1 НикДляЗапросов
 
17.04.13
16:17
Выбрать и подставить
2 Tanis
 
17.04.13
16:29
Вот в этом и вопрос.
3 НикДляЗапросов
 
17.04.13
16:29
давай кусок
4 Tanis
 
17.04.13
16:31
Номен = ОбъектИсточник.ОС.ДанныеСтроки[ОсновноеСредство].Наименование; Или Ссылка.Наименование;

Нужное = Справочник.Номенклатура.НайтиПоНаименованию("Номен");

Результат = Нужное.Ссылка;

Что-то типа этого, но как...
5 НикДляЗапросов
 
17.04.13
16:44
Для каждого Стр из ОбъектИсточник.ОС Цикл
Результат = Стр.ОсновноеСредство
6 Tanis
 
17.04.13
16:48
Так они из разных справочников.
7 Tanis
 
17.04.13
16:53
Вопрос очень срочный.
Подскажите.
8 НикДляЗапросов
 
17.04.13
16:53
Ну не знаю тогда
9 Tanis
 
17.04.13
17:17
Хелп!!!
10 Tanis
 
17.04.13
17:20
как добраться, до этого объекта, ТЧ
11 Tanis
 
17.04.13
17:48
Ном = ОбъектИсточник.ОС;
   
   Для Каждого Стр Из Ном Цикл
   Нужное = Стр.ОсновноеСредство.Наименование;
   
   ОченьНужное = Справочники.Номенклатура.НайтиПоНаименованию(Нужное);
   Результат = ОченьНужное.Ссылка.ПолучитьОбъект;

       
   КонецЦикла;

Что здесь не так?
12 Tanis
 
17.04.13
17:54
Подскажите!
13 Дейл
 
17.04.13
17:59
Результат = ОченьНужное.Ссылка.ПолучитьОбъект();
14 Дейл
 
17.04.13
18:00
Если Результат.Количество()>0 Тогда
Результат = ОченьНужное.Ссылка.ПолучитьОбъект();
Иначе
сообщить("Объект не найден");
КонецЕсли;
15 Tanis
 
17.04.13
18:11
Не помогает.
16 Tanis
 
17.04.13
18:14
Может, обработка как-то не так работает?
17 Tanis
 
17.04.13
18:18
Обработка не работает. :-((((

Там даже если ставить значение, то в новый док оно не ставится.
18 Tanis
 
17.04.13
18:39
Обработка. Работает. Теперь опять вопрос с поиском, значения.
19 Tanis
 
17.04.13
18:49
Нужное = ОбъектИсточник.ДанныеСтроки[ОсновноеСредство].Наименование;
ОченьНужное = Справочники.Номенклатура.НайтиПоНаименованию(Нужное);
Результат = ОченьНужное.Ссылка.ПолучитьОбъект();

Так тоже не прокатывает
20 Tanis
 
17.04.13
18:56
При вводе формулы можно использовать параметры
ОбъектИсточник (объект документа источника)
ДанныеСтроки (строка табличной части)
Результат выполнения надо поместить в переменную "Результат"
21 Tanis
 
17.04.13
19:06
ХЕЛП!!!!
22 Tanis
 
17.04.13
19:17
Подскажите! Вопрос очень срочный...
23 hhhh
 
17.04.13
19:24
в приемник ведь ссылка нужна на номенклатуру. С какого бока тогда появляется объект?
24 Tanis
 
17.04.13
19:29
Ном = ОбъектИсточник.ОС;
Для Каждого Стр Из Ном Цикл
Нужное = Стр.ОсновноеСредство.Наименование;
ОченьНужное = Справочники.Номенклатура.НайтиПоНаименованию(Нужное);
Результат = ОченьНужное.ПолучитьСсылку().Ссылка;
КонецЦикла;

И так не работает
25 Tanis
 
17.04.13
19:30
В (20) сказано, что можно использовать.
26 Tanis
 
17.04.13
19:34
(23) подскажи, пожалуйста.
27 Tanis
 
17.04.13
19:51
ХЕЛП!
28 Tanis
 
17.04.13
20:14
Подскажите, пожалуйста!!! Кто-нибудь!!!
Как заставить эту штуку работать?!
29 hhhh
 
17.04.13
20:19
Результат = Справочники.Номенклатура.НайтиПоНаименованию(Нужное);
30 Tanis
 
17.04.13
20:24
Нет.
31 Tanis
 
17.04.13
20:25
Может там функция Выражение не работает. :-(
32 Tanis
 
17.04.13
20:25
Ном = ОбъектИсточник.ОС;
   
   Для Каждого Стр Из Ном Цикл
   Нужное = Стр.ОсновноеСредство.Наименование;
Результат = Справочники.Номенклатура.НайтиПоНаименованию(Нужное);

       
   КонецЦикла;


Вот так должно работать?
33 Tanis
 
17.04.13
20:28
Вот код обработки

Процедура ВыбратьИзСпискаРеквизитов(Элемент, СтандартнаяОбработка,Текст = "")
   Если ПустаяСтрока(Источник) Тогда
       Возврат;
   КонецЕсли;    
       
   Элемент.СписокВыбора.Очистить();
   СтандартнаяОбработка = Ложь;
   
   ТекСтрока = ЭлементыФормы.ДеревоСоответствий.ТекущаяСтрока;
   ТчИсточник = "";
   Если ПустаяСтрока(ТекСтрока.ТЧПриемник) Тогда //это реквизит шапки
       Для каждого Реквизит из Источник.Реквизиты цикл
           Если СокрЛП(Приемник.Реквизиты[ТекСтрока.ИдПриемник].Тип) = СокрЛП(Реквизит.Тип) тогда
               Если СтрДлина(Текст) > 0 Тогда
                   Если ВРег(Лев(Реквизит.Имя,СтрДлина(Текст))) = ВРег(Текст) Тогда
                       Элемент.СписокВыбора.Добавить(Реквизит.Имя,Реквизит);
                   КонецЕсли;    
               Иначе    
                   Элемент.СписокВыбора.Добавить(Реквизит.Имя,Реквизит,,КартинкаРеквизитаШапки);
               КонецЕсли;    
           КонецЕсли;    
       КонецЦикла;    
       Элемент.СписокВыбора.Добавить("<Значение>","<Значение>",,КартинкаРеквизитаВведеноЗначение);
       Элемент.СписокВыбора.Добавить("<Выражение>","<Выражение>",,КартинкаПользовательскиеПоля);
   ИначеЕсли СокрЛП(ТекСтрока.ТЧПриемник) = "Табличная часть" Тогда
       Для каждого ТЧ из Источник.ТабличныеЧасти цикл
           Если СтрДлина(Текст) > 0 Тогда
               Если ВРег(Лев(тч.Имя,СтрДлина(Текст))) = ВРег(Текст) Тогда
                   Элемент.СписокВыбора.Добавить(тч.Имя,Реквизит);
               КонецЕсли;    
           Иначе    
               Элемент.СписокВыбора.Добавить(тч.имя,ТЧ,,КартинкаРеквизитаТабличныеЧасти);
           КонецЕсли;    
       КонецЦикла;    
   иначе //реквизит ТЧ
       Если Не ПустаяСтрока(ТекСтрока.ТЧИсточник) Тогда
           Для каждого СтрТЧ из Источник.ТабличныеЧасти[ТекСтрока.ТЧИсточник].Реквизиты цикл
               Если СокрЛП(Приемник.ТабличныеЧасти[ТекСтрока.ТЧПриемник].Реквизиты[ТекСтрока.ИдПриемник].Тип) = СокрЛП(СтрТЧ.Тип) тогда
                   Если СтрДлина(Текст) > 0 Тогда //фильтр по начальных буквах
                       Если ВРег(Лев(СтрТЧ.Имя,СтрДлина(Текст))) = ВРег(Текст) Тогда
                           Элемент.СписокВыбора.Добавить(СтрТЧ.Имя,Реквизит,,КартинкаРеквизитаТабличнойЧасти);
                       КонецЕсли;    
                   Иначе    
                       Элемент.СписокВыбора.Добавить(СтрТЧ.имя,СтрТЧ,,КартинкаРеквизитаТабличнойЧасти);
                   КонецЕсли;    
               КонецЕсли;    
           КонецЦикла;    
       КонецЕсли;    
       Элемент.СписокВыбора.Добавить("<Значение>","<Значение>",,КартинкаРеквизитаВведеноЗначение);
       Элемент.СписокВыбора.Добавить("<ВыражениеТЧ>","<Выражение>",,КартинкаПользовательскиеПоля);
   КонецЕсли;
   
   Рез = ВыбратьИзМеню(Элемент.СписокВыбора,Элемент);
   Если Рез =  Неопределено Тогда
       Возврат;
   КонецЕсли;    
   
   Если Рез.Значение = "<Значение>" Тогда
       ТекСтрока.ВведеноЗначение = Истина;
       ТекСтрока.Формула = "";
       
       Если ПустаяСтрока(ТекСтрока.ТЧПриемник) Тогда //это реквизит шапки
           ЭлементыФормы.ДеревоСоответствий.Колонки.Источник.ЭлементУправления.ОграничениеТипа = Приемник.Реквизиты[ТекСтрока.ИдПриемник].Тип;
       иначе
           ЭлементыФормы.ДеревоСоответствий.Колонки.Источник.ЭлементУправления.ОграничениеТипа = Приемник.ТабличныеЧасти[ТекСтрока.ТЧПриемник].Реквизиты[ТекСтрока.ИдПриемник].Тип;
       КонецЕсли;    
       ЭлементыФормы.ДеревоСоответствий.Колонки.Источник.ЭлементУправления.Значение = ЭлементыФормы.ДеревоСоответствий.Колонки.Источник.ЭлементУправления.ОграничениеТипа.ПривестиЗначение(ЭлементыФормы.ДеревоСоответствий.Колонки.Источник.ЭлементУправления.Значение);
       ЭлементыФормы.ДеревоСоответствий.Колонки.Источник.ЭлементУправления.ВыбиратьТип = Истина;
   ИначеЕсли (Рез.Значение = "<Выражение>") или (Рез.Значение = "<ВыражениеТЧ>") Тогда
       ТекСтрока.ВведеноЗначение = Ложь;
       ФормаВводаФормулы    = ЭтотОбъект.ПолучитьФорму("ФормаВводаФормулы");
       Если  (Рез.Значение = "<ВыражениеТЧ>") Тогда
           ФормаВводаФормулы.ЭтоФормулаДляТабЧасти = Истина;    
       КонецЕсли;
       
       ФормаВводаФормулы.ОткрытьМодально();
       
       Если СтрДлина(ФормаВводаФормулы.Формула) > 0 Тогда
           ТекСтрока.Источник    = "<Выражение>";
           ТекСтрока.Формула = ФормаВводаФормулы.Формула;
       КонецЕсли;    
   Иначе
       ТекСтрока.ВведеноЗначение = Ложь;
       ТекСтрока.Формула = "";
       
       ТекСтрока.Источник = Рез.Представление;
       ТекСтрока.ИдИсточник = Рез.Значение;        
       Если СокрЛП(ТекСтрока.ТЧПриемник) = "Табличная часть" Тогда
           для Каждого стр из ТекСтрока.Строки Цикл
               стр.ТЧИсточник = Рез.Значение;
               стр.ИдИсточник = АнализМетаданныхДокументов(СокрЛП(стр.ИдПриемник),СокрЛП(стр.ТЧПриемник),СокрЛП(стр.ТЧИсточник),стр.Источник);                
           КонецЦикла;    
       КонецЕсли;    
   КонецЕсли;    
   
КонецПроцедуры
34 mistеr
 
17.04.13
20:37
А без истерики никак нельзя?

Отладчиком строчку (29) проходил(а)?
35 Tanis
 
17.04.13
22:55
(34) обработка внешняя, как ее отладчиком прйти?
Или в конфу добавлять?
36 Tanis
 
17.04.13
23:00
не было бы истерики, если бы не 60 неудачных попыток.
дело в том что если даже указываешь
Результат = Справочники.Номенклатура.НайтиПоНаименованию(Нужное);
без дополнительных действий, то тоже ноль...
37 НикДляЗапросов
 
17.04.13
23:16
(35) Выгрузи в файл и отлаживать файл
38 Tanis
 
17.04.13
23:23
Не знаю как. файл ставлю остановку, он не останавливается. добавил в конфу
39 Tanis
 
17.04.13
23:32
Такое чувство, что он формулу не распознает...
40 Tanis
 
17.04.13
23:55
для Каждого стрТч из СтрДерева.Строки Цикл  //цикл по метаданным строки
                           Если стрТч.ВведеноЗначение Тогда
                               СтрТчПриемник[стрТч.ИдПриемник] = стрТч.Источник;
                           ИначеЕсли не ПустаяСтрока(стрТч.формула) Тогда
                               Попытка
                                   ОбъектИсточник = ДокИсточник;
                                   ДанныеСтроки = стрТчИсточник;
                                   Результат = "";
                                   Выполнить(стрТч.формула);
                                   ДокПриемник[СтрДерева.ИдПриемник] = Результат;
                               Исключение
                                   сообщить("Не удалось выполнить формулу для реквизита :"+СтрДерева.ИдПриемник+" табличной части:"+СтрДерева.ТЧПриемник);
                               КонецПопытки;    
                           Иначе    


Было стрДерева.формула, он пролистывал формулу, не видел ее, заменил на стрТЧ. Но тпер не выполняет, почему-то эту формулу.
Где еще здесь ошибка?
41 Tanis
 
18.04.13
00:05
Формула может быть строкой?
42 mistеr
 
18.04.13
00:16
Я уже вобще не понимаю, что ты теперь отлаживаешь...
43 Tanis
 
18.04.13
00:18
обработку
44 Tanis
 
18.04.13
00:19
ее механизм
45 Tanis
 
18.04.13
00:23
В (40) надо вставить формулу, чтоб вычислялось нужное.
46 mistеr
 
18.04.13
00:24
Номенклатура уже находится?
47 Tanis
 
18.04.13
00:30
нет
48 Tanis
 
18.04.13
00:31
формула никак не срабатывает.
После всех замен на стрТч стало доходить до ошибки
сообщить("Не удалось выполнить формулу для реквизита :"+СтрДерева.ИдПриемник+" табличной части:"+СтрДерева.ТЧПриемник);
49 Tanis
 
18.04.13
00:32
Выполнить(стрТч.формула); - ?? формула строка
ДокПриемник[СтрДерева.ИдПриемник] = Результат; - 0 либо строка
50 mistеr
 
18.04.13
00:37
Обработка твоя или типовая. Если типовая, там скорее всего все OK, отлаживай только свой код.

Скопируй (32) в новую внешнюю обработку. Выясни в чем проблема с поиском.
51 France
 
18.04.13
00:41
Поиск по наименованию моветон. Это для начала
52 Tanis
 
18.04.13
00:42
Поиск из внешней обработки работает, я уже проверял.

Обработка с инфостарта, еще под 8.1.

И как я понял, что проблема в коде связанном с формулой.
53 Tanis
 
18.04.13
00:48
могу скинуть обработку :-)
54 mistеr
 
18.04.13
00:54
(52) Как все запущено...
55 Tanis
 
18.04.13
00:57
в (40) есть ошибка?
56 Tanis
 
18.04.13
00:58
Почему сразу запущено? Хорошя обработка! Осталось вот только с формулой решить вопрос.
57 Tanis
 
18.04.13
01:17
Если есть желание, могу скинуть обработку, и поковыряйтесь..
58 Tanis
 
18.04.13
08:27
Доброе утро! Продолжаем борьбу с обработкой...
Остались считаные часы...
Подскажите, пожалуйста, варианты?
59 Tanis
 
18.04.13
08:47
Вопрос как никогда срочный...
60 НикДляЗапросов
 
18.04.13
08:57
Платите деньги спецу
61 Tanis
 
18.04.13
08:59
Без денег никак?
Уже ошибки в обработке нашел, еще есть, но не могу найти.

Формула должна отображаться в "", или просто строкой?
62 Tanis
 
18.04.13
09:16
Подскажите, нет ли ошибки в (40)
63 Tanis
 
18.04.13
11:30
Большой ХЕЛП!!!
64 Tanis
 
18.04.13
11:51
SOS
65 Tanis
 
18.04.13
12:00
Кто что может, подскажите?!
66 Tanis
 
18.04.13
12:02
для Каждого стрТч из СтрДерева.Строки Цикл  //цикл по метаданным строки

                           Если стрТч.ВведеноЗначение Тогда
                               СтрТчПриемник[стрТч.ИдПриемник] = стрТч.Источник;
                           ИначеЕсли не ПустаяСтрока(стрТч.формула) Тогда
                               Попытка
                                   ОбъектИсточник = ДокИсточник;
                                   ДанныеСтроки = стрТчИсточник;
                                   Результат = "";
                                   Выполнить(стрТч.формула);
                                   ДокПриемник[СтрДерева.ИдПриемник] = Результат;
                               Исключение
                                   сообщить("Не удалось выполнить формулу для реквизита :"+СтрДерева.ИдПриемник+" табличной части:"+СтрДерева.ТЧПриемник);
                               КонецПопытки;    
                           Иначе

Здесь не выполняется формула...
Сейчас уже просто пробую.
Результат = "Справочник.Номенклатура.НайтиПоНаименованию("Номен");"
67 Tanis
 
18.04.13
15:42
Тема закрыта.

Дело было в коде обработки, в 4-х местах изменил написанное.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс