public ActionResult SafePositionEdit(FormCollection formCollection)
        {
            var openPositionChangedPropertyList = new List<SystemProperty>();
            var closePositionChangedPropertyList = new List<SystemProperty>();

            var strOpenId = String.Empty; // содержит, перечисленные через запятую, уникальные идентификаторы открытых позиций, которые нужно обновить
            var strCloseId = String.Empty; // -- закрытых позиций, которые нужно обновить

            //Список ошибок валидации. Формат: Поле - коментарий к ошибке
            var validationErrorList = new List<Tuple<string, string>>();

            // Мапим коллекцию 'FormCollection' в списоки из элементов 'SystemProperty'
            // Элемент item имеет тут знаения типа "Open_Side", "Open_StopLoss" и т.п.
            foreach (var item in formCollection)
            {
                if (String.IsNullOrEmpty(formCollection[item.ToString()]))
                    continue;  //Если строка оставлена пользователем пустой, тогда НЕ вносим это поле в список на редактирование

                string type;
                string systemName;

                #region парсим тип свойства и его системное имя
                try
                {
                    type = ((string) item).Split('_')[0];
                    systemName = ((string)item).Split('_')[1];
                }
                catch (Exception ex)
                {
                    Logger.Error(String.Format("SafePositionEdit() - не {0}", item), ex);
                    continue;
                }
                #endregion

                var prop = new SystemProperty
                    {
                        SystemName = systemName,
                        Value = formCollection[item.ToString()]
                    };

                if (!prop.Validation())
                {
                    validationErrorList.Add(new Tuple<string, string>(systemName, Resource.ErrorMessageInvalid));
                    continue;
                }

                // Поскольку в следующем switch нет случаев 'OpenDanger_', 'CloseDanger_' и 'OtherDanger_' то в выборку на
                // редактирование попадут только "безопасные" поля сделок
                #region в зависимости от состояния сделки (открыта / закрыта), запихиваем её свойство в соответствующий список из 'SystemProperty'
                switch (type)
                {
                    case "Open":
                        openPositionChangedPropertyList.Add(prop);
                        break;
                    case "Close":
                        closePositionChangedPropertyList.Add(prop);
                        break;
                    case "ItemsId":
                        if (systemName == "Open") strOpenId = formCollection[item.ToString()];
                        if (systemName == "Close") strCloseId = formCollection[item.ToString()];
                        break;
                }
                #endregion
            }

            var mess = string.Empty;

            mess += positionRepository.UpdateSavePositionItem(strOpenId, openPositionChangedPropertyList, PositionState.Opened) ?
                 string.Format("{0}: {1}", Resource.MessageMarketOrderUpdate, strOpenId) :
                 string.Format("{0}: {1} - {2}.",Resource.ErrorMessage, Resource.ErrorMessageUnableMarketOrderUpdate, strOpenId);
            mess += "   ";
            mess += positionRepository.UpdateSavePositionItem(strCloseId, closePositionChangedPropertyList, PositionState.Closed) ?
                string.Format("{0}: {1}", Resource.MessageMarketOrderUpdate, strCloseId) :
                string.Format("{0}: {1} - {2}.", Resource.ErrorMessage, Resource.ErrorMessageUnableMarketOrderUpdate, strCloseId);

            #region Если были найдены ошибки валидации возвращаем на ту же самую страницу редактирования, но уже со списком ошибок
            if (validationErrorList.Count > 0)
            {
                var idArray = String.Empty;
                if (!String.IsNullOrEmpty(strOpenId)) idArray += strOpenId;
                if (!String.IsNullOrEmpty(strCloseId)) idArray += "," + strCloseId;

                var positions = positionRepository.GetPositionsById(idArray.ToIntArrayUniform());
                var model = new PositionsEditModel(positions) { validationErrorList = validationErrorList };
                return View("SafePositionEdit", model);
            }
            #endregion

            return RedirectToAction("PositionList", new { message = mess, accountId = -1 });
        }