Sokoloff Serg

6
Рейтинг

Sykoky



  •   Регистрация: 25.01.2012 (12 лет назад)

  •   Был(а) на сайте: 27.01.2020

Подписчики 1

Рейтинг 6

Импорт Налоговой Накладной из формата XML (J120104)

Инструменты и обработки Системный администратор Программист Бухгалтерский учет 7.7 1С:Бухгалтерия 7.7 Украина Бухгалтерский учет Налоговый учет Windows НДС Абонемент ($m) Внешняя обработка (ert,epf) Файловый обмен (TXT, XML, DBF), FTP

В связи с переходом на централизованную систему сдачи НН в ЄРПН у некоторых пользователей возникла обратная потребность в импорте из XML в 1С этих документов. Предлагаемое решение не претендует на универсальность, но позволяет лицу, сопровождающему 1С, достаточно быстро его адаптировать под свои конкретные нужды.

1 стартмани

26.01.2012    15628    34    Sykoky    9       

6

Комментарии

ToolsСтруктура из Объекта XDTO#8 08.01.20 14:42
(7)
Цитата
ектXDTO"


В заголовке было "Структура из Объекта XDTO", а не "Как вставить стурктуру в XDTO" или "выведем его в JSON"

Намекну, что это было сделано для прямого обращения к любому элементу заголовка или тела. Минуя жесткую структуру, а используя лишь совпадения имен.
DevЗагрузка документов "Операция" по счетам из Excel за период#11 12.02.12 15:23
П.С.

У меня документы - Партии. Кому необходимо изменить - не забываем исправить.
DevЗагрузка документов "Операция" по счетам из Excel за период#10 12.02.12 15:20
Надоело исправлять ошибки, переписал на скорую руку.
Следующий код необходимо вставить ВМЕСТО процедуры КнопкаВыполнитьНажатие




Перем ЛистExcel;

Процедура ЗаписьДанных(СтрокаExcel, СубТип, СубКод, Счет, Субконто, Сообщать=Ложь, Д_К = "Д")
СчЦикла = 0;

Для каждого ТекСубконто Из Счет.ВидыСубконто Цикл

СубкДт = ЛистExcel.Cells(СтрокаExcel,СубТип+СчЦикла).Value;
КодДт = ЛистExcel.Cells(СтрокаExcel,СубКод+СчЦикла).Value;
СчЦикла = СчЦикла + 1;

Если (СокрЛП(КодДт) = Неопределено) Тогда
Если Сообщать Тогда
сообщить("Параметр №"+СчЦикла+" пуст");
КонецЕсли;
Продолжить;
КонецЕсли;
Попытка
СДт = Справочники[Соответствие.Получить(ТекСубконто.ВидСубконто.ТипЗначения.Типы()[0])].НайтиПоКоду(КодДт, Истина);
Если СДт = Неопределено Тогда
Сообщить("Не найдено " + Д_К + СчЦикла + " субконто "+ КодДт);
Иначе
// Сообщить("Найдено Д" + СчЦикла + " субконто " + КодДт + " " + СДт);
КонецЕсли;
Исключение
Попытка
Перечисление = Перечисления[Соответствие1.Получить(ТекСубконто.ВидСубконто.ТипЗначения.Типы()[0])];
СДт = ПолучитьЗначениеПеречисления(СубкДт, Перечисление);
Исключение
Попытка
СДт = Документы.Партия.НайтиПоНомеру(КодДт);
// Если НЕ СДт.Пустая() Тогда
// КонецЕсли;
Исключение
Сообщить("Ошибка субконто " + Д_К + СчЦикла + КодДт);
КонецПопытки;
КонецПопытки;
КонецПопытки;

Попытка
ОбщегоНазначения.УстановитьСубконто(Счет, Субконто, СчЦикла, СДт, Сообщать);
Исключение
Сообщить("Не установлен " + Д_К + СчЦикла);
КонецПопытки;

Если СчЦикла=3 Тогда
Прервать; // В 7-ке из всего 3
КонецЕсли;

КонецЦикла;

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

Процедура КнопкаВыполнитьНажатие(Кнопка)

СоздатьТипы();

Попытка
Файл = ПолучитьCOMОбъект(ПутьКФайлу);
Исключение
Предупреждение("На компе не установлен Excel.");
Возврат
КонецПопытки;

xlCellTypeLastCell = 11;
ЛистExcel = Файл.Sheets(1);
ПоследняяСтрокаExcel = ЛистExcel.Cells.SpecialCells(xlCellTypeLastCell).Row;

Если ПоследняяСтрокаExcel < НомерПервойСтроки Тогда
Предупреждение("НЕ ВЕРНО указана первая строка или в файле Excel первая закладка пуста.");
Возврат;
КонецЕсли;


СтарДатаВремя = "20111231000001"; //********* времянка на 1-й цикл.

НачатьТранзакцию();
СчетчикЦикла = 0;

Для СтрокаExcel = НомерПервойСтроки По ПоследняяСтрокаExcel Цикл
СчетчикЦикла = СчетчикЦикла +1;
Состояние("Строка "+СчетчикЦикла+" из "+ПоследняяСтрокаExcel);

ОбработкаПрерыванияПользователя();


// ***************** Определение строк Excel
ДатаИзXLS = ЛистExcel.Cells(СтрокаExcel,1).Value; // Тут у меня дата такого формата 01.01.2010 и далее нужно ее перевести в формат 1С
СчДт = ЛистExcel.Cells(СтрокаExcel,4).Value;
СчДт = СтрЗаменить(СчДт,".","");
СчКт = ЛистExcel.Cells(СтрокаExcel,5).Value;
СуммаОперации = ЛистExcel.Cells(СтрокаExcel,6).Value;
Количество = ЛистExcel.Cells(СтрокаExcel,26).Value;
Содержание = ЛистExcel.Cells(СтрокаExcel,27).Value;
// ******************


РазделительСтрок = Символы.ПС; // Получим нужный формат даты (20100101230000) из (01.01.2010)
Результат = СтрЗаменить(ДатаИзXLS, ".", РазделительСтрок);
День = СокрЛП(СтрПолучитьСтроку(Результат, 1));
Месяц = СокрЛП(СтрПолучитьСтроку(Результат, 2));
Год = Лев(СокрЛП(СтрПолучитьСтроку(Результат, 3)), 4);
Время = "000001";

ДатаВремя = Год+Месяц+День+Время;

Если СтарДатаВремя <> ДатаВремя
Тогда
Док = Документы.ОперацияБух.СоздатьДокумент();
Док.Дата = ДатаВремя;
Док.Организация = Организация;
Док.Содержание = Содержание;
Док.Ответственный = Ответственный;
Док.Записать();

НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Значение = Док.Ссылка;
НаборЗаписей.Отбор.Регистратор.Использование = Истина;

Сообщить("Создан документ ОперацияБух № " + Док.Ссылка);
КонецЕсли;

Движения = НаборЗаписей.Добавить();
Движения.Регистратор = Док.Ссылка;
Движения.Период = Док.Дата;
Движения.Организация = Док.Организация;

Движения.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду(СчДт);
Движения.СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду(СчКт);
Движения.КоличествоДт = Количество;
Движения.КоличествоКт = Количество;
Движения.Сумма = СуммаОперации;


// ******************************

ЗаписьДанных(СтрокаExcel, 7, 20, Движения.СчетДт, Движения.СубконтоДт, Истина, "Д");

ЗаписьДанных(СтрокаExcel, 10, 23, Движения.СчетКт, Движения.СубконтоКт, Истина, "К");

//*********************************
Попытка
НаборЗаписей.Записать();
Исключение
Сообщить("Ошибка создания набора записей Регистра Бухгалтерии для документа" + Док.Ссылка +" Дт " +Строка(Движения.СчетДт) + " - Кт " + Строка(Движения.СчетКт));
КонецПопытки;

СтарДатаВремя = ДатаВремя;

КонецЦикла;
ЗафиксироватьТранзакцию();

Файл.Close();

Сообщить("Удачно");

Документы.ОперацияБух.ПолучитьФорму("ФормаСписка").Открыть();

КонецПроцедуры
DevЗагрузка документов "Операция" по счетам из Excel за период#9 11.02.12 21:42
Ляп №5 - В 8-ке 4-ре Субконто, а в 7-ке три. А счетчик субконто проверяется на "1", "2", а вот на "3" кто-то забыл, т.е. в следующем цикле Субконто_3 = "", т.к. из файла его не загрузить.

Кстати, проверка субконто идет только на справочники и перечисления. А если это партия?
DevЗагрузка документов "Операция" по счетам из Excel за период#8 10.02.12 16:26
P.S.

Для конфы УТП еще необходимо заменить вызов
БухгалтерскийУчет.УстановитьСубконто
на
ОбщегоНазначения.УстановитьСубконто
DevЗагрузка документов "Операция" по счетам из Excel за период#7 10.02.12 16:24
Ага, грузит, аж 2 раза.

Ляп №1 - сбита нумерация колонок создаваемого DBF-файла и Excel'я начиная с Дебета.
Ляп №2 - при отсутствии выборки корректного счета смысл пытаться дальше что-то делать.
Ляп №3 - 1С 7.7 выгружает счет в виде (хх.уу.яя). А в 8-ке точки где-то есть в плане счетов?
Ляп №4 - при отсутствии найденного элемента Субконто торжественно пишем пустоту.

Полдня потратил, пока нашел/исправил.

Замечания к логике.
1. Искать субконто лучше по коду/полному коду. Наименования, особенно в Товаре, могут и повторяться.

Рекомендации.
1.Лучше выгрузку делать не одним гигантским фалом, а разбить по счетам/операциям - проще контролировать суммы и обороты, когда ищешь сбой.
2. Если делать выгрузку кода, а не наименования, то размер поля придется увеличить. Да и поиск по более короткой строке, а тем более по числу, выполняется намного шустрее...
DevЭкспорт налоговых накладных в XML (Украина). Импорт даты внесения в реестр ДПА из системы документооборота М.E.Doc#58 01.02.12 13:55
(57) MIXOH,
По проверке кодов.
Занятие бесполезное, т.к. коды таможенной службы и ДПА не совпадают. Нарывался неоднократно. Периодически сервер ДПА посылает контрагентов с моим кодом, хотя у меня с этим же кодом НН зарегистрирована.

По неплательщикам.
Можно пока и не выгружать, пока он не запросит корректировку или не захочет вернуть. Тогда - обязательно.

По импорту запроса входящих НН.
Каждому буху все равно придется вносить в программу входящие НН. Сделать отчет за период по журналу этих документов и сохранить его в виде XML для последующего импорта в MEDOC несложно. В OPZ J1400101
DevИмпорт Налоговой Накладной из формата XML (J120104)#6 30.01.12 11:54
Можно воспользоваться простой глобальной заменой - "Клиенты." на "Контрагенты."
Подгонка займет минут 10 - проверял на БУУ 2.58
DevИмпорт Налоговой Накладной из формата XML (J120104)#0 26.01.12 8:28
В связи с переходом на централизованную систему сдачи НН в ЄРПН у некоторых пользователей возникла обратная потребность в импорте из XML в 1С этих документов.
Предлагаемое решение не претендует на универсальность, но позволяет лицу, сопровождающему 1С, достаточно быстро его адаптировать под свои конкретные нужды.
DevИмпорт Налоговой Накладной из формата XML (J120104)#0 26.01.12 8:28
В связи с переходом на централизованную систему сдачи НН в ЄРПН у некоторых пользователей возникла обратная потребность в импорте из XML в 1С этих документов.
Предлагаемое решение не претендует на универсальность, но позволяет лицу, сопровождающему 1С, достаточно быстро его адаптировать под свои конкретные нужды.