Pull to refresh

Выгрузка данных из 1С и экспорт в Excel справочников и регистров сведений

Не так давно возникла казалось бы тривиальная задача. Есть «боевая» база Управление торговлей (версия конфигурации 10.1, платформы — 8.1). Создается новая компания, в которой нужно развернуть новую базу (версия конфигурации 11.2, платформы — 8.3). Чтобы облегчить нелёгкий труд сотрудницам новой компании, было принято решение скопировать часть номенклатуры (каталог товаров и их реквизитов) в новую базу.

Однако не тут-то было. Попытки использовать стандартные средства в 1С привели к неудаче. Синхронизация данных для веб-узла выдавала очень урезанные данные. И даже замечательный обработчик Выгрузка и загрузка данных в XML выдавал ошибку.

Поэтому было найдено такое решение:

  1. Выгрузка данных из «старой» базы посредством обработчика Выгрузка и загрузка данных в XML
  2. Экспорт данных в Excel
  3. Импорт в «новую» базу из Excel собственным обработчиком

Для того чтобы реализовать пункт 1, использовался обработчик отсюда (тот самый Выгрузка и загрузка данных в XML, для платформы 8.1). Для других платформ — Google в помощь.

В связи с тем, что для загрузки нужен была только справочник номенклатуры, то для обработки необходимы только такие сущности, как справочники и регистры сведений. Анализ выгруженного xml-файла (сумасшедших 280Мб для 35000 товаров) показал, что необходимые данные для обеих сущностей хранятся в «плоском» виде:

<?xml version="1.0" encoding="UTF-8"?>
<V8Exch:_1CV8DtUD xmlns:V8Exch="http://www.1c.ru/V8/1CV8DtUD/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:v8="http://v8.1c.ru/data">
	<V8Exch:Data>
		...
		<CatalogObject.Валюты>
			<Ref>1322aec9-3814-11e2-8186-00194165f605</Ref>
			<DeletionMark>false</DeletionMark>
			<Code>156</Code>
			<Description>CNY</Description>
			<НаименованиеПолное>Китайский Юань </НаименованиеПолное>
			...
		</CatalogObject.Валюты>
		...
		<InformationRegisterRecordSet.НоменклатураКонтрагентов>
			<Filter>
				<Контрагент>30a91afd-bd15-35dd-eaca-00194165f605</Контрагент>
				<Номенклатура>dccccc7c-d3a1-31e0-bec3-00194165f605</Номенклатура>
				<ХарактеристикаНоменклатуры>00000000-0000-0000-0000-000000000000</ХарактеристикаНоменклатуры>
			</Filter>
			<Records>
				<Record>
					<Контрагент>30a91afd-bd15-35dd-eaca-00194165f605</Контрагент>
					<Номенклатура>dccccc7c-d3a1-31e0-bec3-00194165f605</Номенклатура>
					<ХарактеристикаНоменклатуры>00000000-0000-0000-0000-000000000000</ХарактеристикаНоменклатуры>
					<КодНоменклатурыКонтрагента>367398</КодНоменклатурыКонтрагента>
					<АртикулНоменклатурыКонтрагента>367398</АртикулНоменклатурыКонтрагента>
					<НаименованиеНоменклатурыКонтрагента>Ёлка зеленая</НаименованиеНоменклатурыКонтрагента>
					...
				</Record>
			</Records>
		</InformationRegisterRecordSet.НоменклатураКонтрагентов>
		...
	</V8Exch:Data>
<V8Exch:_1CV8DtUD/>

Затем на Python был написан парсер, который раскладывал все сущности по отдельным Excel файлам. В результате его работы появился примерно такой набор файлов:

  • CatalogObject.Банки.xlsx
  • CatalogObject.БанковскиеСчета.xlsx
  • ...
  • InformationRegisterRecordSet.НоменклатураКонтрагентов.xlsx
  • InformationRegisterRecordSet.ЦеныНоменклатуры.xlsx

С приблизительно такими графами (столбцами)*:

  • ШтрихКодНоменклатурыКонтрагента
  • КодНоменклатурыКонтрагента
  • АртикулНоменклатурыКонтрагента
  • НаименованиеНоменклатурыКонтрагента
  • ХарактеристикаНоменклатуры
  • ЕдиницаНоменклатурыКонтрагента
  • Номенклатура
  • Контрагент

* пример приведен для файла InformationRegisterRecordSet.ЦеныНоменклатуры.xlsx

А дальше программисты 1С сказали «Отлично, вот теперь мы сами». И все стали немножко более счастливы.

Исходный код лежит на github вот здесь. Поскольку я понимаю, что большинство программистов 1С не знают Python, то там же (в релизах) лежит скомпилированный код (для x64). Если будут просьбы, то код переведу в C# и скомпилирую (уж он-то везде должен работать).

Надеюсь кому-то моя заметка сэкономит время.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.