Добрый день! Направьте на путь истинный!
Исходные Данные 8-ка, обычные формы
Есть Регистр Сведений с измерением "Номенклатура" (может принимать значение группы и элемента) и ресурсом "Ограничение скидки" тип число;
Нужно получить данные "Ограничение скидки" из этого регистра по элементу "Номенклатура"
если запись имеет соответствие Элементу то по элементу иначе значение самого близкого родителя.
Можно ли получить запросом? чтоб в условие передать массив элементов для которых необходимо получить данные
Исходные Данные 8-ка, обычные формы
Есть Регистр Сведений с измерением "Номенклатура" (может принимать значение группы и элемента) и ресурсом "Ограничение скидки" тип число;
Нужно получить данные "Ограничение скидки" из этого регистра по элементу "Номенклатура"
если запись имеет соответствие Элементу то по элементу иначе значение самого близкого родителя.
Можно ли получить запросом? чтоб в условие передать массив элементов для которых необходимо получить данные
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(14) так было бы проще, у меня по регл. заданию каждые две мин. система должна выгружать данные по номенклатуре и получать актуальное значение ограничения, поэтому если пользователь создал или переместил номенклатуру в группах то она автоматом получит это значение согласно иерархии
(10)Сочинил цикл с отбором, за быстродействие не ручаюсь, но тут смысл не в этом, можно отбор и запросом заменить.
Процедура ОперацияРегистр(Номенклатура)
НаборЗаписей = РегистрыСведений.АдресныйКлассификатор.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор = Номенклатура;
НаборЗаписей.Отбор.Регистратор.ЭтоГруппа = Ложь;
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() = 0 Тогда
Пока НаборЗаписей.Количество() <> 0 Цикл
Номенклатура = Номенклатура.Родитель;
НаборЗаписей.Отбор.Регистратор = Номенклатура;
НаборЗаписей.Отбор.Регистратор.ЭтоГруппа = Истина;
НаборЗаписей.Прочитать();
ОбработкаПрерыванияПользователя();
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Показать
(1) Возьмите за основу типовой регистр Счета Учета номенклатуры и посмотрите как там это организованно
вот пример для БП 3.0 - думаю не составить труда переделать под себя
Р.S привел только сам код нужный функции - вложенные функции сможете найти сами
вот пример для БП 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) Не думаю что так все критично по скорости, во-первых может не всегда быть 20- 50 К записей , во-вторых можно попробовать кэшировать данные , во всяком случае - не нужно изобретать велосипед , когда есть готовое решение - достаточно "подпилить" его под себя
Данные в этот регистр регистрирует документ Ограничение скидок, и изменение номенклатуры не трогает регистр.
При изменении номенклатуры в плане обмена номенклатура становится к выгрузке, и вот здесь надо получать актуальное ограничение из регистра
При изменении номенклатуры в плане обмена номенклатура становится к выгрузке, и вот здесь надо получать актуальное ограничение из регистра
Ну, если я вас правильно понял, то вот:
Запрос.Текст =
"ВЫБРАТЬ
| ИсходнаяНоменклатура.Ссылка,
| ЕСТЬNULL(ОграниченияПоЭлементам.ОграничениеСкидки, ОграниченияПоГруппам.ОграничениеСкидки) КАК ОграничениеСкидки
|ИЗ
| Справочник.Номенклатура КАК ИсходнаяНоменклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РегистрСведений1 КАК ОграниченияПоЭлементам
| ПО ИсходнаяНоменклатура.Ссылка = ОграниченияПоЭлементам.Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| СпрНоменклатура.Ссылка КАК Ссылка,
| РегистрПоГруппам.ОграничениеСкидки КАК ОграничениеСкидки
| ИЗ
| Справочник.Номенклатура КАК СпрНоменклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РегистрСведений1 КАК РегистрПоГруппам
| ПО СпрНоменклатура.Родитель = РегистрПоГруппам.Номенклатура
| ГДЕ
| СпрНоменклатура.Ссылка В(&МассивЭлементов)) КАК ОграниченияПоГруппам
| ПО ИсходнаяНоменклатура.Ссылка = ОграниченияПоГруппам.Ссылка
|ГДЕ
| ИсходнаяНоменклатура.Ссылка В(&МассивЭлементов)";
Запрос.УстановитьПараметр("МассивЭлементов", МассивЭлементов);
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот