новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума

Как работает автозаполнение в конфигурации "Управление торговлей" редакции 11.

  • Добавить свою публикацию
  • для этого требуется регистрация

Введение

В конфигурации "Управление торговлей" ред. 11 нет как таковых настроек пользователей для автозаполнения реквизитов создаваемых элементов справочников или документов как это было, например, в УТ версии 10.3 или УПП 1.3.

Изображение

Теперь в конфигурации есть некоторые зачатки "разума", по которым программа самостоятельно определяет какое значение в реквизит документа нужно подставлять.

Далее рассмотрим принцип работы автозаполнения в конфигурации УТ 11.

"Интеллектуальная система"

Обратимся к документу "Заказ клиента". При его создании, вне зависимости от наличия документа-основания, выполняется процедура-обработчик модуля объекта:

"ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)"

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

Для документа "Заказ клиента" программный код обработчика заполнения следующий:

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)	
	ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);
	
	ЗаполнитьПоЗначениямАвтозаполнения(ДанныеЗаполнения);
	
	Если ТипДанныхЗаполнения = Тип("Структура") Тогда
		ЗаполнитьДокументПоОтбору(ДанныеЗаполнения);
	ИначеЕсли ТипДанныхЗаполнения = Тип("СправочникСсылка.Партнеры") Тогда
		ЗаполнитьДокументНаОснованииПартнера(ДанныеЗаполнения);
	ИначеЕсли ТипДанныхЗаполнения = Тип("СправочникСсылка.СделкиСКлиентами") Тогда
		ЗаполнитьДокументНаОснованииСделкиПоПродаже(ДанныеЗаполнения);
	ИначеЕсли ТипДанныхЗаполнения = Тип("ДокументСсылка.КоммерческоеПредложениеКлиенту") Тогда
		ЗаполнитьДокументНаОснованииКоммерческогоПредложенияКлиенту(ДанныеЗаполнения);
	ИначеЕсли ТипДанныхЗаполнения = Тип("СправочникСсылка.СоглашенияСКлиентами") Тогда
		ЗаполнитьДокументНаОснованииИндивидуальногоСоглашенияСКлиентом(ДанныеЗаполнения);
	ИначеЕсли ТипДанныхЗаполнения = Тип("ДокументСсылка.ЗаданиеТорговомуПредставителю") Тогда
		ЗаполнитьДокументНаОснованииЗаданияТорговомуПредставителю(ДанныеЗаполнения);
	КонецЕсли;
	
	ИнициализироватьУсловияПродаж();
	ИнициализироватьДокумент(ДанныеЗаполнения);
КонецПроцедуры

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

 Процедура ЗаполнитьПоЗначениямАвтозаполнения(ДанныеЗаполнения = Неопределено)
	
	ЕстьДанныеЗаполнения = (НЕ ДанныеЗаполнения = Неопределено);
	ДанныеЗаполненияСтруктура = (ТипЗнч(ДанныеЗаполнения) = Тип("Структура"));
	
	Если Не ЕстьДанныеЗаполнения Или ДанныеЗаполненияСтруктура И НЕ ДанныеЗаполнения.Свойство("ДокументОснование") Тогда
		// Заполним основные свойства
		СвойстваАвтозаполнения = Новый Структура("Организация, Склад, ХозяйственнаяОперация");
		СтрокаКлючиСтруктуры = СокрЛП(ОбменДаннымиСобытия.КлючиСтруктурыВСтроку(СвойстваАвтозаполнения));
		
		Если ДанныеЗаполненияСтруктура Тогда
			ЗаполнитьЗначенияСвойств(СвойстваАвтозаполнения, ДанныеЗаполнения);
		КонецЕсли;
		
		ОбщегоНазначенияУТ.ЗаполнитьЗначенияСвойствАвтозаполнения(Ссылка, СвойстваАвтозаполнения);
		
		ЗаполнитьЗначенияСвойств(ЭтотОбъект, СвойстваАвтозаполнения, СтрокаКлючиСтруктуры);
		
		// Заполним банковский счет и кассу в зависимости от организации
		СвойстваАвтозаполнения = Новый Структура("Организация, БанковскийСчет, Касса", Организация);
		СтрокаКлючиСтруктуры = СокрЛП(ОбменДаннымиСобытия.КлючиСтруктурыВСтроку(СвойстваАвтозаполнения));
		
		Если ДанныеЗаполненияСтруктура Тогда
			ЗаполнитьЗначенияСвойств(СвойстваАвтозаполнения, ДанныеЗаполнения);
		КонецЕсли;
		
		ОбщегоНазначенияУТ.ЗаполнитьЗначенияСвойствАвтозаполнения(Ссылка, СвойстваАвтозаполнения);
		
		ЗаполнитьЗначенияСвойств(ЭтотОбъект, СвойстваАвтозаполнения, СтрокаКлючиСтруктуры);
		
	КонецЕсли;КонецПроцедуры

В случае, если данные заполнения не определены, то такие реквизиты как "Организация", "Склад" и "ХозяйственнаяОперация" заполняются автоматически с помощью процедуры "ЗаполнитьЗначенияСвойствАвтозаполнения" общего модуля "ОбщегоНазначенияУТ". При этом, если данные заполнения все же были переданы в виде структуры или документа, то при наличии значения заполнения в них, приоритет отдается данным заполнения.

Обратимся к процедуре "ЗаполнитьЗначенияСвойствАвтозаполнения":

 // Получает значения автозаполнения по статистике и заполняет ими переданную структуру
// Заполненные свойства не перезаполняются и выступают в роли отбора
// Свойства, которые не найдены в метаданных объекта удаляются из структуры
// 
// Параметры:
// ОбъектСсылка - ДокументСсылка - ссылка на заполняемый документ
// СвойстваАвтозаполнения - Структура - свойства, которые нужно заполнить
//
Процедура ЗаполнитьЗначенияСвойствАвтозаполнения(ОбъектСсылка, СвойстваАвтозаполнения) Экспорт
	// ....
КонецПроцедуры

 В соответствии с описанием процедуры, первым параметром передается ссылка на документ, вторым - структура полей для автозаполнения. По тем полям в структуре, для которых не установлено значение заполнения, система формируем запрос на получение последних пяти элементов (в нашем случае документов "Заказ клиента"), в которых получает часто использованные значения заполнения. Вот пример запроса для документа "Заказ клиента":

"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 5
|	СтатистикаСДатами.ОбъектПоиска КАК ОбъектПоиска,
|	СУММА(СтатистикаСДатами.Использование) КАК ОбщийВес
|ПОМЕСТИТЬ Статистика_Организация
|ИЗ
|	(ВЫБРАТЬ ПЕРВЫЕ 5
|		ВидДокумента.Организация КАК ОбъектПоиска,
|		1 КАК Использование
|	ИЗ
|		Документ.ЗаказКлиента КАК ВидДокумента
|	ГДЕ
|		НЕ ВидДокумента.ПометкаУдаления
|		И ВидДокумента.Автор = &Автор
|	
|	УПОРЯДОЧИТЬ ПО
|		ВидДокумента.Дата УБЫВ) КАК СтатистикаСДатамиСГРУППИРОВАТЬ ПО
|	СтатистикаСДатами.ОбъектПоискаУПОРЯДОЧИТЬ ПО
|	ОбщийВес УБЫВ
|;////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	СУММА(Статистика.ОбщийВес) КАК ОбщийВес
|ПОМЕСТИТЬ ОбщееКоличество_Организация
|ИЗ
|	Статистика_Организация КАК Статистика
|;////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	ВложенныйЗапрос.ОбъектПоиска
|ИЗ
|	(ВЫБРАТЬ
|		Статистика.ОбъектПоиска КАК ОбъектПоиска,
|		100 * Статистика.ОбщийВес / ОбщееКоличество.ОбщийВес КАК ВесПоСтатистике
|	ИЗ
|		Статистика_Организация КАК Статистика
|			ЛЕВОЕ СОЕДИНЕНИЕ ОбщееКоличество_Организация КАК ОбщееКоличество
|			ПО (ИСТИНА)) КАК ВложенныйЗапрос
|ГДЕ
|	ВложенныйЗапрос.ВесПоСтатистике > 50
|;////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 5
|	СтатистикаСДатами.ОбъектПоиска КАК ОбъектПоиска,
|	СУММА(СтатистикаСДатами.Использование) КАК ОбщийВес
|ПОМЕСТИТЬ Статистика_Склад
|ИЗ
|	(ВЫБРАТЬ ПЕРВЫЕ 5
|		ВидДокумента.Склад КАК ОбъектПоиска,
|		1 КАК Использование
|	ИЗ
|		Документ.ЗаказКлиента КАК ВидДокумента
|	ГДЕ
|		НЕ ВидДокумента.ПометкаУдаления
|		И ВидДокумента.Автор = &Автор
|	
|	УПОРЯДОЧИТЬ ПО
|		ВидДокумента.Дата УБЫВ) КАК СтатистикаСДатамиСГРУППИРОВАТЬ ПО
|	СтатистикаСДатами.ОбъектПоискаУПОРЯДОЧИТЬ ПО
|	ОбщийВес УБЫВ
|;////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	СУММА(Статистика.ОбщийВес) КАК ОбщийВес
|ПОМЕСТИТЬ ОбщееКоличество_Склад
|ИЗ
|	Статистика_Склад КАК Статистика
|;////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	ВложенныйЗапрос.ОбъектПоиска
|ИЗ
|	(ВЫБРАТЬ
|		Статистика.ОбъектПоиска КАК ОбъектПоиска,
|		100 * Статистика.ОбщийВес / ОбщееКоличество.ОбщийВес КАК ВесПоСтатистике
|	ИЗ
|		Статистика_Склад КАК Статистика
|			ЛЕВОЕ СОЕДИНЕНИЕ ОбщееКоличество_Склад КАК ОбщееКоличество
|			ПО (ИСТИНА)) КАК ВложенныйЗапрос
|ГДЕ
|	ВложенныйЗапрос.ВесПоСтатистике > 50
|;////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 5
|	СтатистикаСДатами.ОбъектПоиска КАК ОбъектПоиска,
|	СУММА(СтатистикаСДатами.Использование) КАК ОбщийВес
|ПОМЕСТИТЬ Статистика_ХозяйственнаяОперация
|ИЗ
|	(ВЫБРАТЬ ПЕРВЫЕ 5
|		ВидДокумента.ХозяйственнаяОперация КАК ОбъектПоиска,
|		1 КАК Использование
|	ИЗ
|		Документ.ЗаказКлиента КАК ВидДокумента
|	ГДЕ
|		НЕ ВидДокумента.ПометкаУдаления
|		И ВидДокумента.Автор = &Автор
|	
|	УПОРЯДОЧИТЬ ПО
|		ВидДокумента.Дата УБЫВ) КАК СтатистикаСДатамиСГРУППИРОВАТЬ ПО
|	СтатистикаСДатами.ОбъектПоискаУПОРЯДОЧИТЬ ПО
|	ОбщийВес УБЫВ
|;////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	СУММА(Статистика.ОбщийВес) КАК ОбщийВес
|ПОМЕСТИТЬ ОбщееКоличество_ХозяйственнаяОперация
|ИЗ
|	Статистика_ХозяйственнаяОперация КАК Статистика
|;////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	ВложенныйЗапрос.ОбъектПоиска
|ИЗ
|	(ВЫБРАТЬ
|		Статистика.ОбъектПоиска КАК ОбъектПоиска,
|		100 * Статистика.ОбщийВес / ОбщееКоличество.ОбщийВес КАК ВесПоСтатистике
|	ИЗ
|		Статистика_ХозяйственнаяОперация КАК Статистика
|			ЛЕВОЕ СОЕДИНЕНИЕ ОбщееКоличество_ХозяйственнаяОперация КАК ОбщееКоличество
|			ПО (ИСТИНА)) КАК ВложенныйЗапрос
|ГДЕ
|	ВложенныйЗапрос.ВесПоСтатистике > 50"

Вот такой огромный, "страшный" запрос выполняется при каждом создании заказа клиента без документа-основания или других данных заполнения. Если кратко, то запрос получает 5 ближайших документов не помеченных на удаление, где автор документа - это текущий пользователь. Далее рассчитывается общий весь и вес каждого из значения реквизита. И в результате запрос возвращает значение, которое пользователь использовал наибольшее число раз. 

В запросе выше описанная операция выполняется трижды, для каждого из реквизитов автозаполнения: для организации, для склада и для хоз. операции. На листинге процедуры "ЗаполнитьЗначенияСвойствАвтозаполнения" выше Вы также могли видеть, что автозаполнение для заказа покупателя выполняется для реквизитов "БанковскийСчет" и "Касса".

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

 
0
Читайте также
Пример перевода конфигурации на управляемый интерфейс
Когда количество изменений на предприятии превышает критический уровень в сторону необновляемых конфигураций - 1С предлагает создание управляемого приложения
Разработки
Свободное проведение документов
Срочное перепроведение документов
Счет на оплату и Акт выполненных услуг
Для БП 2.0 Счет на оплату и Акт выполненых услуг на одном листе
Автоматическое заполнение ЗСО
Обработка для заполнения Зачисление Свойств Объектов
Еще от автора
≡ к списку статей