//////////////////////////////////////////////////////////////////////////////
// ПРОЧИЕ ПРОЦЕДУРЫ И ФУНКЦИИ
Функция НайтиСчетПоКодуИзКэша(КодСчета, СоответствиеКэш)
Если (СоответствиеКэш = Неопределено) Тогда
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ЕПСБУ.Ссылка,
| ЕПСБУ.Код,
| ЕПСБУ.ДатаНачала
|ИЗ
| ПланСчетов.ЕПСБУ КАК ЕПСБУ");
Выборка = Запрос.Выполнить().Выбрать();
СоответствиеКэш = Новый Соответствие;
Пока Выборка.Следующий() Цикл
СоответствиеКэш.Вставить(БухгалтерскийУчет.Представление_Счет_Дата(Выборка.Код, Выборка.ДатаНачала), Выборка.Ссылка);
КонецЦикла;
КонецЕсли;
Результат = СоответствиеКэш.Получить(КодСчета);
Если (Результат = Неопределено) Тогда
Результат = ПланыСчетов.ЕПСБУ.ПустаяСсылка();
КонецЕсли;
Возврат Результат;
КонецФункции
//////////////////////////////////////////////////////////////////////////////
// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
// Заполняет данными регистр сведений КорректныеКорреспонденцииСчетов
//
// Параметры:
// УдалитьВсеСуществующие - Булево. Если Истина, то все существующие записи регистра
// будут удалены перед заполнением
// ПолноеИмяФайла - Строка. Если не указано, то проводки берутся из шаблона
// ОтображатьПрогресс - Булево. Надо ли отображать диалог с прогресс баром. Закрыть эту форму должна
// будет вызывающая функция
//
// Возвращает Истина, если файлы успешно загружены
//
Функция ЗаполнитьПроводки(УдалитьВсеСуществующие, ПолноеИмяФайла,
ЗаполненоПроводок = 0, ОтображатьПрогресс = Ложь) Экспорт
ЗаполненоПроводок = 0;
СоответствиеСчетДт = Новый Соответствие;
НаборЗаписей = РегистрыСведений.КорректныеКорреспонденцииСчетов.СоздатьНаборЗаписей();
СоответствиеКэш = Неопределено;
Если Не(УдалитьВсеСуществующие) Тогда
Запрос = Новый Запрос(
"ВЫБРАТЬ
| КорректныеКорреспонденцииСчетов.СчетДт,
| КорректныеКорреспонденцииСчетов.СчетКт,
| КорректныеКорреспонденцииСчетов.Комментарий
|ИЗ
| РегистрСведений.КорректныеКорреспонденцииСчетов КАК КорректныеКорреспонденцииСчетов");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если (СоответствиеСчетДт[Выборка.СчетДт] = Неопределено) Тогда
СоответствиеСчетДт.Вставить(Выборка.СчетДт, Новый Соответствие);
КонецЕсли;
СоответствиеСчетДт[Выборка.СчетДт].Вставить(
Выборка.СчетКт, Выборка.Комментарий);
КонецЦикла;
КонецЕсли;
ИсточникМакет = ПустаяСтрока(ПолноеИмяФайла);
ЧтениеXML = Новый ЧтениеXML;
Если (ИсточникМакет) Тогда
Макет = РегистрыСведений.КорректныеКорреспонденцииСчетов.ПолучитьМакет("КорректныеКорреспонденции");
ЧтениеXML.УстановитьСтроку(Макет.ПолучитьТекст());
//<_ЦИТ <<>>
#Область Внесение_изменений
#Область Заполнение_соответствия_счетов
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ЕПСБУ.Ссылка,
| ЕПСБУ.Код,
| ЕПСБУ.ДатаНачала
|ИЗ
| ПланСчетов.ЕПСБУ КАК ЕПСБУ";
ТЗ_Результат = Запрос.Выполнить().Выгрузить();
ТЗ_Результат.Колонки.Добавить("СчетХМЛ");
#Область Заполнаяем_счета_с_датой
ЧтениеXML.ПерейтиКСодержимому(); // FileContent
ЧтениеXML.ПрочитатьАтрибут(); // xmlns:nspxml
ЧтениеXML.ПрочитатьАтрибут(); // RecordCount
КоличествоСтрок = XMLЗначение(Тип("Число"), ЧтениеXML.Значение);
н = 0; // Это количесво просмотренных записей файла-источника
Пока (Истина) Цикл
Если (н >= КоличествоСтрок) Тогда
Прервать;
КонецЕсли;
Попытка
ЧтениеXML.Прочитать(); // <Record>
ЧтениеXML.Прочитать(); // <СчетДтКод>
ЧтениеXML.Прочитать();
ТекСчетДтСтрока = ЧтениеXML.Значение;
ЧтениеXML.Прочитать(); // </СчетДтКод>
ЧтениеXML.Прочитать(); // <СчетКтКод>
ЧтениеXML.Прочитать();
ТекСчетКтСтрока = ЧтениеXML.Значение;
ЧтениеXML.Прочитать(); // </СчетКтКод>
ЧтениеXML.Прочитать(); // <Комментарий>
ЧтениеXML.Прочитать();
ТекКомментарий = ЧтениеXML.Значение;
ЧтениеXML.Прочитать(); // </Комментарий>
ЧтениеXML.Прочитать(); // </Record>
мсвДанных = Новый Массив;
мсвДанных.Добавить(ТекСчетДтСтрока);
мсвДанных.Добавить(ТекСчетКтСтрока);
Для Каждого Элемент ИЗ мсвДанных Цикл
Если НЕ Найти(Элемент,"0101") = 0 Тогда
СтрКодСчета = Элемент;
СтрДатаСчета = Сред(СтрКодСчета,Найти(СтрКодСчета,":") + 1,8);
ДатаСчета = Дата(Число(Сред(СтрДатаСчета,1,4)),Число(Сред(СтрДатаСчета,5,2)),Число(Сред(СтрДатаСчета,7,2)));
КодСчета = СтрЗаменить(СтрКодСчета,":" + СтрДатаСчета,"");
НайденныеСтроки = ТЗ_Результат.НайтиСтроки(Новый Структура("Код,ДатаНачала,СчетХМЛ",КодСчета,ДатаСчета,Неопределено));
Для Каждого Строка ИЗ НайденныеСтроки Цикл Строка.СчетХМЛ = Элемент; КонецЦикла;
КонецЕсли;
КонецЦикла;
Исключение
Возврат Ложь;
КонецПопытки;
н = н + 1;
КонецЦикла;
#КонецОбласти // Заполнаяем_счета_с_датой
#Область Заполняем_счета_без_даты
ЧтениеXML.УстановитьСтроку(Макет.ПолучитьТекст());
ЧтениеXML.ПерейтиКСодержимому(); // FileContent
ЧтениеXML.ПрочитатьАтрибут(); // xmlns:nspxml
ЧтениеXML.ПрочитатьАтрибут(); // RecordCount
КоличествоСтрок = XMLЗначение(Тип("Число"), ЧтениеXML.Значение);
н = 0; // Это количесво просмотренных записей файла-источника
Пока (Истина) Цикл
Если (н >= КоличествоСтрок) Тогда
Прервать;
КонецЕсли;
Попытка
ЧтениеXML.Прочитать(); // <Record>
ЧтениеXML.Прочитать(); // <СчетДтКод>
ЧтениеXML.Прочитать();
ТекСчетДтСтрока = ЧтениеXML.Значение;
ЧтениеXML.Прочитать(); // </СчетДтКод>
ЧтениеXML.Прочитать(); // <СчетКтКод>
ЧтениеXML.Прочитать();
ТекСчетКтСтрока = ЧтениеXML.Значение;
ЧтениеXML.Прочитать(); // </СчетКтКод>
ЧтениеXML.Прочитать(); // <Комментарий>
ЧтениеXML.Прочитать();
ТекКомментарий = ЧтениеXML.Значение;
ЧтениеXML.Прочитать(); // </Комментарий>
ЧтениеXML.Прочитать(); // </Record>
мсвДанных = Новый Массив;
мсвДанных.Добавить(ТекСчетДтСтрока);
мсвДанных.Добавить(ТекСчетКтСтрока);
Для Каждого Элемент ИЗ мсвДанных Цикл
Если Найти(Элемент,"0101") = 0 Тогда
СтрКодСчета = Элемент;
КодСчета = СтрКодСчета;
НайденныеСтроки = ТЗ_Результат.НайтиСтроки(Новый Структура("Код,СчетХМЛ",КодСчета,Неопределено));
Для Каждого Строка ИЗ НайденныеСтроки Цикл Строка.СчетХМЛ = Элемент; КонецЦикла;
КонецЕсли;
КонецЦикла;
Исключение
Возврат Ложь;
КонецПопытки;
н = н + 1;
КонецЦикла;
#КонецОбласти // Заполняем_счета_без_даты
#КонецОбласти // Заполнение_соответствия_счетов
Если (ОтображатьПрогресс) Тогда
ФормаИндикации = ПолучитьОбщуюФорму("ХодВыполненияОбработкиДанных");
ФормаИндикации.НаименованиеОбработкиДанных = "Заполнение базы";
ФормаИндикации.КомментарийОбработкиДанных = "Заполнение регистра корректных корреспонденций";
ФормаИндикации.КомментарийЗначения = "Выполнено:";
ФормаИндикации.МаксимальноеЗначение = КоличествоСтрок;
ФормаИндикации.Значение = 0;
Если НЕ ФормаИндикации.Открыта() Тогда
ФормаИндикации.Открыть();
Конецесли;
КонецЕсли;
ЧтениеXML.УстановитьСтроку(Макет.ПолучитьТекст());
ЧтениеXML.ПерейтиКСодержимому(); // FileContent
ЧтениеXML.ПрочитатьАтрибут(); // xmlns:nspxml
ЧтениеXML.ПрочитатьАтрибут(); // RecordCount
н = 0; // Это количесво просмотренных записей файла-источника
Пока (Истина) Цикл
Если (н >= КоличествоСтрок) Тогда
Прервать;
КонецЕсли;
Попытка
ЧтениеXML.Прочитать(); // <Record>
ЧтениеXML.Прочитать(); // <СчетДтКод>
ЧтениеXML.Прочитать();
ТекСчетДтСтрока = ЧтениеXML.Значение;
ЧтениеXML.Прочитать(); // </СчетДтКод>
ЧтениеXML.Прочитать(); // <СчетКтКод>
ЧтениеXML.Прочитать();
ТекСчетКтСтрока = ЧтениеXML.Значение;
ЧтениеXML.Прочитать(); // </СчетКтКод>
ЧтениеXML.Прочитать(); // <Комментарий>
ЧтениеXML.Прочитать();
ТекКомментарий = ЧтениеXML.Значение;
ЧтениеXML.Прочитать(); // </Комментарий>
ЧтениеXML.Прочитать(); // </Record>
Исключение
Возврат Ложь;
КонецПопытки;
НайденныеСтрокиДт = ТЗ_Результат.НайтиСтроки(Новый Структура("СчетХМЛ",ТекСчетДтСтрока));
Если НайденныеСтрокиДт.Количество() = 0 Тогда
ОбщегоНазначения.СообщитьОбОшибке("Ошибка заполнения! Счет " + ТекСчетДтСтрока + " не найден");
н = н + 1;
Продолжить;
КонецЕсли;
ТекСчетДт = НайденныеСтрокиДт[0].Ссылка;
НайденныеСтрокиКт = ТЗ_Результат.НайтиСтроки(Новый Структура("СчетХМЛ",ТекСчетКтСтрока));
Если НайденныеСтрокиКт.Количество() = 0 Тогда
ОбщегоНазначения.СообщитьОбОшибке("Ошибка заполнения! Счет " + ТекСчетКтСтрока + " не найден");
н = н + 1;
Продолжить;
КонецЕсли;
ТекСчетКт = НайденныеСтрокиКт[0].Ссылка;
ДобавлятьЗапись = (УдалитьВсеСуществующие) Или
Не((СоответствиеСчетДт[ТекСчетДт] <> Неопределено) И
(СоответствиеСчетДт[ТекСчетДт].Получить(ТекСчетКт) <> Неопределено));
Если (ДобавлятьЗапись) Тогда
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.СчетДт = ТекСчетДт;
НоваяЗапись.СчетКт = ТекСчетКт;
НоваяЗапись.Комментарий = ТекКомментарий;
ЗаполненоПроводок = ЗаполненоПроводок + 1;
КонецЕсли;
Если (ОтображатьПрогресс) Тогда
ФормаИндикации.Значение = ФормаИндикации.Значение + 1;
КонецЕсли;
н = н + 1;
КонецЦикла;
ЧтениеXML.Закрыть();
НаборЗаписей.Записать(УдалитьВсеСуществующие);
Если (ОтображатьПрогресс) Тогда
Если ФормаИндикации.Открыта() Тогда
ФормаИндикации.Закрыть();
КонецЕсли;
КонецЕсли;
Возврат Истина;
#КонецОбласти // Внесение_изменений
//</_ЦИТ <<>>
Иначе
Попытка
ЧтениеXML.ОткрытьФайл(ПолноеИмяФайла);
Исключение
Возврат Ложь;
КонецПопытки;
КонецЕсли;
Попытка
ЧтениеXML.ПерейтиКСодержимому(); // FileContent
ЧтениеXML.ПрочитатьАтрибут(); // xmlns:nspxml
ЧтениеXML.ПрочитатьАтрибут(); // RecordCount
КоличествоСтрок = XMLЗначение(Тип("Число"), ЧтениеXML.Значение);
Исключение
Возврат Ложь;
КонецПопытки;
Если (ОтображатьПрогресс) Тогда
ФормаИндикации = ПолучитьОбщуюФорму("ХодВыполненияОбработкиДанных");
ФормаИндикации.НаименованиеОбработкиДанных = "Заполнение базы";
ФормаИндикации.КомментарийОбработкиДанных = "Заполнение регистра корректных корреспонденций";
ФормаИндикации.КомментарийЗначения = "Выполнено:";
ФормаИндикации.МаксимальноеЗначение = КоличествоСтрок;
ФормаИндикации.Значение = 0;
Если НЕ ФормаИндикации.Открыта() Тогда
ФормаИндикации.Открыть();
Конецесли;
КонецЕсли;
н = 0; // Это количесво просмотренных записей файла-источника
Пока (Истина) Цикл
Если (н >= КоличествоСтрок) Тогда
Прервать;
КонецЕсли;
Попытка
ЧтениеXML.Прочитать(); // <Record>
ЧтениеXML.Прочитать(); // <СчетДтКод>
ЧтениеXML.Прочитать();
ТекСчетДтСтрока = ЧтениеXML.Значение;
ЧтениеXML.Прочитать(); // </СчетДтКод>
ЧтениеXML.Прочитать(); // <СчетКтКод>
ЧтениеXML.Прочитать();
ТекСчетКтСтрока = ЧтениеXML.Значение;
ЧтениеXML.Прочитать(); // </СчетКтКод>
ЧтениеXML.Прочитать(); // <Комментарий>
ЧтениеXML.Прочитать();
ТекКомментарий = ЧтениеXML.Значение;
ЧтениеXML.Прочитать(); // </Комментарий>
ЧтениеXML.Прочитать(); // </Record>
Исключение
Возврат Ложь;
КонецПопытки;
ТекСчетДт = НайтиСчетПоКодуИзКэша(ТекСчетДтСтрока, СоответствиеКэш);
Если ТекСчетДт.Пустая() Тогда
ОбщегоНазначения.СообщитьОбОшибке("Ошибка заполнения! Счет " +
ТекСчетДтСтрока + " не найден");
КонецЕсли;
ТекСчетКт = НайтиСчетПоКодуИзКэша(ТекСчетКтСтрока, СоответствиеКэш);
Если ТекСчетКт.Пустая() Тогда
ОбщегоНазначения.СообщитьОбОшибке("Ошибка заполнения! Счет " +
ТекСчетКтСтрока + " не найден");
КонецЕсли;
ДобавлятьЗапись = (УдалитьВсеСуществующие) Или
Не((СоответствиеСчетДт[ТекСчетДт] <> Неопределено) И
(СоответствиеСчетДт[ТекСчетДт].Получить(ТекСчетКт) <> Неопределено));
Если (ДобавлятьЗапись) Тогда
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.СчетДт = ТекСчетДт;
НоваяЗапись.СчетКт = ТекСчетКт;
НоваяЗапись.Комментарий = ТекКомментарий;
ЗаполненоПроводок = ЗаполненоПроводок + 1;
КонецЕсли;
Если (ОтображатьПрогресс) Тогда
ФормаИндикации.Значение = ФормаИндикации.Значение + 1;
КонецЕсли;
н = н + 1;
КонецЦикла;
ЧтениеXML.Закрыть();
НаборЗаписей.Записать(УдалитьВсеСуществующие);
Возврат Истина;
КонецФункции