<?xml version="1.0" encoding="windows-1251"?>
<registry>
	<node path="%root%\Объекты\Контроллеры\РеестрПоправок\ПоправкиКЗакону">
		<value type="7" name="ПрименитьПоправки">//Макрос для применения поправок к данным заданного слоя
//Параметры: 
//      Слой: ILayer            - открытый слой с данными, к которым нужно применить поправки. 
//                                Необязательный: если не указан, то создается внутри макроса
//      Слой.Алиас: строка      - алиас слоя данных. Нужен, если параметр "Слой" не указан, чтобы
//                                создать слой и открыть данные. Необязательный.
//      Документ.ИД: целое      - ИД документа, поправки к которому нужно применить. Обязательный.
//
//      Поправка.ИД: целое      - ИД поправки, которую нужно в любом случае применить (независимо от состояния). Необязательный.
//
//      Поправки.Список: строка - дополнительное ограничение, позволяющее применить только указанный перечень поправок.
//                                Список содержит перечисление ИД необходимых поправок через запятую. Поправки применяются
//                                независимо от их принятия.                                        


включить "\библиотеки\libru.lib";
включить "\библиотеки\Layers.lib";
включить "\библиотеки\Reports.lib";
включить "\библиотеки\Base.lib";
включить "\библиотеки\Ops.lib";
включить "\Макросы\Слои\ПоддержкаСлойницы.abl";
включить "\Макросы\Слои\ВспомогательныеФункции.abl";
включить "\Макросы\Слои\ПоддержкаОпераций.abl";

ВыполнитьДляПоправок(Параметры: IVariables);

константы
  алиасПоправка           = "РеестрПоправок.ПоправкиКЗакону.Поправки";
  алиасНаполнениеПоправки = "РеестрПоправок.ПоправкиКЗакону.Операции";
  алиасДокументы          = "Закон.Данные.ПроектыЗаконов";

//Выборка поправок из базы с ограничением по документу
функция ПолучитьПоправки(ИДДокумента: Целое; ИДПоправок: строка; ИДОбязательнойПоправки: строка): ILayer;
переменные
  колОграничения: IVariables;
начало
  колОграничения := CreateVariables;
  если ИДДокумента &lt;&gt; -1 тогда колОграничения.Values("$Layer.Проект_ИД") := ИДДокумента;
  если ИДПоправок &lt;&gt; "" тогда 
  начало
    колОграничения.Values("$Layer.ИД") := ИДПоправок+","+ИДОбязательнойПоправки;
    колОграничения.Values("$Layer.ИД.Ограничение") := "in"; 
  конец;  
  результат := ПолучитьМенеджерСлоев.CreateLayerByAliasEx(алиасПоправка, 1);
  результат.SelectData(колОграничения);  
конец; 

//Выборка операций над данными заданного слоя из заданных поправок 
функция ПолучитьНаполнениеПоправки(ссПоправки: СтатическиеДанные; АлиасСлоя: Строка; ТолькоПринятые: целое): ILayer;
переменные
  колОграничения: IVariables;
  Наполнение: СтатическиеДанные;
начало
  колОграничения := CreateVariables;
  
  колОграничения.Values("$Layer.Поправка_ИД") := ПолучитьСписокЗначенийПоля(ссПоправки, "ИД", ',');
  колОграничения.Values("$Layer.Поправка_ИД.Ограничение") := 'in';
  колОграничения.Values("$Layer.Слой_Алиас") := АлиасСлоя;
  если ТолькоПринятые тогда
    колОграничения.Values("$Layer.Сотояние") := 1;   
  результат := ПолучитьМенеджерСлоев.CreateLayerByAliasEx(алиасНаполнениеПоправки, 1);  
  результат.SelectData(колОграничения);
  //делаем разыменовку некоторых атрибутов по ссылке на поправку (т.к. мы выбрали данные без разыменовки для ускорения работы)  
  Наполнение := результат.LayerData;
  Наполнение.Группировать(ссПоправки, "insert=false;default=false;keys=Поправка_ИД;Поправка_ИД=ИД;Поправка_Номер=НомерПоправки");
конец; 

//Выборка данных слоя с ограничением по версии из указанной сборки
функция ПолучитьДанныеСлоя(АлиасСлоя: Строка; Сборка: Целое): ILayer;
переменные
  колОграничения: IVariables;
начало
  колОграничения := CreateVariables;
  колОграничения.Values("$Version.Сборка") := Сборка;
  результат := ПолучитьМенеджерСлоев.CreateLayerByAlias(АлиасСлоя);
  результат.SelectData(колОграничения);
конец; 

//Получение кода сборки для заданного документа
функция ПолучитьКодСборкиДляДокумента(ИДДокумента: целое): целое;
переменные
  сДокумент            : ILayer;
  ссДокумент           : IStaticSet;
  колОграничения: IVariables;
начало
  колОграничения := CreateVariables;
  колОграничения.Values("$Layer.ИД") := ИДДокумента;
  сДокумент := ПолучитьМенеджерСлоев.CreateLayerByAliasEx(алиасДокументы, 1);
  сДокумент.SelectData(колОграничения);
  ссДокумент := сДокумент.LayerData;
  если ссДокумент.ЧислоЗаписей = 0 тогда 
    ВызватьОшибку("Документ не найден: ИД="+ЦелоеВСтроку(ИДДокумента));
  результат := ссДокумент.ПолеПоИмени("Сборка_Код").КакЦелое;  
конец;

функция ПеренестиДанныеПоПредыдущейПоправкеВБуфер(ссДанные, Буфер: СтатическиеДанные; ПредПоправка: строка; Слой: ILayer);
начало
  если Слой.IsCalculatedLayer тогда
  начало
    //Когда поправки применяются к вычислимым слоям, тогда в данных уже будут присутствовать данные различных поправок. 
    //Поэтому применять придется очень хитро: на каждом шаге удалять из исходных данных предыдущую версию данных  
    если ПредПоправка = "null" тогда  
      УстановитьФильтр(ссДанные, "UpdateGroupIndex is null", да)
    иначе
      УстановитьФильтр(ссДанные, "(UpdateGroupIndex is null) or (UpdateGroupIndex="+ПредПоправка+")", да);
    попытка  
      //!!! закомментировано, т.к. данных исходных может не быть, а поправками +/- могут добавляться записи
          //если ссДанные.ЧислоЗаписей = 0 тогда
      //  ВызватьОшибку("Ошибка в алгоритме применения поправок: для вычислимого слоя "+Слой.Description.Params("Alias")+" не получены данные источников по поправке "+ПредПоправка);  
      Буфер.Группировать(ссДанные, "keys=*;UpdateGroupIndex="+ПредПоправка);
      если ПредПоправка &lt;&gt; "null" тогда  
        УстановитьФильтр(ссДанные, "UpdateGroupIndex="+ПредПоправка, да);             
      ссДанные.Очистить;
    обязательно     
      УстановитьФильтр(ссДанные, "", нет);
    конец;  
  конец
  иначе
    Буфер.Группировать(ссДанные, "keys=*;UpdateGroupIndex="+ПредПоправка);  
конец;

переменные
  сПоправки             : ILayer;
  ссПоправки            : IStaticSet;
  сСлойДанных           : ILayer;
  ссДанные              : IStaticSet;
  АлиасСлоя             : Строка;
  ИДПоправок            : Строка;
  ИДОбязательнойПоправки: Строка; 
  ИДДокумента           : Целое;
  КодСборки             : Целое;
  ВыбратьТолькоПринятые : Целое;
  ПараметрыКонтроллера  : IVariables;
  ПоправкиСписок        : Строка;
  
  Контекст: IVariables;
  БезИсходныхДанных: целое;
начало  
  если не Параметры.CheckParam("Документ.ИД") тогда
    Выход;
  //Определяем ИД документа  
  ИДДокумента := Параметры.Values("Документ.ИД");
  Если Параметры.CheckParam('Поправка.ИД') тогда
    ИДОбязательнойПоправки := Параметры.Values("Поправка.ИД")
  иначе
    ИДОбязательнойПоправки := '';      
  ИДПоправок := "";
  //Определяем сборку (либо по ИД документа, либо из параметров)  
  КодСборки := ПолучитьКодСборкиДляДокумента(ИДДокумента);
  //получаем данные исходного слоя
  //если они не пришли в параметрах, то создаем этот слой и открываем его
  если Параметры.CheckParam("Слой") тогда
  начало
    сСлойДанных := Параметры.Values("Слой");
    АлиасСлоя := сСлойДанных.Description.Params("Alias");
    Контекст := сСлойДанных.ContextParams;
    если Контекст.ПараметрСуществует("$Modifications.SourceData") тогда
      БезИсходныхДанных := не Контекст.Значение("$Modifications.SourceData");
    если Контекст.ПараметрСуществует("Заявки.Сотояние") тогда
      Параметры.Значение("Заявки.Сотояние") := Контекст.Значение("Заявки.Сотояние");
    если Контекст.ПараметрСуществует("ПараметрыОграниченийЗаявок") тогда
      Параметры.Значение("ПараметрыОграниченийЗаявок") := Контекст.Значение("ПараметрыОграниченийЗаявок");
    если Контекст.ПараметрСуществует("ПараметрыОграниченийОпераций") тогда
      Параметры.Значение("ПараметрыОграниченийОпераций") := Контекст.Значение("ПараметрыОграниченийОпераций");
  конец  
  иначе
  начало  
    //Слой не задан, значит должен быть задан алиас слоя
    если Параметры.CheckParam("Слой.Алиас") тогда
      АлиасСлоя := Параметры.Values("Слой.Алиас")
    иначе
      ВызватьОшибку("Не указан слой с исходными данными для применения поправок");    
    сСлойДанных := ПолучитьДанныеСлоя(АлиасСлоя, КодСборки);
  конец;              
  ссДанные := сСлойДанных.LayerData;
  если БезИсходныхДанных тогда
    ссДанные.Очистить;

  Если не Параметры.CheckParam('Заявки.Список') или Параметры.Значение('Заявки.Список') = '' тогда
  начало
    //Считываем параметр ограничения поправок по ИД
    если Параметры.CheckParam("Поправки.Список") тогда
      ИДПоправок := Параметры.Values("Поправки.Список");
                          
    //Получаем все поправки для документа
    сПоправки := ПолучитьПоправки(ИДДокумента, ИДПоправок, ИДОбязательнойПоправки);                                              
    ссПоправки := сПоправки.LayerData;
    
    если ссПоправки.ЧислоЗаписей = 0 тогда Выход;
      
    если ИДОбязательнойПоправки = "" тогда
    начало
      ВыбратьТолькоПринятые := ИДПоправок = "";
      Если ВыбратьТолькоПринятые тогда
        ссПоправки.Фильтр := "((AcceptDate is not null) and (RejectDate is null))";
    конец  
    иначе
    начало
      ссПоправки.Фильтр := "((AcceptDate is not null) and (RejectDate is null)) or (ИД = "+ИДОбязательнойПоправки+")";
      ВыбратьТолькоПринятые := нет;
    конец;    
    // создадим коллекцию для вызова контроллера
    ПараметрыКонтроллера := СоздатьКоллекцию;
    // отсортируем поправки
    ссПоправки.IndexFieldNames := "НомерПоправки";
    ПоправкиСписок := ПолучитьСписокЗначенийПоля(ссПоправки, 'ИД', ',');
    Если Параметры.CheckParam('Заявка.ИД') тогда
    начало
      ссПоправки.ВНачало;
      пока не ссПоправки.ВКонце делать
      начало
        ПараметрыКонтроллера.Clear;
        ПараметрыКонтроллера.Values('Слой') := сСлойДанных;
        ПараметрыКонтроллера.Values('Документ.ИД') := ИДДокумента;
        Если Параметры.ПараметрСуществует('ПараметрыОграниченийЗаявок') тогда
          ПараметрыКонтроллера.Значение('ПараметрыОграниченийЗаявок') := Параметры.Значение('ПараметрыОграниченийЗаявок');
        Если Параметры.ПараметрСуществует('ПараметрыОграниченийОпераций') тогда
          ПараметрыКонтроллера.Значение('ПараметрыОграниченийОпераций') := Параметры.Значение('ПараметрыОграниченийОпераций'); 
        ПараметрыКонтроллера.Values('Поправка.ИД') := ссПоправки.Поле('ИД').КакЦелое;
        Если Параметры.CheckParam('Заявка.ИД') тогда
          ПараметрыКонтроллера.Values('Заявка.ИД') := Параметры.Значение('Заявка.ИД'); 
        Если параметры.ПараметрСуществует('ВыполнитьРазыменовки') тогда
          ПараметрыКонтроллера.Values('ВыполнитьРазыменовки') := Параметры.Значение('ВыполнитьРазыменовки');
        если Параметры.ПараметрСуществует("ВыбратьТолькоЗаявки") тогда 
          ПараметрыКонтроллера.Значение("ВыбратьТолькоЗаявки") := Параметры.Значение("ВыбратьТолькоЗаявки");
        если Параметры.ПараметрСуществует("Заявки.Сотояние") тогда 
          ПараметрыКонтроллера.Значение("Заявки.Сотояние") := Параметры.Значение("Заявки.Сотояние");

        // Пробрасываем параметры по заявкам
        ПараметрыКонтроллера.Значение("Заявки.ПоДатеПринятия") := Параметры.Values("Заявки.ПоДатеПринятия");
        ПараметрыКонтроллера.Значение("Заявки.ДатаНачала") := Параметры.Values("Заявки.ДатаНачала");
        ПараметрыКонтроллера.Значение("Заявки.ДатаКонца") := Параметры.Values("Заявки.ДатаКонца");      
        ПараметрыКонтроллера.Значение("Заявки.ИДСостояний") := Параметры.Values("Заявки.ИДСостояний");  
          
        ВызватьКонтроллер('РеестрПоправок.ПоправкиКЗакону.ПрименитьЗаявки', ПараметрыКонтроллера);
        ссПоправки.Следующий;
      конец;
    конец
    иначе
    начало
      ПараметрыКонтроллера.Clear;
      ПараметрыКонтроллера.Values('Слой') := сСлойДанных;
      ПараметрыКонтроллера.Values('Документ.ИД') := ИДДокумента;
      Если Параметры.ПараметрСуществует('ПараметрыОграниченийЗаявок') тогда
        ПараметрыКонтроллера.Значение('ПараметрыОграниченийЗаявок') := Параметры.Значение('ПараметрыОграниченийЗаявок'); 
      Если Параметры.ПараметрСуществует('ПараметрыОграниченийОпераций') тогда
        ПараметрыКонтроллера.Значение('ПараметрыОграниченийОпераций') := Параметры.Значение('ПараметрыОграниченийОпераций'); 
      ПараметрыКонтроллера.Values('Поправки.Список') := ПоправкиСписок;
      Если параметры.ПараметрСуществует('ВыполнитьРазыменовки') тогда
        ПараметрыКонтроллера.Values('ВыполнитьРазыменовки') := Параметры.Значение('ВыполнитьРазыменовки');
      если Параметры.ПараметрСуществует("ВыбратьТолькоЗаявки") тогда 
        ПараметрыКонтроллера.Значение("ВыбратьТолькоЗаявки") := Параметры.Значение("ВыбратьТолькоЗаявки");
      если Параметры.ПараметрСуществует("Заявки.Сотояние") тогда 
        ПараметрыКонтроллера.Значение("Заявки.Сотояние") := Параметры.Значение("Заявки.Сотояние");
        
      // Пробрасываем параметры по заявкам
      ПараметрыКонтроллера.Значение("Заявки.ПоДатеПринятия") := Параметры.Values("Заявки.ПоДатеПринятия");
      ПараметрыКонтроллера.Значение("Заявки.ДатаНачала") := Параметры.Values("Заявки.ДатаНачала");
      ПараметрыКонтроллера.Значение("Заявки.ДатаКонца") := Параметры.Values("Заявки.ДатаКонца");      
      ПараметрыКонтроллера.Значение("Заявки.ИДСостояний") := Параметры.Values("Заявки.ИДСостояний");  
                
      ВызватьКонтроллер('РеестрПоправок.ПоправкиКЗакону.ПрименитьЗаявки', ПараметрыКонтроллера);  
    конец;
  конец
  иначе
  начало
    ПараметрыКонтроллера := СоздатьКоллекцию;
    ПараметрыКонтроллера.Clear;
    ПараметрыКонтроллера.Values('Слой') := сСлойДанных;
    ПараметрыКонтроллера.Values('Документ.ИД') := ИДДокумента;
    Если Параметры.ПараметрСуществует('ПараметрыОграниченийЗаявок') тогда
      ПараметрыКонтроллера.Значение('ПараметрыОграниченийЗаявок') := Параметры.Значение('ПараметрыОграниченийЗаявок'); 
    Если Параметры.ПараметрСуществует('ПараметрыОграниченийОпераций') тогда
      ПараметрыКонтроллера.Значение('ПараметрыОграниченийОпераций') := Параметры.Значение('ПараметрыОграниченийОпераций'); 
    ПараметрыКонтроллера.Values('Заявки.Список') := Параметры.Значение('Заявки.Список');
    Если параметры.ПараметрСуществует('ВыполнитьРазыменовки') тогда
      ПараметрыКонтроллера.Values('ВыполнитьРазыменовки') := Параметры.Значение('ВыполнитьРазыменовки');
    если Параметры.ПараметрСуществует("ВыбратьТолькоЗаявки") тогда 
      ПараметрыКонтроллера.Значение("ВыбратьТолькоЗаявки") := Параметры.Значение("ВыбратьТолькоЗаявки");
    если Параметры.ПараметрСуществует("Заявки.Сотояние") тогда 
      ПараметрыКонтроллера.Значение("Заявки.Сотояние") := Параметры.Значение("Заявки.Сотояние");

    // Пробрасываем параметры по заявкам
    ПараметрыКонтроллера.Значение("Заявки.ПоДатеПринятия") := Параметры.Values("Заявки.ПоДатеПринятия");
    ПараметрыКонтроллера.Значение("Заявки.ДатаНачала") := Параметры.Values("Заявки.ДатаНачала");
    ПараметрыКонтроллера.Значение("Заявки.ДатаКонца") := Параметры.Values("Заявки.ДатаКонца");      
    ПараметрыКонтроллера.Значение("Заявки.ИДСостояний") := Параметры.Values("Заявки.ИДСостояний");  
            
    ВызватьКонтроллер('РеестрПоправок.ПоправкиКЗакону.ПрименитьЗаявки', ПараметрыКонтроллера);  
  конец;
  Параметры.Значение("Слой") := сСлойДанных;  
конец.
</value>
		<param value="ПрименитьПоправки" type="1" name="AccessCount">6091</param>
		<param value="ПрименитьПоправки" type="2" name="AccessDate">41899.6723329861</param>
		<param value="ПрименитьПоправки" type="3" name="installversion">1.0</param>
	</node>
</registry>
