Бухгалтер і комп'ютер.Субота, 20.10.2018, 10:32

Вітаю Вас Гість | RSS
Головна | Статті | Вхід
Меню сайту

Категорії каталога
Бухгалтер і комп'ютер [8]
Все що потрібно бухгалтерам для роботи за комп'ютером
Програмування на 1С [9]
Все що стосується програмування бухгалтерських програм "1С" версій 7.7 і 8.1.

Друзі сайту

Головна » Статті » Програмування на 1С


Приклад імпорту з ДБФ (отриманого з програми M.E.DOC) факту реєстрації власних відправлених податкових накладних в ЄРПН.

Приклад (для більшості випадків це буде не приклад, а робочий варіант програми) імпорту з ДБФ факту реєстрації власних відправлених податкових накладних в єдиному реєстрі податкових накладних (ЄРПН).

Написано під програму 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С, номер з файлу:" + НомерДокументаЗФайлу + ", номер документа обчислений:" + НомерПодаткової + "", СтатусСообщения.ОченьВажное);

Продолжить;

КонецЕсли;

КонецЦикла;

КонецПроцедуры

Категорія: Програмування на 1С | Додав: Admin (26.01.2012)
Переглядів: 6372 | Коментарі: 2 | Рейтинг: 5.0/3 |
Всього коментарів: 1
1  
Зміни в обробці від 01.02.2012:
Якщо поле TYPE = 1 з ДБФ файлу, то це є розрахунок коригування, його пропускаємо

Ім`я *:
Email *:
Код *:

Статистика


Copyright MyCorp © 2018