Получить параметры из регистра сведений

1. Troler 10 09.10.18 12:53 Сейчас в теме
Добрый день! Направьте на путь истинный!

Исходные Данные 8-ка, обычные формы
Есть Регистр Сведений с измерением "Номенклатура" (может принимать значение группы и элемента) и ресурсом "Ограничение скидки" тип число;

Нужно получить данные "Ограничение скидки" из этого регистра по элементу "Номенклатура"
если запись имеет соответствие Элементу то по элементу иначе значение самого близкого родителя.

Можно ли получить запросом? чтоб в условие передать массив элементов для которых необходимо получить данные
По теме из базы знаний
Ответы
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
4. Doreng 27 09.10.18 12:58 Сейчас в теме
(1)Как вариант из регистров данные можно получать отбором, как из таблицы значений
14. alex-l19041 8 09.10.18 13:37 Сейчас в теме
(1) будет быстрее поиск по регистру (только по номенклатуре), если при записи этого реквизита для группы номенклатуры, в регистр писать такое же значение для всей вложенной номенклатуры, кроме той для которой индивидуально задали.
15. Octopus 337 09.10.18 13:42 Сейчас в теме
(14) И получить головную боль отслеживания изменения в иерархии номенклатуры? Перетащили элемент из группы в группу, саму группу переподчинили другой - вариаций прилично
16. Troler 10 09.10.18 13:43 Сейчас в теме
(14) так было бы проще, у меня по регл. заданию каждые две мин. система должна выгружать данные по номенклатуре и получать актуальное значение ограничения, поэтому если пользователь создал или переместил номенклатуру в группах то она автоматом получит это значение согласно иерархии
19. Octopus 337 09.10.18 13:45 Сейчас в теме
(16) Случай, когда пользователь изменил иерархию групп, не меняя подчинение элемента, у вас обрабатывается?
2. feva 518 09.10.18 12:55 Сейчас в теме
3. feva 518 09.10.18 12:57 Сейчас в теме
Как вариант - колхозить несколько иерархий для запроса, или поломать голову и через вложенный запрос понаходить родителей
6. Troler 10 09.10.18 13:02 Сейчас в теме
(3) Голову поломал, не могу выудить запросом, может уже вошел в ступор (((
5. Troler 10 09.10.18 13:01 Сейчас в теме
Так что запихнуть в отбор? На входе есть элемент в регистре может быть элемент или группа любой вложенности
7. Doreng 27 09.10.18 13:12 Сейчас в теме
(5)Что хотите, то и пихайте
Например
Отбор.Вставить("Номенклатура",Строка.Номенклатура);
Отбор.Вставить("ЭтоГруппа",Ложь);
9. Troler 10 09.10.18 13:18 Сейчас в теме
(7) а как быть если регистре группа верхнего уровня а поиск нужен по элементу более низкого уровня,
+ на входе может быть массив из 20-50К элементов, по каждому элементу дергать регистр в цикле?
8. Doreng 27 09.10.18 13:17 Сейчас в теме
(5)А , я кажется начинаю понимать, что Вам нужно, нужно написать запрос и если количество записей в результате будет 0, тогда 2-й запрос по родителю?
10. Troler 10 09.10.18 13:21 Сейчас в теме
(8) на входе может быть массив из 20-50К элементов, и для одних могут найтись соответствия для других надо подыматься по иерархии вверх пока не найдет значение
11. Doreng 27 09.10.18 13:28 Сейчас в теме
(10)Сочинил цикл с отбором, за быстродействие не ручаюсь, но тут смысл не в этом, можно отбор и запросом заменить.
Процедура ОперацияРегистр(Номенклатура)
НаборЗаписей = РегистрыСведений.АдресныйКлассификатор.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор = Номенклатура;
НаборЗаписей.Отбор.Регистратор.ЭтоГруппа = Ложь;
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() = 0 Тогда
	Пока НаборЗаписей.Количество() <> 0 Цикл
Номенклатура = Номенклатура.Родитель;
НаборЗаписей.Отбор.Регистратор = Номенклатура;
НаборЗаписей.Отбор.Регистратор.ЭтоГруппа = Истина;
НаборЗаписей.Прочитать();
	ОбработкаПрерыванияПользователя();	
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры

Показать
12. Doreng 27 09.10.18 13:31 Сейчас в теме
(10)Можно вообще запросом дернуть все записи в ТЗ и поиском их дергать, если быстродействие сильно беспокоит
17. Octopus 337 09.10.18 13:44 Сейчас в теме
(12) Очень плохая идея для случая большого количества записей
13. vadim1011985 99 09.10.18 13:33 Сейчас в теме
(1) Возьмите за основу типовой регистр Счета Учета номенклатуры и посмотрите как там это организованно

вот пример для БП 3.0 - думаю не составить труда переделать под себя

Р.S привел только сам код нужный функции - вложенные функции сможете найти сами

Функция ПолучитьСчетаУчетаСпискаНоменклатуры(Организация, СписокНоменклатуры, Склад = Неопределено, Знач Дата = Неопределено, Знач ОсобыйПорядокНалогообложения = Ложь) Экспорт
	
	Результат	= Новый Соответствие;
	Если СписокНоменклатуры.Количество() = 0 Тогда
		Возврат Результат;
	КонецЕсли;
	
	Если Не ПравоДоступа("Чтение", Метаданные.РегистрыСведений.СчетаУчетаНоменклатуры) Тогда
		Возврат Результат;
	КонецЕсли;
	
	ПустойСчет = ПланыСчетов.Хозрасчетный.ПустаяСсылка();
    ПустойСпособУчетаНДС = Перечисления.СпособыУчетаНДС.ПустаяСсылка();
	
	Дата = ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса());
	
	Для Каждого Номенклатура Из СписокНоменклатуры Цикл
		Если Номенклатура = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		СтруктураВозврата = Новый Структура();
		СтруктураВозврата.Вставить("СчетУчета",						ПустойСчет);
		СтруктураВозврата.Вставить("СчетУчетаЯвляетсяЗабалансовым",	Ложь);
		СтруктураВозврата.Вставить("СчетУчетаНДС",					ПустойСчет);
		СтруктураВозврата.Вставить("СчетУчетаНДСПродажи",			ПустойСчет);
		СтруктураВозврата.Вставить("СчетНДСТаможни",				ПустойСчет);
		СтруктураВозврата.Вставить("СчетУчетаДавСырья",				ПустойСчет);
		СтруктураВозврата.Вставить("СчетПередачи",					ПустойСчет);
		СтруктураВозврата.Вставить("СчетПередачиЗаб",				ПустойСчет);
		СтруктураВозврата.Вставить("СчетДоходов",					ПустойСчет);
		СтруктураВозврата.Вставить("СчетРасходов",					ПустойСчет);
		СтруктураВозврата.Вставить("Субконто1",						Неопределено);
		СтруктураВозврата.Вставить("Субконто2",						Неопределено);
		СтруктураВозврата.Вставить("Субконто3",						Неопределено);
		СтруктураВозврата.Вставить("СпособУчетаНДС",				ПустойСпособУчетаНДС);
		
		Результат.Вставить(Номенклатура, СтруктураВозврата);
	КонецЦикла;

	МассивОрганизаций = Новый Массив();
	МассивОрганизаций.Добавить(Справочники.Организации.ПустаяСсылка());
	МассивОрганизаций.Добавить(Организация);
	
	МассивСкладов = Новый Массив();
	МассивСкладов.Добавить(Справочники.Склады.ПустаяСсылка());
	
	МассивТиповСкладов = Новый Массив();
	МассивТиповСкладов.Добавить(Перечисления.ТипыСкладов.ПустаяСсылка());
	
	ТипСклада = Неопределено;
	Если ЗначениеЗаполнено(Склад) Тогда
		ТипСклада = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Склад, "ТипСклада");
		МассивСкладов.Добавить(Склад);
		МассивТиповСкладов.Добавить(ТипСклада);
	КонецЕсли;
	
	Если ОсобыйПорядокНалогообложения <> Неопределено Тогда 
		
		// Для совместимости с предыдущими версиями.
		// В новых версиях ОсобыйПорядокНалогообложения учитывается в СчетаУчетаВДокументах.
		
		РозницаЕНВД = Ложь;
		Если ЗначениеЗаполнено(ТипСклада) Тогда
			ДополнительныеПараметрыОсобыйПорядокНалогообложения = Новый Структура;               // См. РеализацияОсобыйПорядокНалогообложения
			ДополнительныеПараметрыОсобыйПорядокНалогообложения.Вставить("ЭтоУслуга", Ложь);     // Допущение принято в режиме совместимости
			ДополнительныеПараметрыОсобыйПорядокНалогообложения.Вставить("ТипСклада", ТипСклада);
			ОсобыйПорядок = УчетДоходовРасходов.РеализацияОсобыйПорядокНалогообложения(
				Организация,
				Дата,
				ДополнительныеПараметрыОсобыйПорядокНалогообложения);
			РозницаЕНВД = (ОсобыйПорядок.Результат = Истина); // Достаточно оснований полагать, что это ЕНВД
        КонецЕсли;
		
		ОсобыйПорядокНалогообложения = ОсобыйПорядокНалогообложения Или РозницаЕНВД;
		
	КонецЕсли;
		
	//Проверим, указаны ли группы номенклатуры в счетах учета
	Запрос = Новый Запрос();
	Запрос.Текст = 
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	СчетаУчетаНоменклатуры.Номенклатура
	|ИЗ
	|	РегистрСведений.СчетаУчетаНоменклатуры КАК СчетаУчетаНоменклатуры
	|ГДЕ
	|	СчетаУчетаНоменклатуры.Номенклатура.ЭтоГруппа";
	
	ЕстьНоменклатура = НЕ Запрос.Выполнить().Пустой();
	
	ТаблицаИерархии = Новый ТаблицаЗначений;
	ТаблицаИерархии.Колонки.Добавить("Элемент",		Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
	ТаблицаИерархии.Колонки.Добавить("Родитель",	Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
	ТаблицаИерархии.Колонки.Добавить("Уровень",		ОбщегоНазначения.ОписаниеТипаЧисло(10, 0));
	
	//Если есть группы номенклатуры в счетах учета, построим иерархию номенклатуры
	Если ЕстьНоменклатура Тогда
				
		СоответствиеЭлементовИГрупп = ОбщегоНазначенияБПВызовСервера.ПолучитьСписокВышеСтоящихГруппЭлементов(СписокНоменклатуры);
		
		Для каждого Номенклатура Из СписокНоменклатуры Цикл
			
			НоваяСтрока = ТаблицаИерархии.Добавить();
			НоваяСтрока.Элемент		= Номенклатура;
			
			НоваяСтрока = ТаблицаИерархии.Добавить();
			НоваяСтрока.Элемент		= Номенклатура;
			НоваяСтрока.Родитель	= Номенклатура;
			
			СписокГрупп = СоответствиеЭлементовИГрупп.Получить(Номенклатура);
			Если СписокГрупп = Неопределено Тогда
				НоваяСтрока.Уровень = 1;
				Продолжить;
			КонецЕсли;
			
			КоличествоВышеСтоящихГрупп = СписокГрупп.Количество();
			
			НоваяСтрока.Уровень = КоличествоВышеСтоящихГрупп + 1;
			
			Для Индекс = 1 По КоличествоВышеСтоящихГрупп Цикл
				НоваяСтрока = ТаблицаИерархии.Добавить();
				НоваяСтрока.Элемент	= Номенклатура;
				НоваяСтрока.Родитель= СписокГрупп[Индекс - 1];
				НоваяСтрока.Уровень	= КоличествоВышеСтоящихГрупп - Индекс + 1;
			КонецЦикла;						
		КонецЦикла;
	//Если в счетах учета указаны только элементы номенклатуры, иерархию можно не строить
	Иначе
		
		Для каждого Номенклатура Из СписокНоменклатуры Цикл
			ВидНоменклатуры = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Номенклатура,	"ВидНоменклатуры");
			
			НоваяСтрока = ТаблицаИерархии.Добавить();
			НоваяСтрока.Элемент		= Номенклатура;
			
			НоваяСтрока = ТаблицаИерархии.Добавить();
			НоваяСтрока.Элемент		= Номенклатура;
			НоваяСтрока.Родитель	= Номенклатура;
			НоваяСтрока.Уровень = 1;
			
		КонецЦикла;
		
	КонецЕсли;
	
	НоваяСтрока = ТаблицаИерархии.Добавить();	// Корень
	
	МассивНоменклатуры = ОбщегоНазначения.ВыгрузитьКолонку(ТаблицаИерархии, "Родитель", Истина);
	
	Запрос = Новый Запрос();
	Запрос.УстановитьПараметр("МассивОрганизаций",	МассивОрганизаций);
	Запрос.УстановитьПараметр("МассивОрганизаций",	МассивОрганизаций);
	Запрос.УстановитьПараметр("СписокНоменклатуры",	СписокНоменклатуры);
	Запрос.УстановитьПараметр("МассивНоменклатуры",	МассивНоменклатуры);
	Запрос.УстановитьПараметр("ТаблицаИерархии",	ТаблицаИерархии);
	Запрос.УстановитьПараметр("МассивСкладов",		МассивСкладов);
	Запрос.УстановитьПараметр("МассивТиповСкладов",	МассивТиповСкладов);
	Запрос.УстановитьПараметр("ПустойСчет",			ПланыСчетов.Хозрасчетный.ПустаяСсылка());
	Если ОсобыйПорядокНалогообложения = Неопределено Тогда
		// Возвращаем данные "как есть". ОсобыйПорядокНалогообложения будет учтен в СчетаУчетаВДокументах.
		Запрос.УстановитьПараметр("Счет_Выручка",				ПланыСчетов.Хозрасчетный.ПустаяСсылка());
		Запрос.УстановитьПараметр("Счет_СебестоимостьПродаж",	ПланыСчетов.Хозрасчетный.ПустаяСсылка());
	Иначе
		// Для совместимости с предыдущей версией
		Запрос.УстановитьПараметр("Счет_Выручка",				?(ОсобыйПорядокНалогообложения, ПланыСчетов.Хозрасчетный.ВыручкаЕНВД,             ПланыСчетов.Хозрасчетный.ВыручкаНеЕНВД));
		Запрос.УстановитьПараметр("Счет_СебестоимостьПродаж",	?(ОсобыйПорядокНалогообложения, ПланыСчетов.Хозрасчетный.СебестоимостьПродажЕНВД, ПланыСчетов.Хозрасчетный.СебестоимостьПродажНеЕНВД));
	КонецЕсли;
	
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ТаблицаИерархии.Элемент КАК Элемент,
	|	ТаблицаИерархии.Родитель КАК Родитель,
	|	ТаблицаИерархии.Уровень КАК Уровень
	|ПОМЕСТИТЬ ВТТаблицаИерархии
	|ИЗ
	|	&ТаблицаИерархии КАК ТаблицаИерархии
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	Родитель
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	ТаблицаИерархии.Элемент КАК Элемент,
	|	ТаблицаИерархии.Родитель КАК Родитель,
	|	ТаблицаИерархии.Уровень КАК Уровень,
	|	Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры
	|ПОМЕСТИТЬ ВТТаблицаИерархииСВидами
	|ИЗ
	|	ВТТаблицаИерархии КАК ТаблицаИерархии
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
	|		ПО ТаблицаИерархии.Элемент = Номенклатура.Ссылка
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	Родитель
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	ТаблицаИерархии.Элемент КАК Номенклатура,
	|	ТаблицаИерархии.Родитель КАК Родитель,
	|	ТаблицаИерархии.Уровень КАК Уровень,
	|	СчетаУчетаНоменклатуры.ВидНоменклатуры КАК ВидНоменклатуры,
	|	СчетаУчетаНоменклатуры.Организация КАК Организация,
	|	СчетаУчетаНоменклатуры.Склад КАК Склад,
	|	СчетаУчетаНоменклатуры.ТипСклада КАК ТипСклада,
	|	СчетаУчетаНоменклатуры.СчетУчета КАК СчетУчета,
	|	ЕСТЬNULL(СчетаУчетаНоменклатуры.СчетУчета.Забалансовый, ЛОЖЬ) КАК СчетУчетаЯвляетсяЗабалансовым,
	|	СчетаУчетаНоменклатуры.СчетУчетаНДСПоПриобретеннымЦенностям КАК СчетУчетаНДС,
	|	СчетаУчетаНоменклатуры.СчетУчетаНДСПоРеализации КАК СчетУчетаНДСПродажи,
	|	СчетаУчетаНоменклатуры.СчетУчетаНДСУплаченногоНаТаможне КАК СчетНДСТаможни,
	|	СчетаУчетаНоменклатуры.СчетУчетаЗабалансовый КАК СчетУчетаДавСырья,
	|	ВЫБОР
	|		КОГДА СчетаУчетаНоменклатуры.СчетДоходовОтРеализации = &ПустойСчет
	|			ТОГДА &Счет_Выручка
	|		ИНАЧЕ СчетаУчетаНоменклатуры.СчетДоходовОтРеализации
	|	КОНЕЦ КАК СчетДоходов,
	|	СчетаУчетаНоменклатуры.СчетУчетаПередачи КАК СчетПередачи,
	|	СчетаУчетаНоменклатуры.СчетУчетаПередачиЗабалансовый КАК СчетПередачиЗаб,
	|	ВЫБОР
	|		КОГДА СчетаУчетаНоменклатуры.СчетРасходовОтРеализации = &ПустойСчет
	|			ТОГДА &Счет_СебестоимостьПродаж
	|		ИНАЧЕ СчетаУчетаНоменклатуры.СчетРасходовОтРеализации
	|	КОНЕЦ КАК СчетРасходов,
	|	СчетаУчетаНоменклатуры.Субконто1 КАК Субконто1,
	|	СчетаУчетаНоменклатуры.Субконто2 КАК Субконто2,
	|	СчетаУчетаНоменклатуры.Субконто3 КАК Субконто3,
	|	СчетаУчетаНоменклатуры.СпособУчетаНДС
	|ИЗ
	|	ВТТаблицаИерархииСВидами КАК ТаблицаИерархии
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СчетаУчетаНоменклатуры КАК СчетаУчетаНоменклатуры
	|		ПО ТаблицаИерархии.Родитель = СчетаУчетаНоменклатуры.Номенклатура
	|		И ТаблицаИерархии.ВидНоменклатуры = СчетаУчетаНоменклатуры.ВидНоменклатуры
	|ГДЕ
	|	СчетаУчетаНоменклатуры.Организация В(&МассивОрганизаций)
	|	И СчетаУчетаНоменклатуры.Номенклатура В(&МассивНоменклатуры)
	|	И СчетаУчетаНоменклатуры.Склад В(&МассивСкладов)
	|	И СчетаУчетаНоменклатуры.ТипСклада В(&МассивТиповСкладов)
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	ТаблицаИерархии.Элемент,
	|	ТаблицаИерархии.Родитель,
	|	ТаблицаИерархии.Уровень,
	|	СчетаУчетаНоменклатуры.ВидНоменклатуры,
	|	СчетаУчетаНоменклатуры.Организация,
	|	СчетаУчетаНоменклатуры.Склад,
	|	СчетаУчетаНоменклатуры.ТипСклада,
	|	СчетаУчетаНоменклатуры.СчетУчета,
	|	ЕСТЬNULL(СчетаУчетаНоменклатуры.СчетУчета.Забалансовый, ЛОЖЬ),
	|	СчетаУчетаНоменклатуры.СчетУчетаНДСПоПриобретеннымЦенностям,
	|	СчетаУчетаНоменклатуры.СчетУчетаНДСПоРеализации,
	|	СчетаУчетаНоменклатуры.СчетУчетаНДСУплаченногоНаТаможне,
	|	СчетаУчетаНоменклатуры.СчетУчетаЗабалансовый,
	|	ВЫБОР
	|		КОГДА СчетаУчетаНоменклатуры.СчетДоходовОтРеализации = &ПустойСчет
	|			ТОГДА &Счет_Выручка
	|		ИНАЧЕ СчетаУчетаНоменклатуры.СчетДоходовОтРеализации
	|	КОНЕЦ,
	|	СчетаУчетаНоменклатуры.СчетУчетаПередачи,
	|	СчетаУчетаНоменклатуры.СчетУчетаПередачиЗабалансовый,
	|	ВЫБОР
	|		КОГДА СчетаУчетаНоменклатуры.СчетРасходовОтРеализации = &ПустойСчет
	|			ТОГДА &Счет_СебестоимостьПродаж
	|		ИНАЧЕ СчетаУчетаНоменклатуры.СчетРасходовОтРеализации
	|	КОНЕЦ,
	|	СчетаУчетаНоменклатуры.Субконто1,
	|	СчетаУчетаНоменклатуры.Субконто2,
	|	СчетаУчетаНоменклатуры.Субконто3,
	|	СчетаУчетаНоменклатуры.СпособУчетаНДС
	|ИЗ
	|	ВТТаблицаИерархииСВидами КАК ТаблицаИерархии
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СчетаУчетаНоменклатуры КАК СчетаУчетаНоменклатуры
	|		ПО ТаблицаИерархии.Родитель = СчетаУчетаНоменклатуры.Номенклатура
	|ГДЕ
	|	СчетаУчетаНоменклатуры.Организация В(&МассивОрганизаций)
	|	И СчетаУчетаНоменклатуры.Номенклатура В(&МассивНоменклатуры)
	|	И СчетаУчетаНоменклатуры.Склад В(&МассивСкладов)
	|	И СчетаУчетаНоменклатуры.ТипСклада В(&МассивТиповСкладов)
	|	И СчетаУчетаНоменклатуры.ВидНоменклатуры = ЗНАЧЕНИЕ(Справочник.ВидыНоменклатуры.ПустаяСсылка)
	|
	|УПОРЯДОЧИТЬ ПО
	|	Уровень УБЫВ,
	|	ВидНоменклатуры УБЫВ,
	|	Склад УБЫВ,
	|	ТипСклада УБЫВ,
	|	Организация УБЫВ";
			
	ТаблицаСчетовУчета = Запрос.Выполнить().Выгрузить();
	ТаблицаСчетовУчета.Индексы.Добавить("Номенклатура");
	
	ОтборСчетовУчета = Новый Структура("Номенклатура");
	
	ПустаяНоменклатура = Справочники.Номенклатура.ПустаяСсылка();
	
	Для Каждого Номенклатура Из СписокНоменклатуры Цикл
		
		СтруктураВозврата = Результат.Получить(Номенклатура);
		
		ОтборСчетовУчета.Номенклатура = Номенклатура;
		
		НайденныеСтроки = ТаблицаСчетовУчета.НайтиСтроки(ОтборСчетовУчета);
		
		Если НайденныеСтроки.Количество() > 0 Тогда
			ЗаполнитьЗначенияСвойств(СтруктураВозврата, НайденныеСтроки[0]);
		Иначе
			
			ОтборСчетовУчета.Номенклатура = ПустаяНоменклатура;
			
			НайденныеСтроки = ТаблицаСчетовУчета.НайтиСтроки(ОтборСчетовУчета);
			Если НайденныеСтроки.Количество() > 0 Тогда
				ЗаполнитьЗначенияСвойств(СтруктураВозврата, НайденныеСтроки[0]);
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Результат;

КонецФункции
Показать
18. Troler 10 09.10.18 13:45 Сейчас в теме
(13) надо попробовать, плохо что много циклов обхода входящего списка номенклатуры (получения иерархии, соответствий) для документа нормально а для всего справочника может быть узкое место...
21. vadim1011985 99 09.10.18 13:52 Сейчас в теме
(18) Не думаю что так все критично по скорости, во-первых может не всегда быть 20- 50 К записей , во-вторых можно попробовать кэшировать данные , во всяком случае - не нужно изобретать велосипед , когда есть готовое решение - достаточно "подпилить" его под себя
22. Troler 10 09.10.18 14:00 Сейчас в теме
(21) у меня на сейчас 20 источников которые каждые 2 мин. одновременно дергают эти данные, могут быть блокировки
20. Troler 10 09.10.18 13:48 Сейчас в теме
Данные в этот регистр регистрирует документ Ограничение скидок, и изменение номенклатуры не трогает регистр.

При изменении номенклатуры в плане обмена номенклатура становится к выгрузке, и вот здесь надо получать актуальное ограничение из регистра
23. Stackmann 10.10.18 15:06 Сейчас в теме
Ну, если я вас правильно понял, то вот:

	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ИсходнаяНоменклатура.Ссылка,
		|	ЕСТЬNULL(ОграниченияПоЭлементам.ОграничениеСкидки, ОграниченияПоГруппам.ОграничениеСкидки) КАК ОграничениеСкидки
		|ИЗ
		|	Справочник.Номенклатура КАК ИсходнаяНоменклатура
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РегистрСведений1 КАК ОграниченияПоЭлементам
		|		ПО ИсходнаяНоменклатура.Ссылка = ОграниченияПоЭлементам.Номенклатура
		|		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
		|			СпрНоменклатура.Ссылка КАК Ссылка,
		|			РегистрПоГруппам.ОграничениеСкидки КАК ОграничениеСкидки
		|		ИЗ
		|			Справочник.Номенклатура КАК СпрНоменклатура
		|				ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РегистрСведений1 КАК РегистрПоГруппам
		|				ПО СпрНоменклатура.Родитель = РегистрПоГруппам.Номенклатура
		|		ГДЕ
		|			СпрНоменклатура.Ссылка В(&МассивЭлементов)) КАК ОграниченияПоГруппам
		|		ПО ИсходнаяНоменклатура.Ссылка = ОграниченияПоГруппам.Ссылка
		|ГДЕ
		|	ИсходнаяНоменклатура.Ссылка В(&МассивЭлементов)";

	Запрос.УстановитьПараметр("МассивЭлементов", МассивЭлементов);
Показать
alex-l19041; +1 Ответить
24. binx 167 11.10.18 18:36 Сейчас в теме
Сделайте запрос к регистру по отбору заданным номенклатурам + всем элементам групп и ищите в цикле Выборка.найтиСледующий до тех пока не найдете ближайшего родителя.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот