Длинные номера при загрузке из Мой склад через Enterpise Data в БП3

У клиента при загрузке данных из Мой склад через формат Enterprise Data возникает ошибка из-за длинного номера (более 11 символов):

В принципе, «Мой склад» предупреждает об этом, если выгружать в режиме, где контролируется соответствие длины формату Enterpise Data:

В нашем случае такой номер в Мой склад у документа «Заказ клиенту», который не нужен в БП. Он тянется при загрузке реализации и загружается в 1С в «Счет покупателю», но отключить загрузку заказа клиенту, к сожалению, нельзя.

Изменять номера документов в «Мой склад» признано невозможным, т.к. прошел большой период и документов много. Поэтому решено обрезать номера документов при загрузке в 1С.

Для тестирования использую демо-базу 1С БП3, нужные организации будут созданы сами из файла.

Буду дорабатывать расширение, которое применял уже ранее для проведения документов при загрузке из «Мой склад».

Для отладки буду использовать «РежимОтладки«, чтобы загрузка велась не в фоновом задании.

По ошибке сразу же находим, что исключение вызывается вот в этой строке, т.к. значение обрезается:

Попробуем обмануть проверку, подсунем ей обработанный номер, модуль МенеджерОбменаЧерезУниверсальныйФормат13:


&Вместо("ПроверитьКлючевыеПоляНаНекорретныеЗначения")
Процедура ппзED_ПроверитьКлючевыеПоляНаНекорретныеЗначения(ПолученныеДанные, ДанныеXDTO, ПроверяемыеПоля)
	Если 
		ТипЗнч(ДанныеXDTO) = Тип("Структура") 
		И ДанныеXDTO.Свойство("КлючевыеСвойства")
		И ТипЗнч(ДанныеXDTO.КлючевыеСвойства) = Тип("Структура") 
		И ДанныеXDTO.КлючевыеСвойства.Свойство("Номер")
		И СтрДлина(ДанныеXDTO.КлючевыеСвойства.Номер) > 11 Тогда
		ИсхНомер = ДанныеXDTO.КлючевыеСвойства.Номер;
		РезНомер = ИсхНомер;
		НаСколькоОбрезать = СтрДлина(РезНомер) - 11; //На сколько обрезать
		Поз = Найти(РезНомер, "_");
		Если Поз = 0 Тогда
			Поз = Найти(РезНомер, "-");
		КонецЕсли;
		Если Поз <> 0 Тогда //Если есть дефис
			Лев = Лев(РезНомер, Макс(Поз - 1 - НаСколькоОбрезать, 0));
			Прав = Сред(РезНомер, Поз);
			РезНомер = Лев + Прав;
		КонецЕсли;
		Если СтрДлина(РезНомер) > 11 Тогда
			РезНомер = Прав(РезНомер, 11); //Обрезаем справа до 11
		КонецЕсли;
		//Выравниваем
		ДанныеXDTO.КлючевыеСвойства.Номер = РезНомер;
		//Реквизит не всегда может называться номер, возможно
		Попытка
			ПолученныеДанные.Номер = РезНомер;
		Исключение
		КонецПопытки;
		Сообщить("Номер документа: " + ПолученныеДанные + " изменен с: " + ИсхНомер + " на: " + РезНомер)
	КонецЕсли;
	
	ПродолжитьВызов(ПолученныеДанные, ДанныеXDTO, ПроверяемыеПоля);
КонецПроцедуры

Не люблю, когда код работает без информирования пользователя, втихую. Поэтому в коде выдаю сообщения пользователю. Выглядит это так:

fixin

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

Читайте также:

комментария 2

  1. Павел:

    Что-то непонятное.
    От тебя требовалось разложить номер по разделителю на две части и убрать ведущие нули — в левой части справа, в правой части номера — слева. Потом сложить. А что получилось? Ну и попытка тут зачем (причем без сообщения) — чтобы если реквизит изменится опять искать все заново почему не работает?

    • на самом деле клиенту было главное чтобы загрузилось, на заказы клиента (счета на оплату в БП) он вообще не смотрел бы.
      Но я посчитал что Credit_12345 лучше сократить до Credi_12345, т.е. обрезать хвост первого слова (до разделителя тире или подчеркивания)

Добавить комментарий для fixin Отменить ответ

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