Имя: Пароль:
1C
1С v8
Перезаписать таб.часть документа
,
0 Ane4ka2410
 
22.03.12
04:25
Такая вот дилемма. В задачу входило сделать обработку для обмена между базами 1с 77 и 82, перенос определенных документов.
Никак не могу разобраться как перезаписывать табличную часть документов. Тоесть в чем суть - запустили обработку, перенесли необходимые документы, но после переноса в 77 возможны какие-то изменения в табл.части товаров и необходимо чтоб при повторной передаче доков - эти части перезаписывались. Пока у меня срабатывает так, что если документ уже существует в базе 82, то обработка его просто пропускает, никак не могу разобраться как правильно прописать чтоб обработка находила доки и если уже существует док, то перезаписывала табл.часть.
Помогите пожалуйста. Сильно не ругайте, в 1с новичок, стараюсь потихоньку колупаться, но могу сильно где-то тупануть.
1 Ane4ka2410
 
22.03.12
04:28
вот кусок кода, где начинаем записывать док и часть кода с записью табл.части.

Для каждого Док Из ТаблицаДокументов Цикл
           ФлагУспешнойЗаписиДокумента = Ложь;
           Документ = Документы.РеализацияТоваровУслуг.СоздатьДокумент();        
           Документ.Дата = Док.ДатаДок;
           Документ.Номер = Док.НомерДок;
           Документ.Организация = ОрганизацияПоУмолчанию;
           Документ.КурсВзаиморасчетов = Док.Курс;
           Документ.ТипЦен =  ОсновнойТипЦен;
           Документ.ВалютаДокумента = ОсновнаяВалюта;
           Документ.КратностьВзаиморасчетов = "1";
           Документ.ОтражатьВБухгалтерскомУчете = истина;
           Документ.ОтражатьВНалоговомУчете = истина;
           Документ.ОтражатьВУправленческомУчете = истина;
//НОМЕНКЛАТУРА ДОК
       ВыборкаНоменклатуры = ТаблицаНоменклатуры.НайтиСтроки(Новый Структура("Владелец", Док));
       Для каждого ДокСтрока Из ВыборкаНоменклатуры Цикл
           Документ.Товары.Очистить();
           Строка = Документ.Товары.Добавить();
           НаименованиеТМЦ = СокрЛП(ДокСтрока.ТМЦ_Наименование);
           ПоискСоответствия = ТаблицаСоответствий.Найти(НаименованиеТМЦ, "Наименование");
           Строка.Номенклатура = ПоискСоответствия.Номенклатура_v82;
           Строка.Количество = ДокСтрока.Кво;
           Строка.Коэффициент = "1";
           Строка.СпособСписанияОстаткаТоваров = Перечисления.СпособыСписанияОстаткаТоваров.СоСклада;
           
           ПоискЕдиницы = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию(ДокСтрока.Ед_Ед);
           Если ПоискЕдиницы.Пустая() Тогда
               НоваяЕдиница = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
               НоваяЕдиница.Наименование = ДокСтрока.Ед_Ед;
               НоваяЕдиница.Коэффициент = ДокСтрока.Ед_Коэффициент;
               Попытка                
                   НоваяЕдиница.Записать();                
               Исключение                    
                   Сообщить("Ошибка при записи единицы измерения " + ДокСтрока.Ед_Ед + " !", СтатусСообщения.Важное);
                   возврат;
               КонецПопытки;                
               Строка.ЕдиницаИзмерения = НоваяЕдиница.Ссылка;
           Иначе
               Строка.ЕдиницаИзмерения = ПоискЕдиницы.Ссылка;
           КонецЕсли;
           
           Строка.Цена = ДокСтрока.ЦенаБезНДС;
           Строка.Сумма = ДокСтрока.ЦенаБезНДС*ДокСтрока.Кво;            
           Строка.СтавкаНДС = ?(Док.ВидНДС_Ставка <> 0, Перечисления.СтавкиНДС.НДС20, Перечисления.СтавкиНДС.БезНДС);            
           Строка.СуммаНДС = ДокСтрока.НДС;
       КонецЦикла;

//ЗАПИСЬ
       Попытка        
           Документ.Записать(?(Проводить, РежимЗаписиДокумента.Проведение, РежимЗаписиДокумента.Запись));    
           Сообщить("Документ № " + Документ.Номер + " от " + Документ.Дата + " записан!");
           КоличествоИмпортаДокументов = КоличествоИмпортаДокументов +1;
           ФлагУспешнойЗаписиДокумента = Истина;
       Исключение            
           Сообщить("Документ № " + Документ.Номер + " от " + Документ.Дата + " не записан!")            
       КонецПопытки;
               
       ЭлементыФормы.Индикатор.Значение = ЭлементыФормы.Индикатор.Значение + 1;
       Состояние("Запис документів. Оброблено " + ЭлементыФормы.Индикатор.Значение + " з " + СписокНакладных.Количество() + " документів.");
   КонецЦикла;
   Сообщить("Документы: Сохранено "+КоличествоИмпортаДокументов+ " записей из найденых "+ТаблицаДокументов.Количество() );
   ЭлементыФормы.Индикатор.Видимость = ЛОЖЬ;
2 Лирик
 
22.03.12
06:35
Существующие документы не изменяет потому, что ты наверняка работаешь со ссылкой. В приведенном коде только создание новых документов, а где код обработки найденных? И где, в конце концов, фото?! Сколько вас учат, ничего не понимаете :)
3 Kassius
 
22.03.12
06:37
Категорически согласен с (2).
(0) без фото тут никто не помогает.
4 Ane4ka2410
 
22.03.12
11:29
эх.... вообще любопытная политика, какое отношение фото имеет к программированию в 1с, ну хоть за совет спасибо :)
А обработки найденных нет, потому что чтобы то что я выдумывала - не срабатывает.
5 lxs
 
22.03.12
11:34
(0) тебе не кажется, что вот здесь:



      Для каждого ДокСтрока Из ВыборкаНоменклатуры Цикл
           Документ.Товары.Очистить();


кроется засада?
6 patapum
 
22.03.12
11:37
Ну попробуй перед созданием документа
ДокументСсылка = Документы.РеализацияТоваровИУслуг.НайтиПоНомеру(Док.ДатаДок, Док.НомерДок);
Если ЗначениеЗаполнено(ДокументСсылка) Тогда
Документ = ДокументСсылка.ПолучитьОбъект();
Иначе
то что было у тебя
КонецЕсли;
а без фото на мисте программирование не пойдет. это МИСТика...
7 Ane4ka2410
 
22.03.12
11:37
пробовала так. Не проходит. Если документ уже существует, то он его тупо не записывает
8 patapum
 
22.03.12
11:40
ну, если ему сказать Записать, то ему деваться то некуда...
9 Alex375
 
22.03.12
11:45
если хочешь, можешь в аську постучаться - помогу разобраться с задачей
10 Ane4ka2410
 
22.03.12
11:49
patapum,  lxs - Спасибо за помощь :) пока не выходит, но идея ясна, буду рыть в ту сторону.
Alex375 - я пока постараюсь сильно никого собой не обременять и попробую поколупаться, но если туго будет - напишу, спасибо :)
11 patapum
 
22.03.12
11:51
"Сисадмин цветы и конфеты не пьет!" (с)
фото с тебя... )))
12 Ane4ka2410
 
22.03.12
11:56
добавила фото, раз это так существенно :)
13 lxs
 
22.03.12
11:58
(7) Почему не записывает-то? Ошибка какая-то или что? может транзакцию не закрываешь. Распиши подробнее.
14 sanja26
 
22.03.12
12:03
А ты существующий док после перезаполнения записываешь? или тлько новые
15 sanja26
 
22.03.12
12:05
в (1) только вновь создаваемый
16 Ane4ka2410
 
22.03.12
12:13
sanja26, пишет при записи, что номер не уникален.
Вообще немного путаюсь - по факту мне нужно перезаписать только табл.часть, а не весь документ. Тоесть мне перед началом цикла создания дока нужно сделать проверку, а очищать уже в цикле табл.части?
з.ы. сильно не ругайтесь на тупёж:)
17 Гефест
 
22.03.12
12:15
(16) Ты наверное создаешь новый документ? Ты должна найти существующий, внести в него изменения и записать
18 lxs
 
22.03.12
12:16
(16) показывай. где ищешь.
19 Ane4ka2410
 
22.03.12
12:28
Для каждого Док Из ТаблицаДокументов Цикл
       НомерСчета= "РН00000026";
       ДокументСсылка = Документы.РеализацияТоваровУслуг.НайтиПоНомеру(НомерСчета);
       Если Если ДокументСсылка = Неопределено Тогда        
       Документ = Документы.РеализацияТоваровУслуг.СоздатьДокумент();    
                     ........
               Иначе
           ИначеЕсли Документ <> Неопределено Тогда
       Сообщить("Найден документ №"+НомерСчета);

Ну это приблизительно. Взяла один конкретный док, поиск среди всех потом напишу, мне пока главное принцип понять.
Документ то находит, а вот что дальше с ним делать - путаюсь. КонецЕсли нужно ж уже прописывать в самом конце всех махинаций?
В Записи просто изменила Исключение
20 Ane4ka2410
 
22.03.12
12:29
*без еще одного иначе
21 lxs
 
22.03.12
12:31
Неправильно. Неопределено может быть только в том случае, если ты не передаешь НомерСчета.
22 Гефест
 
22.03.12
12:32
(19) Точно так же как и для нового заполняй реквизиты и записывай. Для табличных частей не забудь УдалитьСтроки(), чтобы очистить их
23 Ane4ka2410
 
22.03.12
12:33
ДокументСсылка = Документы.РеализацияТоваровУслуг.НайтиПоНомеру(Док.ДатаДок, Док.НомерДок);
Если ЗначениеЗаполнено(ДокументСсылка) Тогда
Документ = ДокументСсылка.ПолучитьОбъект();
24 hhhh
 
22.03.12
12:34
(23)         ДокументСсылка = Документы.РеализацияТоваровУслуг.НайтиПоНомеру(Док.ДатаДок, Док.НомерДок);

спасибо, рассмешила.
25 Ane4ka2410
 
22.03.12
12:34
тоесть грубо говоря нужно будет дважды продублировать код, но в коде где документ найден очистить строки?
Ну с этим поколупаюсь. А такой еще вопрос, если мне при записи пишет что номер не уникален, то как это обойти?
26 lxs
 
22.03.12
12:35
...
Если Документссылка.Пустая() Тогда
 //создаешь новый
Иначе
 //получаешь объект
 Об = Документссылка.ПолучитьОбъект();
 //меняешь реквизиты, если надо
 ..
 //меняешь табличную часть
 Об.<Табличная часть>.Очистить();
 Для каждого СтрокаЗаполнения Из ДанныеДляЗаполненияДокумента Цикл
   НоваяСтрока = Об.<Табличная часть>.Добавить();
   ..
 КонецЦикла;
 Попытка
   Об.Записать(<РежимЗаписиДокумента>);
 Исключение
   ..
 КонецПопытки;
27 lxs
 
22.03.12
12:36
(25) Устранить причину неуникальности.
28 Ane4ka2410
 
22.03.12
12:37
hhhh, я лишь скопировала то что мне написали до этого, мне главное принцип понять, это ж черновой вариант. И я очень благодарна что мне пытаются помочь.
29 Ane4ka2410
 
22.03.12
12:38
lxs, спасибо большое, попробую :))
30 sanja26
 
22.03.12
13:34
НомерСчета разве не переменная, которую получаешь из семерки?? СокрЛП(НомерСчета) тебе в помощь
31 Ane4ka2410
 
23.03.12
00:33
Все большое спасибо за помощь! Разобралась :) сразу не было возможности написать))
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан