<?xml version="1.0" encoding="windows-1251"?>
<registry>
	<node path="%root%\Объекты\Контроллеры\АСБюджет">
		<value type="7" name="ЭкспортРосписиПоЗаявкамНовый">включить '\Библиотеки\LibRu.lib';
включить '\Библиотеки\Reports.lib';
включить '\Библиотеки\Layers.lib';
включить "\библиотеки\Base.lib";
включить '\Библиотеки\Documents.lib';
включить "\Макросы\Слои\ВспомогательныеФункции.abl";
включить '\Макросы\Слои\ПоддержкаСлойницы.abl';
включить "\Макросы\Слои\ПоддержкаКонтроллеров.abl";
включить "\Макросы\ЭкспортВРоспись\ПоддержкаЭкспортаВРоспись.abl";

ЭкспортРосписиПоЗаявкамНовый(Параметры: IVariables);

константы
  алиасЗаявки                 = "РеестрПоправок.ПоправкиКЗакону.Заявки";
  алиасНастройкиЭкспорта      = "АСБюджет.Экспорт.ПараметрыЭкспорта";
  алиасСписокПодключенийБД    = "АСБюджет.Экспорт.СписокПодключенийКБД";
  алиасТипыЭкспорта           = "АСБюджет.Экспорт.ТипыИнтерфейсов";
  алиасНастройкиСинхронизации = "АСБюджет.Экспорт.НастройкиСинхронизации";
  алиасИсхСлой                = "АСБюджет.БазисПланированияНаЭкспорт"; 
  алиасТаблицаСинхронизации   = "АСБюджет.Экспорт.ТаблицаЗначенийСинхронизацииСправочников";  
  алиасВыгруженныеЗаявки      = "АСБюджет.Закон.Заявки.СоответствиеЗаявокИУведомлений";

переменные
  
  СписокКВСР, СписокИДТекст : Текст;
  ТаблицаИДУведомлений: СтатическиеДанные;
  НомераЗаявок : строка;
  Подключение, ТипИнтерфейса: строка;
  НомерСборки, PROGINDEX, ГодПланирования : целое;
  Вариант: целое;
  ЗапущеноАвтоматически: целое;
  ЗначенияКлючейГруппировкиУведомлений: Переменная;
  СписокКлючейГруппировкиУведомлений: Текст;
  
  СлойИсточник, СлойПриемникМастер, СлойПриемникДеталь: ILayer;
  LayersMan : ILayersMan;
  СлойИсточникДанные : СтатическиеДанные;
  СлойПриемникМастерДанные : СтатическиеДанные;
  СлойПриемникДетальДанные : СтатическиеДанные; 
  Генератор: СтатическиеДанные;
  
  СправочникЛицевыеСчетаПрием, СправочникКВСРПрием: ILayer;
  СлойЗаявок, СлойУведомлений: ILayer;
  ДанныеЗаявок, ДанныеУведомлений: СтатическиеДанные;
  ПараметрыМакроса, ПараметрыЭкспортаОбщие, ПараметрыЭкспорта : IVariables;  
  //ПараметрыСобытия: IVariables;
  КэшСлоев : IVariables;
   //
  ЛогТекст: Текст;
  Прогресс: IProgress;

// Вызывает таблицу различающихся значений справочников с возможностью выбора синхронизации
функция ПолучитьЗначенияСинхронизацииСправочников;
переменные
  СписокЗаявок: Текст;
  ИндексСписка: целое;
  СлойНастроек, ТаблицаСинхронизации: ILayer;
  НастройкиСинхронизации, ДанныеТаблицыСинхронизации: СтатическиеДанные;
  пИмя, пИмяПоляИсточника, пМаппингПараметровСинхр, пПроверкаУровней, пМаска: поле;
  инд: целое;
  СписокЗначений, СписокКлючей: Текст;
  МассивЗначенийКлючей, МассивЗначенийУровня: Переменная;
начало
  ТаблицаСинхронизации := LayersMan.CreateLayerByAlias(алиасТаблицаСинхронизации);
  ТаблицаСинхронизации.OpenEmpty;
  ДанныеТаблицыСинхронизации := ТаблицаСинхронизации.LayerData;
  КэшСлоев.Значение(алиасТаблицаСинхронизации) := ТаблицаСинхронизации;
  
  СлойНастроек := КэшСлоев.Значение(алиасНастройкиСинхронизации);
  НастройкиСинхронизации := СлойНастроек.LayerData; 
  НастройкиСинхронизации.Фильтр := "(Использовать=1)"; 
  пИмя := НастройкиСинхронизации.Поле("Классификатор");
  пИмяПоляИсточника := НастройкиСинхронизации.Поле("ИмяПоляИсточника");
  пМаппингПараметровСинхр := НастройкиСинхронизации.Поле("МаппингНеобязатПараметров");
  пПроверкаУровней := НастройкиСинхронизации.Поле("ПроверкаУровней");
  пМаска := НастройкиСинхронизации.Поле("Маска");
  
  СоздатьИПоместитьВКэшСправочники(КэшСлоев, НастройкиСинхронизации, НомерСборки, Подключение);

  СписокЗначений := СоздатьТекст;
  СписокКлючей := СоздатьТекст;
  МассивЗначенийКлючей := CreateVariant;
  МассивЗначенийУровня := CreateVariant;
  попытка
  //синхронизация справочников для заявок
  СписокЗаявок := СоздатьТекст;
  попытка
    СписокЗаявок.РазделенноеЗначение := НомераЗаявок;
    НастройкиСинхронизации.Фильтр := "(Использовать=1)and(Синхронизировать=1)and(УровеньДетализации=0)";    
    от ИндексСписка := 0 до СписокЗаявок.Количество - 1 делать
    начало
      НастройкиСинхронизации.ВНачало;
      пока не НастройкиСинхронизации.ВКонце делать 
        начало
          если пМаппингПараметровСинхр.КакСтрока &lt;&gt; '' тогда
          начало
            ДанныеЗаявок.Локализовать("ИД", СписокЗаявок.Стр(ИндексСписка), 0);
            СписокКлючей.РазделенноеЗначение(";") := пИмяПоляИсточника.КакСтрока;
            ПолучитьМассивЗначенийКлючей(МассивЗначенийКлючей, СписокКлючей, ДанныеЗаявок);
            ДобавитьЗаписьВТаблицуСинхронизации(МассивЗначенийКлючей, пИмя.КакСтрока, НастройкиСинхронизации, ДанныеТаблицыСинхронизации, КэшСлоев);
            если пПроверкаУровней.КакСтрока &lt;&gt; '' 
            тогда начало
              СписокЗначений.РазделенноеЗначение(";") := пПроверкаУровней.КакСтрока;
              от инд := 0 до СписокЗначений.Количество-1 делать
              начало
                ПолучитьМассивЗначенийВышестоящегоУровня(пМаска.КакСтрока, СписокЗначений.Стр(инд), МассивЗначенийКлючей, МассивЗначенийУровня);
                ДобавитьЗаписьВТаблицуСинхронизации(МассивЗначенийУровня, пИмя.КакСтрока, НастройкиСинхронизации, ДанныеТаблицыСинхронизации, КэшСлоев);   
              конец;
            конец;
          конец;
          НастройкиСинхронизации.Следующая;
        конец;       
    конец;
  обязательно
    УдалитьОбъект(СписокЗаявок);
  конец;      

  //синхронизация справочников для детали
  НастройкиСинхронизации.Фильтр := "(Использовать=1)and(Синхронизировать=1)and(УровеньДетализации=1)";
  СлойИсточникДанные.ВНачало;
  пока не СлойИсточникДанные.ВКонце делать
  начало
    НастройкиСинхронизации.ВНачало;
    пока не НастройкиСинхронизации.ВКонце делать 
      начало
        если пМаппингПараметровСинхр.КакСтрока &lt;&gt; '' тогда
        начало
          СписокКлючей.РазделенноеЗначение(";") := пИмяПоляИсточника.КакСтрока;
          МассивЗначенийКлючей.Очистить;
          МассивЗначенийУровня.Очистить;
          ПолучитьМассивЗначенийКлючей(МассивЗначенийКлючей, СписокКлючей, СлойИсточникДанные);
          ДобавитьЗаписьВТаблицуСинхронизации(МассивЗначенийКлючей, пИмя.КакСтрока, НастройкиСинхронизации, ДанныеТаблицыСинхронизации, КэшСлоев);
          если пПроверкаУровней.КакСтрока &lt;&gt; '' 
            тогда начало
              СписокЗначений.РазделенноеЗначение(";") := пПроверкаУровней.КакСтрока;
              от инд := 0 до СписокЗначений.Количество-1 делать
              начало
                ПолучитьМассивЗначенийВышестоящегоУровня(пМаска.КакСтрока, СписокЗначений.Стр(инд), МассивЗначенийКлючей, МассивЗначенийУровня);
                ДобавитьЗаписьВТаблицуСинхронизации(МассивЗначенийУровня, пИмя.КакСтрока, НастройкиСинхронизации, ДанныеТаблицыСинхронизации, КэшСлоев);   
              конец;
            конец;
        конец;
        НастройкиСинхронизации.Следующая;
      конец;
    СлойИсточникДанные.Следующая;
  конец;
  НастройкиСинхронизации.Фильтр := "";

  //для корректировки таблицы синхронизации
  /*ПараметрыСобытия := CreateVariables;
  ПараметрыСобытия.Значение("ТаблицаСинхронизации") := ТаблицаСинхронизации;
  ПолучитьРасширенияКонтроллера(Параметры).ОбработатьСобытие("ПередПоказомТаблицыСинхронизации", ПараметрыСобытия); */
  
  обязательно
    УдалитьОбъект(СписокЗначений, СписокКлючей, МассивЗначенийКлючей, МассивЗначенийУровня);
  конец;                                                                                                       

  ПоказатьТаблицуСинхронизации(ТаблицаСинхронизации);
конец;

функция ВыбратьТипыИнтерфейсовИзДиалога(СлойТиповЭкспорта: ILayer; СписокИменПоУмолчанию: строка): строка;
переменные
  ТипыЭкспорта: СтатическиеДанные;
  пТип, пИмя: поле;
  ПараметрДиалога: ДиалоговыйПараметр;
  инд: целое;
  СписокИнтерфейсов: Текст;
начало
  результат := "";
  Диалог.Очистить;
  Диалог.Заголовок := "Выбор типов интерфейса для экспорта";
  Диалог.Добавить('Типы интерфейсов', "ТипыИнтерфейсов", 0, 0, '', '');
  Диалог.Параметр("ТипыИнтерфейсов").ТолькоЧтение := 1; 
  
  ТипыЭкспорта := СлойТиповЭкспорта.LayerData;
  ТипыЭкспорта.IndexFieldNames := "Номер";
  пТип := ТипыЭкспорта.Поле("ТипИнтерфейса");
  пИмя := ТипыЭкспорта.Поле("Имя");
  
  СписокИнтерфейсов := СоздатьТекст;
  попытка
    СписокИнтерфейсов.РазделенноеЗначение := СписокИменПоУмолчанию; 
    ТипыЭкспорта.ВНачало;
    пока не ТипыЭкспорта.ВКонце делать
    начало
      ПараметрДиалога := Диалог.Добавить(пИмя.КакСтрока, пТип.КакСтрока, 1, Проверка+ТолькоЧтение, '', '');
      ПараметрДиалога.Флаг := СписокИнтерфейсов.Поиск(пТип.КакСтрока) &lt;&gt; -1;
      ТипыЭкспорта.Следующая;
    конец;
  обязательно
    УдалитьОбъект(СписокИнтерфейсов);
  конец;
  
  если Диалог.Выполнить тогда
  начало
    от инд := 0 до Диалог.ЧислоПараметров-1 делать  
      если Диалог.ПараметрПоНомеру(инд).Флаг тогда
        результат := результат + "," + Диалог.ПараметрПоНомеру(инд).Идентификатор;
    результат := ЗаменитьПодстроку(результат, ",", "", нет);
  конец;
конец;

// Комментарий
функция ПолучитьСлойВариантов(СлойТиповЭкспорта: ILayer; ИмяИнтерфейса: строка): ILayer;
переменные  
  ДанныеТиповЭкспорта: СтатическиеДанные;
начало
  ДанныеТиповЭкспорта := СлойТиповЭкспорта.LayerData;
  если ДанныеТиповЭкспорта.ЧислоЗаписей = 0 тогда
    ВызватьОшибку(Формат("Не найдены настройки типов экспорта для базы данных %d года!", ГодПланирования)); 
  //ТипИнтерфейса := ПолучитьТипИнтерфейсаИзМеню(ДанныеТиповЭкспорта);
  ДанныеТиповЭкспорта.Локализовать("ТипИнтерфейса", ТипИнтерфейса, 0);
  PROGINDEX := ДанныеТиповЭкспорта.ПолеПоИмени("Код").КакЦелое; 
  ИмяИнтерфейса := ДанныеТиповЭкспорта.ПолеПоИмени("Имя").КакСтрока;
  
  результат := СлойТиповЭкспорта.GetDetail("Варианты");
конец;

// создает диалог с параметрами макроса
функция ПолучитьПараметры(СлойВариантов: ILayer);
переменные  
  СлойНастроек, СлойНастроекСинхронизации: ILayer;
  ДанныеНастроек, ДанныеНастроекСинхронизации: СтатическиеДанные;
начало  
  /*ДанныеТиповЭкспорта := СлойТиповЭкспорта.LayerData;
  если ДанныеТиповЭкспорта.ЧислоЗаписей = 0 тогда
    ВызватьОшибку(Формат("Не найдены настройки типов экспорта для базы данных %d года!", ГодПланирования)); 
  //ТипИнтерфейса := ПолучитьТипИнтерфейсаИзМеню(ДанныеТиповЭкспорта);
  ДанныеТиповЭкспорта.Локализовать("ТипИнтерфейса", ТипИнтерфейса, 0);
  PROGINDEX := ДанныеТиповЭкспорта.ПолеПоИмени("Код").КакЦелое; 
  ИмяИнтерфейса := ДанныеТиповЭкспорта.ПолеПоИмени("Имя").КакСтрока;
  
  // шаг 2 - получение варианта
  СлойВариантов := СлойТиповЭкспорта.GetDetail("Варианты");
  ДанныеВариантов := СлойВариантов.LayerData; 
  если ДанныеВариантов.ЧислоЗаписей = 0 тогда
    ВызватьОшибку(Формат("Не найдены настройки экспорта для типа интерфейса '%s'!", ИмяИнтерфейса));
  если не ДанныеВариантов.Локализовать("ЭкспортЗаявок", 1, 0) тогда
    ВызватьОшибку(Формат("Не найдены настройки экспорта заявок для типа интерфейса '%s'!", ИмяИнтерфейса)); */
     
  // шаг 3 - получение настроек
  СлойНастроек := СлойВариантов.GetDetail("НастройкиПараметров");
  ДанныеНастроек := СлойНастроек.LayerData;
  //если ДанныеНастроек.ЧислоЗаписей = 0 тогда
    //ВызватьОшибку(Формат("Не найдены настройки параметров для варианта экспорта с номером %d!", ВариантНастроек));
  СлойНастроекСинхронизации := СлойВариантов.GetDetail("НастройкиСинхронизации");
  ДанныеНастроекСинхронизации := СлойНастроекСинхронизации.LayerData;
  //если ДанныеНастроекСинхронизации.ЧислоЗаписей = 0 тогда
    //ВызватьОшибку(Формат("Не найдены настройки синхронизации для варианта экспорта с номером %d!", ВариантНастроек));
    
  если КэшСлоев = nil 
    тогда КэшСлоев := СоздатьКоллекцию
    иначе КэшСлоев.Clear;
  КэшСлоев.Значение(алиасНастройкиЭкспорта) := СлойНастроек;
  КэшСлоев.Значение(алиасНастройкиСинхронизации) := СлойНастроекСинхронизации; 
 
  ДанныеНастроек.Фильтр := "not(ЗначениеПараметра=4)";
    
  // заполняем коллекцию параметров
  если ПараметрыМакроса = nil 
    тогда ПараметрыМакроса := СоздатьКоллекцию
    иначе ПараметрыМакроса.Clear;
  ЗаполнитьКоллекциюПараметров(ПараметрыМакроса, ДанныеНастроек); 
  ДанныеНастроек.Фильтр := "";
  
  //если значение нулевое, то заполняем автоматически: 2.00 для уведомлений
  если не ПараметрыМакроса.ПараметрСуществует("КодВидПлана") тогда 
    ПараметрыМакроса.Значение("КодВидПлана") := 200;    
конец;

// Заполнение полей, проверка классификаторов
функция ЗаполнитьПоляКромеСуммы;
переменные
  ДанныеСправочникаЛС: СтатическиеДанные;
  ДетализироватьЛицевыеСчета, ПроверятьЛицевыеСчета: целое;
  ЛицевойСчет, Организация: целое;
начало 
  //проставляем тип классификации, нужно для синхронизации кода целевых средств
  ЗаполнитьТипКлассификации(КэшСлоев, СлойПриемникДетальДанные);
  
  СкопироватьЗначенияКлассификаторов(1, КэшСлоев, СлойИсточникДанные, СлойПриемникДетальДанные, ЛогТекст, Генератор);
  
  //получаем ИД заголовка из таблицы по значениям ключевых полей
  ПолучитьМассивЗначенийКлючей(ЗначенияКлючейГруппировкиУведомлений, СписокКлючейГруппировкиУведомлений, СлойИсточникДанные);
  ТаблицаИДУведомлений.Локализовать(СписокКлючейГруппировкиУведомлений.РазделенноеЗначение(";"), ЗначенияКлючейГруппировкиУведомлений, 0);    
  СлойПриемникДетальДанные.ПолеПоИмени("RecordIndex").КакСтрока := ТаблицаИДУведомлений.Поле("ИДМастера").КакЦелое;
   
  СлойПриемникДетальДанные.ПолеПоИмени("PROGINDEX").КакЦелое := PROGINDEX;  
  ЗаполнитьКонстантныеПоля(1, КэшСлоев, СлойПриемникДетальДанные);
  
  // какие лицевые счета нужно прописывать в детализации: ПБС или ГРБС - задаем параметром ДетализироватьЛицевыеСчета
  если ПараметрыМакроса.ПараметрСуществует("ДетализироватьЛицевыеСчета") 
    тогда ДетализироватьЛицевыеСчета := ПараметрыМакроса.Значение("ДетализироватьЛицевыеСчета")
    иначе 
    начало
      ДетализироватьЛицевыеСчета := да;
    конец; 
  если не ДетализироватьЛицевыеСчета тогда
  начало
    //ДанныеЗаявок.Локализовать("ИД", СлойИсточникДанные.ПолеПоИмени("UpdateGroupIndex").КакЦелое, 0);
    //ЛицевойСчет := ДанныеЗаявок.Поле("FacialAccCls").КакЦелое;
    //в случае, если у заявки данные по нескольким ГРБС, лицевой счет получаем по ГРБС
    //если ЛицевойСчет = 0 
      //тогда 
    ПолучитьДанныеГРБС(СлойИсточникДанные.ПолеПоИмени("КВСР").КакЦелое, Организация, ЛицевойСчет, СписокКВСР, ЛогТекст, СправочникКВСРПрием, СправочникЛицевыеСчетаПрием, КэшСлоев);
      //иначе Организация := ПолучитьОрганизациюПоГРБС(СлойИсточникДанные.ПолеПоИмени("КВСР").КакЦелое, СписокКВСР, СправочникКВСРПрием);
    // а разве организация не должна проставиться автоматически?
    СлойПриемникДетальДанные.ПолеПоИмени("ORG_REF").КакЦелое := Организация; 
    СлойПриемникДетальДанные.ПолеПоИмени("FACIALACC_CLS").КакЦелое := ЛицевойСчет; 
  конец
  иначе
    ЛицевойСчет := СлойИсточникДанные.ПолеПоИмени("ЛицевойСчет").КакЦелое;
  
  // при желании делаем проверку лицевых счетов на актуальность, а также на соответствие коду ГРБС
  если ПараметрыМакроса.ПараметрСуществует("ПроверятьЛицевыеСчета") 
    тогда ПроверятьЛицевыеСчета := ПараметрыМакроса.Значение("ПроверятьЛицевыеСчета")
    иначе ПроверятьЛицевыеСчета := да;
  если ПроверятьЛицевыеСчета тогда
  начало
    ДанныеСправочникаЛС := СправочникЛицевыеСчетаПрием.LayerData;
    если ДанныеСправочникаЛС.Locate('ID', ЛицевойСчет, 0)
       тогда начало
         если ДанныеСправочникаЛС.ПолеПоИмени("STATUSACCOUNT").КакЦелое &lt;&gt; 0 тогда
           ДобавитьВЛог("Лицевой счет " + ФорматироватьКлассификатор(ЛицевойСчет,"000.00.000.0") + " закрыт или заблокирован", ЛогТекст);
         если ДанныеСправочникаЛС.ПолеПоИмени("KVSR").КакЦелое &lt;&gt; СлойИсточникДанные.ПолеПоИмени("КВСР").КакЦелое тогда
           ДобавитьВЛог("Код " + ФорматироватьКлассификатор(СлойИсточникДанные.ПолеПоИмени("КВСР").КакЦелое,"000") + 
             " не соответствует указанному коду ГРБС во внешнем справочнике для лицевого счета " + 
             ФорматироватьКлассификатор(ЛицевойСчет,"000.00.000.0"), ЛогТекст);
       конец
       //иначе ДобавитьВЛог("Во внешнем справочнике лицевых счетов отсутствует запись с кодом " + ФорматироватьКлассификатор(ЛицевойСчет,"000.00.000.0"), ЛогТекст);
  конец;
конец;

//Заполнение cлоя-детали c переносом суммы из слоя-источника
функция ЗаполнитьДеталь;
переменные 
  ИмяСуммыПрием: строка;
  инд, КоличествоЗаписей: целое;
  Шаг, ПозицияПрогресса: дробное;
  ЕстьИзменения: целое;
  МаппингСумм : Текст;
начало
  если не ПараметрыМакроса.ПараметрСуществует("СуммыНаТриГода") тогда
    ПараметрыМакроса.Значение("СуммыНаТриГода") := нет;
    
  МаппингСумм := СоздатьТекст;
  попытка
    МаппингСумм.РазделенноеЗначение(";") := ПараметрыМакроса.Значение("МаппингСуммПриемника");     
  Прогресс.SetMessage("Заполнение данных детали");
  Прогресс.SetProgress(0);
  КоличествоЗаписей := СлойИсточникДанные.ЧислоЗаписей;
  Шаг := 100/КоличествоЗаписей;
  ПозицияПрогресса := 0;    
  
  СлойИсточникДанные.ВНачало;
  пока не СлойИсточникДанные.ВКонце делать 
  начало    
    //вставляем новую запись
    СлойПриемникДетальДанные.Вставить; 
    //копируем суммы
    ИмяСуммыПрием := МаппингСумм.ИмяПараметра(0);
    СлойПриемникДетальДанные.Поле(ИмяСуммыПрием).КакДробное := СлойИсточникДанные.Поле(МаппингСумм.ЗначениеПараметра(ИмяСуммыПрием)).КакДробное; 
    ЕстьИзменения := (СлойПриемникДетальДанные.Поле(ИмяСуммыПрием).КакДробное &lt; -0.005) или (СлойПриемникДетальДанные.Поле(ИмяСуммыПрием).КакДробное &gt; 0.005);
    если ПараметрыМакроса.Значение("СуммыНаТриГода") тогда
    от инд := 1 до МаппингСумм.Количество-1 делать
    начало
      ИмяСуммыПрием := МаппингСумм.ИмяПараметра(инд);
      СлойПриемникДетальДанные.Поле(ИмяСуммыПрием).КакДробное := СлойИсточникДанные.Поле(МаппингСумм.ЗначениеПараметра(ИмяСуммыПрием)).КакДробное; 
      если (СлойПриемникДетальДанные.Поле(ИмяСуммыПрием).КакДробное &lt; -0.005) или (СлойПриемникДетальДанные.Поле(ИмяСуммыПрием).КакДробное &gt; 0.005) тогда
        ЕстьИзменения := 1;
    конец;
    //нулевые изменения откатываем
    если ЕстьИзменения
      тогда
      начало
       ЗаполнитьПоляКромеСуммы; 
       // заполняем системные поля, так как в некоторых регионах
       // нет триггера на вставку записи в детализацию
       СлойПриемникДетальДанные.Поле("ID").КакЦелое := ПолучитьНовоеЗначениеГенератора(Генератор);
       СлойПриемникДетальДанные.Поле("CREATERUSER").КакСтрока := ТекущийПользователь;
       СлойПриемникДетальДанные.Поле("UPDATERUSER").КакСтрока := ТекущийПользователь;
       СлойПриемникДетальДанные.Поле("CREATEDATE").КакДробное := ТекущаяДата;
       СлойПриемникДетальДанные.Поле("UPDATEDATE").КакДробное := ТекущаяДата;
       СлойПриемникДетальДанные.Сохранить;
      конец
      иначе СлойПриемникДетальДанные.Отменить; 
      
    ПозицияПрогресса := ПозицияПрогресса + Шаг;
    Прогресс.SetProgress(Округлить(ПозицияПрогресса));            
    СлойИсточникДанные.Следующая;                                      
  конец;
  обязательно
    УдалитьОбъект(МаппингСумм);
  конец;
конец;

функция ПолучитьВнешнийСправочникЛСиКВСР;
переменные
  НастройкиСинхронизации: СтатическиеДанные;
  СлойНастроек: ILayer;
начало  
  СлойНастроек := КэшСлоев.Значение(алиасНастройкиСинхронизации);
  НастройкиСинхронизации := СлойНастроек.LayerData;    
  если не НастройкиСинхронизации.Локализовать("Классификатор", "Лицевые счета", 1) тогда
    ВызватьОшибку("Не найдены настройки синхронизации для лицевых счетов!");
  СправочникЛицевыеСчетаПрием := СоздатьИОткрытьСлойПоСборке(НастройкиСинхронизации.Поле("Приемник").КакСтрока, 0, Подключение);
  если не НастройкиСинхронизации.Локализовать("Классификатор", "КВСР", 1) тогда
    ВызватьОшибку("Не найдены настройки синхронизации для КВСР!");
  СправочникКВСРПрием := СоздатьИОткрытьСлойПоСборке(НастройкиСинхронизации.Поле("Приемник").КакСтрока, 0, Подключение);
конец; 

функция ВыполнитьЭкспорт;
переменные
  ИмяПараметра: строка;
  Код_ГРБС, Код_Организации, Код_Заявка, ИДМастера: целое;
  ЛицевойСчет: целое; 
  МаппингПолей: Текст;
  инд, КоличествоЗаписей: целое;
  Шаг, ПозицияПрогресса: дробное;
  ПараметрыСобытия: IVariables; 
  СписокУдаляемыхИзМастераИД, СписокУдаляемыхИДДляЗаявки: строка;
  ДанныеЗаголовка, ДанныеДетали: СтатическиеДанные;
  ОбобщатьЛицевыеСчетаВЗаголовке: целое;
  пЛицевойСчет, пИД, пИДУведомления, пКВСР: поле;
  ПараметрыПодключения: строка;
начало
  ПолучитьВнешнийСправочникЛСиКВСР;
    
  ПроверитьНаличиеПараметра("АлиасСлояПриемникаМастер", "Не задан параметр 'алиас слоя-заголовка росписи' в настройках экспорта!", ПараметрыМакроса);  
  СлойПриемникМастер := LayersMan.CreateLayerByAliasEx(ПараметрыМакроса.Значение("АлиасСлояПриемникаМастер"), 1);
  ПроставитьИмяБДВОписанииСлоя(СлойПриемникМастер, Подключение);
  ПроверитьНаличиеПараметра("АлиасСлояПриемникаДеталь", "Не задан параметр 'алиас слоя-детализации росписи' в настройках экспорта!", ПараметрыМакроса); 
  СлойПриемникДеталь := LayersMan.CreateLayerByAliasEx(ПараметрыМакроса.Значение("АлиасСлояПриемникаДеталь"), 1);
  ПроставитьИмяБДВОписанииСлоя(СлойПриемникДеталь, Подключение);
  
  если не ПараметрыМакроса.ПараметрСуществует("ЗаменятьРанееВыгруженныеЗаявки") тогда
    ПараметрыМакроса.Значение("ЗаменятьРанееВыгруженныеЗаявки") := нет;
    
  СлойПриемникМастер.OpenEmpty;                                         
  СлойПриемникДеталь.OpenEmpty;
  
  // Заполняем слой - мастер  
  СлойПриемникМастерДанные := СлойПриемникМастер.LayerData;
  СлойПриемникДетальДанные := СлойПриемникДеталь.LayerData;
  
  СписокКВСР := СоздатьТекст;
  СписокИДТекст := СоздатьТекст;  
  СписокУдаляемыхИзМастераИД := "";
 
  // создаем таблицу ИД уведомлений 
  СписокКлючейГруппировкиУведомлений := СоздатьТекст;
  ТаблицаИДУведомлений := СоздатьТаблицуУведомлений(ПараметрыМакроса, СписокКлючейГруппировкиУведомлений, СлойИсточникДанные, 2);
  ЗначенияКлючейГруппировкиУведомлений.СоздатьМассив(varVariant, 0, СписокКлючейГруппировкиУведомлений.Количество - 1);
  попытка
    пИД := ТаблицаИДУведомлений.Поле("UpdateGroupIndex");
    пИДУведомления := ТаблицаИДУведомлений.Поле("ИДМастера"); 
   // ТаблицаИДУведомлений.НайтиПоле("КВСР", пКВСР);       изменено Shishka99
    ПолучитьЗначенияСинхронизацииСправочников;
    если ПараметрыЭкспорта &lt;&gt; nil тогда
      ПараметрыЭкспорта.Значение("КэшСлоев") := КэшСлоев;
  
    ОбобщатьЛицевыеСчетаВЗаголовке := да;
    если ПараметрыМакроса.ПараметрСуществует("ОбобщатьЛицевыеСчетаВЗаголовке") тогда
      если не ПараметрыМакроса.Значение("ОбобщатьЛицевыеСчетаВЗаголовке") тогда
        ОбобщатьЛицевыеСчетаВЗаголовке := не ТаблицаИДУведомлений.НайтиПоле("ЛицевойСчет", пЛицевойСчет);
    
    Прогресс.SetMessage("Заполнение данных заголовка");
    КоличествоЗаписей := ТаблицаИДУведомлений.ЧислоЗаписей;
    Шаг := 100/КоличествоЗаписей;
    ПозицияПрогресса := 0;
  
    //для каждого из значений создаем отдельную запись заголовка
    ПараметрыПодключения := СформироватьАлиасБД(Подключение);
    ОткрытьТранзакцию(ПараметрыПодключения);
    ТаблицаИДУведомлений.ВНачало;
    попытка
      если не ПараметрыМакроса.ПараметрСуществует("МаппингПолейЗаголовка") тогда
        ПараметрыМакроса.Значение("МаппингПолейЗаголовка") := ""; 
      МаппингПолей := СоздатьТекст;
      попытка
        МаппингПолей.РазделенноеЗначение(";") := ПараметрыМакроса.Значение("МаппингПолейЗаголовка");
      
        Генератор := СоздатьГенератор(ПараметрыПодключения);         
        пока не ТаблицаИДУведомлений.ВКонце делать
        начало
          ЛицевойСчет := -1;
          Код_Организации := -1;
          
          Код_Заявка := пИД.КакЦелое;
          ДанныеЗаявок.Локализовать("ИД", Код_Заявка, 0);
          
          СлойПриемникМастерДанные.Вставить;
          // генерим ID записи с помощью генератора базы исполнения, так как нам потребуется проставить это
          // значение в детализации росписи, а также в слое уведомлений в планировании 
          СлойПриемникМастерДанные.ПолеПоИмени("ID").КакЦелое := ПолучитьНовоеЗначениеГенератора(Генератор);
          СлойПриемникМастерДанные.ПолеПоИмени('NOTIFYTYPE').КакЦелое := 0;
          СлойПриемникМастерДанные.ПолеПоИмени("PROGINDEX").КакЦелое := PROGINDEX;
          СлойПриемникМастерДанные.ПолеПоИмени('ДатаВвода').КакДробное := ОбычнаяДатаВРасшир(ПолучитьТекущуюДату);
          СлойПриемникМастерДанные.ПолеПоИмени('КодВидПлана').КакДробное := ПараметрыМакроса.Значение("КодВидПлана");
          ПроверитьНаличиеПараметра("КодБюджета", "Не задан параметр 'код бюджета' в настройках экспорта!", ПараметрыМакроса);
          ПроверитьНаличиеПараметра("ОтнесениеБА_ЛБО", "Не задан параметр 'отнесение БА/ЛБО' в настройках экспорта!", ПараметрыМакроса);
          ЗаполнитьКонстантныеПоля(0, КэшСлоев, СлойПриемникМастерДанные);
    
          // заполняем поля заголовка данными заявки
          от инд := 0 до МаппингПолей.Количество-1 делать
          начало
            ИмяПараметра := МаппингПолей.ИмяПараметра(инд);
            СлойПриемникМастерДанные.Поле(ИмяПараметра).КакСтрока := ДанныеЗаявок.Поле(МаппингПолей.ЗначениеПараметра(ИмяПараметра)).КакСтрока;
          конец;
      
          // копируем классификаторы с синхронизацией справочников
          СкопироватьЗначенияКлассификаторов(0, КэшСлоев, ДанныеЗаявок, СлойПриемникМастерДанные, ЛогТекст, Генератор);

          // параметр "ОбобщатьЛицевыеСчетаВЗаголовке" влияет на то, какой лицевой счет будет проставлен в заголовке
          // уведомления: лицевой счет заявки, либо детальный лицевой счет из наполнения заявки
          если ОбобщатьЛицевыеСчетаВЗаголовке
            тогда начало
              //на всякий случай
              если пКВСР = nil тогда начало
                ЛицевойСчет := ДанныеЗаявок.Поле("FacialAccCls").КакЦелое;
                //получаем код ГРБС, по которому будем заполнять поля организации и лицевого счета в заголовке
                Код_ГРБС := ПолучитьГРБСпоЛицевомуСчету(ЛицевойСчет, СправочникЛицевыеСчетаПрием, ЛогТекст);
                если (Код_ГРБС &lt;&gt; -1) тогда
                  Код_Организации := ПолучитьОрганизациюПоГРБС(Код_ГРБС, СписокКВСР, СправочникКВСРПрием);
              конец              
              иначе 
                //получаем данные, в том числе лицевой счет, по коду ГРБС 
                ПолучитьДанныеГРБС(пКВСР.КакЦелое, Код_Организации, ЛицевойСчет, СписокКВСР, ЛогТекст, СправочникКВСРПрием, СправочникЛицевыеСчетаПрием, КэшСлоев);
            конец  
            иначе начало
              ЛицевойСчет := пЛицевойСчет.КакЦелое;
              Код_Организации := ПолучитьКодОрганизацииПоЛицевомуСчету(ЛицевойСчет, СправочникЛицевыеСчетаПрием, ЛогТекст);
            конец;
    
          если ЛицевойСчет &lt;&gt; -1 тогда
            СлойПриемникМастерДанные.ПолеПоИмени('ЛицевойСчетВладельца').КакЦелое := ЛицевойСчет;
          если Код_Организации &lt;&gt; -1 тогда
            СлойПриемникМастерДанные.ПолеПоИмени('ORGREF').КакЦелое := Код_Организации;
    
          //дополнительная корректировка записи заголовка
          ПараметрыСобытия := СоздатьКоллекцию;
          ПараметрыСобытия.Значение("СлойЗаголовок") := СлойПриемникМастер;
          ПараметрыСобытия.Значение("СлойЗаявок") := СлойЗаявок;
          если ПараметрыЭкспорта &lt;&gt; nil тогда
            ПараметрыСобытия.Значение("ПараметрыЭкспорта") := ПараметрыЭкспорта;
          ПолучитьРасширенияКонтроллера(Параметры).ОбработатьСобытие("ВставкаЗаписиВЗаголовок", ПараметрыСобытия);
    
          СлойПриемникМастерДанные.Сохранить; 
          //записываем ИД заголовка в таблицу
          ИДМастера := СлойПриемникМастерДанные.ПолеПоИмени('ID').КакЦелое;   
          пИДУведомления.КакЦелое := ИДМастера;  
    
          //если заявка ранее выгружалась в исполнение, удаляем старую запись   
          //проставляем ИД уведомления для заявки   
          СписокУдаляемыхИДДляЗаявки := ПроставитьНовыеИДУведомлений(Код_Заявка, ИДМастера, ProgIndex, ТипИнтерфейса, Вариант, ДанныеУведомлений);
          если (СписокУдаляемыхИДДляЗаявки &lt;&gt; "") и ПараметрыМакроса.Значение("ЗаменятьРанееВыгруженныеЗаявки") тогда
            СписокУдаляемыхИзМастераИД := СписокУдаляемыхИзМастераИД + "," + СписокУдаляемыхИДДляЗаявки; 

          ТаблицаИДУведомлений.Следующая;    
          ПозицияПрогресса := ПозицияПрогресса + Шаг;
          Прогресс.SetProgress(Округлить(ПозицияПрогресса));
        конец;
      обязательно
        УдалитьОбъект(МаппингПолей);
      конец;
      СписокУдаляемыхИзМастераИД := Подстрока(СписокУдаляемыхИзМастераИД, 2, Длина(СписокУдаляемыхИзМастераИД)-1);
  
      попытка  
        //заполняем детализацию
        ЗаполнитьДеталь;
  
        //при необходимости корректируем данные росписи
        ПараметрыСобытия := СоздатьКоллекцию;
        ПараметрыСобытия.Значение("СлойПриемникМастер") := СлойПриемникМастер;
        ПараметрыСобытия.Значение("СлойПриемникДеталь") := СлойПриемникДеталь;
        ПараметрыСобытия.Значение("ТекстЛога") := ЛогТекст.РазделенноеЗначение(";");
        если ПараметрыЭкспорта &lt;&gt; nil тогда
          ПараметрыСобытия.Значение("ПараметрыЭкспорта") := ПараметрыЭкспорта;
        ПолучитьРасширенияКонтроллера(Параметры).ОбработатьСобытие("ПослеВыполненияЭкспорта", ПараметрыСобытия); 
        если ПараметрыСобытия.ПараметрСуществует("НовыйТекстЛога") тогда
          ЛогТекст.РазделенноеЗначение(";") := ПараметрыСобытия.Значение("НовыйТекстЛога");
  
        УдалитьЗаписиСПустымиДетализациями(СлойПриемникМастерДанные, СлойПриемникДетальДанные);
        УдалитьОбъект(СписокКВСР, СписокИДТекст);
  
        //сохраняем изменения в базу
        если СлойПриемникМастерДанные.ЧислоЗаписей &gt; 0 тогда
        начало
          Прогресс.SetMessage("Сохранение данных в базе исполнения");
          СохранитьВнешниеСправочники(КэшСлоев);
          
          //после сохранения справочников в базу у новых записей кода целевых средств проставляется ID
          //теперь его можно проставить в поле КЦС росписи 
          ЗаполнитьКодЦелевыхСредств(СлойПриемникДетальДанные, КэшСлоев, Подключение);
          
          СлойПриемникМастер.Commit;
          СлойПриемникДеталь.Commit;     
  
          если СписокУдаляемыхИзМастераИД &lt;&gt; '' тогда
          начало
            ДанныеДетали := СоздатьСтатическиеДанные; 
            ДанныеЗаголовка := СоздатьСтатическиеДанные; 
            попытка    
              попытка
                //удаляем старые записи детали
                УдалитьЗаписиИзТаблицыБД(ДанныеДетали, ПараметрыПодключения, "budgetdata", Формат("recordindex in (%s)", СписокУдаляемыхИзМастераИД));
                //удаляем старые записи заголовка
                УдалитьЗаписиИзТаблицыБД(ДанныеЗаголовка, ПараметрыПодключения, "budnotify", Формат("ID in (%s)", СписокУдаляемыхИзМастераИД));
              неудача
                ДанныеДетали.CancelUpdates;
                ДанныеЗаголовка.CancelUpdates;
                ВызватьОшибку(ПоследняяОшибка);
              конец;
            обязательно
              УдалитьОбъект(ДанныеДетали, ДанныеЗаголовка);
            конец;  
          конец;
          СлойУведомлений.Commit; 
        конец;
      неудача
        ВызватьОшибку("В процессе экспорта произошла ошибка: " + ПоследняяОшибка);
      конец;
      ЗакрытьТранзакцию(Подключение);
    неудача
      ОтменитьТранзакцию(Подключение);
      ВызватьОшибку(ПоследняяОшибка);       
    конец;
  обязательно
    УдалитьОбъект(ТаблицаИДУведомлений, СписокКлючейГруппировкиУведомлений, ЗначенияКлючейГруппировкиУведомлений); 
  конец;
  
  //для отображения изменений на интерфейсе
  ПараметрыСобытия := СоздатьКоллекцию;
  ПараметрыСобытия.Значение("СлойЗаявок") := СлойЗаявок;
  ПолучитьРасширенияКонтроллера(Параметры).ОбработатьСобытие("ПослеСохраненияИзменений", ПараметрыСобытия); 
конец;

функция ПрименитьЗаявкиКСлою(Слой: ILayer; ИДЗаявки: целое);
переменные
  ПараметрыСобытия: IVariables; 
начало
  ДанныеЗаявок.Локализовать("ИД", ИДЗаявки, 0);
  ПараметрыСобытия := CreateVariables;
  ПараметрыСобытия.Values("Слой") := Слой;
  ПараметрыСобытия.Values("Поправка.ИД") := ДанныеЗаявок.ПолеПоИмени("Поправка_ИД").КакЦелое; 
  ПараметрыСобытия.Values("Заявки.Список") := ИДЗаявки;
  // Применяем заявки.
  ПолучитьРасширенияКонтроллера(Параметры).ОбработатьСобытие("ПрименитьЗаявки", ПараметрыСобытия);  
конец;

//получаем данные из слоя-источника
функция ПолучитьДанные(Заявка: целое; Алиас: строка): ILayer;
переменные
  Слой, СлойПреобразования : ILayer;
  ДанныеСлоя : СтатическиеДанные;
  Парам: IVariables;
начало    
  Слой := LayersMan.CreateLayerByAlias(Алиас);
  Слой.OpenEmpty;
  ПрименитьЗаявкиКСлою(Слой, Заявка);
  
  СлойПреобразования := nil;    
  если ПараметрыМакроса.ПараметрСуществует("АлиасСлояПреобразования") тогда начало
    если ПараметрыМакроса.Значение("АлиасСлояПреобразования") &lt;&gt; '' тогда
    начало
      СлойПреобразования := LayersMan.CreateLayerByAliasEx(ПараметрыМакроса.Значение("АлиасСлояПреобразования"), 1);
      СлойПреобразования.Open;
      Парам := CreateVariables;
      Парам.Values(Алиас) := Слой;
      СлойПреобразования.CalculateFromSource(Парам);
    конец
  конец;
  
  если СлойПреобразования &lt;&gt; nil тогда
    результат := СлойПреобразования
  иначе
    результат := Слой;
  ДанныеСлоя := результат.LayerData;
  
  если не ПараметрыМакроса.ПараметрСуществует("ФильтрИсточника") тогда
    ПараметрыМакроса.Значение("ФильтрИсточника") := "";
  если ПараметрыМакроса.Значение("ФильтрИсточника") &lt;&gt; "" тогда
    ДанныеСлоя.Фильтр := ПараметрыМакроса.Значение("ФильтрИсточника");

  //СлойИсточникДанные.Группировать(ДанныеСлояПреобразования, "keys="+Ключи+";"+МаппингКлючей+";"+МаппингСумм+UpdateGroupIndex);
конец;

функция СформироватьНаборДанныхДляЭкспорта: целое;
переменные
  Буфер : СтатическиеДанные;
  АлиасИсточника, МаппингИсточника, КлючиИсточника, МаппингСумм, СтрокаГруппировки: строка;
  Источник: ILayer;
  СписокЗаявок: Текст;
  ИндексСписка: целое;
  ПараметрыСобытия: IVariables;
начало  
  ПроверитьНаличиеПараметра("АлиасИсточника", "Не задан алиас слоя-источника данных для экспорта!", ПараметрыМакроса);
  ПроверитьНаличиеПараметра("МаппингКлючейИсточника", "Не задан маппинг ключей для слоя-источника данных для экспорта!", ПараметрыМакроса);
  ПроверитьНаличиеПараметра("МаппингСуммИсточника", "Не задан маппинг сумм для слоя-источника данных для экспорта!", ПараметрыМакроса);
  //ПроверитьНаличиеПараметра("КлючиПриемника", "Не задан список ключей для слоя бюджетной росписи!", ПараметрыМакроса);
  ПроверитьНаличиеПараметра("МаппингСуммПриемника", "Не задан маппинг сумм для слоя бюджетной росписи!", ПараметрыМакроса);
  
  АлиасИсточника := ПараметрыМакроса.Значение("АлиасИсточника");
  МаппингИсточника := ПараметрыМакроса.Значение("МаппингКлючейИсточника");      
  КлючиИсточника := ПолучитьКлючиПоМаппингу(МаппингИсточника);  
  МаппингСумм := СформироватьМаппингСумм(ПараметрыМакроса.Значение("МаппингСуммИсточника"));
  СтрокаГруппировки := "keys="+КлючиИсточника+";"+МаппингИсточника+";"+МаппингСумм;
      
  СписокЗаявок := СоздатьТекст;
  попытка
  СписокЗаявок.РазделенноеЗначение := НомераЗаявок;
  
  Буфер := СоздатьСтатическиеДанные; 
  Буфер.ПрисвоитьПоля(СлойИсточникДанные);
  Буфер.Открыть;

  от ИндексСписка := 0 до СписокЗаявок.Количество - 1 делать
    начало
      Источник := ПолучитьДанные(СтрокаВЦелое(СписокЗаявок.Стр(ИндексСписка)), АлиасИсточника);
      Буфер.Группировать(Источник.LayerData, СтрокаГруппировки+";UpdateGroupIndex=" + СписокЗаявок.Стр(ИндексСписка));
      СлойИсточникДанные.Закачать(Буфер);
      Буфер.Очистить;  
    конец; 
  обязательно
    УдалитьОбъект(СписокЗаявок);
  конец;

  ФорматироватьСубсидииИЦелевыеСредства(СлойИсточникДанные);
  
  //на случай, если потребуется изменить исходные данные
  ПараметрыСобытия := СоздатьКоллекцию;
  ПараметрыСобытия.Значение("СлойИсточник") := СлойИсточник;
  ПараметрыСобытия.Значение("СлойЗаявок") := СлойЗаявок;
  ПараметрыСобытия.Значение("ТекстЛога") := ЛогТекст.РазделенноеЗначение(";");
  ПараметрыСобытия.Значение("ЗапущеноАвтоматически") := ЗапущеноАвтоматически;
  ПараметрыЭкспорта := СоздатьКоллекцию;
  ПараметрыЭкспорта.Значение("ИмяБД") := Подключение;
  ПараметрыЭкспорта.Значение("ТипИнтерфейса") := ТипИнтерфейса;
  ПараметрыСобытия.Значение("ПараметрыЭкспорта") := ПараметрыЭкспорта;
  ПолучитьРасширенияКонтроллера(Параметры).ОбработатьСобытие("ФормированиеНабораДанных", ПараметрыСобытия); 
  если ПараметрыСобытия.ПараметрСуществует("НовыйТекстЛога") тогда
    ЛогТекст.РазделенноеЗначение(";") := ПараметрыСобытия.Значение("НовыйТекстЛога");
  
  результат := (СлойИсточникДанные.ЧислоЗаписей &gt; 0);                                                                                                           
конец;


переменные 
  Хранилище : Сущность;
  СписокДокументов : Список;
  ИтераторДокументов :  Итератор;
  ПараметрыСобытия: IVariables; 
  ДобавитьНомерЗаявкиВСписок, ПроверятьЗаявкиНаНаличие: целое;
  ЕстьДанные, ИсточникОткрыт: целое;
  СлойТиповЭкспорта, СлойВариантов: ILayer;
  ДанныеВариантов: СтатическиеДанные;
  СписокТиповИнтерфейсов: Текст;
  инд, ПоказыватьДиалог: целое;
  НомераЗаявокИзСобытия, СписокИменПоУмолчанию: строка;
  ИмяИнтерфейса: строка;

начало
  если Параметры.ПараметрСуществует('Модель') тогда 
    СписокДокументов := Параметры.Значение('Модель')
  иначе
  начало
    СписокДокументов := nil;
    выход;
  конец;
  
  если СписокДокументов.Размер = 0 тогда начало
    Сообщение("Нет данных для экспорта."); 
    Выход;
  конец;
  
  //получаем данные заявок
  Хранилище := СписокДокументов.ВзятьОбъект(0);
  СлойЗаявок := Хранилище.Источник;
  ДанныеЗаявок := СлойЗаявок.LayerData;
  //определяем код сборки, по которому будем выбирать данные классификаторов для синхронизации
  НомерСборки := Хранилище.Атрибут("Сборка_Код");
 
 ЕстьДанные := нет;
 ИсточникОткрыт := нет;
 ИмяИнтерфейса := "";
 ЛогТекст := СоздатьТекст;
 ОчиститьЛог;
 
 ЗапущеноАвтоматически := нет;
 если Параметры.ПараметрСуществует("ЗапущеноАвтоматически") тогда
   ЗапущеноАвтоматически := Параметры.Значение("ЗапущеноАвтоматически");
 
 попытка
  LayersMan := ПолучитьМенеджерСлоев;
  СлойТиповЭкспорта := ПолучитьТипыИнтерфейсов(НомерСборки, ГодПланирования, Подключение, ПараметрыЭкспортаОбщие);
  если не ЗапущеноАвтоматически тогда
    если Сообщение(Формат("Внимание! Будет произведен экспорт в базу исполнения %d года! Продолжить?", ГодПланирования), Сообщение_Вопрос, Кнопка_Да+Кнопка_Нет) &lt;&gt; Результат_Да тогда
      Выход;
    
  ИтераторДокументов := СписокДокументов.Итератор;
  пока ИтераторДокументов.ЕстьСледующий делать
  начало
    Хранилище := ИтераторДокументов.Следующий;
    СтеретьОшибкиВДокументе(Хранилище);             
    если Хранилище.Атрибут("Сборка_Код") &lt;&gt; НомерСборки тогда
      ВызватьОшибку("В выделенных строках присутствуют заявки, относящиеся к разным проектам закона. Экспорт невозможен.");
  конец;  
        
  СписокТиповИнтерфейсов := СоздатьТекст;
  
  СлойУведомлений := ПолучитьМенеджерСлоев.CreateLayerByAliasEx(алиасВыгруженныеЗаявки, 1);
  СлойУведомлений.Open;
  ДанныеУведомлений := СлойУведомлений.LayerData;   
  
  попытка
    если ПараметрыЭкспортаОбщие.ПараметрСуществует("Заявки_ПоказыватьДиалогВыбораИнтерфейса") 
      тогда ПоказыватьДиалог := ПараметрыЭкспортаОбщие.Значение("Заявки_ПоказыватьДиалогВыбораИнтерфейса")
      иначе ПоказыватьДиалог := да;
    если ПараметрыЭкспортаОбщие.ПараметрСуществует("Заявки_СписокИнтерфейсовПоУмолчанию") 
      тогда СписокИменПоУмолчанию := ПараметрыЭкспортаОбщие.Значение("Заявки_СписокИнтерфейсовПоУмолчанию")
      иначе СписокИменПоУмолчанию := "";
    если ПоказыватьДиалог 
      тогда СписокТиповИнтерфейсов.РазделенноеЗначение := ВыбратьТипыИнтерфейсовИзДиалога(СлойТиповЭкспорта, СписокИменПоУмолчанию)
      иначе СписокТиповИнтерфейсов.РазделенноеЗначение := СписокИменПоУмолчанию; 
    
    // цикл по интерфейсам  
    от инд := 0 до СписокТиповИнтерфейсов.Количество - 1 делать
    начало
      ТипИнтерфейса := СписокТиповИнтерфейсов.Стр(инд);
      СлойВариантов := ПолучитьСлойВариантов(СлойТиповЭкспорта, ИмяИнтерфейса);
      ДанныеВариантов := СлойВариантов.LayerData; 
      ДанныеВариантов.Фильтр := "ЭкспортЗаявок=1";
      если ДанныеВариантов.ЧислоЗаписей = 0 тогда
        ВызватьОшибку(Формат("Не найдены настройки экспорта заявок для типа интерфейса '%s'!", ИмяИнтерфейса));
      ДанныеВариантов.ВНачало;
      // цикл по вариантам
      пока не ДанныеВариантов.ВКонце делать
      начало     
      ПолучитьПараметры(СлойВариантов);
      Вариант := ДанныеВариантов.Поле("Номер").КакЦелое; 
      ПроверятьЗаявкиНаНаличие := ПараметрыМакроса.Значение("ПроверятьЗаявкиНаНаличие");
  
      НомераЗаявок := "";
      ИтераторДокументов := СписокДокументов.Итератор;
      пока ИтераторДокументов.ЕстьСледующий делать
      начало
        Хранилище := ИтераторДокументов.Следующий;
        ДобавитьНомерЗаявкиВСписок := да;
        // ранее выгруженные документы не выгружаются
        если ПроверятьЗаявкиНаНаличие тогда          
          если ЗаявкаВыгруженаВБюджет(Хранилище.Атрибут('ИД'), ТипИнтерфейса, Вариант, ДанныеУведомлений) 
          тогда начало
            ДобавитьОшибкуВДокумент(Хранилище, "документ уже был выгружен на интерфейс "+ИмяИнтерфейса);
            ДобавитьНомерЗаявкиВСписок := нет;
          конец;
        если ДобавитьНомерЗаявкиВСписок тогда
        начало
          если НомераЗаявок &lt;&gt; "" тогда
            НомераЗаявок := НомераЗаявок + ",";
          НомераЗаявок := НомераЗаявок + ЦелоеВСтроку(Хранилище.Атрибут('ИД'));          
        конец;
      конец;
      
      НомераЗаявокИзСобытия := "";
      //возможно, потребуется ограничить список экспортируемых документов
      ПараметрыСобытия := СоздатьКоллекцию;
      ПараметрыСобытия.Значение("Документы") := СписокДокументов;
      //ПараметрыСобытия.Значение("ТекстЛога") := ЛогТекст;
      ПараметрыСобытия.Значение("ИмяБД") := Подключение;
      ПараметрыСобытия.Значение("КодИнтерфейса") := ТипИнтерфейса;
      //ПараметрыСобытия.Значение("НомераЗаявок") := НомераЗаявок;
      ПолучитьРасширенияКонтроллера(Параметры).ОбработатьСобытие("ФормированиеСпискаЗаявок", ПараметрыСобытия);
      если ПараметрыСобытия.ПараметрСуществует("НомераЗаявок") тогда начало 
        НомераЗаявокИзСобытия := ПараметрыСобытия.Значение("НомераЗаявок");
        НомераЗаявок := СложитьСтрокиПоПринципуИ(НомераЗаявок, НомераЗаявокИзСобытия); 
      конец;  
      
      //ЕстьДанные := ЕстьДанные или (НомераЗаявок &lt;&gt; '');
      
      //ВызватьОшибку("Ошибка!!!");
      Прогресс := Progress;
      Прогресс.BeginProgress;
      попытка       
        если НомераЗаявок &lt;&gt; '' тогда
        начало
          ДанныеЗаявок.BeginUpdate;
          попытка
            если не ИсточникОткрыт тогда
            начало
              СлойИсточник := LayersMan.CreateLayerByAlias(алиасИсхСлой);
              СлойИсточник.Open;
              СлойИсточникДанные := СлойИсточник.LayerData;
              ИсточникОткрыт := да;
            конец 
            иначе
              СлойИсточникДанные.Очистить;
            //формируем набор данных из источника
            Прогресс.SetMessage("Формирование данных для экспорта");
            Прогресс.SetProgress(0);
            если СформироватьНаборДанныхДляЭкспорта тогда
            начало
              ЕстьДанные := да;
              ВыполнитьЭкспорт;  
            конец;
            Прогресс.SetProgress(100);
          обязательно
            ДанныеЗаявок.EndUpdate;
          конец;   
        конец; 
      обязательно
        Прогресс.EndProgress;
      конец;
      ДанныеВариантов.Следующая;
     конец;
     ДанныеВариантов.Фильтр := "";
    конец;   
  обязательно
    УдалитьОбъект(СписокТиповИнтерфейсов);
  конец; 
  
  если ЕстьДанные и не ЗапущеноАвтоматически тогда                                                   
   если ЛогТекст.Количество &gt; 0 
     тогда Сообщение("Экспорт выполнен с ошибками, смотрите лог.")
     иначе Сообщение("Экспорт выполнен.");
  если не ЕстьДанные и не ЗапущеноАвтоматически тогда
    Сообщение("Нет данных для экспорта!");                                           
              
 обязательно
   ВывестиВЛог(ЛогТекст); 
   УдалитьОбъект(ЛогТекст);
 конец;

конец.
</value>
		<param value="ЭкспортРосписиПоЗаявкамНовый" type="1" name="AccessCount">359</param>
		<param value="ЭкспортРосписиПоЗаявкамНовый" type="2" name="AccessDate">41656,3856453009</param>
		<param value="ЭкспортРосписиПоЗаявкамНовый" type="3" name="installversion">1.0</param>
		<param value="ЭкспортРосписиПоЗаявкамНовый" type="3" name="Export">SHISHKIND-NEW\shishkind\17.01.2014 9:24:28</param>
	</node>
</registry>
