Имя: Пароль:
1C
 
изменить проводки программно...
0 zak555
 
27.04.09
18:30
что-то забыл: можно ли программно отредактировать проводки документа?
1 Медвед1Сник
 
27.04.09
18:31
Кажись в семерке этого нельзя. Все делается в рамках ОбработкаПроведения. Но не уверен, т.к. не семерочник.
2 zak555
 
27.04.09
18:33
(1) вся проблема в том, что при интерактивном перепроведении дока изменяться суммы - что не есть гуд!
мне нужно только аналитику сменить ...
3 Нуф-Нуф
 
27.04.09
18:33
напрямую в таблицах?
4 у лю 427
 
27.04.09
18:35
можно... ищи в инете...
5 zak555
 
27.04.09
18:35
(3) ну через это не хотел бы...

что-то ттипа того:

О.НайтиОперацию(Док)

О.Дебет(1,Нужный);

О.Записать()
6 Greeen
 
27.04.09
18:38
можно
7 GreyK
 
27.04.09
19:14
(0) Разрешаю, но с условием чтения УК РФ :)
8 Стрелок
 
27.04.09
19:29
как раз операцию в 7.7 можно править на раз.. до перепроведения всё прокатит. а вот с регистрами - опа .... там извращаться надо если надо
9 Дядя Васька
 
27.04.09
19:33
И с проводками и с регистрами все просто. Комментируешь обработку проведения, снимаешь автоматическое удаление движений. В своей обработке проведения собираешь свои движения в ТЗ, удаляешь движения. Извращаешься над ТЗ, создаешь из нее движения заново. Ну и как проведешь, вертаешь взад нормальную обормотку. Технологическое проведение однако...
10 GreyK
 
27.04.09
19:38
(9) Не поверишь, но проводки операций легко меняются обработкой, а с регистраи гемор.
11 Стрелок
 
27.04.09
19:39
(9) глупость
12 Дядя Васька
 
27.04.09
19:40
(10) Не поверю.
(11) В чем глупость? ВыбратьДвиженияДокумента() уже отменили?
13 Zaval
 
27.04.09
19:53
(0) Когда-то делал Ючойсом... долго копается...
14 GreyK
 
27.04.09
19:59
(12) Для тебя не жалко :)
//*******************************************
Процедура Сформировать()
   Сч60=СчетПоКоду("60.1");
   Сч84=СчетПоКоду("84.3");
   Контрики=СоздатьОбъект("Справочник.Контрагенты");
   Контрики.НайтиПоНаименованию("GreyK",,);
   Операция=СоздатьОбъект("Операция");
   Доки=СоздатьОбъект("Документ");
   Доки.ВыбратьДокументы(,);
   Пока Доки.ПолучитьДокумент()=1 Цикл
       Если Доки.СуществуетОперация()=1 Тогда
           Операция.НайтиОперацию(Доки.ТекущийДокумент());
           Если Контрики.Выбран()=0 Тогда
               Операция.ВыбратьПроводки();
               Пока Операция.ПолучитьПроводку()=1 Цикл
                   Пока Операция.ПроводкаВыбрана()=1 Цикл
                       Операция.УдалитьПроводку();
                   КонецЦикла;
               КонецЦикла;
           Иначе
               МояМзда=Операция.КоличествоПроводок();
               Операция.НоваяПроводка();
               Операция.Кредит.Счет=Сч60;
               Операция.Контрагенты=Контрики.ТекущийЭлемент();
               Операция.Дебет.Счет=Сч84;
               Операция.Записать();
           КонецЕсли;
       КонецЕсли;
   КонецЦикла;
КонецПроцедуры
15 zak555
 
27.04.09
20:01
(7) да мне на него наср@ть!
16 Дядя Васька
 
27.04.09
20:03
(14) В чем принципиальное отличие от (9)? Сначала удаляешь, потом заново создаешь. Изменить существующую не даст.
Для Стрелка тоже не жалко, берем демку торговли, в документе реализация снимаем галку "Автоматическое удаление движений" если есть, и меняем обработку проведения на это:
Процедура ОбработкаПроведения(ВидыДвижений)
   
//    // Проверка заполненности обязательных реквизитов.
//      Если глВсеРеквизитыДокументаЗаполнены(Контекст,
//        "Фирма,Склад,Валюта,Контрагент,Договор")=0 Тогда
//        Возврат;
//    КонецЕсли;
//                  
//    Если (Склад.РозничныйСклад = 1) Тогда
//        глНеПроводить(Контекст,"Документ """+ глНазваниеДокументаВЖурнале(Контекст)+""" можно
//        |оформлять только с оптового склада!");
//        Возврат;
//    КонецЕсли;
//
//    // Проведение по регистрам оперативного учета.    
//    Если (ПустоеЗначение(ВидыДвижений) = 1) ИЛИ (Найти(ВидыДвижений, "Регистр") <> 0) Тогда
//        ПроведениеПоРегистрам();
//        
//        Если СтатусВозврата() = 0 Тогда
//            Возврат;
//        КонецЕсли;
//    КонецЕсли;
//    
//    глПриПроведении(Контекст, ВидыДвижений);

   ТЗДвижений=СоздатьОбъект("ТаблицаЗначений");
   ТЗДвижений.НоваяКолонка("Фирма");
   ТЗДвижений.НоваяКолонка("Номенклатура");
   ТЗДвижений.НоваяКолонка("Склад");
   ТЗДвижений.НоваяКолонка("ЦенаПрод");
   ТЗДвижений.НоваяКолонка("Количество");
   ТЗДвижений.НоваяКолонка("Внутреннее");
   
   Рег=СоздатьОбъект("Регистр.ОстаткиТМЦ");
   Рег.ВыбратьДвиженияДокумента(ТекущийДокумент());
   Пока Рег.ПолучитьДвижение()=1 Цикл
       ТЗДвижений.НоваяСтрока();
       ТЗДвижений.Фирма = Рег.Фирма;
       ТЗДвижений.Номенклатура = Рег.Номенклатура;
       ТЗДвижений.Склад = Рег.Склад;
       ТЗДвижений.ЦенаПрод = Рег.ЦенаПрод;
       ТЗДвижений.Количество = Рег.Количество;
       ТЗДвижений.Внутреннее = Рег.Внутреннее;
   КонецЦикла;
   
   ОчиститьДвижения("Регистр.ОстаткиТМЦ");
   
   ТЗДвижений.ВыбратьСтроки();
   Пока ТЗДвижений.ПолучитьСтроку() = 1 Цикл
       Регистр.ОстаткиТМЦ.Фирма = ТЗДвижений.Фирма;
       Регистр.ОстаткиТМЦ.Номенклатура = ТЗДвижений.Номенклатура;
       Регистр.ОстаткиТМЦ.Склад = ТЗДвижений.Склад;
       Регистр.ОстаткиТМЦ.ЦенаПрод = ТЗДвижений.ЦенаПрод;
       Регистр.ОстаткиТМЦ.Количество = ТЗДвижений.Количество*2;
       Регистр.ОстаткиТМЦ.Внутреннее = ТЗДвижений.Внутреннее;
       Регистр.ОстаткиТМЦ.ДвижениеРасходВыполнить();
   КонецЦикла;
КонецПроцедуры //ОбработкаПроведения()

в результате при проведении все количество по движениям регистра остатки ТМЦ увеличили на 2. Практического смысла не имеет конечно, просто как пример.
17 Дядя Васька
 
27.04.09
20:05
+(16) "увеличили на 2" = "умножили на 2" конечно
18 GreyK
 
27.04.09
20:10
(16) "Изменить существующую не даст." - А ты попробуй вставй текст в обработку и проверь.
19 GreyK
 
27.04.09
20:13
+(18) Чёй-то у меня скорописание грешит:)
20 Дядя Васька
 
27.04.09
20:13
(18) Куда вставить? Не далее чем в субботу пробовал. Надо было в старых документах новое субконто заполнить значением по умолчанию чтобы ничего не поехало. Если просто выбрать проводки и попробовать изменить и записать, скажет низзя. Потому делал по аналогии с (16).
21 GreyK
 
27.04.09
20:22
(20) Создай внешний отчет.
22 Дядя Васька
 
27.04.09
20:23
(21) Да говорю тебе пробовал я. Удалить существующую проводку и создать новую можно, изменить существующую програмно нельзя, если это операция документа, а не просто операция.
23 Дядя Васька
 
27.04.09
20:27
+(22) ОПЕРАЦИЮ изменишь, ПРОВОДКУ нет. Соответственно все равно сначала их надо выбрать и где-то запомнить.
24 GreyK
 
27.04.09
20:32
(22) Тебе создать внешний отчет трудно? Вставить туда код и на типовой опробовать трудно?
Твоя ошибка была в обращении к операции. Если долбится через Документ.Операция толка не будет, а через объект "Омерация" можно всё.
ПС Запускай на большую базу, мзда будет привлекательней :)
25 GreyK
 
27.04.09
20:33
+(24) "Омерация" = "Операция"
26 zak555
 
27.04.09
20:34
(23) а если раззрешить доку изменять проводки в ручную?
или это только для интерактива?
27 GreyK
 
27.04.09
20:36
(26) Однописуально :)
28 zak555
 
27.04.09
20:42
29 GreyK
 
27.04.09
20:48
(28) Молодец, но настоящий подаван 1С вначале смотрит КЖК :), а потом ищет подсказки.
30 Дядя Васька
 
27.04.09
20:56
(24) Н-дя, попробовал так, работает:
Процедура Сформировать()
   Сч41_1=СчетПоКоду("41.1");
   Сч41_2=СчетПоКоду("41.2");
   
   Опер=СоздатьОбъект("Операция");
   Опер.НайтиОперацию(ДокРасходнаяНакладная.ТекущийДокумент());
   Опер.ВыбратьПроводки();
   Пока Опер.ПолучитьПроводку() = 1 Цикл
       Если Опер.Кредит.Счет=Сч41_1 Тогда
           Опер.Кредит.Счет=Сч41_2;
           Опер.Записать();
       КонецЕсли;
   КонецЦикла;
КонецПроцедуры

наверное правда через документ долбился. Ну да бывает...
31 zak555
 
27.04.09
20:56
(29) нету книжек, нету сейчас 1С-ки ...
вот и спрашиваю...
32 zak555
 
27.04.09
20:57
(30) Опер.Записать () может из цикла нужно вытащить?
33 Дядя Васька
 
27.04.09
20:59
(32) Пример не для работы, на коленке за минуту не думая :)
34 zak555
 
27.04.09
22:11
(33) да понтяно...
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.