// Устанавливает состояние "Проведен в последовательности" для всех записей
// последовательности за указанный период.
//
// Параметры:
// Организация - СправочникСсылка.Организации, по которой меняется последовательность.
// ДатаНачала - Дата начала периода. Если указана пустая дата, то самого начала последовательности.
// ДатаОкончания - Дата окончания периода, за который необходимо установить состояние последовательности.
//
// Возвращаемое значение:
// Момент времени, на который фактически была установлена последовательность.
//
Функция УстановитьПоследовательность(Организация, ДатаНачала, ДатаОкончания) Экспорт
МоментСледующегоДокумента = Неопределено;
// Для изменения состояний в последовательности блокируем последовательность
// в целом по организации.
// Установка управляемой блокировки возможно только в рамках транзакции.
// В случае возникновения ошибок отменяем транзакцию.
НачатьТранзакцию();
Попытка
УстановитьБлокировкуПоследовательностиПоОрганизации(Организация);
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТаблицаПоследовательности.Регистратор
|ИЗ
| Последовательность.ДокументыОрганизаций КАК ТаблицаПоследовательности
|ГДЕ
| ТаблицаПоследовательности.Организация = &Организация
| И &УсловиеПериод
| И ТаблицаПоследовательности.СостояниеПроведения В (ЗНАЧЕНИЕ(Перечисление.СостоянияПроведенияВПоследовательности.ПроведенСНарушениемПоследовательности), ЗНАЧЕНИЕ(Перечисление.СостоянияПроведенияВПоследовательности.ИсключенИзПоследовательности))";
ТекстУсловиеПериод = "";
Если ЗначениеЗаполнено(ДатаНачала) И ЗначениеЗаполнено(ДатаОкончания) Тогда
ТекстУсловиеПериод = "ТаблицаПоследовательности.Период МЕЖДУ &ДатаНачала И &ДатаОкончания";
ИначеЕсли ЗначениеЗаполнено(ДатаНачала) Тогда
ТекстУсловиеПериод = "ТаблицаПоследовательности.Период >= &ДатаНачала";
ИначеЕсли ЗначениеЗаполнено(ДатаОкончания) Тогда
ТекстУсловиеПериод = "ТаблицаПоследовательности.Период <= &ДатаОкончания";
КонецЕсли;
Если ЗначениеЗаполнено(ТекстУсловиеПериод) Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеПериод", ТекстУсловиеПериод);
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст, "И &УсловиеПериод", "");
КонецЕсли;
Выборка = Запрос.Выполнить().Выбрать();
НаборЗаписей = Последовательности.ДокументыОрганизаций.СоздатьНаборЗаписей();
Пока Выборка.Следующий() Цикл
НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);
НаборЗаписей.Прочитать();
ВГраница = НаборЗаписей.Количество() - 1;
Для Сч = 0 По ВГраница Цикл
// Удаляем с конца набора
Движение = НаборЗаписей[ВГраница - Сч];
// У документа могут быть записи последовательности по нескольким организациям,
// если у него ранее меняли реквизит Организация, поэтому обрабатываем
// только записи по текущей организации.
Если Движение.Организация = Организация Тогда
Если Движение.СостояниеПроведения = Перечисления.СостоянияПроведенияВПоследовательности.ИсключенИзПоследовательности Тогда
НаборЗаписей.Удалить(Движение);
Иначе
Движение.СостояниеПроведения = Перечисления.СостоянияПроведенияВПоследовательности.ПроведенВПоследовательности;
КонецЕсли;
КонецЕсли;
КонецЦикла;
НаборЗаписей.Записать();
КонецЦикла;
Если ЗначениеЗаполнено(ДатаОкончания) Тогда
// Следующий по очереди документ объявляем проведенным с нарушением,
// чтобы с него начать потом перепроведение.
МоментСледующегоДокумента = МоментВремениПервогоДокументаВПоследовательности(Организация, ДатаОкончания + 1);
Если МоментСледующегоДокумента <> Неопределено Тогда
СброситьСостояниеПоследовательностиДокумента(
МоментСледующегоДокумента.Ссылка,
МоментСледующегоДокумента.Дата,
Организация);
КонецЕсли;
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ТекстОшибки = ОписаниеОшибки();
ОписаниеОшибки = ИнформацияОбОшибке();
ОтменитьТранзакцию();
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки);
ЗаписьЖурналаРегистрации(НСтр("ru = 'Операция не выполнена'"), УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки.Описание);
ВызватьИсключение ТекстОшибки;
КонецПопытки;
Возврат МоментСледующегоДокумента;
КонецФункции |