1. Troler 10 09.10.18 12:53 Сейчас в теме

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

Добрый день! Направьте на путь истинный!

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

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

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

Показать
12. Doreng 10 09.10.18 13:31 Сейчас в теме
(10)Можно вообще запросом дернуть все записи в ТЗ и поиском их дергать, если быстродействие сильно беспокоит
17. Octopus 337 09.10.18 13:44 Сейчас в теме
(12) Очень плохая идея для случая большого количества записей
13. vadim1011985 56 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 56 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 3 11.10.18 18:36 Сейчас в теме
Сделайте запрос к регистру по отбору заданным номенклатурам + всем элементам групп и ищите в цикле Выборка.найтиСледующий до тех пока не найдете ближайшего родителя.
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Старший Программист 1С НОВОСИБИРСК
Новосибирск
зарплата до 130 000 руб.
Полный день

Программист 1С
Новосибирск
зарплата от 75 000 руб.
Полный день

Ведущий программист 1С
Воронеж
зарплата от 90 000 руб. до 120 000 руб.
Полный день

Программист 1С
Воронеж
зарплата от 65 000 руб. до 90 000 руб.
Полный день