if (obj == null || parentObj == null || numerator == null) return string.Concat(prefix, current); var doc = obj.Document; if (doc.Extensions.EngineeringChangesManager.State >= TechEngineeringChangesTechnologyState.Approved) { object childFilter = doc.Model.Filters[numerator.Children] as object ?? doc.Model.Classes[numerator.Children]; string attrName = numerator.AttributeName; var children = parentObj.Children.Find(childFilter).ToList(); int objIndex = children.IndexOf(obj); int prevValue = 0; int nextValue = 0; int currentValue; Func getNumberFunc = (o) => { if (o == null) return 0; var stringValue = o.Attributes[attrName].Value.ToString(); int result = 0; if (!string.IsNullOrEmpty(prefix)) stringValue = stringValue.Replace(prefix, string.Empty); int.TryParse(stringValue, out result); return result; }; currentValue = getNumberFunc(obj); if (objIndex > 0) prevValue = getNumberFunc(children[objIndex - 1]); int nextObjectIndex = objIndex + 1; while (nextObjectIndex < children.Count) { nextValue = getNumberFunc(children[nextObjectIndex]); if (nextValue > prevValue) break; nextObjectIndex++; } if (children.Count > 1 && currentValue > prevValue && nextValue <= prevValue && prevValue > 0) return obj.Attributes[attrName].Value.ToString(); if (nextValue <= prevValue) nextValue = 0; if (children.Count > 1 && currentValue > prevValue && nextObjectIndex - objIndex == 1 && (currentValue < nextValue || nextValue == 0)) return obj.Attributes[attrName].Value.ToString(); int step = (nextValue == 0) ? numerator.Step : (nextValue - prevValue) / 2; // Получает значение int value = (step > 0) ? prevValue + step : prevValue + 1; if (objIndex < children.Count - 1) { nextValue = getNumberFunc(children[objIndex + 1]); if (nextValue <= value) { obj.Attributes[attrName].Value = prefix + value.ToString("D" + numerator.MaxLength); // для передачи в функцию Renumerate используем индекс объекта в общем, неограниченном фильтром списке дочерних объектов objIndex = parentObj.Children.IndexOf(obj); obj.Document.Extensions.NumerationService.Renumerate(parentObj, objIndex + 1, objIndex + 1); } } return prefix + value.ToString("D" + numerator.MaxLength); } return string.Concat(prefix, current);