Самостоятельная организация подборов в документах

11.02.19

Разработка - Универсальные функции

В заметке приводится пример организации подборов в документах.

При написании конфигурации с нуля, я столкнулся с задачей организации подборов в документах. Все что я накопал по этому вопросу, сводилось либо к совсем простеньким подборам, в рамках задачи по управляемым формам на экзамене на Спеца по платформе, что было недостаточно, либо к сложным обработкам, обширный функционал которых был явно избыточен для моей задачи. В итоге, посидев и немного подумав, я сделал свой вариант, который, не претендуя ни на что особенное,  устроил меня в рамках выполняемой задачи. Может, кому-то пригодится и сэкономит время.

В МодулеФормы документа из которого осуществляется подбор разместил две процедуры:

&НаКлиенте
Процедура Подобрать(Команда)
		
	 //Проверка заполнение ревизитов ВидЦены и Склад
	Если НЕ ЗначениеЗаполнено(Объект.ВидЦены) Тогда
		Предупреждение("Заполните Вид цены!");	
	ИначеЕсли НЕ ЗначениеЗаполнено(Объект.Склад) Тогда
		Предупреждение("Заполните Склад!");
	Иначе
		//Создадим и заполним структуру передаваемых параметров
		ПараметрыОтбора = Новый Структура;
		ПараметрыОтбора.Вставить("ВидЦены", Объект.ВидЦены);
		ПараметрыОтбора.Вставить("Склад",Объект.Склад);
		
	Если РасчетыНаСервере.ЗначениеКонстанты() = Истина Тогда	
		//Откроем форму подбора справочника Номенклатура
		ФормаПодбора = ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаПодбораСХарактеристиками", ПараметрыОтбора, Элементы.Товары);
	Иначе
		 ФормаПодбора = ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаВыбораТовБезХарактеристик", ПараметрыОтбора, Элементы.Товары);
	КонецЕсли;
	
	КонецЕсли;
КонецПроцедуры


&НаКлиенте
Процедура ТоварыОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	Для Каждого СтрокаТЧ из ВыбранноеЗначение Цикл
		ТекСтрока = Объект.Товары.Добавить();
		ТекСтрока.Номенклатура = СтрокаТЧ.Номенклатура;
		
	Если РасчетыНаСервере.ЗначениеКонстанты() = Истина Тогда
		ТекСтрока.Характеристика = СтрокаТЧ.Характеристика;
	Иначе
		 ТекСтрока.Характеристика = "";
	КонецЕсли;
	
		ТекСтрока.Количество =  СтрокаТЧ.Количество;
		ДанныеСтруктура = Новый Структура("СтавкаНДС, ВидНоменклатуры, ЕденицаИзмерения",,,,);
		Структура =  РасчетыНаСервере.ПолучитьДанныеНоменклатуры(ДанныеСтруктура, ТекСтрока.Номенклатура);
		ТекСтрока.СтавкаНДС = Структура.СтавкаНДС;
		ТекСтрока.ВидНоменклатуры = Структура.ВидНоменклатуры;
		ТекСтрока.ЕденицаИзмерения = Структура.ЕденицаИзмерения;
		
		РасчетыНаКлиенте.ОбработкаЦены(ТекСтрока, ТекСтрока.Характеристика, Объект);
		
		РасчетыНаКлиенте.ПересчитатьСтроку(ТекСтрока, Объект);
	КонецЦикла;
	
КонецПроцедуры

Создал ФормуПодбора, в ней разместил реквизиты формы ИерархияНоменклатуры(ДинамическийСписок:  Основная таблица - СправочникНоменклатура), Список(ТаблицаЗначений ) и ОтобранныеТовары(ТаблицаЗначений)  в модуле формы разместил несколько процедур

&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)//Выбор номенклатуры кликом
	ТекСтрока = Элементы.Список.ТекущиеДанные;
	
	Структура = Новый Структура("Номенклатура, Характеристика, Цена", ТекСтрока.Номенклатура,ТекСтрока.Характеристика, ТекСтрока.Цена);
	  		
	СтандартнаяОбработка = ЛОЖЬ;
	//Поиск идентичной номенклатуры в ТаблицеЗначений	
	Строка = ОтобранныеТовары.НайтиСтроки(Новый Структура("Номенклатура, Характеристика, Цена", Структура.Номенклатура, Структура.Характеристика, Структура.Цена));	
	//Если Номенклатура уже записана то просто добавляем 1 к Количеству
	Если Строка.Количество() > 0 Тогда
	     Строка[0].Количество = Строка[0].Количество+1;
		 Строка[0].Сумма = Строка[0].Количество * Строка[0].Цена;
    Иначе//Создаем новый элемент
		 НовСтр = ОтобранныеТовары.Добавить();	
		 НовСтр.Номенклатура = ТекСтрока.Номенклатура;
		 НовСтр.Характеристика = ТекСтрока.Характеристика;
		 НовСтр.Количество = 1;
		 НовСтр.Цена = ТекСтрока.Цена;
		 НовСтр.Сумма = ТекСтрока.Цена;
	КонецЕсли; 
КонецПроцедуры


&НаКлиенте
Процедура СписокНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, Выполнение)//Выбор номенклатуры перетаскиванием	
	ТекСтрока = Элементы.Список.ТекущиеДанные;
	
	Структура = Новый Структура("Номенклатура, Характеристика, Цена", ТекСтрока.Номенклатура,ТекСтрока.Характеристика, ТекСтрока.Цена);
	  		
	СтандартнаяОбработка = ЛОЖЬ;
	//Поиск идентичной номенклатуры в ТаблицеЗначений	
	Строка = ОтобранныеТовары.НайтиСтроки(Новый Структура("Номенклатура, Характеристика", Структура.Номенклатура, Структура.Характеристика));	
	//Если Номенклатура уже записана то просто добавляем 1 к Количеству
	Если Строка.Количество() > 0 Тогда
	     Строка[0].Количество = Строка[0].Количество+1;
		 Строка[0].Сумма = Строка[0].Количество * Строка[0].Цена;
    Иначе//Создаем новый элемент
		 НовСтр = ОтобранныеТовары.Добавить();	
		 НовСтр.Номенклатура = ТекСтрока.Номенклатура;
		 НовСтр.Характеристика = ТекСтрока.Характеристика;
		 НовСтр.Количество = 1;
		 НовСтр.Цена = ТекСтрока.Цена;
		 НовСтр.Сумма = ТекСтрока.Цена;
	КонецЕсли; 
КонецПроцедуры


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)//Параметры передаваемые из Документа для запроса
	 ВидЦены = Параметры.ВидЦены;
	 Склад =Параметры.Склад;
	 Дата = Параметры.Дата;
КонецПроцедуры

&НаКлиенте
Процедура ПеренестиВДокумент(Команда)
	ОповеститьОВыборе(ОтобранныеТовары);
КонецПроцедуры



&НаСервере
Функция ЗаполнитьСписокНаСервере(Родитель)
		
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	ЕСТЬNULL(ОстаткиНаСкладахОстатки.Характеристика, ЦеныНоменклатурыСрезПоследних.Характеристика) КАК Характеристика,
		|	ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.ВидЦены, """") КАК ВидЦены,
		|	ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена,
		|	ЕСТЬNULL(ОстаткиНаСкладахОстатки.Склад, """") КАК Склад,
		|	ЕСТЬNULL(ОстаткиНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
		|	ОстаткиНаСкладахОстатки.Номенклатура КАК Номенклатура
		|ПОМЕСТИТЬ ВТ
		|ИЗ
		|	РегистрНакопления.ОстаткиНаСкладах.Остатки(&Дата, Склад = &Склад) КАК ОстаткиНаСкладахОстатки
		|		ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
		|		ПО ОстаткиНаСкладахОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
		|			И ОстаткиНаСкладахОстатки.Характеристика = ЦеныНоменклатурыСрезПоследних.Характеристика
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	СпрНоменклатура.Ссылка КАК Номенклатура,
		|	ВТ.Характеристика КАК Характеристика,
		|	ВТ.ВидЦены КАК ВидЦены,
		|	ВТ.Цена КАК Цена,
		|	ВТ.Склад КАК Склад,
		|	ВТ.КоличествоОстаток КАК КоличествоОстаток
		|ИЗ
		|	Справочник.Номенклатура КАК СпрНоменклатура
		|		ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ
		|		ПО СпрНоменклатура.Ссылка = ВТ.Номенклатура
		|ГДЕ
		|	СпрНоменклатура.Родитель = &Родитель
		|	И СпрНоменклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Справочник.ВидыНоменклатуры.Товар)";
	
	Запрос.УстановитьПараметр("ВидЦены", ВидЦены);
	Запрос.УстановитьПараметр("Дата", Дата);
	Запрос.УстановитьПараметр("Склад", Склад);
	Запрос.УстановитьПараметр("Родитель", Родитель);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВДЗ = РезультатЗапроса.Выбрать();
	
	Список.Очистить();
	Пока ВДЗ.Следующий() Цикл
		Строка = Список.Добавить();
		Строка.Номенклатура = ВДЗ.Номенклатура;
		Строка.Характеристика = ВДЗ.Характеристика;
		Строка.Склад = ВДЗ.Склад;
		Строка.Цена = ВДЗ.Цена;
		Строка.ВидЦены = ВДЗ.ВидЦены;
		Строка.КоличествоОстаток = ВДЗ.КоличествоОстаток;
	КонецЦикла;
		
КонецФункции


&НаКлиенте
Процедура ИерархияНоменклатурыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	Родитель = Элементы.ИерархияНоменклатуры.ТекущаяСтрока;
	ЗаполнитьСписокНаСервере(Родитель);
КонецПроцедуры


Вот собственно и все. 

 

Чуть чуть улучшил функционал обработки, сделав аналог полнотекстового поиска при большом количестве номенклатуры. Для этого добавил реквизит формы ОтборНаименование с типом Строка. Код разместил в модуле ФормыПодбора

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
	ПеречитатьТабЧасть();
КонецПроцедуры

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
	ПеречитатьТабЧасть();
КонецПроцедуры

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

&НаКлиенте
Процедура ОтборНаименованиеОчистка(Элемент, СтандартнаяОбработка)
	УстановитьОтбор("НаименованиеНоменклатуры","");
КонецПроцедуры


&НаКлиенте
Процедура ОтборНаименованиеИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
	УстановитьОтбор("НаименованиеНоменклатуры",Текст);
КонецПроцедуры

&НаКлиенте
Процедура УстановитьОтбор (ТекЭлементОтбора,ТекЗначениеОтбора)
	
	СтруктураПоиска = Новый Структура;
	
	Если ТекЗначениеОтбора <> "" Тогда
		СтруктураПоиска.Вставить(ТекЭлементОтбора,ТекЗначениеОтбора);
	КонецЕсли;
	
	Элементы.Список.ОтборСтрок = Новый ФиксированнаяСтруктура(СтруктураПоиска);
	
КонецПроцедуры

 

подборы товаров из документа и скрины

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2686    1    John_d    8    

55

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4620    atdonya    22    

45

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    3965    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8852    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2078    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16159    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7245    quazare    8    

109
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. CheBurator 3119 14.11.18 04:12 Сейчас в теме
Категорически форма похожа на форму подбора из ТиС 77
3. srub 84 14.11.18 09:29 Сейчас в теме
(1)
Хотите верьте хотите нет, но я не видел ранее этой формы, и решал эту задачу самостоятельно применительно к своей самописной конфигурации. Данная архитектура была выбрана мной чтобы сохранить иерархию с Справочнике Номенклатура, так как использование характеристик сильно затруднило процесс. Я посмотрел как это устроено в Рознице и взял оттуда идею использовать ТаблицуЗначений Иерархия Номенклатуры, дальше все это чисто моя самодеятельность так как в типовой все очень сложно и много того что мне было просто не нужно. Так что это самостоятельное решение не содранное у кого, которое можно критиковать за какие то косяки, но оно меня устраивает применительно к решаемой задаче. Я выложил это здесь чтобы сэкономить кому то нужное время. И отнюдь не всегда внешнее сходство, подразумевает сходство реализации решения))) Вы сравните код, если у Вас есть код той обработки и тогда говорите о сходстве.
4. CheBurator 3119 14.11.18 23:25 Сейчас в теме
да я, вообще-то, и не ругаюсь...
5. srub 84 15.11.18 09:30 Сейчас в теме
(4)
Вас понял)) Есть какие то общие решения удобные для пользователя и такое расположение полей мне показалось очень удобным.))
6. srub 84 13.02.19 14:25 Сейчас в теме
Добавил в подбор поиск по строке
Оставьте свое сообщение