Книга знаний

1С:Предприятие / v8 / Объекты конфигурации / Документы

v8: Последовательность как инструмент запрета проведения задним числом

Последовательность как инструмент запрета проведения задним числом документов в определенном разрезе (группировке) Автор статьи: Rovan
Последняя редакция №1 от 16.02.06
URL: http://kb.mista.ru/article.php?id=94

Ключевые слова: Последовательность, запрет, проведения


В системе существует особый вид объекта – последовательность, который позвляет отслеживать корректность работы с документами – отображает последний документ, с которым была работа – проведение или отмена проведения. Обычная последовательность просто отражает факт события, и не позволяет блокировать что-либо. Моя последовательность (ПланированиеПроизводства) предназначена для блокирования нежелательных событий – запрет проведения и отмены проведения документов, которые находятся ранее по времени, чем последний проведенный документ. При отмене проведения последнего документа граница последровательности сдвигается – ищется последний проведенный документ, если найден то он становиться границей, если нет, то граница = 0.
Последовательность имеет 2 измерения – ГруппаПланирования и ДатаПланирования – это значит, что для разных значений этих измерений последовательности незвисимы.
Для этого сделана следующая функция в общем модуле

Функция омРаботаСПоследовательностьюПлан( Режим, ЭтотДок, ГруппаПланирования, ДатаПланирования ) Экспорт 
  Если Режим <> "Проверка" и
   Режим <> "Проведение" Тогда
   Возврат Ложь;
  КонецЕсли;
    
  ТЗ = Новый Структура;
  ТЗ.Вставить( "ГруппаПланирования", ГруппаПланирования );
  ТЗ.Вставить( "ДатаПланирования", ДатаПланирования );
    
  Граница = Последовательности.ПланированиеПроизводства.ПолучитьГраницу( ТЗ );
  ПустойМомент = Новый МоментВремени( Дата( '00010101' ));

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

//соответсвенно при попытке записать документ с проведением или отменой проведения надо поставить //проверку в модуле объекта документа
Если омРаботаСПоследовательностьюПлан( "Проверка", ЭтотОбъект, ГруппаПланирования, ДатаПланирования ) Тогда
  Сообщить( "Есть документы проведенные позднее !" );
  Отказ = Истина;
  Возврат;
КонецЕсли;

//а в обработке проведения
омРаботаСПоследовательностьюПлан( "Проведение", ЭтотОбъект, ГруппаПланирования, ДатаПланирования );

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика