public static object GetAttributeValue(this GM_NSIReferenceRecord record, string attributeId)
        {
            if (record == null)
            {
                return(null);
            }
            var attribute = record.GM_NSIReferenceRecordAttribute.FirstOrDefault(
                x =>
                ReferenceAttributeCache.GetAttribute(x.ReferenceAttributeRecId).ReferenceAttributeId.Equals(attributeId, StringComparison.InvariantCultureIgnoreCase));

            if (attribute == null)
            {
                throw new ApplicationException(string.Format("не найден НСИ атрибут {0} у записи {1}({2}) справочника {3}", attributeId, record.RecordId,
                                                             record.RecordName, record.ReferenceId));
            }
            return(GetAttributeValue(attribute));
        }
        /// <summary>
        /// Сравнение значений аттрибута у двух записей НСИ справочника (записи одного типа) применимо для аттрибутов типа Integer. Real, DateTime.
        /// </summary>
        /// <param name="rec1">Первая запись справочника НСИ</param>
        /// <param name="rec2">Вторая запись справочника НСИ</param>
        /// <param name="attributeID">Идентификатов аттрибута</param>
        /// <returns>true - если аттрибут первой записи больше или равен аттрибуту второй записис, иначе false</returns>
        public static bool FirstNSIAttributeGreaterOrEqual(GM_NSIReferenceRecord rec1, GM_NSIReferenceRecord rec2, string attributeID)
        {
            // Проверка переданы ли записи справочника
            if (rec1 == null || rec2 == null)
            {
                throw new ApplicationException("FirstNSIAttributeGreaterOrEqual : Попытка сравнить аттрибуты пустой записи справочника");
            }
            // Получение аттрибутов
            var attribute1 =
                rec1.GM_NSIReferenceRecordAttribute.FirstOrDefault(
                    x =>
                    ReferenceAttributeCache.GetAttribute(x.ReferenceAttributeRecId).ReferenceAttributeId.Equals(attributeID, StringComparison.InvariantCultureIgnoreCase));
            var attribute2 =
                rec2.GM_NSIReferenceRecordAttribute.FirstOrDefault(
                    x =>
                    ReferenceAttributeCache.GetAttribute(x.ReferenceAttributeRecId).ReferenceAttributeId.Equals(attributeID, StringComparison.InvariantCultureIgnoreCase));

            // Проверка существоания аттрибутов
            if (attribute1 == null)
            {
                throw new ApplicationException(string.Format("не найден НСИ атрибут {0} у записи {1}({2}) справочника {3}", attributeID, rec1.RecordId,
                                                             rec1.RecordName, rec1.ReferenceId));
            }
            if (attribute2 == null)
            {
                throw new ApplicationException(string.Format("не найден НСИ атрибут {0} у записи {1}({2}) справочника {3}", attributeID, rec2.RecordId,
                                                             rec2.RecordName, rec2.ReferenceId));
            }
            // Сравнение аттрибутов
            switch ((NSIDataTypes)ReferenceAttributeCache.GetAttribute(attribute1.ReferenceAttributeRecId).ReferenceAttributeType)
            {
            case NSIDataTypes.Integer:
                return(attribute1.ValueInteger >= attribute2.ValueInteger);

            case NSIDataTypes.Real:
                return(attribute1.ValueReal >= attribute2.ValueReal);

            case NSIDataTypes.DateTime:
                return(attribute1.ValueDate >= attribute2.ValueDate);

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
        public static object GetAttributeValue(this GM_NSIReferenceRecordAttribute attribute)
        {
            switch ((NSIDataTypes)ReferenceAttributeCache.GetAttribute(attribute.ReferenceAttributeRecId).ReferenceAttributeType)
            {
            case NSIDataTypes.String:
                return(attribute.ValueString);

            case NSIDataTypes.Integer:
                return(attribute.ValueInteger);

            case NSIDataTypes.Real:
                return(attribute.ValueReal);

            case NSIDataTypes.DateTime:
                return(attribute.ValueDate);

            case NSIDataTypes.ReferenceRecord:
                return(attribute.ValueRecord);

            default:
                throw new ArgumentOutOfRangeException();
            }
        }