Обработка выполняет проверку контрагентов на наличие в реестре коммерческих организаций с повышенным риском совершения правонарушений.
Обработка получает реестр расположенный непосредственно на портале "Министерства по налогам и сборам республики Беларусь" в формате xls. Поле обработки файла реестра производит проверку списка контрагентов являющимися резидентами РБ на наличие в реестре.
Если контрагент присутствует в реестре, выводится сообщение.
Код
Перем ИмяВходящегоФайла;
Перем Таблица Экспорт;
Перем Отказ;
Процедура ПолучитьОбработатьДанные() Экспорт
Отказ = Ложь;
ПолучитьДанныеССервера(Отказ);
Если НЕ Отказ Тогда
#Если Клиент Тогда
ПрочитатьКлиент();
#Иначе
ПрочитатьСервер();
#КонецЕсли
ЗаполнитьРегистрСведенийНеБлагонадежных();
#Если Клиент Тогда
ПроверитьКонтрагентовНаБлагонадежность();
#КонецЕсли
КонецЕсли;
КонецПроцедуры
Процедура ПолучитьДанныеССервера(Отказ)
Перем HTTP;
СерверИсточник = "www.nalog.gov.by";
ОбработкаПолученияФайлов = Обработки.ПолучениеФайловИзИнтернета.Создать();
Адрес = "uploads/documents/Report.xls";
ВремКаталог = КаталогВременныхФайлов() + "Report";
СоздатьКаталог(ВремКаталог);
Попытка
УдалитьФайлы(ВремКаталог,"*.*");
Исключение
ТекстОшибки = "Ошибка блокировки временных файлов";
#Если Клиент Тогда
Предупреждение(ТекстОшибки, 10, "Предупрежедние");
#Иначе
ЗаписьЖурналаРегистрации(
ТекстОшибки,
УровеньЖурналаРегистрации.Ошибка, , ,
ОписаниеОшибки());
#КонецЕсли
Отказ = Истина;
Возврат;
КонецПопытки;
// получение файла
ИмяВходящегоФайла = "" + ВремКаталог + "\" + ИмяФайла;
#Если Клиент Тогда
Если ОбработкаПолученияФайлов.ЗапроситьФайлыССервера(СерверИсточник, Адрес, ИмяВходящегоФайла, HTTP) <> Истина Тогда
Предупреждение("Не удалось получить интернет-ресурс.",10, "Предупрежедние");
Отказ = Истина;
Возврат;
КонецЕсли;
#Иначе
ПараметрыПолучения = Новый Структура;
ПараметрыПолучения.Вставить("МестоХранения", "Сервер");
ПараметрыПолучения.Вставить("Путь", ИмяВходящегоФайла);
Если НЕ ПолучениеФайловИзИнтернетаКлиентСервер.ПодготовитьПолучениеФайла(СерверИсточник+"/"+Адрес,,,,30,,,ПараметрыПолучения).Статус Тогда
ЗаписьЖурналаРегистрации(
"Ошибка получения файла",
УровеньЖурналаРегистрации.Ошибка, , ,
ОписаниеОшибки());
Отказ = Истина;
Возврат
КонецЕсли;
#КонецЕсли
ВходящийФайл = Новый Файл(ИмяВходящегоФайла);
Если НЕ ВходящийФайл.Существует() Тогда
ТекстОшибки = "Не удалось получить данные.";
#Если Клиент Тогда
Предупреждение(ТекстОшибки,10, "Предупрежедние");
#Иначе
ЗаписьЖурналаРегистрации(
ТекстОшибки,
УровеньЖурналаРегистрации.Ошибка, , ,
ТекстОшибки);
#КонецЕсли
Отказ = Истина;
Возврат;
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьРегистрСведенийНеБлагонадежных()
Регистр = Регистрысведений.НеБлагонадежныеКонтрагенты;
й=0;
Для Каждого СтрокаТаблицы из Таблица Цикл
#Если Клиент Тогда
й = й + 1;
Состояние("Заполнение регистра (" + й + " из " + Таблица.Количество() + ")");
#КонецЕсли
Запись = Регистр.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(Запись, СтрокаТаблицы);
Запись.Прочитать();
Если НЕ Запись.Выбран() Тогда
ЗаполнитьЗначенияСвойств(Запись, СтрокаТаблицы);
Запись.Записать(Истина);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПрочитатьСервер()
//очищаем таблицу и удаляем колонки
Таблица.Очистить();
Таблица.Колонки.Очистить();
Попытка
Excel = ПолучитьCOMОбъект(ИмяВходящегоФайла);
Исключение
#Если Клиент Тогда
Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
Сообщить(ОписаниеОшибки());
#Иначе
ЗаписьЖурналаРегистрации(
"Обновление регистра не благонадежных контрагентов",
УровеньЖурналаРегистрации.Ошибка, , ,
ОписаниеОшибки());
#КонецЕсли
Возврат;
КонецПопытки;
ПодготовитьСтруктуруКолонок();
Страница = Excel.Sheets(1);
СчСтолбцов = 1;
Пока СокрЛП(Страница.Cells(2, СчСтолбцов).Value) <> "" Цикл
СтрВалюта = НРег(СокрЛП(Страница.Cells(6, СчСтолбцов).Value));
ПозицияПервогоПробела = Найти(СтрВалюта, " ");
//НоваяСтрокаТЗВалюты = ТЗВалюты.Добавить();
//НоваяСтрокаТЗВалюты.Обозначение = Сред(СтрВалюта, Найти(СтрВалюта, "(") + 1, 3);
//НоваяСтрокаТЗВалюты.Кратность = Сред(СтрВалюта, 1, ПозицияПервогоПробела - 1);
//НоваяСтрокаТЗВалюты.НомерЯчейки = СчСтолбцов;
СчСтолбцов = СчСтолбцов + 2;
КонецЦикла;
КонецПроцедуры
Процедура ПодготовитьСтруктуруКолонок()
//Структура колонок-полей
Таблица.Колонки.Добавить("УНП", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(9), "УНП");
Таблица.Колонки.Добавить("Наименование", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(0), "Наименование");
Таблица.Колонки.Добавить("ДатаВключенияВРеестр",ОбщегоНазначения.ПолучитьОписаниеТиповДаты(ЧастиДаты.ДатаВремя), "Дата включения в реестр");
Таблица.Колонки.Добавить("Основание", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(0), "Основания включения в реестр");
Таблица.Колонки.Добавить("ДатаДФР", ОбщегоНазначения.ПолучитьОписаниеТиповДаты(ЧастиДаты.ДатаВремя), "Дата составления заключения ДФР");
Таблица.Колонки.Добавить("ПериодДФР", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(50), "Период, определенный в заключении ДФР, в течение которого оформленные первичные учетные документы для целей налогообложения не имеют юридической силы");
КонецПроцедуры
Процедура ПрочитатьКлиент()
//очищаем таблицу и удаляем колонки
Таблица.Очистить();
Таблица.Колонки.Очистить();
//подключаемся к эксел
Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.WorkBooks.Open(ИмяВходящегоФайла);
#Если Клиент Тогда
Состояние("Обработка файла Microsoft Excel...");
#Иначе
ЗаписьЖурналаРегистрации(
"Обновление регистра не благонадежных контрагентов",
УровеньЖурналаРегистрации.Ошибка, , ,
"Обработка файла Microsoft Excel...");
#КонецЕсли
Исключение
#Если Клиент Тогда
Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
Сообщить(ОписаниеОшибки());
#Иначе
ЗаписьЖурналаРегистрации(
"Обновление регистра не благонадежных контрагентов",
УровеньЖурналаРегистрации.Ошибка, , ,
ОписаниеОшибки());
#КонецЕсли
Возврат;
КонецПопытки;
Попытка
//Открываем необходимый лист
Excel.Sheets(1).Select(); // лист 1, по умолчанию
Исключение
//Закрываем Excel
Excel.ActiveWorkbook.Close();
Excel = 0;
ТекстОшибки = "Файл "+Строка(ИмяВходящегоФайла)+" не соответствует необходимому формату! Первый лист не найден!";
#Если Клиент Тогда
Сообщить(ТекстОшибки);
#Иначе
ЗаписьЖурналаРегистрации(
ТекстОшибки,
УровеньЖурналаРегистрации.Ошибка, , ,
ОписаниеОшибки())
#КонецЕсли
ОтменитьТранзакцию();
Возврат;
КонецПопытки;
//Получим количество строк и колонок.
//В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel
Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1);
Если Версия = "8" тогда
ФайлСтрок = Excel.Cells.CurrentRegion.Rows.Count;
ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
Иначе
ФайлСтрок = Excel.Cells(1,1).SpecialCells(11).Row;
ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column;
Конецесли;
ПодготовитьСтруктуруКолонок();
Для НС = 3 по ФайлСтрок Цикл // НС указываем с какой строки начинать обработку
#Если Клиент Тогда
Состояние("Файл "+Строка(ИмяФайла)+": Обрабатывается первый лист "+Строка(Формат(?(ФайлСтрок=0,0,((100*НС)/ФайлСтрок)),"ЧЦ=3; ЧДЦ=0"))+" %");
ОбработкаПрерыванияПользователя(); //указав данный оператор, цикл можно прервать в любой момент нажатие ctrl+break
#КонецЕсли
НоваяСтрока = Таблица.Добавить();
Для НомерКолонки = 1 по Таблица.Колонки.Количество() Цикл
//заполняем строку значениями
ТекущееЗначение = Excel.Cells(НС, НомерКолонки).Text;
Колонка = Таблица.Колонки[НомерКолонки-1];
Если Колонка.ТипЗначения = ОбщегоНазначения.ПолучитьОписаниеТиповДаты(ЧастиДаты.ДатаВремя) Тогда
ТекущееЗначение = ПолучитьДатуИзСтроки(ТекущееЗначение)
КонецЕсли;
ИмяКолонки = Колонка.Имя;
НоваяСтрока[ИмяКолонки] = ТекущееЗначение;
КонецЦикла;
КонецЦикла;
//Закрываем Excel
Excel.ActiveWorkbook.Close();
КонецПроцедуры
Функция ПолучитьДатуИзСтроки(Стр)
Д = Дата("00010101000000");
Если ПустаяСтрока(Стр) Тогда
Возврат Д;
КонецЕсли;
Если Найти(Стр,".") > 0 Тогда
Если Найти(Стр,":") > 0 И Найти(Стр," ") > 0 Тогда
М = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(Стр," ");
Возврат ПолучитьДатуИзСтроки(М[0]);
КонецЕсли;
М = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(Стр,".");
ИначеЕсли Найти(Стр,"/")>0 Тогда
М = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(Стр,"/");
ИначеЕсли Найти(Стр,",")>0 Тогда
М = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(Стр,",");
ИначеЕсли Найти(Стр,"-")>0 Тогда
М = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(Стр,"-");
КонецЕсли;
Попытка
Если М.Количество() = 3 Тогда
Год = ?(СтрДлина(М[2]) = 2,2000 + М[2],М[2]);
Д = Дата(Год,М[1],М[0]);
ИначеЕсли М.Количество() = 2 Тогда
Год = ?(СтрДлина(М[1]) = 2,2000 + М[1],М[1]);
Д = Дата(Год,М[0],1);
КонецЕсли;
Исключение
КонецПопытки;
Возврат Д;
КонецФункции
#Если Клиент Тогда
Процедура ПроверитьКонтрагентовНаБлагонадежность()
мВалютаРегламентированногоУчета = Константы.ВалютаРегламентированногоУчета.Получить();
Организация = глЗначениеПеременной("ОсновнаяОрганизация");
ТабДок = Новый ТабличныйДокумент;
ТабДок.АвтоМасштаб = Истина;
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДок.ТолькоПросмотр = Истина;
Макет = ПолучитьМакет("Отчет");
ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
ОбластьМакета.Параметры.ДатаПроверки = Формат(РабочаяДата, "ДФ=dd.MM.yyyy");
ТабДок.Вывести(ОбластьМакета);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Контрагент,
| Контрагенты.ИНН КАК УНП
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| НЕ Контрагенты.ЭтоГруппа
| И Контрагенты.РезидентРБ
| И НЕ Контрагенты.ПометкаУдаления";
Результат = Запрос.Выполнить().Выбрать();
ОбластьМакета = Макет.ПолучитьОбласть("Строка");
Пока Результат.Следующий() Цикл
СтруктураОтбор = Новый Структура;
СтруктураОтбор.Вставить("УНП", Результат.УНП);
МассивСтрок = Таблица.НайтиСтроки(СтруктураОтбор);
Если МассивСтрок.Количество() Тогда
ОбластьМакета.Параметры.Заполнить(МассивСтрок[0]);
ОбластьМакета.Параметры.Контрагент = Результат.Контрагент;
РезультатыСверки = "";
РезультатыСверки = "задолженность ";
ОстатокНаКонец = ПолучитьОстатокНаКонец(Результат.Контрагент, , Организация);
Если ОстатокНаКонец > 0 Тогда
РезультатыСверки = РезультатыСверки + "в пользу " + СокрЛП(Организация.Наименование) + " "
+ Формат(ОстатокНаКонец, "ЧЦ=21; ЧДЦ=2") + " " + Строка(мВалютаРегламентированногоУчета);
ИначеЕсли ОстатокНаКонец < 0 Тогда
РезультатыСверки = РезультатыСверки + "в пользу " + СокрЛП(Результат.Контрагент.Наименование) + " "
+ Формат(-ОстатокНаКонец, "ЧЦ=21; ЧДЦ=2") + " " + Строка(мВалютаРегламентированногоУчета);
Иначе
РезультатыСверки = РезультатыСверки + "отсутствует";
КонецЕсли;
ОбластьМакета.Параметры.ПредставлениеЗадолженности = РезультатыСверки;
ТабДок.Вывести(ОбластьМакета);
//#Если Клиент Тогда
// Сообщить("Контрагент: " + Результат.Ссылка + " включен в реестр неблагонадежных");
//#КонецЕсли
КонецЕсли;
КонецЦикла;
ТабДок.Показать();
КонецПроцедуры
Функция ПолучитьОстатокНаКонец(Контрагент, ДоговорКонтрагента = Неопределено, Организация)
СчетаПоУмолчанию = Новый Массив();
СчетаПоУмолчанию.Добавить(ПланыСчетов.Хозрасчетный.РасчетыСПоставщикамиИПодрядчиками);
СчетаПоУмолчанию.Добавить(ПланыСчетов.Хозрасчетный.РасчетыСПокупателямиИЗаказчиками);
СчетаПоУмолчанию.Добавить(ПланыСчетов.Хозрасчетный.РасчетыПоКраткосрочнымКредитамИЗаймам);
СчетаПоУмолчанию.Добавить(ПланыСчетов.Хозрасчетный.РасчетыПоДолгосрочнымКредитамИЗаймам);
СчетаПоУмолчанию.Добавить(ПланыСчетов.Хозрасчетный.РасчетыСРазнымиДебиторамиИКредиторами);
СчетаПоУмолчанию.Добавить(ПланыСчетов.Хозрасчетный.ПредоставленныеДолгосрочныеЗаймы);
СчетаПоУмолчанию.Добавить(ПланыСчетов.Хозрасчетный.ПредоставленныеКраткосрочныеЗаймы);
АналитикаРасчетов = Новый Массив;
АналитикаРасчетов.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты);
АналитикаРасчетов.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры);
// Запрос по остаткам.
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Запрос.УстановитьПараметр("ДоговорКонтрагента", ДоговорКонтрагента);
Запрос.УстановитьПараметр("Валюта", Неопределено);
Запрос.УстановитьПараметр("АналитикаРасчетов", АналитикаРасчетов);
Запрос.УстановитьПараметр("ФильтрСписокСчетов", СчетаПоУмолчанию);
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("ДатаНачала", ?(НЕ ЗначениеЗаполнено(РабочаяДата), Неопределено, Новый Граница (РабочаяДата, ВидГраницы.Исключая)));
Запрос.УстановитьПараметр("ДатаОкончания", ?(НЕ ЗначениеЗаполнено(РабочаяДата), Неопределено, Новый Граница (КонецДня(РабочаяДата), ВидГраницы.Включая)));
Запрос.Текст = ?(НЕ ЗначениеЗаполнено(РабочаяДата),
"ВЫБРАТЬ
| 0 КАК ОстатокНаНачало,
| 0 КАК ОстатокНаКонец",
"ВЫБРАТЬ
| ВЫБОР
| КОГДА &Валюта = НЕОПРЕДЕЛЕНО
| ТОГДА ХозрасчетныйОстаткиНаНачало.СуммаОстаток
| ИНАЧЕ ХозрасчетныйОстаткиНаНачало.ВалютнаяСуммаОстаток
| КОНЕЦ КАК ОстатокНаНачало,
| 0 КАК ОстатокНаКонец
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(
| &ДатаНачала,
| Счет В ИЕРАРХИИ (&ФильтрСписокСчетов),
| &АналитикаРасчетов,
| Организация = &Организация
| И ВЫБОР
| КОГДА &Валюта = НЕОПРЕДЕЛЕНО
| ТОГДА ИСТИНА
| ИНАЧЕ Валюта = &Валюта
| КОНЕЦ
| И Субконто1 = &Контрагент
| И ВЫБОР
| КОГДА &ДоговорКонтрагента = НЕОПРЕДЕЛЕНО
| ТОГДА ИСТИНА
| ИНАЧЕ Субконто2 = &ДоговорКонтрагента
| КОНЕЦ) КАК ХозрасчетныйОстаткиНаНачало")
+ "
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|0,
| ВЫБОР
| КОГДА &Валюта = НЕОПРЕДЕЛЕНО
| ТОГДА ХозрасчетныйОстаткиНаНачало.СуммаОстаток
| ИНАЧЕ ХозрасчетныйОстаткиНаНачало.ВалютнаяСуммаОстаток
| КОНЕЦ
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(
| &ДатаОкончания,
| Счет В ИЕРАРХИИ (&ФильтрСписокСчетов),
| &АналитикаРасчетов,
| Организация = &Организация
| И ВЫБОР
| КОГДА &Валюта = НЕОПРЕДЕЛЕНО
| ТОГДА ИСТИНА
| ИНАЧЕ Валюта = &Валюта
| КОНЕЦ
| И Субконто1 = &Контрагент
| И ВЫБОР
| КОГДА &ДоговорКонтрагента = НЕОПРЕДЕЛЕНО
| ТОГДА ИСТИНА
| ИНАЧЕ Субконто2 = &ДоговорКонтрагента
| КОНЕЦ) КАК ХозрасчетныйОстаткиНаНачало
|ИТОГИ
| СУММА(ОстатокНаНачало),
| СУММА(ОстатокНаКонец)
|ПО ОБЩИЕ";
Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "ОБЩИЕ");
Выборка.Следующий();
ОстатокНаНачалоПоСчетам = Выборка.ОстатокНаНачало;
ОстатокНаНачало = ОстатокНаНачалоПоСчетам;
ОстатокНаКонец = Выборка.ОстатокНаКонец;
Возврат ОстатокНаКонец;
КонецФункции
Процедура ПроверитьСправочникКонтрагентов() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НеБлагонадежныеКонтрагенты.УНП,
| НеБлагонадежныеКонтрагенты.ДатаВключенияВРеестр,
| НеБлагонадежныеКонтрагенты.Основание,
| НеБлагонадежныеКонтрагенты.ДатаДФР,
| НеБлагонадежныеКонтрагенты.ПериодДФР
|ИЗ
| РегистрСведений.НеБлагонадежныеКонтрагенты КАК НеБлагонадежныеКонтрагенты";
Результат = Запрос.Выполнить().Выгрузить();
Таблица = Результат;
ПроверитьКонтрагентовНаБлагонадежность()
КонецПроцедуры
#КонецЕсли
Таблица = Новый ТаблицаЗначений;
ИмяФайла = "Report.xls";
Отказ = Ложь;
Результат проверки с выводом печатной формы:
Для работы необходим предустановленный Microsoft Excel.
Тестировалось на платформе 8.3.8.1861 конфигурация "Бухгалтерия производственного предприятия для Беларуси. Редакция 1.6."