Имя: Пароль:
1C
1С v8
Заполнение пустого поля ТЧ по другому
0 Anastasiy
 
25.10.12
11:08
Создала Вот такую внешнюю обработку, Чтобы массово заполнить поле НаименованиеТовараНов(ссылка) по ТабПолю НаименованиеТовара(строка), вот только копирует она во все 99 999 строк))) Подскажите, кто знает, что можно сделать.
1 Anastasiy
 
25.10.12
11:09
Процедура КнопкаВыполнитьНажатие(Кнопка)
   
   ВыборкаДокументов = Документы.Доверенность.Выбрать(ОтборДатаНач, ОтборДатаКон);
   
   Пока ВыборкаДокументов.Следующий() Цикл
       
   ОбъектДокумента = ВыборкаДокументов.ПолучитьОбъект();
   ТЧ = ОбъектДокумента.Товары;    
   ТЧ1 = ТЧ.С
    Для каждого Стр Из ОбъектДокумента.Товары Цикл
       
               
Если Не ЗначениеЗаполнено(Стр.НаименованиеТовара) Тогда
           
   Сообщить("Доверенность № """ + ОбъектДокумента.Номер +", " + ОбъектДокумента.Дата + """ Поля НаименованиеТовара не заполнено");
           
               
ИначеЕсли ЗначениеЗаполнено(Стр.НаименованиеТовара) Тогда
   
       НСтр = ТЧ.Добавить();
       
   НСтр.НаименованиеТовара = Стр.НаименованиеТовара;    
   НСтр.НаименованиеТовараНов = Справочники.Номенклатура.НайтиПоНаименованию(Стр.НаименованиеТовара);    
   
   
    НСтр.Количество = Стр.Количество;
    НСтр.ЕдиницаПоКлассификатору = Стр.ЕдиницаПоКлассификатору;
   
ОбъектДокумента.Дата = ВыборкаДокументов.Дата;
ОбъектДокумента.ДатаДействия = ОбъектДокумента.Дата + 10 * (24 * 60 * 60);



 Иначе
     Сообщить("Доверенность № """ + ОбъектДокумента.Номер +", " + ОбъектДокумента.Дата + """ Номенклатура не найдена");
КонецЕсли;        
     ОбъектДокумента.Записать();            
КонецЦикла;            
           

КонецЦикла;
 
КонецПроцедуры
2 lxndr
 
25.10.12
11:12
Ничче не понимаю.. Заполняешь документы самими собой?
ТЧ = ОбъектДокумента.Товары;
...
НСтр = ТЧ.Добавить();
3 dimaldinho
 
25.10.12
11:19
ИначеЕсли ЗначениеЗаполнено(Стр.НаименованиеТовара) Тогда
    Стр.НаименованиеТовараНов = Справочники.Номенклатура.НайтиПоНаименованию(Стр.НаименованиеТовара);    

Если задача только в заполнении реквизита табличной части документа, то реквизиты шапки документа не трогать.
4 dimaldinho
 
25.10.12
11:20
Ну и сообщить, если номенклатура не найдена по Стр.НаименованиеТовара

Ну и записывать документ не после каждой строчки, а по окончании перебора всей табличной части.
5 dimaldinho
 
25.10.12
11:24
Если Не ЗначениеЗаполнено(Стр.НаименованиеТовара) Тогда
ИначеЕсли ЗначениеЗаполнено(Стр.НаименованиеТовара) Тогда
Иначе
     Сообщить("Доверенность № """ + ОбъектДокумента.Номер +", " + ОбъектДокумента.Дата + """ Номенклатура не найдена");
КонецЕсли;  

А это нечеткая логика: значение может быть заполнено, не заполнено и ... промежуточные значения между заполненностью и незаполненностью?
6 Zmich
 
25.10.12
11:26
ОбъектДокумента.Записать();
выведи за цикл
7 Anastasiy
 
25.10.12
11:40
(5))) Промежуточное значение не найдена номенклатура в справочнике)) Что тоже имеет место быть))
8 Anastasiy
 
25.10.12
11:40
(6) Спасибо, гляну.
9 palpetrovich
 
25.10.12
11:40
(0) поток сознания :)
//в цикле
Для каждого Стр Из ОбъектДокумента.Товары Цикл
// нижеизложенное - не комильфо :)
               НСтр = ТЧ.Добавить();
10 palpetrovich
 
25.10.12
11:41
+9 ну и это:
           Если Не ЗначениеЗаполнено(Стр.НаименованиеТовара) Тогда
           ИначеЕсли ЗначениеЗаполнено(Стр.НаименованиеТовара) Тогда
           Иначе  // что еще может быть?
11 Anastasiy
 
25.10.12
11:57
Поток сознания прекрасно работает))) Спасибо(6) устала с этой обработкой, просмотрела)
12 Anastasiy
 
25.10.12
12:07
Процедура КнопкаВыполнитьНажатие(Кнопка)
   
   ВыборкаДокументов = Документы.Доверенность.Выбрать(ОтборДатаНач, ОтборДатаКон);
   
   Пока ВыборкаДокументов.Следующий() Цикл
       
   ОбъектДокумента = ВыборкаДокументов.ПолучитьОбъект();
   
   ТЧ = ОбъектДокумента.Товары;    
   ТЧ1 = ТЧ.Выгрузить();
   ТЧ.Загрузить(ТЧ1);

    Для каждого Стр Из ОбъектДокумента.Товары Цикл
       
               
Если Не ЗначениеЗаполнено(Стр.НаименованиеТовара) Тогда
           
   Сообщить("Доверенность № """ + ОбъектДокумента.Номер +", " + ОбъектДокумента.Дата + """ Поля НаименованиеТовара не заполнено");
           
               
ИначеЕсли ЗначениеЗаполнено(Стр.НаименованиеТовара) Тогда
   
   Стр.НаименованиеТовараНов = Справочники.Номенклатура.НайтиПоНаименованию(Стр.НаименованиеТовара);    
   
   
       
   ОбъектДокумента.Дата = ВыборкаДокументов.Дата;
   ОбъектДокумента.ДатаДействия = ОбъектДокумента.Дата + 10 * (24 * 60 * 60);


 Иначе
    Сообщить("Доверенность № """ + ОбъектДокумента.Номер +", " + ОбъектДокумента.Дата + """ Номенклатура не найдена");
КонецЕсли;        
             
КонецЦикла;            
           
 
КонецЦикла;
     ОбъектДокумента.Записать();
КонецПроцедуры

// ---------------------------------------------------------------------------------------------------------------------

мНастройкаПериода = Новый НастройкаПериода;

Вот так в итоге - работает.
13 palpetrovich
 
25.10.12
12:56
(12) ничего особо прекрасного в коде вообще-то нет :)
это лишнее, сюда ты никогда не попадещь:
Иначе
    Сообщить("Доверенность № """ + ОбъектДокумента.Номер +", " + ОбъектДокумента.Дата + """ Номенклатура не найдена");

а это что???
ТЧ1 = ТЧ.Выгрузить();
   ТЧ.Загрузить(ТЧ1);
14 Шапокляк
 
25.10.12
13:04
(12)      ОбъектДокумента.Записать();
КонецПроцедуры

Мы перебираем все документы, а записываем объект только один раз, судя по всему для последнего в выборке документа. Вы уверены, что это нормально работает?
15 Anastasiy
 
26.10.12
07:59
Сорь -))) Вот так, поторопилась))

КнопкаВыполнитьНажатие(Кнопка)
   
       ВыборкаДокументов = Документы.Доверенность.Выбрать(ОтборДатаНач, ОтборДатаКон);
   
Пока ВыборкаДокументов.Следующий() Цикл
       
       ОбъектДокумента = ВыборкаДокументов.ПолучитьОбъект();    
       ТЧ = ОбъектДокумента.Товары;    
   
Для каждого Стр Из ОбъектДокумента.Товары Цикл
       
               
Если Не ЗначениеЗаполнено(Стр.НаименованиеТовара) Тогда
           
       Сообщить("Доверенность № """ + ОбъектДокумента.Номер +", " + ОбъектДокумента.Дата + """ Поля НаименованиеТовара не заполнено");
                           
ИначеЕсли ЗначениеЗаполнено(Стр.НаименованиеТовара) Тогда
   
       Стр.НаименованиеТовараНов = Справочники.Номенклатура.НайтиПоНаименованию(Стр.НаименованиеТовара);    
       ОбъектДокумента.Дата = ВыборкаДокументов.Дата;
       ОбъектДокумента.ДатаДействия = ОбъектДокумента.Дата + 10 * (24 * 60 * 60);
Иначе
       Сообщить("Доверенность № """ + ОбъектДокумента.Номер +", " + ОбъектДокумента.Дата + """ Номенклатура не найдена");
КонецЕсли;        
             
КонецЦикла;    
       ОбъектДокумента.Дата = ВыборкаДокументов.Дата;
       ОбъектДокумента.ДатаДействия = ОбъектДокумента.Дата + 10 * (24 * 60 * 60);
       ОбъектДокумента.Записать();    
 
КонецЦикла;
         
КонецПроцедуры
16 palpetrovich
 
26.10.12
11:15
(15) опять поторопилась :)
хоть какой-то смысл есть только в :

Процедура КнопкаВыполнитьНажатие(Кнопка)
   
   ВыборкаДокументов = Документы.Доверенность.Выбрать(ОтборДатаНач, ОтборДатаКон);
   
   Пока ВыборкаДокументов.Следующий() Цикл
       
       ОбъектДокумента = ВыборкаДокументов.ПолучитьОбъект();    
       ОбъектДокумента.ДатаДействия = ОбъектДокумента.Дата + 10 * (24 * 60 * 60);
       ОбъектДокумента.Записать();    
       
   КонецЦикла;
   
КонецПроцедуры

ТЧ = ОбъектДокумента.Товары; // нигде не используется    
Стр.НаименованиеТовараНов = Справочники.Номенклатура.НайтиПоНаименованию(Стр.НаименованиеТовара); // НайтиПоНаименованию возвращает ссылку на элеиент справочника,
// но даже если, но даже  сделать так: Стр.НаименованиеТовараНов = Справочники.Номенклатура.НайтиПоНаименованию(Стр.НаименованиеТовара).Наименование, все равно
// действие бесполезно ибо ищем сами себя
ОбъектДокумента.Дата = ВыборкаДокументов.Дата; // масло масляное

вообще, зачем перебираешь ТЧ - непонятно, ты-бы озвучила лучше задачу по-русски, без кода, было-бы толку больше :)