Молочников Олег 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.
(0) >>> Я хотел бы создать группу, посвященную конвертации данных,
Всё уже украдено до вас (с)
Конвертация данных
http://infostart.ru/community/groups/51/
Предложение о создании раздела
http://forum.infostart.ru/forum17/topic54364/
Вопрос 1: на фига из УПП перегружать данные в БП, если в УПП и так есть бухучет?
Сильно подозреваю, что был ничем не мотивированный ответ бухов «хотим, чтобы и там».
Если разговор идет о «белой» базе, то
Вопрос 2: зачем клонировать строки номенклатуры с учетом ширины рулонов? Бухгалтерия в данном случае является чисто СУММОВОЙ программой, той же налоговой глубоко фиолетово какой ШИРИНЫ продавались рулоны, им важен СУММОВОЙ результат!
И у меня была подобная ситуация при переносе данных из УТ с очень сильно развитым учетом по характеристикам и свойствам. Быстро объяснил понятно и доходчиво бухам, что они маются фигней и вполне обойдутся в номенклатуре только наименованиями. Главное, чтобы во всех доках СУММЫ верные стояли.
(3)1. УПП очень сильно переделан для учета рулонов. Вести бухгалтерию в УПП — это значит бесконечно обновлять не типовую программу с огромным количеством дописок. Труд адский и некому не нужный, к тому же требующий сильных программистов. А я собираюсь закончить этот проект и уйти на следующий.
2. Что делать, если позиции с разной шириной могут иметь разные цены за кг в одном документе поступления? Они должны иметь разные цены списания, они должны быть визуально различимы в печатных формах. (Может возникнуть ситуация когда печатные формы нужно распечатать из бухгалтерии, например когда печатная форма счета-фактуры уже обновлена в бухгалтерии, а в УПП еще не успели 🙂
3.Есть некоторая специфика учета, которую легко реализовать именно в выгрузке, например автоматически формируя пакеты документов из одного.
(1) Группа есть, жизни в ней нет…
У меня еще круче бухгалтеры хотят. Им не нужны в БП не только характеристики товара, но и однотипный товар и с одинаковой ценой тоже хотят видеть в документах БП в виде одной строчки.
Я сделал обработку которая компрессирует товар по названию и цене в накладной, и записывает такой список во внутреннюю таблицу документа.
А вот как подменить в плане обмена с бухгалтерией основную таблицу с товаром на мою внутреннюю не могу сообразить.
Может кто подскажет или это можно как-то по другому решить? Типа вообще на лету сжимать таблицу документа?
(6) Ты смеешься? Я же только что написал об этом. Перед обработкой табличной части товары вставляется код запроса по табличной части, который и сжимает табличную часть.Даже пример привел.
Да, извини не въехал сразу то что прочитал.
(5) Думаешь, в твоей будет? Создавай.
(0) Главное потом эту конвертацию обновлять когда в бухне опять поменяют название перечисления или добавят вид движения… тут программист нужен не менее сильный чем на обновление типовой. Главное сразу оговори что обмен для этой КОНКРЕТНОЙ версии а то бывают прецеденты.
(11) Ты прав,но трудоемкость обновления управленческой базы в сотни раз больше и обовлять ее всякий раз, как в бухгалтерии поменяют печаную форму…
Хорошая статья. Хотелось бы, чтобы Вы осветили Правила регистрации объектов (ПРО) в конвертации данных и их использование совместно с планами обмена.
(4) вот здесь можно с Вами согласиться,действительно оч.многие и оч. сильно «ломают» УПП и встают в тупик( хотя тож самое и про БУХ можно сказать), но сама идея «гнать» цифры из УПП в БУХ- это что-то,надеюсь моим бухам эта затея не придет в голову( или предложить?).
(12) плохой сайт, коллеги. это мое мнение и только мое.
полгода назад зашел я на этот сайт, ничего нормального скачать нельзя, сплошь реклама… автор 1С-ников за кого держит? в итоге по крупицам собрал информацию с диска ИТС, со статей ИС, методичку какую-то скачал с 1С-ПРО…
(14) да уж, засада… чего только не приходится выдумывать…
(5) и в вновь созданной группе жизни не будет… а вот иногда писать статьи по теме полезно для сообщества. и за это отдельное спасибо всем и каждому автору.
и как идея — во вновь созданной группе можно накапливать ссылки на полезные и проверенные временем статьи и обсуждения.
Подскажите, как в обмене между Бух и УТ запретить передачу определенных документов?
(18) Операции->Справочники->Настройки обмена данными. На закладке «Обмен по правилам» выбираем сответсвующий тип документа и меняем настройку выгрузки с «выгружать» на «по ссылке». Если документ продолжает выгружаться по ссылкам из других документов, то на закладке «основные» выгружаем правила обмена, меняем их в конвертации данных, загружаем опять.
(19) забыл уточнить. Обмен между Бух2.0 и УТ11. Таких настроек не нашел ни в бухе не УТ11.
(19)
меняем правила конвертации? А Правила регистрации не помогут в этом деле?
(20) Уточняю Операции->Справочники->Настройки обмена данными
(22) это все относится к обмену с УТ10. Потому как с УТ11 свои настройки «Обмен данными с продуктами на платформе 1С8.2» Обмен у меня уже настроен и работает. А в «Операции->Справочники->Настройки обмена данными» план обмена с УТ11 вообще не попадает.
(23) Ты прав,извини, я забыл про особенности УТ11. Не настраивал в ней обмен еще.
(24) А там в настройках и выбора никого нет кроме «Организации», но есть доступ к правилам конвертации и регистраций. Вот только не пойму как через эти правила настроить чтобы документы или справочники шли только в одну сторону. Мне допустим совсем не хочется видеть в бухгалтерии все многообразие номенклатуры из УТ. А обмен упорно пытается за синхронизировать все справочники.
(25) Jon2011, Можно правила обмена поправить. Просто отключить правило выгрузки справочника «Номенклатура». И время от времени очищать регистрацию по номенклатуре, чтоб глаза не мозолило.
Занимательно. У меня в связи со статьёй вопрос. Вы пишете: «Это привело к катастрофе, которую обнаружили не сразу, что лишь усилило разрушительный результат. Оказывается ВИ не настолько уникальны, как описывает 1С….» Имеется ли тут в виду механизм уникальных идентификаторов (получаемый как СсылкаНаОбъект.УникальныйИдентификатор();) или речь о чём-то другом?
У меня сейчас стоит задача настройки регулярного обмена данных. Я собирался привязываться как раз к этим GUID’ам..
(27)
GUID уникален по определению.
А у автора одна из баз скорее всего является частичной копией другой. Вот и повторения.
(27)(28) Нет. Обмен был между УПП и бухгалтерией. И когда через несколько недель стали появляться документы с перезаписанными контрагентами или договорами, принадлежащими другим контрагентам, для меня это был шок. Я до сих пор пытаюсь разобраться в механике произошедшего.
(26)В правилах конвертации конечно можно рубануть выгрузку. А как очищать регистрацию? Может как раз в «Правилах регистрации данных» надо что-то подправить? Совершенно не врубаюсь как эти правила работают.
Ликбез что нада
(29)
А механика в этом случае очень простая, сначала ищет по GUID, не находит
далее ищет по номеру и дате, но какая гарантия, что в бухгалтерии уже не создан документ с таким
номером и датой (ручками бухгалтером), вот и затирает такие документы. В вашем случае поиск только по
GUID без каких либо реквизитов.
Вы не правы. Здесь что-то более сложное. Менялся номер контрагента, который был в базе под другим номером. Полное впечатление, что совпали именно уникальные идентификаторы, чего вроде тоже не может быть.
(33) Посмотрите в регистре сведений «Соответствие объектов информационных баз»: в нём как раз и могут быть пары GUID-ов, испортивших Вам настроение. Ну и обработки обработка типа «НайтиОбъектПоUUID.epf» и метод НашОбъект.УникальныйИдентификатор() тоже пригодятся.