Как я на 1С лабал #1: Экспорт данных в XML

Сразу скажу — 1С не моя стихия — писать код кириллицей, и разбираться в тонкостях бухгалтерского/налогового учета, мне совсем не интересно, поэтому приведенный здесь код не претендует на истинность в первой инстанции.

Заниматься подобным онанизмом (взято отсюда):

// Создадим новую таблицу значений
Тз = Новый ТаблицаЗначений; 

// Добавим в таблицу значений три колонки
Тз.Колонки.Добавить("Колонка1"); 
Тз.Колонки.Добавить("Колонка2"); 
Тз.Колонки.Добавить("Колонка3"); 

// Добавим несколько строк в таблицу значений
Для п = 1 По 10 Цикл
    НовСтрока = Тз.Добавить(); 
    НовСтрока.Колонка1 = "Колонка1"; 
    НовСтрока.Колонка2 = "Колонка2"; 
    НовСтрока.Колонка3 = п; 
КонецЦикла;

я не привык, да и привыкать как-то не собирался, поэтому, писал все по привычке на буржуйском (благодаря чему у меня возникли некоторые трудности с переводом).

Так вот. Курсовая подразумевала реализацию двух конфигураций 1С с односторонним обменом данными. Экспортирующая конфигурация — «Торговля», импортирующая — «Бухгалтерия». Так как мне повезло с преподом, он не стал ставить условия на правильность бухгалтерских проводок (упаси /dev/null), сделав акцент на обмене и построении простых отчетов.

Конфигурация «Торговля»

Для реализации сего чуда, я использовал т.н. регистры накопления. Смысл их достаточно прост — они учитывают приход/расход (+/-) неких товаров из справочника. К счастью, в 1С есть куча встроенных генераторов кода, например регистр накопления можно привязать к определенным документам, а документы создаются при заполнении формы.

Окей, регистры заполняются, формы работают, отчеты генерируются. Код отчета получился такой:

// проверка баланса товаров
Procedure okClick(Control)
 // Вставить содержимое обработчика.
 good_ref = Controls.good_ref.Value;
 
 condition = new Structure();
 
 if(not(good_ref = Catalogs.Товары.EmptyRef())) then
     condition.Insert("Товар",good_ref);
 endif;
 
 total = AccumulationRegisters.Товары.Balance(,condition);
 
 Controls.TableBox1.Value = total;
 Controls.TableBox1.CreateColumns();
EndProcedure

Соответственно, если выбран товар, то выводится статистика только по нему, иначе выводится статистика по всем товарам.

Большая часть кода в модуле экспорта относится к реализации реакций интерфейса на действия пользователя (прямо Delphi вспомнился), поэтому тут не приводится. Реализация же самого механизма экспорта данных несложна по своей сути и сводится к такому куску кода:

text_file = new TextWriter(export_name, TextEncoding.UTF8);
 
xml_file = new XMLWriter;
xml_file.SetString();
 
reg = AccumulationRegisters.Товары.Select();
 
xml_file.WriteStartElement("export_items");
// экспорт регистра товаров
xml_file.WriteStartElement("registry");
 
while reg.Next() do
    xml_file.WriteStartElement("registry_item");
    xml_file.WriteAttribute("type", String(reg.RecordType));
    xml_file.WriteAttribute("count", String(reg.Количество)); 
    WriteXML(xml_file, reg.Товар.Ref);
    xml_file.WriteEndElement();
enddo;
 
xml_file.WriteEndElement();
 
// экспорт справочника товаров
good = Catalogs.Товары.Select();
 
xml_file.WriteStartElement("goods");
 
while good.Next() do
    xml_file.WriteStartElement("goods_item");
    xml_file.WriteAttribute("code", String(good.Code));
    xml_file.WriteAttribute("description", String(good.Description));
    WriteXML(xml_file, good.GetObject());
    xml_file.WriteEndElement(); 
enddo;
 
xml_file.WriteEndElement();
xml_file.WriteEndElement();
 
text_file.Write(xml_file.Close());
text_file.Close();

На этом разработка конфигурации «Торговля» была завершена.

Текст XML файла с выгрузкой

Комментарии

comments powered by Disqus
Яндекс.Метрика