Выгрузка из ТиС 7.7 в Enterprise Data купленной обработкой
Попробовал выгрузку из ТиС 7.7 релиз 9.2 (7.70.1006) в БП3 через Enterpise Data. Вообще идея здравая, ведь так решается большинство проблем. В ТиС есть выгрузка счет-фактур, но в устаревший формат CommerceML.
Клиент купил обработку на Инфостарте, я стал тестировать.

Увы, фокус не удался, при выгрузке счет-фактур по нажатию кнопки Выполнить выдавало ошибку «Неверно указан вид.«.
Посмотрел отладчиком, проблема в открытии модальной формы:

Честно говоря, я уже забыл 7.7 и даже не подозреваю, какой отчет тут пытается открыться.
Поддержка объяснила, что:
- Нужно в первом поле указывать имя обработки выгрузки объекта «ВыгрузкаПоСхеме8.1.6_infostart.ert»
- Выгружать нужно не счет-фактуры выданные, а реализации.

После этого возникла ошибка

Однако возникла еще одна маленькая проблемка — в справочнике Номенклатура не было реквизита ИдентификаторОбмена:

Скопировал из справочника Контрагенты в справочник Номенклатура реквизит Идентификатор и переименовал его в ИдентификаторОбмена.
После этого файл сформировался. Файл формируется в одну строку, поэтому когда я его открыл, сперва подумал, что ничего не выгрузилось. Но нет, данные выгрузились:

При загрузке в БП получил ошибку ИНН, что максимальная длина — 12 символов. Оказалось, у клиента в базе ТИС ИНН от КПП отделялась не слешем, а бэк-слешем, пришлось доработать процедуры получения ИНН и КПП:
Функция ПолучитьИНН(ИННКПП) Если Найти(ИННКПП, "/") <> 0 Тогда // найден разделитель Возврат Лев(ИННКПП, Найти(ИННКПП, "/") - 1); ИначеЕсли Найти(ИННКПП, "\") <> 0 Тогда // найден разделитель Возврат Лев(ИННКПП, Найти(ИННКПП, "\") - 1); Иначе Возврат СокрЛП(ИННКПП); КонецЕсли; КонецФункции
Функция ПолучитьКПП(ИННКПП) Если Найти(ИННКПП, "/") <> 0 Тогда // найден разделитель Возврат Сред(ИННКПП, Найти(ИННКПП, "/") + 1); ИначеЕсли Найти(ИННКПП, "\") <> 0 Тогда // найден разделитель Возврат Сред(ИННКПП, Найти(ИННКПП, "\") + 1); Иначе Возврат ""; КонецЕсли; КонецФункции
В демо-базу все загрузилось успешно, но при загрузке в облачную базу на Fresh получил вполне понятную ошибку:

Пришлось отключить выгрузку ответственного:
// ДобавитьЭлемент_Пользователь(Эл, Пользователь) Процедура ДобавитьЭлемент_Пользователь(Эл, Пользователь) Возврат; //Осипов 25.11.28 - пользователя во Fresh нельзя выгружать Если ПустоеЗначение(Пользователь) = 1 Тогда Возврат КонецЕсли; Ид=ПолучитьУникальныйИдентификатор(Пользователь); Если СписокИд.Принадлежит(Ид)=0 Тогда //Если ПустоеЗначение(XMLBody.ВыбратьУзел("//Справочник.Пользователи/КлючевыеСвойства[Ссылка="""+ПолучитьУникальныйИдентификатор(Пользователь)+"""]"))=1 Тогда ЭлСпр = XMLДокумент.СоздатьУзел("element","Справочник.Пользователи","http://v8.1c.ru/edi/edi_stnd/EnterpriseData/"+ВерсияОбмена); ЭлСпрКлючевыеСвойства=СоздатьПодчиненныйЭлемент(ЭлСпр, "КлючевыеСвойства"); УстановитьСвойства_Пользователя(ЭлСпрКлючевыеСвойства, Пользователь, Ид); XMLBody.ДобавитьПодчиненный(ЭлСпр); СписокИд.ДобавитьЗначение(Ид); КонецЕсли; УстановитьСвойства_Пользователя(Эл, Пользователь, Ид); КонецПроцедуры // ДобавитьЭлемент_Пользователь()
Но все равно загрузка выдавала ошибку:

Проблема оказалась в пустых тегах Ответственный:

Для тестовой загрузки я их заменил на пустую строку в выгрузке.
Но для постоянного обмена пришлось поправить код, чтобы ответственный не выгружался. Чтобы не править в каждом вызове, добавил в функцию СоздатьПодчиненныйЭлемент:
Функция СоздатьПодчиненныйЭлемент(ЭлВладелец, ИмяТега, Значение="", ФлЕслиПустоеНеДобавлять=0) Если ИмяТега = "Ответственный" Тогда //25.11.28 Осипов - во Fresh нельзя выгружать ответственного Возврат 0; КонецЕсли; Если (ФлЕслиПустоеНеДобавлять = 1) И (ПустоеЗначение(Значение) = 1) Тогда Возврат "" КонецЕсли; ЭлВозврата = ЭлВладелец.СоздатьПодчиненныйЭлемент(ИмяТега); Если Значение <> "" Тогда ЭлВозврата.Значение = СокрЛП(Значение); КонецЕсли; Возврат ЭлВозврата; КонецФункции
После загрузки интересовал вопрос, не будут ли дублироваться организация и контрагенты. Организация не задублировалась, но контрагенты некоторые задублировались. Проверка показала, что у них отличаются КПП, клиент попросил делать выгрузку без КПП. Сделал:
Функция ПолучитьКПП(ИННКПП) Возврат ""; //Осипов 25.11.28 у клиента учет без КПП Если Найти(ИННКПП, "/") <> 0 Тогда // найден разделитель Возврат Сред(ИННКПП, Найти(ИННКПП, "/") + 1); ИначеЕсли Найти(ИННКПП, "\") <> 0 Тогда // найден разделитель Возврат Сред(ИННКПП, Найти(ИННКПП, "\") + 1); Иначе Возврат ""; КонецЕсли; КонецФункции
Если в файле есть только ИНН, то контрагенты не дублируются, но дублируется организация.
Пришлось сделать еще одну итерацию. Организацию выгружаю с ИНН и КПП, контрагентов только с ИНН, для этого написал отдельную функцию для выгрузки КПП контрагента, которая выгружает пустую строку:
Процедура УстановитьСвойства_Контрагента(Эл, Контрагент, Ид) СоздатьПодчиненныйЭлемент(Эл, "Ссылка",Ид,1); СоздатьПодчиненныйЭлемент(Эл, "Наименование",СокрЛП(Контрагент.ЮрФизЛицо.Наименование),1); СоздатьПодчиненныйЭлемент(Эл, "НаименованиеПолное",СокрЛП(Контрагент.ЮрФизЛицо.ПолнНаименование),1); ТекИНН = ПолучитьИНН(Контрагент.ЮрФизЛицо.ИНН); СоздатьПодчиненныйЭлемент(Эл, "ИНН",ТекИНН,1); СоздатьПодчиненныйЭлемент(Эл, "КПП",ПолучитьКППКонтрагента(Контрагент.ЮрФизЛицо.ИНН),1); СоздатьПодчиненныйЭлемент(Эл, "ЮридическоеФизическоеЛицо",?(СтрДлина(ТекИНН)=12,"ФизическоеЛицо","ЮридическоеЛицо"),1); КонецПроцедуры
При загрузке все прошло хорошо, но возник один нюанс — при загрузке обновлялись наименования контрагентов, а они в 77 были записаны не так, как в 1С8. Тут думаю или заставить в 77 переименовать контрагентов или написать расширение, которое блокирует изменение справочников при загрузке в БП3.
Замечания:
Тестировал, кстати, на копии базы, что облегчило работу — после неудачной загрузки просто опять копировал тестовую базу из рабочей.
Файлы смотрел в Notepad++, используя плагин Pretty Print для XML, чтобы видеть данные в читаемом виде.
Написал разработчику, чтобы:
- Предупреждать, что не выбрана обработка конвертации объектов, чтобы была понятна причина ошибки «Не выбран вид».
- Предусмотреть возможность отключать выгрузку пользователя и ответственного для выгрузки во Fresh.
- Учитывать запись ИНН и КПП через бэк-слеш.
- Возможность отключать КПП контрагентов, т.е. выгрузки только ИНН у контрагентов (не организации).
Объем: 2 час.



Свежие комментарии