Информационный поток
Задания вакансии материалы разработки сообщения форума
Яндекс-директ

Внешняя обработка для обмена данными в формате XML 1.0 с интернет-магазином на Битрикс с Бухгалтерией предприятия 3.0.40.хх

  • Добавить свою разработку
 
Константин
Связаться с автором
05.07.2015 17:16:43
0
Загрузка и выгрузка данных в формате XML 1.0 по номенклатуре, контрагентам, договорам и счетам клиента из Битрикс в Бухгалтерию предприятия 3.0.40 с максимальной защитой от ошибок загрузки и возможностью отладки.
Скриншоты
Описание

При серьезной доработке интернет-магазина на Битриксе возникла задача определять ошибки в файлах XML на стороне 1C 8 для максимально корректного ведения учета еще на этапе загрузки. В данной обработке помимо механизма чтения XML 1.0 предусмотрено ведение протокола на стороне сервера полностью до момента ошибки с передачей его на клиента со всеми ошибками для выяснения их причин. Обработка также находится в стадии доработки и может быть применена как образец для тестирования выгрузок и для модификации под подобные решения, а также для изучения работы механизмов клиент-серверного взаимодействия. Платформа 8.3.5.1383. Режим исполнения тонкий клиент.
Примечание: по отзывам скачавших пользователей без больших усилий переделывается под Управление торговлей 11.1.

Общий вид обработки приведен ниже на рисунке 1:

Рисунок 1 -общий вид обработки

Основой решения послужила задача на форуме Загрузка XML в бухгалтерию 3.0 Предстояло сделать сложный этап - загрузку. Также для тестирования подобных задач применил идею создания списка значений, структур на клиенте для передачи их на сервер для того, чтобы как при штатной отработке, так и в случае возникновения синтаксической ошибки или ошибке в данных периода исполнения вся информация ДО данного момента по прочей загрузке была сохранена в протоколе загрузки.

Достоинства обработки:

1. Контроль ввода пользователем всех данных (обычная системная ПроверитьЗаполнение()реквизитов для нужного режима).

2. Возможность сохранения и восстановления настроек формы (тоже все стандартные возможности платформы 8.3).

3. Как уже упоминалось, возможность отладки. Есть "глобальная" транзакция, которая может быть зафиксирована только по флажку, с целью получения "отчета" по возможным ошибкам загрузки. Также учтено что платформа 1С 8 не поддерживает механизма вложенных транзакций. Также учтена особенность неявных транзакций Попытка...Исключение. Во всех случаях протокол создается в виде файла на стороне клиента

4. Ведение счетчика успешно загруженных объектов для предварительного контроля. Опять таки, не учитываются основные договора контрагентов.

5. Для оптимизации не передается контекст формы на сервер.

 

Недостатки:

1. На больших объемах XML (если файл, допустим, 2 Гб) обработка может зависать, т.к. файл (см. фрагмент кода 1) передается с клиента на сервер для обработки.

2. Не использованы современные парсеры, а использованы примитивные методы платформы 1С 8Новый ЧтениеXML  для "построчного" анализа кода. В данном случае изначально представлялись файлы с ошибками (специально не соответствовали формату XML по спецификации 1.0 - отсутствующие теги и прочее), и даже возникала необходимость предварительной обработки таких текстов. Хорошо, потом данную ошибку устранили в источнике на базе битрикса.

3. Нет индикатора процесса, что сильно бы усложнило задачу, ведь потребовалось бы периодическое возвращение на клиент с потерей всех серверных результатов. 

Ниже привожу фрагмент кода главной процедуры:

&НаКлиенте
Процедура ЗагрузитьВсе(Команда)
    
    Если НЕ ПроверитьЗаполнение() Тогда
        Возврат;
    КонецЕсли;
    
    Попытка        
        Лог = Новый ТекстовыйДокумент;
        Лог.ИспользуемоеИмяФайла = Объект.ПутьЛог;
        Лог.ДобавитьСтроку("--> Начали лог загрузки "+ТекущаяДата() );
        Лог.Записать(Лог.ИспользуемоеИмяФайла);        
        Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(Объект.ПутьФайлХМЛ), ЭтаФорма.УникальныйИдентификатор);
        СписокВЛог = Новый СписокЗначений; // Сообщения сервера
        СтруктКол = Неопределено;
        ПрочитатьХМЛНаСервере(Адрес, Объект.ФиксироватьТранзакцию, Объект.ВидНоменклатурыТовар, Объект.ВидНоменклатурыУслуга, СтруктКол, СписокВЛог, Объект.Организация, Объект.ВидДоговора); // Вызываем для оптимальной работы без контекста формы
        
        Если СписокВЛог = Неопределено Тогда
            ВызватьИсключение("Была фатальная ошибка на сервере"); // Дальше общий обработчик
        Иначе
            Для Каждого Стр Из СписокВЛог Цикл
                Лог.ДобавитьСтроку(Стр.Значение);
            КонецЦикла;    
        КонецЕсли;
        
        Лог.Записать(Лог.ИспользуемоеИмяФайла);
    Исключение
        Инфо = ИнформацияОбОшибке();
        ТекстОшибок = ПолучитьВсеОписаниеОшибокНаКлиентеНаСервере(Инфо);
        СообщитьНаКлиентеНаСервере(ТекстОшибок);        
        
        Если СписокВЛог <> Неопределено Тогда
            Для Каждого СтрокаЛога Из СписокВЛог Цикл
                Лог.ДобавитьСтроку(СтрокаЛога.Значение);
            КонецЦикла;    
        КонецЕсли;
        
        Лог.ДобавитьСтроку(ТекстОшибок); // Ситуация, когда лог не может создаться/сохраниться 
        Лог.Записать(Лог.ИспользуемоеИмяФайла);    
        
        Возврат;
        
    КонецПопытки;
    Лог.Записать(Лог.ИспользуемоеИмяФайла);    
    
    // Нормально завершение работы загрузки
    Если СтруктКол <> Неопределено Тогда
        Лог.ДобавитьСтроку("--> Закончили чтение XML в 1С в "+ТекущаяДата() );
        Лог.ДобавитьСтроку("");        
        Лог.ДобавитьСтроку("--> Загружено: Номенклатуры "+ СтруктКол.КолНом+  " шт");
        Лог.ДобавитьСтроку("--> Загружено: Контрагентов "+ СтруктКол.КолКон+  " шт");
        Лог.ДобавитьСтроку("--> Загружено: Договоров "+ СтруктКол.КолДог+  " шт");
        Лог.ДобавитьСтроку("--> Загружено: Счетов "+ СтруктКол.КолСчет+ " шт");
    КонецЕсли;
    Лог.Записать(Лог.ИспользуемоеИмяФайла);    
    СообщитьНаКлиентеНаСервере("ОК");
КонецПроцедуры

Фрагмент кода 1 - главная процедура чтения.

 

Для "парсинга" тегов использовал унифицированные процедуры приведеннные ниже. Сами алгоритмы создания контрагентов, договоров, Номенклтуры не представляют сложности и аналогичны как в обработка в толстом клинете

&НаСервереБезКонтекста
Процедура ЧтениеИСозданиеКонтрагентовНаСервере(СтруктПар)
    НомСтр = Новый Структура;    
    // Чтение тегов <Элемент>...</Элемент> У Номенклатуры
    Пока СтруктПар.Чтение.Прочитать() Цикл
        ИмяУзла  = СтруктПар.Чтение.Имя;
        ТипУзла  = СтруктПар.Чтение.ТипУзла;
        ЗначУзла = СтруктПар.Чтение.Значение;
        
        Если ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
            Если ИмяУзла = "Контрагенты" Тогда
                Возврат;            
            ИначеЕсли ИмяУзла = "Элемент" Тогда                
                НайтиСоздатьКонтрагента(НомСтр, СтруктПар);
                НомСтр = Новый Структура; // Очищается Все
                Продолжить; // Читаем следующий элемент у Номенклатуры
            КонецЕсли;
        КонецЕсли; // Если Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда... 
        
        // Заполняем данные для Нового элемента
        Если ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            Если ИмяУзла = "Элемент" Тогда
                Продолжить;
            Иначе
                СохрИмяУзла = ИмяУзла;
            КонецЕсли;
        ИначеЕсли ТипУзла = ТипУзлаXML.Текст Тогда                        
            НомСтр.Вставить(СохрИмяУзла, ЗначУзла); // // Читаем все Теги номенклатуры что есть во входном файле.
        КонецЕсли; // Если Чтение.ТипУзла =... 
    КонецЦикла;    // Пока Чтение.Прочитать()...
    
КонецПроцедуры    
 
 Далее, фрагмент XML файла для загрузки:
Также публикую формат здесь. Формат на тестовых данных БП 3.0 (демо) чисто для примера. В реальных задачах его допиливать и допиливать под свои нужды (как со стороны Битрикс, так и со стороны 1С при изменении формата). 
<?xml version="1.0" encoding="UTF-8"?>
<Exchange>
<Номенклатура>
    <Элемент>
        <Код>БП-00000003</Код>
        <Наименование>Тестовый товар , зведен 11.02.  в 16.41</Наименование>
        <НаименованиеПолное>Тестовый товар , зведен 11.02.  в 16.41</НаименованиеПолное>
        <ПризнакГруппы>Нет</ПризнакГруппы>
        <Родитель/>
        <Комментарий/>
        <Артикул/>
        <ЕдиницаИзмерения>шт</ЕдиницаИзмерения>
        <СтавкаНДС>18%</СтавкаНДС>
        <Услуга>Да</Услуга>
    </Элемент>
    <Элемент>
        <Код>БП-00000001</Код>
        <Наименование>Тетовый товар их бухгалтер</Наименование>
        <НаименованиеПолное>Тетовый товар их бухгалтер</НаименованиеПолное>
        <ПризнакГруппы>Нет</ПризнакГруппы>
        <Родитель/>
        <Комментарий/>
        <Артикул/>
        <ЕдиницаИзмерения>шт</ЕдиницаИзмерения>
        <СтавкаНДС>18%</СтавкаНДС>
        <Услуга>Нет</Услуга>
    </Элемент>
</Номенклатура>
<Контрагенты>
    <Элемент>
        <Код>00-000050</Код>
        <Наименование>Торговый дом "Комплексный"</Наименование>
        <НаименованиеПолное>ЗАО "Торговый дом Комплексный"</НаименованиеПолное>
        <ПризнакГруппы>Нет</ПризнакГруппы>
        <Родитель>00-000046</Родитель>
        <ЮридическоеФизическоеЛицо>Юридическое лицо</ЮридическоеФизическоеЛицо>
        <ИНН>0056123412</ИНН>
        <КПП>56789</КПП>
        <КодПоОКПО/>
        <ОсновнойБанковскийСчетКод>000000057</ОсновнойБанковскийСчет<wbr>­Код>
        <ОсновнойБанковскийСчетНомерСчета>40702810000000089945</Осно<wbr>­внойБанковскийСчетНомерСчета>
        <ОсновнойБанковскийСчетБанкНаименование>ОАО БАНК ВТБ</ОсновнойБанковскийСчетБанкНаименование>
        <ОсновнойБанковскийСчетБанкКод>044525187</ОсновнойБанковский<wbr>­СчетБанкКод>
        <ОсновнойБанковскийСчетБанкКоррСчет>30101810700000000187</Ос<wbr>­новнойБанковскийСчетБанкКоррСчет>
        <ОсновнойБанковскийСчетБанкАдрес/>
        <ОсновнойДоговорКонтрагентаКод>000000051</ОсновнойДоговорКон<wbr>­трагентаКод>
        <ОсновнойДоговорКонтрагентаНаименование>Основной договор</ОсновнойДоговорКонтрагентаНаименование>
    </Элемент>
</Контрагенты>
<Договора>
    <Элемент>
        <Код>00-000024</Код>
        <Наименование>3 от 01.04.2013</Наименование>
        <ПризнакГруппы>Нет</ПризнакГруппы>
        <Родитель/>
        <КонтрагентКод>00-000028</КонтрагентКод>
    </Элемент>
</Договора>
<Счета>
    <Элемент>
        <Номер>ТД00-000001</Номер>
        <Дата>24.01.2013 12:00:00</Дата>
        <Проведен>Да</Проведен>
        <ВалютаДокумента>руб.</ВалютаДокумента>
        <СуммаВключаетНДС>Да</СуммаВключаетНДС>
        <СуммаДокумента>136 500</СуммаДокумента>
        <СтатусОплаты>Не оплачен</СтатусОплаты>
        <ДокументБезНДС>Нет</ДокументБезНДС>
        <ТипЦен/>
    </Элемент>
</Счета>
</Exchange>

Также возможна доработка под потребности вашего интернет-магазина подобной обработки или написание новой.

Ключевые слова:   Битрикс   XML   бухгалтерия предприятия 3.0   парсинг XML   теги   загрузка   договор   контрагент   счет   обработка загрузки-выгрузки.
Файлы для скачивания
  • 399р
    • IN_s_chteniem_daty 2.0.epf (45Kb)
    • Внешняя обработка для бухгалтерия предприятия 3.0.40.хх по загрузке из Битрикс в формате XML 1.0 данных по номенклатуре, контрагентам, договорам и счетам клиента максимальной защитой от ошибок загрузки и возможностью отладки.
    • Представляет собой внешнюю обработку для бухгалтерия предприятия 3.0.40.хх по загрузке из Битрикс в формате XML 1.0 данных по номенклатуре, контрагентам, договорам и счетам клиента максимальной защитой от ошибок загрузки и возможностью отладки.
    • дата загрузки: 05.07.2015 17:33:08
    • Exchange исправленный.xml (4Kb)
    • Формат на тестовых данных БП 3.0 (демо) для примера.
    • Для иллюстрации возможностей выгрузки выкладываю данный формат XML для загрузки в БП 3.0.
    • скачиваний: 157
    • дата загрузки: 05.07.2015 17:41:18
Скачать все файлы одним архивом (49Kb)
0
    ≡ к списку разработок