logo

Изменение названия документа при выключенной опции «Разрешать менять название»

Вы можете разрешить или запретить пользователям изменять название документа определённого типа. Для этого в дизайнере в карточке типа документа на вкладке Описание используйте опцию Разрешать менять название.

В этой статье рассмотрим, как настроить изменение названия документа на значение созданного нумератора, если указанная опция выключена.

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

В этой ситуации настроить изменение названия документа согласно нумератору можно на уровне конфигурации одним из следующих способов:

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

Решение с использованием листенера

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

Системный листенер, который актуализирует имя документа, наследуется от PostFlushEventListener. Созданный листенер будет переписывать работу системного. Поэтому его тоже нужно унаследовать от PostFlushEventListener, а также переопределить метод OnPostUpdate. Для настройки компонента Order установите значение 1000.

Создать листенер можно с помощью следующего сценария:

[Component(Order = 1000)] // Order важен, специально сделан большим, чтобы вызываться после системного листенера
public class ReSaveEntity : PostFlushEventListener
{
        // переопределяем OnPostUpdate, т. к. системный листенер актуализирует имя документа именно здесь
	public override void OnPostUpdate(NHibernate.Event.PostUpdateEvent @event)
	{
               // пытаемся преобразовать к требуемому типу документа
		var doc = @event.Entity as TestDocument;
		if (doc == null)
		{
			return;
		}
	            
		string name;
		if (string.IsNullOrEmpty(doc.InternalNumber))
		{
			var numerator = NumeratorManager.Instance.Load(new Guid("b4ed8a45-7bee-4e0a-bfdc-a983ce34f505"));
			var v_num = NumeratorManager.Instance.GetNewId(numerator, true).ToString();
			while (true)
			{
				if (v_num.Length < 6)
				{
					v_num = "0" + v_num;
				} 
                                else
				{
					break;
				}
			}		
			doc.InternalNumber = "Вн" + v_num;
			name = "Вн" + v_num;
			doc.Name = name;//doc.Name.Replace("#DocumenID#", "Вн" + v_num);
		} 
		else
		{
			doc.Name = doc.InternalNumber;
		}
	}
}

Решение с использованием шаблонной функции

Вы можете использовать вместо листенера шаблонную функцию, которая будет вызываться при любом изменении документа, если выключена опция Разрешать менять название.

Шаблонная функция формирует название документа. Например, в дизайнере в шаблоне имени файла можно указать значение {GenerateDocumentName({$Document})}.

Задать шаблонную функцию в сценарии можно следующим образом:

// Компонент объявления шаблонных функций
[Component]
public class DocumentNameGeneratorFunctions : EleWise.ELMA.Templates.ITemplateGeneratorFunctionsContainer
{
        // функция с именем, которое можно использовать в шаблоне
	public static FormatedValue GenerateDocumentName(FunctionEvaluationContext context)
	{
		if (context.Parameters.Count < 1 || context.Parameters[0] == null)
		{
			return null;
		}
		var doc = context.Parameters[0].Value as TestDocument;
		if (doc == null)
		{
			return null;
		}
		
		string name;
		if (string.IsNullOrEmpty(doc.InternalNumber))
		{
			var numerator = NumeratorManager.Instance.Load(new Guid("b4ed8a45-7bee-4e0a-bfdc-a983ce34f505"));
			var v_num = NumeratorManager.Instance.GetNewId(numerator, true).ToString();
			while (true)
			{
				if (v_num.Length < 6)
				{
					v_num = "0" + v_num;
				} 
				else
				{
					break;
				}
			}
			doc.InternalNumber = "Вн" + v_num;
			name = "Вн" + v_num;
			//doc.Name = doc.Name.Replace("#DocumenID#", "Вн" + v_num);
			doc.Save();
		} 
		else
		{
			name = doc.InternalNumber;
		}
		return new FormatedValue(name);
	}
}