v8: Последовательность как инструмент запрета проведения задним числом Последовательность как инструмент запрета проведения задним числом документов в определенном разрезе (группировке) | | Автор статьи: Rovan Последняя редакция №1 от 16.02.06 URL: http://kb.mista.ru/article.php?id=94 | |
Ключевые слова: Последовательность, запрет, проведения
В системе существует особый вид объекта – последовательность, который позвляет отслеживать корректность работы с документами – отображает последний документ, с которым была работа – проведение или отмена проведения. Обычная последовательность просто отражает факт события, и не позволяет блокировать что-либо. Моя последовательность (ПланированиеПроизводства) предназначена для блокирования нежелательных событий – запрет проведения и отмены проведения документов, которые находятся ранее по времени, чем последний проведенный документ. При отмене проведения последнего документа граница последровательности сдвигается – ищется последний проведенный документ, если найден то он становиться границей, если нет, то граница = 0.
Последовательность имеет 2 измерения – ГруппаПланирования и ДатаПланирования – это значит, что для разных значений этих измерений последовательности незвисимы.
Для этого сделана следующая функция в общем модуле
Функция омРаботаСПоследовательностьюПлан( Режим, ЭтотДок, ГруппаПланирования, ДатаПланирования ) Экспорт
Если Режим <> "Проверка" и
Режим <> "Проведение" Тогда
Возврат Ложь;
КонецЕсли;
ТЗ = Новый Структура;
ТЗ.Вставить( "ГруппаПланирования", ГруппаПланирования );
ТЗ.Вставить( "ДатаПланирования", ДатаПланирования );
Граница = Последовательности.ПланированиеПроизводства.ПолучитьГраницу( ТЗ );
ПустойМомент = Новый МоментВремени( Дата( '00010101' ));
Если Граница = ПустойМомент или
не Граница.Ссылка.Проведен Тогда
Запрос = Новый Запрос( "ВЫБРАТЬ
| ПланированиеПроизводства.ГруппаПланирования,
| ПланированиеПроизводства.ДатаПланирования,
| ПланированиеПроизводства.МоментВремени КАК МоментВремени
|ИЗ Последовательность.ПланированиеПроизводства КАК ПланированиеПроизводства
|ГДЕ
|ПланированиеПроизводства.ГруппаПланирования = &ГруппаПланирования И
|ПланированиеПроизводства.ДатаПланирования = &ДатаПланирования
|УПОРЯДОЧИТЬ ПО МоментВремени УБЫВ" );
Запрос.УстановитьПараметр( "ГруппаПланирования", ГруппаПланирования );
Запрос.УстановитьПараметр( "ДатаПланирования", ДатаПланирования );
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если не Выборка.МоментВремени.Ссылка.Проведен или
Выборка.МоментВремени.Сравнить( Граница ) = 1 Тогда
Продолжить;
КонецЕсли;
Прервать;
КонецЦикла;
Если Выборка.МоментВремени <> Неопределено Тогда
Последовательности.ПланированиеПроизводства.УстановитьГраницу(
Выборка.МоментВремени, ТЗ );
Граница = Выборка.МоментВремени;
КонецЕсли;
КонецЕсли;
МоментСсылки = Новый МоментВремени( ЭтотДок.Дата, ЭтотДок.Ссылка );
Если Режим = "Проведение" Тогда
Если Граница.Сравнить( МоментСсылки ) = -1 Тогда
Последовательности.ПланированиеПроизводства.
УстановитьГраницу( МоментСсылки , ТЗ );
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецЕсли;
Если Граница.Дата > ЭтотДок.Дата Тогда
Возврат Истина;
ИначеЕсли Граница.Дата < ЭтотДок.Дата Тогда
Возврат Ложь;
КонецЕсли;
Сравнили = Граница.Сравнить( МоментСсылки );
Если Сравнили = 1 Тогда
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
//соответсвенно при попытке записать документ с проведением или отменой проведения надо поставить //проверку в модуле объекта документа
Если омРаботаСПоследовательностьюПлан( "Проверка", ЭтотОбъект, ГруппаПланирования, ДатаПланирования ) Тогда
Сообщить( "Есть документы проведенные позднее !" );
Отказ = Истина;
Возврат;
КонецЕсли;
//а в обработке проведения
омРаботаСПоследовательностьюПлан( "Проведение", ЭтотОбъект, ГруппаПланирования, ДатаПланирования );
|