Не так давно возникла казалось бы тривиальная задача. Есть «боевая» база Управление торговлей (версия конфигурации 10.1, платформы — 8.1). Создается новая компания, в которой нужно развернуть новую базу (версия конфигурации 11.2, платформы — 8.3). Чтобы облегчить нелёгкий труд сотрудницам новой компании, было принято решение скопировать часть номенклатуры (каталог товаров и их реквизитов) в новую базу.
Однако не тут-то было. Попытки использовать стандартные средства в 1С привели к неудаче. Синхронизация данных для веб-узла выдавала очень урезанные данные. И даже замечательный обработчик Выгрузка и загрузка данных в XML выдавал ошибку.
Поэтому было найдено такое решение:
Для того чтобы реализовать пункт 1, использовался обработчик отсюда (тот самый Выгрузка и загрузка данных в XML, для платформы 8.1). Для других платформ — Google в помощь.
В связи с тем, что для загрузки нужен была только справочник номенклатуры, то для обработки необходимы только такие сущности, как справочники и регистры сведений. Анализ выгруженного xml-файла (сумасшедших 280Мб для 35000 товаров) показал, что необходимые данные для обеих сущностей хранятся в «плоском» виде:
Затем на Python был написан парсер, который раскладывал все сущности по отдельным Excel файлам. В результате его работы появился примерно такой набор файлов:
С приблизительно такими графами (столбцами)*:
* пример приведен для файла InformationRegisterRecordSet.ЦеныНоменклатуры.xlsx
А дальше программисты 1С сказали «Отлично, вот теперь мы сами». И все стали немножко более счастливы.
Исходный код лежит на github вот здесь. Поскольку я понимаю, что большинство программистов 1С не знают Python, то там же (в релизах) лежит скомпилированный код (для x64). Если будут просьбы, то код переведу в C# и скомпилирую (уж он-то везде должен работать).
Надеюсь кому-то моя заметка сэкономит время.
Однако не тут-то было. Попытки использовать стандартные средства в 1С привели к неудаче. Синхронизация данных для веб-узла выдавала очень урезанные данные. И даже замечательный обработчик Выгрузка и загрузка данных в XML выдавал ошибку.
Поэтому было найдено такое решение:
- Выгрузка данных из «старой» базы посредством обработчика Выгрузка и загрузка данных в XML
- Экспорт данных в Excel
- Импорт в «новую» базу из 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# и скомпилирую (уж он-то везде должен работать).
Надеюсь кому-то моя заметка сэкономит время.