Приклад (для
більшості випадків це буде не приклад,
а робочий варіант програми) імпорту з
ДБФ факту реєстрації власних відправлених
податкових накладних в єдиному реєстрі
податкових накладних (ЄРПН).
Написано під
програму 1С версії Бухгалтерія для
України і програму M.E.Doc з якого і можна
отримати цю інформацію в DBF файлі.
Послідовність
роботи:
Відправивши
податкові накладні з Медка, і отримавши
квитанції на них про факт отримання/відмови
в реєстрації, можна сформувати файл dbf
з переліком тільки правильно зареєстрованих
податкових накладних.
Де цей файл
взяти: коли відкритий модуль "Податкові
накладні”, тоді в меню "Файл-Експорт”
буде ще пункт: "Експортувати в ДБФ
дату реєстрації в ЄРПН ”.
Далі в 1С з
допомогою обробки: http://commerce.at.ua/load/1-1-0-4
імпортуємо щойно
створений ДБФ файл (ім'я OUTNAKLKVT*.dbf). Після
цього в програмі 1С податкові накладні
по яких отримано підтвердження з ЄРПН
що вони зареєстровані, будуть відмічені
(зверху в шапці документа) як "Включена
до Єдиного реєстру податкових накладних”.
І відповідно в
журналі податкових накладних в 1С можна
буде зручно бачити і фільтрувати тільки
ті податкові які потребують виправлення
і повторної відправки.
Структура dbf
файлу з програми Медок:
DATE_REG Дата
реєстрації
NUMBER Номер
податкової
DATEDOC Дата
документа податкової
EDRPOU Код ЄДРПОУ
INN Індивідуальний
податковий код
NUM_SVD Номер
свідоцтва платника
TYPE Мені нажаль
невідомо що це за поле :(
Вихідний текст
обробки імпорту:
Перем ФайлТимчасовий;
Функция
ДБФвТаблицюЗначень(ПовнийШляхЗІмям,Кодування)
Попытка
ИмяФайла =
СокрЛП(ПовнийШляхЗІмям); ФС = Новый
Файл(ИмяФайла); Если НЕ
ФС.Существует() Тогда Сообщить("Поки
думали імпортувати файл ДБФ кудись
пропав вже :("); Возврат 0; КонецЕсли; ДБФ = Новый
XBase; ДБФ.Кодировка
= Кодування; ДБФ.ОткрытьФайл(ИмяФайла); ТЗ = Новый
ТаблицаЗначений; //Тимчасова КількістьКолонок
= ДБФ.Поля.Количество(); Для і = 0 по
КількістьКолонок-1 Цикл НазваКолонки
= ДБФ.Поля[і].Имя; ТипДаних =
ДБФ.Поля[і].Тип; ДовжинаДаних
= ДБФ.Поля[і].Длина;
ТочністьДаних
= ДБФ.Поля[і].Точность; МассивЧ = Новый
Массив; МассивЧ.Добавить(Тип("Число")); МассивС = Новый
Массив; МассивС.Добавить(Тип("Строка")); МассивД = Новый
Массив; МассивД.Добавить(Тип("Дата")); Если ТипДаних
= "F" ИЛИ ТипДаних = "N" Тогда ТипДаних =
Новый ОписаниеТипов(МассивЧ); ИначеЕсли
ТипДаних = "S" Тогда ТипДаних =
Новый ОписаниеТипов(МассивС); ИначеЕсли
ТипДаних = "D" Тогда ТипДаних =
Новый ОписаниеТипов(МассивД); Иначе ТипДаних =
Новый ОписаниеТипов(МассивС); ДовжинаДаних
= 100; КонецЕсли; ТЗ.Колонки.Добавить(НазваКолонки,ТипДаних,НазваКолонки,ДовжинаДаних); КонецЦикла; КількістьРядків
= ДБФ.КоличествоЗаписей(); ДБФ.Первая(); Пока НЕ
ДБФ.ВКонце() Цикл СтрокаТЧ =
ТЗ.Добавить(); Для і = 0 по
КількістьКолонок-1 Цикл СтрокаТЧ[і] =
ДБФ.ПолучитьЗначениеПоля(і); КонецЦикла; ДБФ.Следующая(); КонецЦикла; ДБФ.ЗакрытьФайл(); Возврат ТЗ;
//Успішно записано Исключение
Сообщить("Помилка
отримання ТЗ з DBF файлу:" +
ИмяФайла,СтатусСообщения.Важное); Сообщить(ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат 0; КонецПопытки;
КонецФункции
//
Функция
ВизначитиНомерПодаткової(Знач
ДатаДокумента,Знач НомерОтриманий)
ПозиціяРозділювачаФілії
= Найти(НомерОтриманий,"/"); Если
ПозиціяРозділювачаФілії = 0 Тогда КодФіліїСпецрежимуЗФайлу
= ""; НомерПодаткової
= НомерОтриманий; Иначе КодФіліїСпецрежимуЗФайлу
= Число(Сред(НомерОтриманий,ПозиціяРозділювачаФілії+1)); НомерПодаткової
= Лев(НомерОтриманий,ПозиціяРозділювачаФілії-1); КонецЕсли; Префикс = ""; ПрефиксНалоговых
= ""; УчетнаяПолитикаНеЗадана
= Ложь; УчетнаяПолитика =
ОбщегоНазначения.ПолучитьПараметрыУчетнойПолитики(ДатаДокумента,
УчетнаяПолитикаНеЗадана, Организация); Если
УчетнаяПолитикаНеЗадана тогда Возврат ""; КонецЕсли; Если НЕ
ЗначениеЗаполнено(Организация.Префикс)
Тогда Префикс = ""; Иначе Префикс =
Организация.Префикс; КонецЕсли; Если
УчетнаяПолитика.ВестиРаздельнуюНумерациюНалоговыхДокументов
= Истина Тогда ПрефиксНалоговых
= ПрефиксНалоговых + "Н"; КонецЕсли; Если
УчетнаяПолитика.ВестиМесячнуюНумерациюНалоговыхДокументов
= Истина Тогда // разделяем
префиксом по месяцам ПрефиксНалоговых
= ПрефиксНалоговых +
ОбщегоНазначения.ПолучитьМесячныйПрефиксНалоговыхДокументов(ДатаДокумента); КонецЕсли; // як визначити
номер при веденні обліку для філії в
Конфігурації Бухгалтерія невідомо :( // тому вважаєм
що все що прийшло в номері після слешу
є ознакою спецрежиму Если
УчетнаяПолитика.ВестиРаздельнуюНумерациюНалоговыхДокументовПоСпецРежимам
= Истина и НЕ ПустаяСтрока(КодФіліїСпецрежимуЗФайлу)
Тогда СпецРежим =
КодФіліїСпецрежимуЗФайлу; Если СпецРежим
= 0 Тогда ПрефиксНалоговых
= ПрефиксНалоговых + ""; ИначеЕсли
СпецРежим = 2 Тогда ПрефиксНалоговых
= ПрефиксНалоговых + "U"; ИначеЕсли
СпецРежим = 3 Тогда ПрефиксНалоговых
= ПрефиксНалоговых + "V"; ИначеЕсли
СпецРежим = 4 Тогда ПрефиксНалоговых
= ПрефиксНалоговых + "W"; КонецЕсли; КонецЕсли; ПрефиксНалоговых
= Лев(ПрефиксНалоговых + "0000", 4); Префикс =
СОКРП(Префикс) + ПрефиксНалоговых;
// Доповняєм
нулями до 13 символів за мінусом довжини
префіксу НомерПодаткової
= Прав("0000000000000" +
СокрЛП(НомерПодаткової),13-СтрДлина(Префикс)); Возврат Префикс
+ НомерПодаткової;
КонецФункции
Процедура
КнопкаВыполнитьНажатие(Кнопка)
Если НЕ
ЗначениеЗаполнено(Организация) Тогда Сообщить("Не
заповнено організацію на формі обробки!"); Возврат; КонецЕсли; ТЗІмпорт = Новый
ТаблицаЗначений; ТЗІмпорт =
ДБФвТаблицюЗначень(ФайлТимчасовий,КодировкаXBase.ANSI); Если ТЗІмпорт
= 0 Тогда Сообщить("Файл
ДБФ порожній."); Возврат; КонецЕсли; Для Каждого
РядокДБФ Из ТЗІмпорт Цикл ДатаДокумента
= РядокДБФ.DATEDOC; // Дата документа ПН НомерДокументаЗФайлу
= СокрЛП(РядокДБФ.NUMBER);// Повний номер
ПН з перфіксом у форматі: "1555/2" ІндивідуальнийПН
= СокрЛП(РядокДБФ.INN);// Отриманий ІПН //Зміни від 01.02.2012 //Якщо поле TYPE = 1, то це є розрахунок коригування, його пропускаємо, обробки коригуючих тут немає Если РядокДБФ.TYPE <> 0 Тогда Сообщить("Пропущено проставлення відміток для коригуючої, №" + НомерДокументаЗФайлу + " від " + ДатаДокумента); Продолжить; КонецЕсли; // По номеру
свідоцтва перевірку не робимо, ІПН
цілком достатньо для звірки, оскільки
номер ПН не можу дублюватися в межах
місяця // Тим більше
по коду ЄДРПОУ, який не обовязково є
заданим в Медку і може його не бути
зовсім в дбф файлі Если ДатаДокумента
< '2012.01.01' Тогда Сообщить("Нажаль
не реалізовано визначення номера
податкової для документів до 01.01.2012р."); // Хоча при
бажанні, якщо відомо нумерацію ПН і вона
була більш менш логічною то також можна
реалізувати // Але це потрібно
лише для повернень по ПН до 01/01/2012р., що
відправляються на портал одночасно з
коригуючими,
// а їх не так
вже багато буде. Продолжить; КонецЕсли; НомерПодаткової
= ВизначитиНомерПодаткової(ДатаДокумента,НомерДокументаЗФайлу); Если Режим = 0
Тогда //Тест: перевірка
коректності співставлення номерів
податкових із отриманими з ДБФ Сообщить("Номер
з файлу:" + НомерДокументаЗФайлу + ",
номер в 1С:" + НомерПодаткової); Продолжить; КонецЕсли; Запрос = Новый
Запрос; Запрос.Текст
= "ВЫБРАТЬ
| НалоговаяНакладная.Ссылка КАК Док,
| НалоговаяНакладная.Дата КАК ДатаДок,
| НалоговаяНакладная.Проведен КАК
ОзнакаПроведення,
| НалоговаяНакладная.ПометкаУдаления,
| НалоговаяНакладная.Номер,
| НалоговаяНакладная.ТребуетВключенияВЕдиныйРеестрНалоговыхНакладных,
| НалоговаяНакладная.ВключенаВЕдиныйРеестрНалоговыхНакладных,
| НалоговаяНакладная.Контрагент.КодПоЕДРПОУ,
| НалоговаяНакладная.Контрагент.ИНН,
| НалоговаяНакладная.Контрагент.НомерСвидетельства |ИЗ
| Документ.НалоговаяНакладная КАК
НалоговаяНакладная |ГДЕ
| НалоговаяНакладная.Номер = &Номер | И
НалоговаяНакладная.Контрагент.ИНН =
&ИНН | И
НалоговаяНакладная.Организация =
&Организация"; Запрос.УстановитьПараметр("Номер",
НомерПодаткової); Запрос.УстановитьПараметр("ИНН",
ІндивідуальнийПН); Запрос.УстановитьПараметр("Организация",
Организация); Результат =
Запрос.Выполнить(); Выборка =
Результат.Выбрать(); Если
Выборка.Количество() > 1 Тогда // Сюда попадем
якщо неправильно співставлено номер
отриманий з ДБФ файлу із нумерацією
податкових в 1С Сообщить("Пропущено
з обробки! невідомо яку ПН обрати з
декількох, номер з файлу:" +
НомерДокументаЗФайлу + ", номер
документа обчислений:" + НомерПодаткової
+ "", СтатусСообщения.ОченьВажное); Продолжить; КонецЕсли; Если
Выборка.Следующий() Тогда // Перевірка
на факт вилучення Если
Выборка.ПометкаУдаления Тогда Сообщить("Пропущено
з обробки! Документ помічено на вилучення
в 1С, код документа:" + НомерПодаткової,
СтатусСообщения.ОченьВажное ); Продолжить; КонецЕсли; // Перевірка
на факт розпроведення Если НЕ
Выборка.ОзнакаПроведення Тогда Сообщить("Пропущено
з обробки! Документ непроведено в 1С,
код документа:" + НомерПодаткової,
СтатусСообщения.ОченьВажное ); Продолжить; КонецЕсли; // Перевірка
на факт зняття помітки про потребу
відправки в ЄРПН Если НЕ
Выборка.ТребуетВключенияВЕдиныйРеестрНалоговыхНакладных
Тогда Сообщить("Пропущено
з обробки! Документ немає помітки про
включення в ЄРПН, код документа:" +
НомерПодаткової, СтатусСообщения.ОченьВажное
); Продолжить; КонецЕсли; // Якщо все
добре, і ще немає ознаки тоді тільки
міняєм Если НЕ
Выборка.ВключенаВЕдиныйРеестрНалоговыхНакладных
Тогда ДокументНовий
= Выборка.Док.ПолучитьОбъект(); ДокументНовий.ВключенаВЕдиныйРеестрНалоговыхНакладных
= Истина; Попытка ДокументНовий.ОбменДанными.Загрузка
= Истина; ДокументНовий.Записать(РежимЗаписиДокумента.Запись); Исключение Сообщить("Пропущено
з обробки! Помилка при запису ознаки в
1С, для документа:" + НомерПодаткової); КонецПопытки; Сообщить("Документ
змінено, код документа:" + НомерПодаткової,
СтатусСообщения.Информация); Продолжить; КонецЕсли; Иначе Сообщить("Пропущено
з обробки! Документ не знайдено в 1С,
номер з файлу:" + НомерДокументаЗФайлу
+ ", номер документа обчислений:" +
НомерПодаткової + "",
СтатусСообщения.ОченьВажное); Продолжить; КонецЕсли; КонецЦикла;
КонецПроцедуры
|