Молочников Олег Spb. 2012.
Заметки о конвертации данных
Сразу замечу, конвертация данных – не мой конек. Но вот текущий проект находится на стадии интеграции с бухгалтерией, и я столкнулся с огромным ворохом проблем, которые не мешало бы обсудить с коллегами. Я надеюсь, что эти заметки помогут не только мне.
Начну с самых больших граблей, на которые я наступил – я скопировал исходные правила для обмена УПП->УПП, приспособил их под себя и оставил первичную синхронизацию для документов и справочников по внутреннему идентификатору (В начале поиск объекта производится по внутреннему идентификатору (ВИ) и лишь при отсутствии объекта с таким ВИ, производится поиск по указанным реквизитам синхронизации (код, это группа и т.д.).
Это привело к катастрофе, которую обнаружили не сразу, что лишь усилило разрушительный результат. Оказывается ВИ не настолько уникальны, как описывает 1С. В бухгалтерской базе, в которой работа до этого велась несколько лет, это привело к перезаписи некоторых старых документов и справочников. При запрете синхронизации по внутреннему идентификатору проблема вроде бы исчезла, но доказать это может только время.
Несколько хитростей, которые я применил. В УПП ведется по ролевой учет, где каждый ролик это серия номенклатуры с добавленными реквизитами (вес, метраж, площадь, тех. инф., исходные рулоны). Естественно, выгружать документы из сотен позиций в бухгалтерию смысла нет. Выгружаются только данные о весе в килограммах, строки сворачиваются до структуры: Номенклатура, ширина, вес (как количество).
Для этого перед обработкой табличной части товары удобно вставлять код наподобие вот этого:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВложенныйЗапрос.Номенклатура,
| ВложенныйЗапрос.Количество,
| ВложенныйЗапрос.СуммаНДС,
| ВложенныйЗапрос.Сумма,
| ВложенныйЗапрос.СтавкаНДС,
| ВложенныйЗапрос.СерияНоменклатурыНомерГТД КАК НомерГТД,
| ВложенныйЗапрос.СерияНоменклатурыСтранаПроисхождения КАК СтранаПроисхождения,
| ВЫБОР
| КОГДА ВложенныйЗапрос.Количество > 0
| ТОГДА ВложенныйЗапрос.Сумма / ВложенныйЗапрос.Количество
| ИНАЧЕ 0
| КОНЕЦ КАК Цена,
| &ЕдПоКлассификатору КАК ЕдПоКлассификатору,
| ВложенныйЗапрос.Ширина
|ИЗ
| (ВЫБРАТЬ
| РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
| СУММА(ВЫБОР
| КОГДА РеализацияТоваровУслугТовары.СерияНоменклатуры = ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)
| ТОГДА РеализацияТоваровУслугТовары.Количество
| ИНАЧЕ РеализацияТоваровУслугТовары.Количество * РеализацияТоваровУслугТовары.СерияНоменклатуры.Вес
| КОНЕЦ) КАК Количество,
| СУММА(РеализацияТоваровУслугТовары.СуммаНДС) КАК СуммаНДС,
| СУММА(РеализацияТоваровУслугТовары.Сумма) КАК Сумма,
| РеализацияТоваровУслугТовары.СтавкаНДС КАК СтавкаНДС,
| РеализацияТоваровУслугТовары.СерияНоменклатуры.НомерГТД КАК СерияНоменклатурыНомерГТД,
| РеализацияТоваровУслугТовары.СерияНоменклатуры.СтранаПроисхождения КАК СерияНоменклатурыСтранаПроисхождения,
| РеализацияТоваровУслугТовары.ХарактеристикаНоменклатуры.ШиринаВтулки.Наименование КАК Ширина
| ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
| ГДЕ
| РеализацияТоваровУслугТовары.Ссылка = &Ссылка
|
| СГРУППИРОВАТЬ ПО
| РеализацияТоваровУслугТовары.Номенклатура,
| РеализацияТоваровУслугТовары.СтавкаНДС,
| РеализацияТоваровУслугТовары.СерияНоменклатуры.НомерГТД,
| РеализацияТоваровУслугТовары.СерияНоменклатуры.СтранаПроисхождения,
| РеализацияТоваровУслугТовары.ХарактеристикаНоменклатуры.ШиринаВтулки.Наименование
| ) КАК ВложенныйЗапрос";
Запрос.УстановитьПараметр("Ссылка", Источник.Ссылка);
Запрос.УстановитьПараметр("ЕдПоКлассификатору", Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("кг"));
КоллекцияОбъектов= Запрос.Выполнить().Выгрузить();
В УПП ведется учет по номенклатуре и характеристике (ширине рулона).
В бухгалтерии нет возможности использовать характеристики номенклатуры.
Для каждой комбинации номенклатуры и ширины создается отдельный элемент номенклатуры с кодом номенклатуры, состоящим из кода номенклатуры и ширины рулона. Для этого:
1. Перед выгрузкой номенклатуры:
ИсходящиеДанные= Новый Структура;
ИсходящиеДанные.Вставить("Ширина",ОбъектКоллекции.Ширина);
Перед выгрузкой реквизита “Код” справочника Номенклатура:
ШиринаРулона = "0000";
Если ВходящиеДанные <> Неопределено и ВходящиеДанные.Свойство("Ширина") тогда
ВходящиеДанные.Свойство("Ширина",ШиринаРулона);
Если ШиринаРулона <> "" Тогда
ШиринаРулона = СтрЗаменить(СокрЛП(ШиринаРулона)," ","");
ШиринаРулона = СтрЗаменить(СокрЛП(ШиринаРулона)," ","");
ШиринаРулона = Прав(ШиринаРулона,4);
ДлинаШР = СтрДлина(ШиринаРулона);
ШиринаРулона = Формат(0, "ЧЦ="+(4-ДлинаШР)+"; ЧН=; ЧВН=; ЧГ=")+ШиринаРулона;
КонецЕсли;
КонецЕсли;
КодРулона = Прав(СокрЛП(Источник.Код),6);
ДлинаКода = СтрДлина(КодРулона);
КодРулона = Формат(0, "ЧЦ="+(6-ДлинаКода)+"; ЧН=; ЧВН=; ЧГ=")+КодРулона;
Значение = СокрЛП("u"+КодРулона+ШиринаРулона);
3. При выгрузке реквизита “Наименование” справочника Номенклатура:
ШиринаРулона = "0000";
Если ВходящиеДанные <> Неопределено и ВходящиеДанные.Свойство("Ширина") тогда
ВходящиеДанные.Свойство("Ширина",ШиринаРулона);
Если ШиринаРулона <> "" Тогда
ШиринаРулона = СтрЗаменить(СокрЛП(ШиринаРулона)," ","");
ШиринаРулона = СтрЗаменить(СокрЛП(ШиринаРулона)," ","");
ШиринаРулона = Прав(ШиринаРулона,4);
ДлинаШР = СтрДлина(ШиринаРулона);
ШиринаРулона = Формат(0, "ЧЦ="+(4-ДлинаШР)+"; ЧН=; ЧВН=; ЧГ=")+ШиринаРулона;
КонецЕсли;
КонецЕсли;
КодРулона = Прав(СокрЛП(Источник.Код),6);
ДлинаКода = СтрДлина(КодРулона);
КодРулона = Формат(0, "ЧЦ="+(6-ДлинаКода)+"; ЧН=; ЧВН=; ЧГ=")+КодРулона;
Значение = СокрЛП("u"+КодРулона+ШиринаРулона);
Я хотел бы создать группу, посвященную конвертации данных, где можно поделиться своими решениями и обсудить возникающие проблемы.
Также, если народу будет интересно, я хотел бы написать продолжение посвященное следующим темам: организация автоматического обмена, использование планов обмена, учет давальческого сырья и выгрузка данных в бухгалтерию.
PS: Надеюсь вам понравится эта и другие мои статьи и разработки на //infostart.ru/profile/48714/.
Очень жду ваших комментариев и пожеланий.
Молочников Олег Spb. 2012.