Как я на 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();
На этом разработка конфигурации «Торговля» была завершена.
