Имя: Пароль:
1C
1С v8
Программно добавить строку в ТЧ документа
,
0 amadeus2010
 
01.09.12
08:27
Доброе утро,вот и осень наступила,но вопросы остаются.У меня к уважаемым знатокам вопрос.Есть документ с реквизитом Агент и ТЧ в которую заполняются торговые точки Выбранного агента.Список точек хранится в справочнике.Теперь надо сделать так чтобы при заполнении торг точек была проверка, что если торг точка принадлежит агенту но ее нет в документе тогда добавить ее из справочника.Вот старый код заполнения ТЧ торговые точки

/////////////////////////////////////////////////////////////////
Выборка = Справочники.кпкТорговыеТочки.Выбрать(, , Новый Структура("Агент", Агент));
   КонецЕсли;

   Пока Выборка.Следующий() Цикл
       Если Выборка.ПометкаУдаления Тогда Продолжить КонецЕсли;
       Стр = Дни.Добавить();
       Стр.ТорговаяТочка = Выборка.Ссылка;                
       Стр.Контрагент = Выборка.Ссылка.Владелец;                
   КонецЦикла;
   
   
   
   // удаление торговых точек не принадлежащих Агенту    
   i=0;
   Пока i<=Дни.Количество()-1 Цикл
       Если Дни[i].ТорговаяТочка.Агент<>Агент Тогда
           Дни.Удалить(i);
       Иначе
           i=i+1;
       КонецЕсли;
   КонецЦикла;
//////////////////////////////////////////////////////////
1 Мимохожий Однако
 
01.09.12
08:33
А теперь вопрос...
2 Megas
 
01.09.12
08:33
3 способа.
1) Выгрузить Тч в Тз , поместить тз в запрос для отбора.
2) Метод "Найти".
3) Метод "Свернуть".
3 Megas
 
01.09.12
08:35
(0) и ещё жутко не люблю такие выборки.
"Выборка = Справочники.кпкТорговыеТочки.Выбрать(, , Новый Структура("Агент", Агент));"
Я так и не понял для чeго их сделали если всё можно сделать через "Запрос"
4 amadeus2010
 
01.09.12
08:52
документ был создан до меня я его только переделываю,согласен запросом удобнее,например таким
/////////////////////////////////////
ВЫБРАТЬ
   кпкТорговыеТочки.Ссылка как TT
ИЗ
   Справочник.кпкТорговыеТочки КАК кпкТорговыеТочки
ГДЕ
   кпкТорговыеТочки.Агент = &Агент
/////////////////////////////////////////
только как потом сделать проверку что есть или нет такой точки и если нет то добавить
5 amadeus2010
 
01.09.12
09:10
написал вот так
//////////////////////////
Запрос= Новый Запрос
   Запрос.Текст=
   "ВЫБРАТЬ
   |кпкТорговыеТочки.Ссылка как TT
   |ИЗ
   |Справочник.кпкТорговыеТочки КАК кпкТорговыеТочки
   |ГДЕ
   |кпкТорговыеТочки.Агент = &Агент";
   Запрос.УстановитьПараметр("Агент", Агент);
   Выборка=Запрос.Выполнить().Выбрать();
   Пока Выборка.Следующий() Цикл
       Строка=Дни.Добавить();
       Строка.ТорговаяТочка=Выборка.ТТ;
   КонецЦикла;    
///////////////////////////////////////////////////////////
этот код и удаление точек из (0) висит на одной кнопке Обновить. Как сделать так чтобы 2 кода не затерли друг друга
6 Мимохожий Однако
 
01.09.12
09:24
Если заполнить тем, что надо, то не придется удалять потом ))
7 amadeus2010
 
01.09.12
09:32
трассировка выдала ошибку
Поле объекта не обнаружено (ТТ)
       Строка.ТорговаяТочка=Выборка.ТТ;
8 Живой Ископаемый
 
01.09.12
09:37
нашел чем хвастаться
9 amadeus2010
 
01.09.12
09:38
я не хвастаюсь, прошу помощи
10 Живой Ископаемый
 
01.09.12
09:39
а чем помочь?
11 amadeus2010
 
01.09.12
09:48
не понятна ошибка (7), нет я понял что это не обнаружено, но вот как сделать чтобы не выходила эта ошибка? Привожу полный код процедуры
/////////////////////////////////////////////////////////////
//Дима+ удаление торговых точек не принадлежащих Агенту    
   i=0;
   Пока i<=Дни.Количество()-1 Цикл
       Если Дни[i].ТорговаяТочка.Агент<>Агент Тогда
           Дни.Удалить(i);
       Иначе
           i=i+1;
       КонецЕсли;
   КонецЦикла;
   //Дима-    
   
   
   Запрос= Новый Запрос;
   Запрос.Текст=
   "ВЫБРАТЬ
   |кпкТорговыеТочки.Ссылка как TT
   |ИЗ
   |Справочник.кпкТорговыеТочки КАК кпкТорговыеТочки
   |ГДЕ
   |кпкТорговыеТочки.Агент = &Агент";
   Запрос.УстановитьПараметр("Агент", Агент);
   Выборка=Запрос.Выполнить().Выбрать();
   Пока Выборка.Следующий() Цикл
       Строка=Дни.Добавить();
       Строка.ТорговаяТочка=Выборка.ТТ;
   КонецЦикла;    
////////////////////////////////////////////////////////////////////
12 Живой Ископаемый
 
01.09.12
09:49
всем плевать
выполни свой запрос в консоли. И покажи скриншот что результат ненулевой.
13 Rie
 
01.09.12
09:52
(7) Нескромный вопрос - а буквы у тебя "Т" или "T"?
14 Живой Ископаемый
 
01.09.12
09:55
вообще точно, сорри. :) (13) прав.
15 Wobland
 
01.09.12
09:57
ещё никто не сказал, что удалять с конца надо?
16 Wobland
 
01.09.12
10:01
+(13) замени ТТ на ЧЧ
17 amadeus2010
 
01.09.12
10:04
(13) ТТ были написаны латиницей в тексте запроса, а в параметрах кирилицей.Теперь торговые точки находятся и записываются,но при этом к уже существующим.Как здесь можно использовать метод ТЧ.Очистить()?
18 Капитан О
 
01.09.12
10:08
(17) ТЧ.Очистить()
19 Mikeware
 
01.09.12
10:10
План посещений лепишь? :-)
20 amadeus2010
 
01.09.12
10:18
(19) да, их леплю.Вот сделал так,насколько это правильно?
/////////////////////////////////
//Дима+ удаление торговых точек не принадлежащих Агенту    
   i=0;
   Пока i<=Дни.Количество()-1 Цикл
       Если Дни[i].ТорговаяТочка.Агент<>Агент Тогда
           Дни.Удалить(i);
       Иначе
           i=i+1;
       КонецЕсли;
   КонецЦикла;
   //Дима-    

   
       
    //Дима+ добавление новых торговых точек Агента
   Запрос= Новый Запрос;
   Запрос.Текст=
   "ВЫБРАТЬ
   |кпкТорговыеТочки.Ссылка как ТТ
   |ИЗ
   |Справочник.кпкТорговыеТочки КАК кпкТорговыеТочки
   |ГДЕ
   |кпкТорговыеТочки.Агент = &Агент";
   Запрос.УстановитьПараметр("Агент", Агент);
   Выборка=Запрос.Выполнить().Выбрать();
     Дни.Очистить();
   Пока Выборка.Следующий()>0  Цикл
       Строка=Дни.Добавить();
       Строка.ТорговаяТочка=Выборка.ТТ;
   КонецЦикла;    
   //Дима-
////////////////////////////////////
21 Капитан О
 
01.09.12
10:19
(20) найти строки с чужим агентом и удали их в цикле
22 amadeus2010
 
01.09.12
10:26
(20) первая часть кода это и делает.
(19) Проверил, выводит только торговые точки выбранного агента,но при этом обнуляет дни псещений,т.е если в документе указаны были дни посещений,то после выполнения моей процедуры они обнуляться и их придется отмечать заново.Как можно это сделать без обнуления?
23 Капитан О
 
01.09.12
10:26
а вообще, при повторном отрабатывании кода добавятся лишние строки. я не понял задачу
24 Капитан О
 
01.09.12
10:26
(21) имелось в виду
М=НайтиСтроки()
Для Каждого Из М ТЧ.Удалить
25 Капитан О
 
01.09.12
10:27
(24) отбой, НайтиСтроки по неравенству не работает
26 Капитан О
 
01.09.12
10:27
один хрен с конца удалять в цикле нужно
27 amadeus2010
 
01.09.12
10:44
лишние строки не добавляются,только обнуляется реквизит ТЧ.дни,каким методом можно не добавляю лишних строк в документ записать все новые торговые точки агента,при этом не добавляя чужих точек? Т.е мне нужно добавить новые точки если такие есть в документ,но при этом оставить не тронутыми старые записи
28 Капитан О
 
01.09.12
10:56
(27) слева: справочник, справа: твоя ТЧ, соединение по точке, фильтр по твоему агенту и нуллу. получишь все точки агента, которых нет в ТЧ
29 amadeus2010
 
01.09.12
11:05
(28)не совсем понял, можно пример привести как это реализовать
30 Wobland
 
01.09.12
11:08
(29) выбрать что-то из справочник левое тч по справочник.точка=тч.точка где справочник.агент=&агент и тч.точка есть NULL и тч.ссылка=&ссылка
31 amadeus2010
 
01.09.12
12:23
решил вопрос таким образом
//////////////////////////////////////////
Запрос= Новый Запрос;
   Запрос.Текст=
   "ВЫБРАТЬ
   |кпкТорговыеТочки.Ссылка как ТТ
   |ИЗ
   |Справочник.кпкТорговыеТочки КАК кпкТорговыеТочки
   |ГДЕ
   |кпкТорговыеТочки.Агент = &Агент";
   Запрос.УстановитьПараметр("Агент", Агент);
   Выборка=Запрос.Выполнить().Выбрать();
     //Дни.Очистить();
   Пока Выборка.Следующий()  Цикл
   Запрос=Новый Запрос;
   Запрос.Текст=
   "ВЫБРАТЬ
   |кпкПланПосещений.Дни.ТорговаяТочка.Ссылка КАК ТТ
   |ИЗ
   |Документ.кпкПланПосещений КАК кпкПланПосещений
   |ГДЕ
   |кпкПланПосещений.Дни.ТорговаяТочка.Ссылка = &ТТ";
   Запрос.УстановитьПараметр("ТТ",Выборка.ТТ);
   Выборка2=Запрос.Выполнить();
   Если Выборка2.Пустой() Тогда
       Строка=Дни.Добавить();
       Строка.ТорговаяТочка=Выборка.ТТ;
       Строка.Контрагент=Выборка.ТТ.Владелец;
   КонецЕсли;    
   КонецЦикла;    
/////////////////////////////////////////////////////
32 Wobland
 
01.09.12
12:35
(31) а что не прислушался?
33 Wobland
 
01.09.12
12:38
за запрос в цикле полагается эцих с гвоздями
34 Wobland
 
01.09.12
12:45
а почему во втором запросе выборка по всем документам?
короче, удаляй эти нечистоты и делай снова
35 amadeus2010
 
01.09.12
13:59
переделал так
////////////////////////////
Запрос= Новый Запрос;
   Запрос.Текст=
   "ВЫБРАТЬ
   |кпкТорговыеТочки.Ссылка как ТТ
   |ИЗ
   |Справочник.кпкТорговыеТочки КАК кпкТорговыеТочки
   |ГДЕ
   |кпкТорговыеТочки.Агент = &Агент";
   Запрос.УстановитьПараметр("Агент", Агент);
   Выборка=Запрос.Выполнить().Выбрать();
     
   Пока Выборка.Следующий()  Цикл
       ПараметрыОтбора = Новый Структура;
       ПараметрыОтбора.Вставить("ТорговаяТочка", Выборка.ТТ);
       ТТНайдено=Дни.НайтиСтроки(ПараметрыОтбора);
   
     Если ТТНайдено.Количество()=0 Тогда
       Строка=Дни.Добавить();
       Строка.ТорговаяТочка=Выборка.ТТ;
       Строка.Контрагент=Выборка.ТТ.Владелец;
    КонецЕсли;    
   КонецЦикла;    
////////////////////////////////////
36 Wobland
 
01.09.12
14:39
выбрать
точка, владелец, сумма(количество)
из
(выбрать
ТЧ.Точка,
ТЧ.Владелец,
ТЧ.Количество
ИЗ ТЧ
объединить
спр.Ссылка,
спр.Владелец,
0
из справочник где агент=&агент)
сгруппировать по точка, владелец
...
ТЧ.Загрузить(Запрос.Выполнить.Выгрузить)
37 Wobland
 
01.09.12
14:39
(36) неа, в таком случае теряется порядок строк в ТЧ
AdBlock убивает бесплатный контент. 1Сергей