Выгрузка из ТиС 7.7 в Enterprise Data купленной обработкой

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

Клиент купил обработку на Инфостарте, я стал тестировать.

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

Посмотрел отладчиком, проблема в открытии модальной формы:

Честно говоря, я уже забыл 7.7 и даже не подозреваю, какой отчет тут пытается открыться.

Поддержка объяснила, что:

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

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

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

Скопировал из справочника Контрагенты в справочник Номенклатура реквизит Идентификатор и переименовал его в ИдентификаторОбмена.

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

При загрузке в БП получил ошибку ИНН, что максимальная длина — 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, чтобы видеть данные в читаемом виде.

Написал разработчику, чтобы:

  1. Предупреждать, что не выбрана обработка конвертации объектов, чтобы была понятна причина ошибки «Не выбран вид».
  2. Предусмотреть возможность отключать выгрузку пользователя и ответственного для выгрузки во Fresh.
  3. Учитывать запись ИНН и КПП через бэк-слеш.
  4. Возможность отключать КПП контрагентов, т.е. выгрузки только ИНН у контрагентов (не организации).

Объем: 2 час.

image_pdfimage_print

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Вам может также понравиться...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *