|
v7: Обработка пометить документы на удаление | ☑ | ||
---|---|---|---|---|
0
msk-07
02.03.13
✎
00:17
|
Пишу обработку, понимаю, что для кого-то это расплюснуть, но а я хочу разобраться. Прошу помогите найти ошибку, почему не срабатывает метод Удалить
Процедура Заполнить() Перем Запрос, ТекстЗапроса, Таб; //Создание объекта типа Запрос Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = "//{{ЗАПРОС(Сформировать) |Период с НачДата по КонДата; |ОбрабатыватьДокументы все; |Обрабатывать НеПомеченныеНаУдаление; |Контрагенты = Справочник.Контрагенты.ТекущийЭлемент; |Реализация = Документ.Реализация.ТекущийДокумент; |Группировка Реализация упорядочить по Реализация.ДатаДок; |"//}}ЗАПРОС ; // Если ошибка в запросе, то выход из процедуры Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат; КонецЕсли; // Подготовка к заполнению выходных форм данными запроса Таб = СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("Сформировать"); // Заполнение полей "Заголовок" Таб.ВывестиСекцию("Заголовок"); Состояние("Заполнение выходной таблицы..."); Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0); Пока Запрос.Группировка(1) = 1 Цикл // Заполнение полей Реализация Таб.ВывестиСекцию("Реализация"); КонецЦикла; // Вывод заполненной формы Таб.ТолькоПросмотр(1); // Таб.Показать("Сформировать", ""); Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат; КонецЕсли; Запрос.Выгрузить(ТЗ,0,1); КонецПроцедуры Процедура Выполнить() НачатьТранзакцию(); ФлагФиксТранзакции = 1; ТЗ.ВыбратьЭлементы(); Пока ТЗ.ПолучитьЭлемент()=1 Цикл ТЗ.Удалить(0); КонецЦикла; Если ФлагФиксТранзакции = 1 Тогда ЗафиксироватьТранзакцию(); Иначе ОтменитьТранзакцию(); КонецЕсли; КонецПроцедуры |
|||
1
Джордж1
02.03.13
✎
00:19
|
Метод не у того объекта применяешь
|
|||
2
msk-07
02.03.13
✎
00:21
|
В тз все выгрузил, теперь пересчет строку в цикле делаю и пока это делаю хочу их удалить
ТЗ.ВыбратьСтроку(); Пока ТЗ.ПолучитьСтроку()=1 Цикл ТЗ.Удалить(0); |
|||
3
Джордж1
02.03.13
✎
00:21
|
Ну и посмотри что ты удаляешь
|
|||
4
Кокос
02.03.13
✎
00:26
|
ОбъектыДок.НайтиДокумент(ТЗ.Реализация);
ОбъектыДок.Удалить(0); |
|||
5
msk-07
02.03.13
✎
00:32
|
Значение не представляет агрегатный объект (НайтиДокумент)
|
|||
6
msk-07
02.03.13
✎
00:42
|
Процедура Выполнить()
НачатьТранзакцию(); ФлагФиксТранзакции = 1; ОбъектыДок.НайтиДокумент(ТЗ.Реализация); ОбъектыДок.Удалить(0); Если ФлагФиксТранзакции = 1 Тогда ЗафиксироватьТранзакцию(); Иначе ОтменитьТранзакцию(); КонецЕсли; КонецПроцедуры |
|||
7
msk-07
02.03.13
✎
00:42
|
не может все равно удалить :(
|
|||
8
Кокос
02.03.13
✎
00:48
|
ОбъектДок = СоздатьОбъект("Документ");
ТЗ.ВыбратьСтроку(); Пока ТЗ.ПолучитьСтроку()=1 Цикл ОбъектыДок.НайтиДокумент(ТЗ.Реализация); ОбъектыДок.Удалить(0); |
|||
9
NS
02.03.13
✎
00:49
|
Красивый код, ничего что ФлагФикстранзакции всегда будет равен единице?
|
|||
10
Кокос
02.03.13
✎
00:50
|
эх. 7рка. сто лет ее не трогал :))
|
|||
11
msk-07
02.03.13
✎
00:53
|
простите, но не получается
ТЗ.ВыбратьСтроку(); Пока ТЗ.ПолучитьСтроку()=1 Цикл ОбъектыДок.НайтиДокумент(ТЗ.Реализация); ОбъектыДок.Удалить(0); КонецЦикла; Если ФлагФиксТранзакции = 1 Тогда ЗафиксироватьТранзакцию(); Иначе ОтменитьТранзакцию(); КонецЕсли; |
|||
12
msk-07
02.03.13
✎
00:53
|
он не находит документ
|
|||
13
Cthulhu
02.03.13
✎
00:58
|
по краю ходишь.
пометка на удаление проведенного документа выполняется с предварительной отменой его проведения.. проведение и отмена проведения документов выполняются во "внутренней" (организовываемой самим движком) транзакции. вложенные транзакции 1с не поддерживает. рискуешь получить помеченные на удаления документы с движениями (которые толком без плясок даже и не увидишь) |
|||
14
msk-07
02.03.13
✎
01:00
|
документы не проведенные, это точно
|
|||
15
NS
02.03.13
✎
01:01
|
|Период с НачДата по КонДата;
|ОбрабатыватьДокументы все; |Обрабатывать НеПомеченныеНаУдаление; |Контрагенты = Справочник.Контрагенты.ТекущийЭлемент; |Реализация = Документ.Реализация.ТекущийДокумент; |Группировка Реализация упорядочить по Реализация.ДатаДок; А это что за чудеса? |
|||
16
NS
02.03.13
✎
01:02
|
Потом - зачем два раза выполнять запрос? Есть метод вначаловыборки()
|
|||
17
msk-07
02.03.13
✎
01:05
|
простите но не кажется что все таки что-то не так здесь
ОбъектыДок.НайтиДокумент(ТЗ.Реализация); ОбъектыДок.Удалить(0); Все время ругается на удалить |
|||
18
NS
02.03.13
✎
01:10
|
ОбъектыДок у тебя как определены?
=Создатьобъект("Документ")? |
|||
19
Злопчинский
02.03.13
✎
03:28
|
внимание, вопрос - ты хочеь пометить на удаление или удалить?
|
|||
20
Дегенератор идей
02.03.13
✎
08:24
|
(13) что значит не поддерживает вложенные транзакции?
|
|||
21
mishaPH
02.03.13
✎
08:27
|
(13) глупость
|
|||
22
mishaPH
02.03.13
✎
08:30
|
Процедура Выполнить()
НачатьТранзакцию(); ТЗ.ВыбратьЭлементы(); Пока ТЗ.ПолучитьЭлемент()=1 Цикл Док = СоздатьОбъект("Документ."+ТЗ.Реализация.Вид()); Док.НайтиДокумент(ТЗ.Реализация); Док.Удалить(0); КонецЦикла; ЗафиксироватьТранзакцию(); КонецПроцедуры |
|||
23
mishaPH
02.03.13
✎
08:31
|
(15) кстати да. что за фигня
|
|||
24
mishaPH
02.03.13
✎
08:32
|
Автор. тебе тупо надо выбрать проведенные доки и их удалить? нафига тогда черный запрос.
|
|||
25
mishaPH
02.03.13
✎
08:34
|
Процедура Выполнить()
Таб = СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("Сформировать"); // Заполнение полей "Заголовок" Таб.ВывестиСекцию("Заголовок"); Состояние("Заполнение выходной таблицы..."); Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0); Таб.ТолькоПросмотр(1); НачатьТранзакцию(); Док = СоздатьОбъект("Документ.Реализация"); Док.ВыбратьДокументы() Пока Док.ПолучитьДокумент()=1 Цикл Таб.ВывестиСекцию("Реализация"); Док.Удалить(0); КонецЦикла; ЗафиксироватьТранзакцию(); Таб.Показать(); КонецПроцедуры |
|||
26
mishaPH
02.03.13
✎
08:34
|
и к чему печатная таблица?
|
|||
27
mishaPH
02.03.13
✎
08:35
|
если тупо удалить доки то выпили из (25) код с таблицей
|
|||
28
sapphire
02.03.13
✎
10:16
|
Изобретение колеса продолжается?
|
|||
29
Lionee
02.03.13
✎
10:35
|
ага квадратного
|
|||
30
Cthulhu
02.03.13
✎
12:10
|
(20): что непонятно в это фразе из документации?
(21): глупостью было бы полагать, что собеседник высказывает свое мнение без достаточных на то оснований. так что глупость - ты сказал, но не я. а ситуацию такую сам видел (наличие движений у помеченных на удаление вследствие использования пакетного проведения/распроведения/плясокспометкойнаудаление в транзакции). |
|||
31
mishaPH
02.03.13
✎
18:04
|
(30) Однажды встречал такое. но с транзакциями не связывал
|
|||
32
Cthulhu
02.03.13
✎
23:40
|
(31): я просто вынужден был связать. после того, как мне показали - после чего это случилось. и этим самым "чем" оказалась обработка, лупящая в транзакции цикл с проведением/распроведением и пометку на удаление со снятием (по условиям определенным), проверил на том же наборе данных (есс-но после выпрямления кривизны ранее обнаруженной) - ага, точнёхонько воспроизвелось. но там нюанс - был вылет по ошибке. что, однако, не меняет сути. в связи с чем проведение в транзакции с тех пор - табу. подтвержденное приведенными выше выдержками из комплектного мануала.
|
|||
33
Torquader
03.03.13
✎
01:24
|
(32) Без вылета вложенные транзакции в 1С прекрасно работают, только нужно учитывать один нюанс - ОтменитьТранзакцию() будет работать только для основной транзакции, то есть все открытые вложенные просто увеличивают счётчик транзакции, но никак не влияют на результат.
В случае проведения, это означает, что если система отменит проведение документа (в случае неуспеха), то ошибки не произойдёт, но и проведение не отменится. То есть имеем проведённый документ. Открываем транзакцию. Изменяем документ. Записываем. Выполняем проведение - тут ошибка - должна произойти отмена (и функция провести возвращает неуспех), а в базе остаются последствия проведения (причём не старое состояние, а часть нового). |
|||
34
Злопчинский
03.03.13
✎
01:33
|
(33) не понял малость вот этого:
> В случае проведения, это означает, что если система отменит проведение документа (в случае неуспеха), то ошибки не произойдёт, но и проведение не отменится. . код типа НачатьТранзакцию(); Цикл по докам Результат = Док.Провести(); Если Результат = 0 Тогда ОтменитьТранзакцию(); Возврат; КонецЕсли; КонецЦикла; ЗафиксироватьТранзакцию(); . покатит или нет? |
|||
35
Torquader
03.03.13
✎
15:22
|
(34) Так прокатит, но только в том случае, когда это всё ещё в одну транзакцию не завёрнуто.
Там ещё есть фокусы с обработкой Попытка Исключение в случае транзакций. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |