Рефакторинг и реинжиниринг в повседневной практике

Публикация № 1679419 20.06.22

Разработка - Рефакторинг и качество кода

рефакторинг HTTP rest soap интеграция поставщик оптимизация унификация код асинхронный запрос WS-ссылка метод прокси параметры дерево XML

В этой статье будут затронуты многие темы. Использование WS ссылок, HTTP запросов, асинхронных запросов к внешним сервисам, работа с XML, методики интеграции. Но лишь попутно. Для наглядности. На технических вопросах реализации останавливаться не буду. Все примеры работы с этими объектами есть в коде. Файлы обработки и расширения доступны. Главная цель - рассмотреть рефакторинг и реинжиниринг как инструменты для достижения вполне конкретных практических целей.

Согласно классическому определению рефакторинг это упрощение кода без изменения функциональности. Реинжиниринг же, как раз, предполагает изменение функциональности. Как правило серьезный реинжиниринг требует предварительно серьезного рефакторинга. На практике же эти два процесса часто сливаются в один. Изменение функциональности может не затрагивать внешнего поведения программы. Зато может сильно повлиять на ее способность к развитию и адаптации.

Конечно, с красивым кодом работать куда приятнее, чем с не красивым. Но за всю свою долгую практику рефакторинг ради рефакторинга не встречал ни разу. Поводом всегда служил предстоящий реинжиниринг. А за последним всегда стояла очень конкретная цель. 

К сожалению, заказы на рефакторинг чужого кода поступают довольно редко. Поэтому я хочу поговорить о другом. О постоянном и ежедневном рефакторинге собственного кода. Опыт говорит о том, что хороший код можно получить только с десятого раза. Первые девять попыток идут в корзину. Похоже, это касается всех. Лев Толстой, говорят, тоже переписывал свои тексты по многу раз. Конечно это требует определенной легкости в пальцах. Но это уже вопрос тренировок.

Эстетические соображения здесь не при чем. Я буду говорить о своем опыте. Расскажу, как писался код. О том есть ли в этом самоистязании ощутимая практическая польза или нет - пусть судит читатель. Ссылка на файлы с результатом дана в конце статьи.

Однако, к делу. Задача заключалась в интеграции информационной системы с системами поставщиков электронной техники, используя их API. Одна из составных частей задачи - получение и размещение в базе информации о каталогах поставщиков. Загрузка каталогов, в свою очередь, состоит из двух подзадач. Получение информации и укладка ее в наши справочники и регистры. Как правило, в исходном варианте кода, который застаешь, прибыв на место действия, эти подзадачи решаются вместе. Как говорится, в одном флаконе. Хотя, очевидно, что задача укладки решается одинаково для всех поставщиков, а задача получения данных специфична для каждого из них.

Итак, первым делом разделяем их. Получаем данные от разных контрагентов и помещаем их в унифицированное хранилище. Затем укладываем в нашу базу одинаковым образом. 

Еще немного сузим поле битвы. Укладку оставим за бортом. С ней все ясно и для каждой базы данных она имеет свои особенности. Займемся более интересным и полезным. Получением разнородной информации существенно разными способами и приведением ее к единому формату. 

Примерно, вот к такому:

 

Материал, в нашем случае, подобрался хороший и показательный. Два поставщика предоставили WSDL описание с моделью данных. Третий дал описание, но без модели и возвращает в ответе на запрос не объект XDTO, а строку XML. Четвертый вообще предлагает делать HTTP запросы. Двое отдают каталог по одному запросу, остальные двое дают информацию о товарах только в разрезе групп. Один поставщик экономит трафик и отвечает только на асинхронные запросы.

Отсутствие общепринятых стандартов при создании API сильно подвигает к индивидуальной работе с каждым поставщиком. К сожалению, вижу результат этого на практике часто.  Соблазн пойти по этому пути всегда есть. Однако, наступил себе на горло и занялся объединением этого зоопарка и выделением общих черт у жирафа и антилопы.

Цель перед собой ставил вполне конкретную. За счет унификации методики обеспечить существенный выигрыш во времени разработки уже на третьей-четвертой интеграции. Т.е. все достаточно меркантильно. Никакой эстетики. Хотелось добиться того, чтобы новый поставщик интегрировался легко и бездумно. Чтобы из описания просто переносился состав полей ответа, вызов методов и их параметры.

На первые две интеграции ушло три дня. Пришлось много раз перерабатывать код. Первые варианты вызывали только нервный смех, так далеки они были от поставленной цели. Поэтому рассказывать о них не буду. Уже третья интеграция заняла значительно меньше времени. Четвертая, наконец, получилась так как задумано. Быстро, бездумно и без напряжения. Лягушка взбила масло.

Теперь посмотрим, что получилось и стоила ли игра свеч.

Были отработаны две методики: 

Первая - Товары (весь каталог со ссылками на группы) получается отдельно и группы отдельно.

Вторая - товары запрашиваются в разрезе предварительно полученных групп.

Ниже приведен код главной вызываемой функции. Сначала делается попытка получить весь каталог. В этом случае группы запрашиваются независимо. Для этой методики асинхронная работа не предусмотрена, т.к. те, кто экономят - весь каталог запрашивать обычно не дают. Если с первой попытки товары получить не удалось, то запрашиваются группы и делается попытка получить данные в разрезе каждой группы. Здесь уже предусмотрено использование асинхронных запросов. В этом случае, сначала делаются запросы по всем группам. Затем также по всем группам собираются ответы. С точки зрения функций, которые получают ответы, нет большой разницы между получением ответа на синхронный запрос и получением ответа по идентификатору - результату асинхронного запроса. В целом, идея не моя и не новая, однако такой подход позволил кардинально сократить время на получение данных. После нескольких попыток ответы на асинхронные запросы начинают получаться от сервера поставщика практически без ожидания.

В итоге, функция выглядит так:

// Это главная вызываемая функция. Возвращает структуру, состоящую из унифицированной таблицы товаров и унифицированной таблицы или дерева групп (в случаях фиксированной или произвольной вложенности).
// В ней реализованы две главные методики получения данных. Первая - Товары (весь каталог со ссылками на группы) отдельно и группы отдельно. Вторая - товары запрашиваются в разрезе групп.
// Сначала делается попытка получить весь каталог (если раздел поставщика есть в функции СписокПолныеДанныеПоставщика). В этом случае группы запрашиваются независимо.
// Для этой методики асинхронная работа не предусмотрена.
// Затем (если товары так получить не удалось) запрашиваются группы и делается попытка получить данные в разрезе каждой группы. 
// Соответствующие функции отрабатывают в случае если в них есть раздел данного поставщика. Затем таблицы с разными видами данных сворачиваются (СвернутаяТаблицаДанныхПоставщика) и уходят на выход. 
// Для этой методики есть нюанс в случае использования асинхронных запросов. 
// Перед циклом получения данных по идентификаторам ответов в разрезе групп при необходимостие делаются асинхронные запросы (ИдентификаторыАсинхронныхЗапросов).
Функция ОбновитьДанныеПоставщика(ИмяПоставщика, Пользователь, Пароль) Экспорт
	
	Ответ = Неопределено; 
	
	Попытка
		
		ПараметрыПоставщика = ПараметрыПоставщика(ИмяПоставщика, Пользователь, Пароль);		
		ТаблицаДанныхПоставщика = НоваяТаблицаДанныхПоставщика();
		
		СписокПолный = СписокПолныеДанныеПоставщика(ИмяПоставщика, ПараметрыПоставщика);
		ПоместитьВТаблицуДанных(ИмяПоставщика, СписокПолный, "Товары", ТаблицаДанныхПоставщика);
		
		Если ТаблицаДанныхПоставщика.Количество() > 0 Тогда
			ТаблицаГрупп = НовоеДеревоГрупп();
			ТаблицаГрупп = ГруппыПоставщика(СписокГруппПоставщика(ИмяПоставщика, ПараметрыПоставщика), СтруктураПолейГруппы(ИмяПоставщика), ТаблицаГрупп.Строки);
		Иначе 
			
			ТаблицаГрупп = ГруппыПоставщика(СписокГруппПоставщика(ИмяПоставщика, ПараметрыПоставщика), СтруктураПолейГруппы(ИмяПоставщика)); 
			// Если есть асинхронная работа
			ТаблицаГрупп = ИдентификаторыАсинхронныхЗапросов(ТаблицаГрупп, ИмяПоставщика, ПараметрыПоставщика);
			
			Для Каждого СтрокаГруппы Из ТаблицаГрупп Цикл  
				// Каббалистическое условие из-за особенностей Мерлиона
				Если СтрДлина(СтрокаГруппы.КодГруппы) >= 8 Тогда  
					СписокТоваров = СписокТоваровКаталогаПоставщика(СтрокаГруппы, ИмяПоставщика, ПараметрыПоставщика, СтрокаГруппы.ИдентификаторТовары);
					СписокОстатков = СписокОстатковПоставщика(СтрокаГруппы, ИмяПоставщика, ПараметрыПоставщика, СтрокаГруппы.ИдентификаторОстатки);
					СписокЦен = СписокЦенПоставщика(СтрокаГруппы, ИмяПоставщика, ПараметрыПоставщика, СтрокаГруппы.ИдентификаторЦены);
					СписокШтрихКодов = СписокШтрихКодовПоставщика(СтрокаГруппы, ИмяПоставщика, ПараметрыПоставщика, СтрокаГруппы.ИдентификаторШтрихкоды);
					ПоместитьВТаблицуДанных(ИмяПоставщика, СписокТоваров, "Товары", ТаблицаДанныхПоставщика, СтрокаГруппы);
					ПоместитьВТаблицуДанных(ИмяПоставщика, СписокОстатков, "Остатки", ТаблицаДанныхПоставщика, СтрокаГруппы);
					ПоместитьВТаблицуДанных(ИмяПоставщика, СписокЦен, "Цены", ТаблицаДанныхПоставщика, СтрокаГруппы); 
					ПоместитьВТаблицуДанных(ИмяПоставщика, СписокШтрихКодов, "Штрихкоды", ТаблицаДанныхПоставщика, СтрокаГруппы); 
				КонецЕсли;
			КонецЦикла;
			
		КонецЕсли;
		
		Ответ = Новый Структура("Группы, Товары", ТаблицаГрупп, СвернутаяТаблицаДанныхПоставщика(ТаблицаДанныхПоставщика)); 
		
	Исключение
		ТекстСообщения = ОписаниеОшибки();
		Сообщить(ТекстСообщения);
	КонецПопытки;      
	
	Возврат Ответ;
	
КонецФункции

 

Функция помещена в раздел универсальных. Специфики не содержит и пока в нее все методики укладываются. Надеюсь, дальнейшая модификация не потребуется. В процессе вызываются специфические функции с параметром "ИмяПоставщика", которые содержат условный оператор, разветвляющий алгоритм. Они выдают результат если в них есть раздел данного поставщика. Если нет, то операция пропускается.

Эти функции также условно разделены на виды запрашиваемой информации. Выделено пять видов (соответственно пять функций):

1. Запрос полной информации.

2. Запрос свойств номенклатуры.

3. Запрос цен.

4. Запрос остатков.

5. Запрос штрихкодов

Разделение в некотором смысле условное. Просто для облегчения понимания и достижения той самой "бездумности" при добавлении поставщика в систему. Эти функции и содержат специфическую часть кода. В них, собственно, код и добавляется.

Функции выглядят примерно так:

	// Запрос всех данных по всему каталогу 
Функция СписокПолныеДанныеПоставщика(ИмяПоставщика, ПараметрыПоставщика) Экспорт
	
	ОтветПолный = Неопределено; 
	
	Попытка
		Если ИмяПоставщика = "Марвел" Тогда
		    ПараметрыНТТРЗавпроса = "";
		    ДобавитьПараметрыНТТРЗапроса(ПараметрыНТТРЗавпроса, "user" , ПараметрыПоставщика.Пользователь);
		    ДобавитьПараметрыНТТРЗапроса(ПараметрыНТТРЗавпроса, "password" , ПараметрыПоставщика.Пароль);
		    ДобавитьПараметрыНТТРЗапроса(ПараметрыНТТРЗавпроса, "secretKey" , "");
		    ДобавитьПараметрыНТТРЗапроса(ПараметрыНТТРЗавпроса, "packStatus" , "1");
		    ДобавитьПараметрыНТТРЗапроса(ПараметрыНТТРЗавпроса, "responseFormat" , "1");
		    ДобавитьПараметрыНТТРЗапроса(ПараметрыНТТРЗавпроса, "inStock" , "1");
			ОтветПоставщика = ОтправитьЗапросHTTP(ПараметрыПоставщика.СерверHTTP, ПараметрыПоставщика.ЗаголовкиHTTP, "POST", "Api/GetFullStock", ПараметрыНТТРЗавпроса); 
			Если ЗначениеЗаполнено(ОтветПоставщика.ОписаниеОшибки) Тогда
				Сообщить(СтрШаблон("Ошибка получения групп %1: %2 ", ИмяПоставщика, ОтветПоставщика.ОписаниеОшибки));
			Иначе  
				Сообщение = ОтветПоставщика.ОтветHTTP.Header; 
				Если Сообщение.Code = 0 Тогда
					ОтветПолный = ОтветПоставщика.ОтветHTTP.Body.CategoryItem; 
				Иначе
					Сообщить(СтрШаблон("Ошибка получения товаров %1: %2 ", ИмяПоставщика, Сообщение.Message));
				КонецЕсли;
			КонецЕсли;
		ИначеЕсли ИмяПоставщика = "Треолан" Тогда
			WSПрокси = ПараметрыПоставщика.WSПрокси;
			Если Не WSПрокси = Неопределено Тогда  
				ОтветТовары = WSПрокси.GenCatalogV2(ПараметрыПоставщика.login, 
													ПараметрыПоставщика.password, 
													ПараметрыПоставщика.category, 
													ПараметрыПоставщика.vendorid, 
													ПараметрыПоставщика.keywords, 
													ПараметрыПоставщика.criterion,
													ПараметрыПоставщика.inArticul,
													ПараметрыПоставщика.inName,
													ПараметрыПоставщика.inMark,
													ПараметрыПоставщика.showNc
												);
												
				ОтветПолный = СписокПозицийСРодителямиИзXML(ОтветТовары, "position");
			КонецЕсли;
		КонецЕсли;
	Исключение
		ТекстСообщения = ОписаниеОшибки();
		Сообщить(ТекстСообщения);
	КонецПопытки;      
			
	Возврат ОтветПолный;
		
 КонецФункции

 

Или так:

		// Доступные остатки
Функция СписокОстатковПоставщика(СтрокаГруппы, ИмяПоставщика, ПараметрыПоставщика, Идентификатор = "") Экспорт
	
	ОтветОстатки = Неопределено; 
	
	Попытка
		Если ИмяПоставщика = "Дихауз" Тогда 
			ОтветОстатки = ОтветАсинхронногоЗапросаДихаус(ПараметрыПоставщика.WSПрокси, Идентификатор);
			ОтветОстатки = ОтветОстатки.ProductRemains.ProductRemain;
		ИначеЕсли ИмяПоставщика = "Мерлион" Тогда
			Если СтрДлина(СтрокаГруппы.КодГруппы) = 8 Тогда  
				WSПрокси = ПараметрыПоставщика.WSПрокси;
				Если Не WSПрокси = Неопределено Тогда  
					cat_id = WSПрокси.ФабрикаXDTO.Создать(ПараметрыПоставщика.ТипСтрока, СтрокаГруппы.КодГруппы);
					ОтветОстатки = WSПрокси.getItemsAvail(cat_id, ПараметрыПоставщика.shipment_method, ПараметрыПоставщика.shipment_date, ПараметрыПоставщика.only_avail, ПараметрыПоставщика.item_id); 
					ОтветОстатки = ОтветОстатки.item;
				КонецЕсли;
			КонецЕсли; 
		КонецЕсли;
	Исключение
		ТекстСообщения = ОписаниеОшибки();
		Сообщить(ТекстСообщения);
	КонецПопытки;      
			
	Возврат ОтветОстатки;
		
 КонецФункции

		// Актуальные цены
Функция СписокЦенПоставщика(СтрокаГруппы, ИмяПоставщика, ПараметрыПоставщика, Идентификатор = "") Экспорт
	
	ОтветЦены = Неопределено; 
	
	Попытка
		Если ИмяПоставщика = "Дихауз" Тогда 
			ОтветЦены = ОтветАсинхронногоЗапросаДихаус(ПараметрыПоставщика.WSПрокси, Идентификатор);
			ОтветЦены = ОтветЦены.ProductPricelist.ProductPrice;
		КонецЕсли;
	Исключение
		ТекстСообщения = ОписаниеОшибки();
		Сообщить(ТекстСообщения);
	КонецПопытки;      
			
	Возврат ОтветЦены;
		
 КонецФункции

		// Отдельно хранимые штрихкоды
Функция СписокШтрихКодовПоставщика(СтрокаГруппы, ИмяПоставщика, ПараметрыПоставщика, Идентификатор = "") Экспорт
	
	ОтветШтрихКоды = Неопределено; 
	
	Попытка
		Если ИмяПоставщика = "Мерлион" Тогда
			Если СтрДлина(СтрокаГруппы.КодГруппы) = 8 Тогда  
				WSПрокси = ПараметрыПоставщика.WSПрокси;
				Если Не WSПрокси = Неопределено Тогда  
					cat_id = WSПрокси.ФабрикаXDTO.Создать(ПараметрыПоставщика.ТипСтрока, СтрокаГруппы.КодГруппы);
					ОтветШтрихКоды = WSПрокси.getItemsBarcodes(cat_id, ПараметрыПоставщика.item_id);
					ОтветШтрихКоды = ОтветШтрихКоды.item;
				КонецЕсли;
			КонецЕсли; 
		КонецЕсли;
	Исключение
		ТекстСообщения = ОписаниеОшибки();
		Сообщить(ТекстСообщения);
	КонецПопытки;      
			
	Возврат ОтветШтрихКоды;
		
 КонецФункции

 

Примеры привел для того, чтобы было понятно, как это выглядит и что код для нового поставщика добавляется по аналогии и не в каждую функцию.

Ответ обрабатывается аналогично, с помощью функций, возвращающей структуру состава полей ответа по имени поставщика. Также предусмотрена процедура для учета нюансов при получении информации из полей ответа. Если они есть. Например, вычисление нужного значения из значений нескольких полей. Работает по принципу причесывания. Если нюансы присутствуют, то надо просто их туда аккуратно занести.

Сюда заносим поля из документации. Функции выглядят так:

// Здесь формируется структура соответствий имен полей унифицированной таблицы данных групп и имен полей из ответа поставщика (на запрос групп).
// Здесь для нового поставщика формируется своя структура.
Функция СтруктураПолейГруппы(ИмяПоставщика) Экспорт  
	
	СтруктураПолей = Новый Структура();  
	
	Если ИмяПоставщика = "Дихауз" Тогда
		СтруктураПолей.Вставить("КодГруппы", "code"); 
		СтруктураПолей.Вставить("Наименование", "name"); 
	ИначеЕсли ИмяПоставщика = "Мерлион" Тогда
		СтруктураПолей.Вставить("КодГруппы", "ID"); 
		СтруктураПолей.Вставить("КодРодителя", "ID_PARENT"); 
		СтруктураПолей.Вставить("Наименование", "Description"); 
	ИначеЕсли ИмяПоставщика = "Марвел" Тогда 
		СтруктураПолей.Вставить("КодГруппы", "CategoryId"); 
		СтруктураПолей.Вставить("КодРодителя", "ParentCategoryId"); 
		СтруктураПолей.Вставить("Наименование", "CategoryName"); 
		СтруктураПолей.Вставить("МассивПодгрупп", "SubCategories"); 
	ИначеЕсли ИмяПоставщика = "Треолан" Тогда 
		СтруктураПолей.Вставить("КодГруппы", "id"); 
		СтруктураПолей.Вставить("КодРодителя", "parentid"); 
		СтруктураПолей.Вставить("Наименование", "name"); 
	КонецЕсли; 
		
	Возврат СтруктураПолей; 
	
КонецФункции

// Здесь формируется структура соответствий имен полей унифицированной таблицы данных по товарам и имен полей из ответа поставщика.
// Здесь для нового поставщика формируется своя структура. Возможно разбиение по видам запросов (Товары, Цены, Остатки, Штрихкоды). 
// Для каждого вида запроса формируется свой раздел.
Функция СтруктураПолейОтвета(ИмяПоставщика, ВидДанных) Экспорт  
	
	Ответ = Новый Структура();  
	
	Если ИмяПоставщика = "Дихауз" Тогда
		Ответ.Вставить("Идентификатор", "code");  
		Если ВидДанных = "Цены" Тогда
			Ответ.Вставить("Цена", "Price");  
		ИначеЕсли ВидДанных = "Товары" Тогда
			Ответ.Вставить("Категория", "Category");  
			Ответ.Вставить("Артикул", "VendorCode");  
			Ответ.Вставить("Наименование", "Name");  
			Ответ.Вставить("Штрихкод", "EAN");  
			Ответ.Вставить("Единица", "Unit");  
		КонецЕсли; 
	ИначеЕсли ИмяПоставщика = "Мерлион" Тогда
		Если ВидДанных = "Остатки" Тогда
			Ответ.Вставить("Идентификатор", "No");  
			Ответ.Вставить("Цена", "PriceClientRUB_MSK");  
			Ответ.Вставить("Остаток", "AvailableClient_MSK");  
		ИначеЕсли ВидДанных = "Товары" Тогда
			Ответ.Вставить("Идентификатор", "No");  
			Ответ.Вставить("Бренд", "Brand");  
			Ответ.Вставить("Артикул", "Vendor_part");  
			Ответ.Вставить("Вес", "Weight");  
			Ответ.Вставить("Длина", "Length");  
			Ответ.Вставить("Ширина", "Width");  
			Ответ.Вставить("Высота", "Height");  
			Ответ.Вставить("Наименование", "Name");  
			Ответ.Вставить("Категория", "GroupCode3");
			Ответ.Вставить("КатегорияРодитель", "GroupCode2");
		ИначеЕсли ВидДанных = "Штрихкоды" Тогда
			Ответ.Вставить("Идентификатор", "ItemNo");  
			Ответ.Вставить("ШтрихКод", "Barcode");  
		КонецЕсли; 
	ИначеЕсли ИмяПоставщика = "Марвел" Тогда 
		Если ВидДанных = "Товары" Тогда
			Ответ.Вставить("Идентификатор", "WareArticle");  
			Ответ.Вставить("Категория", "CategoryId");
			Ответ.Вставить("НаименованиеКатегории", "CategoryName");
			Ответ.Вставить("Наименование", "WareFullName");  
			Ответ.Вставить("Вес", "Weight");  
			Ответ.Вставить("Длина", "Depth");  
			Ответ.Вставить("Ширина", "Width");  
			Ответ.Вставить("Высота", "Height");  
			Ответ.Вставить("Бренд", "WareVendor");  
			Ответ.Вставить("Артикул", "WareArticle");  
			Ответ.Вставить("Цена", "WarePriceRUB");  
			Ответ.Вставить("Остаток", "AvailableForB2BOrderQtyInMSK");  
		КонецЕсли; 
	ИначеЕсли ИмяПоставщика = "Треолан" Тогда
		Если ВидДанных = "Товары" Тогда
			Ответ.Вставить("Идентификатор", "id");  
			Ответ.Вставить("Артикул", "articul");  
			Ответ.Вставить("Бренд", "vendor");  
			Ответ.Вставить("Наименование", "name");  
			Ответ.Вставить("ШтрихКод", "GTIN");  
			Ответ.Вставить("Вес", "brutto");  
			Ответ.Вставить("Длина", "length");  
			Ответ.Вставить("Ширина", "width");  
			Ответ.Вставить("Высота", "height");  
			Ответ.Вставить("Валюта", "currency");  
			Ответ.Вставить("Цена", "price");  
			Ответ.Вставить("Остаток", "freenom");  
			Ответ.Вставить("Категория", "id_Родитель");  
			Ответ.Вставить("КатегорияРодитель", "parent");
		КонецЕсли; 
	КонецЕсли; 
		
	Возврат Ответ; 
	
КонецФункции

Есть еще аналогичная функция, отвечающая за параметры подключения и вызова методов сервисов. Ее приводить не буду. Для всех желающих код доступен, четко структурирован и подробно документирован.

Итоговая методика добавления контрагента:

1. Блок параметров подключения в виде структуры для нового поставщика.

2. Структура полей ответа на запрос товаров и групп.

3. Код вызова методов с заранее определенными параметрами.

Лично я остался доволен. Устраивает ли такой подход других - каждый может решить сам.

Код писался не для практического использования, а для наглядной демонстрации методики построения подобных программ. Однако, все работает. Получение данных тестировалось, все ссылки в расширении рабочие. Очевидно, что для того, чтобы поиграться Вам потребуются рабочие логины и пароли для доступа к сервису каждого поставщика.

Всего с комментариями около 900 строк. Половина - выделенная универсальная часть. В случае использования в нее можно не заглядывать, если не сбоит. Вторая половина - специфика, в которую и нужно внести инфу из документации, по аналогии с уже имеющимся текстом. В примере представлена загрузка данных для поставщиков Дихауз, Марвел, Мерлион и Треолан. 

Файлы обработки и расширения доступны для скачивания по ссылке: https://github.com/MikeSheinesson/Files1C 

 

Вот и все. Спасибо тем, кто дочитал до конца. Буду рад, если данная публикация кому-то принесет практическую пользу или к чему-то побудит. Всем удачи.

 

Специальные предложения

Оставьте свое сообщение

См. также

SonarQube: про объемы, ветки, покрытие кода и интеграцию с Gitlab

DevOps и автоматизация разработки Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Опыт применения SonarQube в нескольких командах. Плюс некоторые тонкости: уменьшение объемов базы SQ, интеграция, покрытие кода.

26.02.2023    1898    kraynev-navi    10    

42

Зачем и как читать чужой код? Какой результат ожидаем получить? Основные подходы

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Данная статья является кратким содержанием статей цикла "Как читать чужой код". Цель такой публикации: создать чек-лист различных подходов для чтения непонятного кода. Более подробно каждый из методов можно прочитать в исходной статьей. Последовательность изложения материала полностью совпадает с исходными статьями, и разделена на 4 части.

06.02.2023    2436    biimmap    9    

23

Как проверять код на языке 1С с помощью BSL Language Server

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Некоторые разработчики на платформе 1С не проверяют свой код ни на соответствие стандартам 1С, ни на самые распространённые ошибки кодирования. И если раньше они могли оправдываться отсутствием инструментов для этого, то с появлением BSL Language Server оправданий больше нет.

13.01.2023    2804    aleksei_adamov    10    

44

Без комментариев!

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Подниму холиварную тему. Несколько раз коллеги меня спрашивали - почему в своем коде я не пишу комментариев. Отвечаю на этот вопрос статьей. Присоединяйтесь к обсуждениям, что вы думаете по этому поводу. Комментарии в коде - нужны или нет?

05.01.2023    5040    ardn    161    

37

Правила работы с транзакциями 1С

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

Список правил при работе с транзакциями из BSL Language Server и SonarQube 1C (BSL) Plugin. Переработка и осмысление материала.

01.12.2022    4006    kuzyara    39    

78

Распознавание и загрузка документов в 1С Промо

Универсальная программа-обработка для распознавания любых сканов или фото первичных документов в 1С (счета-фактуры, УПД, ТТН, акты и тд). Точность распознания до 98%.

от 11 рублей

Как избавиться от большого количества комментариев в коде с использованием EDT + Git

Рефакторинг и качество кода DevOps и автоматизация разработки Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Публикация освещает вопрос улучшения качества и читабельности кода путем отказа от излишних комментариев. Рассматривается пример из опыта работы команды разработки на EDT + Git. Команда работает в EDT меньше года. Конфигурация сильно доработана и не обновляется типовыми релизами.

15.11.2022    981    shastin87    5    

9

Модульность в 1С – как следовать принципам DRY в реалиях 1С: Предприятие 8.3

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Принцип DRY – Don't repeat yourself (не повторяйся) – один из классических принципов программирования. Краеугольным камнем реализации этого принципа является модульная архитектура, которую можно реализовать в 1С с помощью расширений. Но экосистемы модулей общего назначения, сравнимой с существующими в других языках, в 1С пока что нет. О том, как спроектировать архитектуру таких модулей и управлять ими с помощью менеджера пакетов, на митапе «Путь к идеальному коду» рассказал технический директор компании «А1» Арсений Геращенко.

03.06.2022    2916    Enigma    3    

22

Красота разработки в 1С, или художественная верстка кода

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рекомендации по верстке и организации кода в 1С, которые я вывел для себя. P.S. Нет, это не про комментарии и номера версий.

02.06.2022    6759    TimofeySin    67    

63

Как выжить, если у тебя в базе 1С 50+ расширений

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Расширения – это простой способ делать доработки на лету. Но администрировать большое количество расширений и не допустить бардак – очень сложно. О том, как выжить в такой ситуации, реализовать управление доработками и установкой актуальных версий расширений, на митапе «Путь к идеальному коду» рассказал Юрий Былинкин – архитектор 1С в компании Аскона.

16.05.2022    5752    ardn    44    

53

Про простой и понятный код

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Внимание! Данная публикация с большой долей вероятности не добавит ничего нового к Вашим знаниям и Вашему опыту, поэтому если Вы читаете Инфостарт исключительно для целей "прокачки" своих навыков, не тратьте на её чтение своё время и перейдите сразу к следующей!

03.12.2021    5374    q_i    161    

71

Видеокурс-практикум: как подготовить и написать ТЗ, ЗНР, ЧТЗ. Промо

В курсе обобщен опыт работы аналитика на проектах в течение пяти лет, в нескольких фирмах. Подходы к написанию документов унифицированы и по возможности не привязаны к конфигурациям 1С.

3 500 рублей

Как читать чужой код? Часть 1. Общие вопросы. Доработка чужого кода. Code review

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Во всех вакансиях есть требование - умение читать чужой код. Но ни на одних курсах специально этому не учат. Чтобы устранить это противоречие, пишу данную статью. Рассмотрю случаи, в которых нам необходимо разбирать чужой код, поймём, чей код мы пытаемся разобрать, зачем и, главное, как. В статье описан личный опыт длиною в 18 лет начиная с версии платформы 7.7. Статья будет большой, набираемся терпения). Статья содержит в себе описание сценариев разбора кода, т.е. набор шагов. В статье не получится показать это на практике. Для этого планирую сделать онлайн или оффлайн курс, где на примерах будет показан разбор незнакомого кода. Статья разбита на 4 публикации для удобства изучения.

20.09.2021    12503    biimmap    55    

133

Распространенные ошибки разработчиков, приводящие к проблемам производительности

HighLoad оптимизация Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Рассмотрим примеры ошибок, анализ, исправление и мероприятия по недопущению подобного в будущем. Всего будет 18 примеров.

02.08.2021    15697    ivanov660    77    

139

Антипаттерны программирования в 1С

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Поговорим про плохой стиль программирования и рассмотрим 17 часто встречающихся антипаттернов.

19.07.2021    12732    ivanov660    121    

66

Чек-листы для проведения Code Review

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 1С:Франчайзи, автоматизация бизнеса Бесплатно (free)

В данной статье будут приведены два чек-листа (основной и для проверки архитектурных решений). По данным чек-листам программист любой квалификации может проверить свой код и код других разработчиков.

17.05.2021    11213    Shining_ninja    99    

127

1СПАРК РИСКИ. Сервис оценки благонадежности контрагентов. Промо

СПАРК помогает предотвратить мошенничество со стороны компаний и предпринимателей, благодаря актуальным сведениям о компаниях и системе выявления факторов риска.Сервис позволяет управлять налоговыми рисками и комплексно оценивать благонадежность контрагентов.

Эффективные приемы разработки

Математика и алгоритмы Рефакторинг и качество кода СКД Платформа 1С v8.3 Бесплатно (free)

На Infostart Meetup Ekaterinburg.Online выступил Сергей Наумов – руководитель центра аналитики и консалтинга WiseAdvice. Сергей поделился с коллегами приемами разработки, которые помогут избежать потенциальных проблем при реализации сложных проектов.

07.04.2021    5085    SergeyN    13    

39

Ускорение расчета себестоимости УПП 1.3 в несколько раз

Рефакторинг и качество кода Закрытие периода Платформа 1С v8.3 1С:Управление производственным предприятием Бухгалтерский учет Управленческий учет Бесплатно (free)

Как определить причину медленного расчёта себестоимости в УПП 1.3, один из вариантов поиска проблем производительности с помощью инструментов 1С и ускорения расчёта средствами встроенного языка

02.02.2021    5426    RPGrigorev    23    

40

Практика применения DevOps. Работа с SonarQube

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Во второй части мастер-класса «Практика применения DevOps» на конференции Infostart Event 2019 Inception выступил Виталий Подымников – он рассказал про процесс проверки качества кода и использование SonarQube для работы с ним.

07.12.2020    15203    arcius_7012    21    

83

Операторы перехода в программном коде: использовать или нет?

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим ситуации использования операторов перехода Перейти (GoTo), Возврат (Return), Прервать (Break), Продолжить (Continue). Как вы считаете - это дурной тон, нормальная практика или зависит от ситуации?

16.11.2020    9130    ivanov660    23    

10

Чистый кот (Clean cat)

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

От автора легендарного бестселлера "Совершенный кот".

04.11.2020    2395    vasilev2015    25    

5

Программы для исполнения 54-ФЗ Промо

С 01.02.2017 контрольно-кассовая техника должна отправлять электронные версии чеков оператору фискальных данных - правила установлены в 54-ФЗ ст.2 п.2. Инфостарт предлагает подборку программ, связанных с применением 54-ФЗ, ККТ и электронных чеков.

Доработайте это "немедленно", или как уменьшить доработки конфигурации

Рефакторинг и качество кода Платформа 1С v8.3 Россия Бесплатно (free)

Доработки конфигурации - необходимое зло. Автор предлагает несколько простых подходов и приемов, позволяющих хотя бы немного, но оптимизировать объем доработок конфигурации, упростить их, и облегчить дальнейшие доработки и обновления конфигурации. Все примеры и подходы взяты автором из реальной жизни и основаны на собственных наблюдениях.

25.09.2020    4919    Богатырев Артур    24    

14

Как найти неиспользуемый код

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Описание нескольких способов поиска и определения неиспользуемого кода

03.08.2020    5834    Infostart    29    

71

Как поставить качество кода на поток и при этом не разориться? Какие шаги стоит сделать уже завтра, чтобы повысить планку качества?

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Наличие в 1С-решениях некачественного кода мешает их поддержке и эффективному развитию. Как добиться соблюдения стандартов разработки при написании кода и внедрить бюджетный Code Review с помощью инструментария на основе АПК (Автоматизированной проверки конфигураций) на конференции Infostart Event 2019 Inception рассказал технический руководитель компании Бизнес Лоджик Иван Козлов.

22.06.2020    5043    kozlov.alians    1    

23

Молчание "best practices": тестовые и эталонные данные, структура и связность, падения и новая функциональность, и другие неудобные вопросы к сценарному тестированию

Рефакторинг и качество кода Тестирование QA Платформа 1С v8.3 Бесплатно (free)

Непонимание некоторых базовых вопросов мешает программистам начать применять инструменты тестирования в процессе разработки для 1С. Как разобраться в терминологии и интегрировать процесс тестирования в разработку 1С-решений на конференции Infostart Event 2019 Inception рассказал руководитель отдела разработки компании C.T.Consultants Решитко Дмитрий.

29.05.2020    6686    grumagargler    14    

48

Готовые переносы данных из различных конфигураций 1C Промо

Рекомендуем готовые решения для переноса данных из различных конфигураций 1C. C техподдержкой от разработчиков и гарантией от Инфостарт.

Рефакторинг в редакторе модулей

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Для тех, кто не пользуется Ctrl+Alt+R. “Контролируемый процесс улучшения кода без написания новой функциональности”, “Равносильное преобразование алгоритмов” и т.п в данной статье НЕ рассматриваются. Тема статьи: замечательные команды из подменю Рефакторинг контекстного меню редактора модулей в конфигураторе. В статье описано, как команды из подменю Рефакторинг помогают при написании кода

10.03.2020    5948    pparshin    6    

52

Качество кода: Поведенческие паттерны проектирования

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Поговорим про применение паттернов проектирования в разработке на 1С.

03.03.2020    12187    ivanov660    0    

83

Боремся с запросами в циклах. Мой опыт рефакторинга запросов

Рефакторинг и качество кода Запросы Конфигурации 1cv8 Бесплатно (free)

В текущей публикации я предлагаю вам несколько простых примеров с решениями, в которых будет представлено решение "единым запросом", без использования запросов в цикле.

02.03.2020    13777    aximo    55    

72

Код разработчика в зависимости от опыта работы

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Пятничный пост! Как меняется код разработчика в зависимости от опыта работы.

14.02.2020    13554    Infostart    229    

105

Стабильность превыше всего

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Странная заметка о поддержании стабильности в условиях интенсивного изменения конфигурации.

07.11.2019    10933    Infostart    41    

75

Подборка программ для взаимодействия с ЕГАИС Промо

ЕГАИС (Единая государственная автоматизированная информационная система) - автоматизированная система, предназначенная для государственного контроля за объёмом производства и оборота этилового спирта, алкогольной и спиртосодержащей продукции. Инфостарт рекомендует подборку проверенных решений для взаимодействия с системой.

Оценка скорости кода. Сложность алгоритма

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Эта тема одной из первых всплывает на собеседовании программистов языков вроде Java и C, но она почти неизвестна в "мире 1С". Поговорим о вычислительной сложности алгоритмов.

07.10.2019    7600    m-rv    12    

16

Управление качеством кода

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

О SonarQube, АПК, EDT. Какие преимущества дает их использование. Для каких команд подходит.

22.07.2019    22654    Stepa86    40    

179

По следам код-ревью

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Приведу примеры с картинками и небольшим пояснением по вопросам, связанным с код-ревью (обзором кода).

09.07.2019    16093    ivanov660    112    

117

Совершенный коТ (Cat complete)

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Стандарты программирования в картинках. Самоирония прилагается.

03.06.2019    11160    vasilev2015    150    

69

Даем названия переменным: как префиксы экономят наше время

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Понятные названия переменных экономят время и силы разработчика : в начале, когда мы даём названия переменным, в процессе развития разработки, когда мы "на лету" понимаем назначение той или иной переменной, в конце, когда мы передаём разработку на поддержку других программистов, сами переходя к новым разработкам

06.05.2019    11374    Designer1C    86    

13

Работа с 1С:Аналитика Промо

Онлайн-курс предусматривает изучение возможностей системы “1С:Аналитика”, которая работает как составная часть платформы “1С:Предприятие” и обеспечивает оперативный просмотр и анализ необходимых данных.

4500 рублей

Логические выражения и красивый код

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

В данной статье я хочу поделиться своей практикой применения логических выражений при написании кода. Учитывая тот факт, что платформа 1С 8.х использует сокращенный цикл вычисления логических выражений, можно заменить громоздкие конструкции “Если Тогда ИначеЕсли КонецЕсли” на красивую и лаконичную запись, похожую на список операций.

20.04.2019    35146    Vortigaunt    88    

57

Антидот

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Необходимое лекарство для тех, кто случайно передозировал чтение статей о хорошем-плохом программировании на 1С.

22.01.2019    7988    mkalimulin    183    

23

Быстрый способ разобраться в чужом коде

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Добрый день! Хочу рассказать о способе, который позволит быстро разобраться в чужом коде. Я, конечно, думаю, что это жесткий баян, но не видел, чтобы кто-то пользовался этим способом. По крайней мере, новичкам точно будет интересно.

29.12.2018    12931    wizard.ilmir02    22    

78

Что такое рефакторинг и в чем его цели

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Что такое рефакторинг, и в каких случаях им стоит заниматься? Евгений Шумилов дает ответы на эти вопросы, а также рассказывает о признаках хорошего и плохого кода. Кроме того, в статье приведены основные проблемы рефакторинга и способы их решения.

30.10.2018    17396    eu_genij    34    

63