Как удалить движения документа программно? Потребовалось в УТ быстро удалить все движения по банку, дело вроде легкое - отменить проведение всех поступлений и списаний безналичных денежных средств, но не тут то было...
При попытке отмены проведения выполнялись проверки на условия оплаты по заказу и документ ни как не отменял проведения
Ну не может типовым способом, заставим не типовым: Через запрос делаем выбору необходимых нам документов и в обработке результата пишем:
Код 1C v 8.3 Для Каждого СтрокаРезультата Из РезультатТаблица Цикл
//алгоритм обработки строки результата - начало
ДокОбъект = СтрокаРезультата.Ссылка.ПолучитьОбъект();
Для Каждого Движение ИЗ ДокОбъект.Движения Цикл
Если Движение.Количество() > 0 Тогда
Точка = Найти(Строка(Движение), ".");
ВидРегистра = Лев(Строка(Движение), Точка - 13);
РегистрИмя = СокрП(Сред(Строка(Движение), Точка + 1));
Если ВидРегистра = "РегистрНакопления" Тогда
НаборЗаписей = РегистрыНакопления[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрБухгалтерии" Тогда
НаборЗаписей = РегистрыБухгалтерии[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрСведений" Тогда
НаборЗаписей = РегистрыСведений[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрРасчета" Тогда
НаборЗаписей = РегистрыРасчета[РегистрИмя].СоздатьНаборЗаписей();
КонецЕсли;
НаборЗаписей.Отбор.Регистратор.Установить(ДокОбъект.Ссылка);
Иначе
НаборЗаписей = Движение;
КонецЕсли;
Попытка
НаборЗаписей.Записать();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
ДокОбъект.Проведен = Ложь;
//ДокОбъект.ОбменДанными.Загрузка = Истина;
ДокОбъект.Записать(режимзаписидокумента.запись);
//алгоритм обработки строки результата - конец
КонецЦикла;
Готовая функция для использования в своих обработках или общем модуле:
Код 1C v 8.3 Процедура УдалитьДвиженияДокумента(Документ)
ДокОбъект = Документ.ПолучитьОбъект();
Для Каждого Движение ИЗ ДокОбъект.Движения Цикл
Если Движение.Количество() > 0 Тогда
Точка = Найти(Строка(Движение), ".");
ВидРегистра = Лев(Строка(Движение), Точка - 13);
РегистрИмя = СокрП(Сред(Строка(Движение), Точка + 1));
Если ВидРегистра = "РегистрНакопления" Тогда
НаборЗаписей = РегистрыНакопления[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрБухгалтерии" Тогда
НаборЗаписей = РегистрыБухгалтерии[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрСведений" Тогда
НаборЗаписей = РегистрыСведений[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрРасчета" Тогда
НаборЗаписей = РегистрыРасчета[РегистрИмя].СоздатьНаборЗаписей();
КонецЕсли;
НаборЗаписей.Отбор.Регистратор.Установить(ДокОбъект.Ссылка);
Иначе
НаборЗаписей = Движение;
КонецЕсли;
Попытка
НаборЗаписей.Записать();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Категория:
Документы Как выбрать запросом записи регистра сведений и удалить их? В регистре сведений штрих кодов появились ошибочные записи, которые надо было быстро удалить... можно конечно и ручками выбирать и жать Delete, но это не наш метод!
Код 1C v 8.3 Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Штрихкоды.Штрихкод,
| Штрихкоды.Владелец,
| Штрихкоды.ТипШтрихкода,
| Штрихкоды.ЕдиницаИзмерения,
| Штрихкоды.ХарактеристикаНоменклатуры,
| Штрихкоды.СерияНоменклатуры,
| Штрихкоды.Качество
|ИЗ
| РегистрСведений.Штрихкоды КАК Штрихкоды
|ГДЕ
| Штрихкоды.СерияНоменклатуры.ПометкаУдаления";
Результат = Запрос.Выполнить();
РезультатТаблица = Результат.Выгрузить();
ТекПозиция = 0;
Для каждого СтрокаЗапроса из РезультатТаблица Цикл
ОбработкаПрерыванияПользователя();
ТекПозиция = ТекПозиция + 1;
Состояние("Выполнено " + Окр(ТекПозиция / РезультатТаблица.Количество() * 100) + "%");
НаборЗаписей = РегистрыСведений.Штрихкоды.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Штрихкод.Установить(СтрокаЗапроса.Штрихкод);
НаборЗаписей.Отбор.Владелец.Установить(СтрокаЗапроса.Владелец);
НаборЗаписей.Отбор.ТипШтрихкода.Установить(СтрокаЗапроса.ТипШтрихкода);
НаборЗаписей.Отбор.ЕдиницаИзмерения.Установить(СтрокаЗапроса.ЕдиницаИзмерения);
НаборЗаписей.Отбор.ХарактеристикаНоменклатуры.Установить(СтрокаЗапроса.ХарактеристикаНоменклатуры);
НаборЗаписей.Отбор.СерияНоменклатуры.Установить(СтрокаЗапроса.СерияНоменклатуры);
// Удаляем записи
НаборЗаписей.Записать(Истина);
КонецЦикла;
Предупреждение("Обработка закончена.");
Категория:
Регистры сведений Как принудительно завершить бизнес-процесс и задачи? Стандартная механика обеспечивает автоматическое завершение бизнес-процесса, когда он достигает точки завершения и все задачи по нему выполнены.
Однако иногда может потребоваться принудительно завершить бизнес-процесс, не дожидаясь, пока он дойдет до точки завершения.
Для этого необходимо установить свойство Завершен бизнес-процесса равным Истина:
Код 1C v 8.х БизнесПроцесс.Завершен = Истина;
БизнесПроцесс.Записать();
Далее нужно отметить все задачи по этому бизнес-процессу как выполненные.
1. Отобрать задачи по бизнес-процессу можно с помощью запроса вида:
2. После чего каждой из отобранных задач нужно установить свойство Выполнена равным Истина:
Код 1C v 8.х ТекущаяЗадача.Выполнена = Истина;
ТекущаяЗадача.Записать();
Рекомендуется выполнять запись бизнес-процесса и задач в транзакции , чтобы избежать возможного расхождения бизнес-процесса и связанных с ним задач.
Код 1C v 8.х Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОСН_Задача.Ссылка,
| ОСН_Задача.Дата,
| ОСН_Задача.БизнесПроцесс,
| ОСН_Задача.ТочкаМаршрута,
| ОСН_Задача.Пользователь,
| ОСН_Задача.Подразделение,
| ОСН_Задача.БизнесПроцесс.ДокументДоставки
|ИЗ
| Задача.ОСН_Задача КАК ОСН_Задача
|ГДЕ
| ОСН_Задача.БизнесПроцесс.ДокументДоставки = &ДокументДоставки";
Запрос.УстановитьПараметр("ДокументДоставки", ВыбранныйДокумент);
Результат = Запрос.Выполнить();
Выборка = Результат.Выгрузить();
ТекПозиция = 0;
Для каждого СтрокаЗапроса из Выборка Цикл
ОбработкаПрерыванияПользователя();
ТекПозиция = ТекПозиция + 1;
Состояние("Выполнено " + Окр(ТекПозиция / РезультатТаблица.Количество() * 100) + "%");
//Завешим Задачу
ОбъектЗадача = СтрокаЗапроса.Ссылка.ПолучитьОбъект();
ОбъектЗадача.Выполнена = Истина;
ОбъектЗадача.Записать();
//Если необходимо то Завершим и Бизнес Процесс
БизнесПроцесс = СтрокаЗапроса.БизнесПроцесс.ПолучитьОбъект();
БизнесПроцесс.Завершен = Истина;
БизнесПроцесс.Записать();
КонецЦикла;
Код 1C v 8.х Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| CRM_Задача.Ссылка,
| CRM_Задача.Дата,
| CRM_Задача.БизнесПроцесс,
| CRM_Задача.ТочкаМаршрута,
| CRM_Задача.Пользователь,
| CRM_Задача.Подразделение,
| CRM_Задача.БизнесПроцесс.ДокументДоставки
|ИЗ
| Задача.CRM_Задача КАК CRM_Задача
|ГДЕ
| CRM_Задача.Выполнена = ЛОЖЬ
| И CRM_Задача.Дата < &Дата";
Запрос.УстановитьПараметр("Дата", Дата("07.09.2012 0:00:00"));
Результат = Запрос.Выполнить();
Выборка = Результат.Выгрузить();
ТекПозиция = 0;
Для каждого СтрокаЗапроса из Выборка Цикл
ОбработкаПрерыванияПользователя();
ТекПозиция = ТекПозиция + 1;
Состояние("Выполнено " + Окр(ТекПозиция / РезультатТаблица.Количество() * 100) + "%");
//Завешим Задачу
ОбъектЗадача = СтрокаЗапроса.Ссылка.ПолучитьОбъект();
ОбъектЗадача.ВыполнитьЗадачу();
//Если необходимо то Завершим и Бизнес Процесс
Если НЕ СтрокаЗапроса.Ссылка.БизнесПроцесс.Завершен Тогда
БизнесПроцесс = СтрокаЗапроса.Ссылка.БизнесПроцесс.ПолучитьОбъект();
БизнесПроцесс.Завершен = Истина;
БизнесПроцесс.Записать();
КонецЕсли;
КонецЦикла;
Категория:
Бизнес-процессы