Создать отчет, обработку

  • Автор темы nikh848
  • Дата начала
N

nikh848

Добрый день, Всем!
Кто может подсказать мне, новичку?
У меня есть справочники: Номенклатура (Детали, Узлы, Изделия) и
подчиненный справочник СоставНоменклатуры
Узлы состоят из Деталей и Узлов нижнего уровня;
Изделия состоят из Узлов и Деталей;
Есть план производства Изделий.
Как написать отчет, чтобы она рассчитала сколько потребуется Деталей
для выполнения плана?
Заранее Большое Спасибо!
 
V

vitfil

Что конкретно у вас не получается?
 
N

nikh848

Что конкретно у вас не получается?
Написал такую процедуру:

Процедура Сформировать()
СпрН = СоздатьОбъект("Справочник.Номенклатура");
СпрС =СоздатьОбъект("Справочник.Состав");
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Таблица");
Таб.ВывестиСекцию("Шапка");

СпрН.ВыбратьЭлементы();
Пока СпрН.ПолучитьЭлемент()=1 Цикл
НаимИзд = СпрН.Наименование;
Таб.ВывестиСекцию("Строка1");
Вл1 = СпрН.ТекущийЭлемент();
СпрС.ИспользоватьВладельца(Вл1);
СпрС.ВыбратьЭлементы();
Пока СпрС.ПолучитьЭлемент()=1 Цикл
НаимУзла =СпрС.Состав;
КвоВИзд = СпрС.Кво;
Таб.ВывестиСекцию("Строка2")
КонецЦикла;

Дальше как то надо повторно сылаться на Справочник.Состав, чтобы она вывела состав состава, т.е детали и узлы следующего поколения.
Пробовал НайтиПоНаименованию в Спр.Номенклатура и дальше вывести ее состав, но тоже не получилось....
 
P

puh14

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

Запрос.Выгрузить(ТЗ);

Тз.выбратьСтроки();
Пока Тз.ПолучитьСтроку() = 1 Цикл
Таб.вывестиСекцию("Строка");
КонецЦикла;

в таблице у себя заменяешь ссылки на Запрос.СпрН и Спр.С - и усё. Выводит все группы по иерархии - если хочешь без групп, в условиях пишешь Группировка Ном Без Групп; . ещё более наглядно - создай на форме таблицу значений- и в ней посмотри структуру, которая выводится.
 
N

nikh848

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

Запрос.Выгрузить(ТЗ);

Тз.выбратьСтроки();
Пока Тз.ПолучитьСтроку() = 1 Цикл
Таб.вывестиСекцию("Строка");
КонецЦикла;

в таблице у себя заменяешь ссылки на Запрос.СпрН и Спр.С - и усё. Выводит все группы по иерархии - если хочешь без групп, в условиях пишешь Группировка Ном Без Групп; . ещё более наглядно - создай на форме таблицу значений- и в ней посмотри структуру, которая выводится.
Спасибо за текст запроса ,работает.
А вот как сформировать запрос, чтобы вывела и 3 столбец (СоставСостава)?
__Изделие__________Состав_________СоставСостава
____изд1_____________Узел1______________Дет1
________________________________________Дет2
________________________________________Дет3
_____________________Узел2______________Дет1
________________________________________Дет4
________________________________________Дет5
_____________________Дет2
_____________________Дет6
 
P

puh14

Так он у тебя и должен выводить в таком виде, если Изделия - это группы, а узлы - это элементы справочника.
 
N

nikh848

Так он у тебя и должен выводить в таком виде, если Изделия - это группы, а узлы - это элементы справочника.
В том то и дело, что и изделия, и узлы, и детали - все элементы. Справочник номенклатура состоит из 3 групп: изделия, узлы, детали. В каждой группе около 60 элементов
 
P

puh14

если у тебя элемент справочника ссылается на другой элемент этого-же справочника, то он у тебя должен по-другому называться(в виде реквизита). Как он у тебя называются узлы и детали? Как ты вообще отслеживаешь, что в состав изделия входят эти узлы и детали?
 
N

nikh848

если у тебя элемент справочника ссылается на другой элемент этого-же справочника, то он у тебя должен по-другому называться(в виде реквизита). Как он у тебя называются узлы и детали? Как ты вообще отслеживаешь, что в состав изделия входят эти узлы и детали?
У меня справочник владелец - Номенклатура
Подчиненный - Состав
Подчиненный состоит из реквизитов состав, количество.
реквизит состав заполняется из элементов справочника номенклатуры методом подстановки,
а в наименование записывается группа и элемент. Н-р: узел,узел1
Состав И4:
узел,узел1
узел,узел2
деталь,деталь1
деталь,деталь2
деталь,деталь3

хочу как то написать, что узел,узел1 - это тоже самое что узел1 из спр.номенклатура и он состоит из.....
 
P

puh14

Мдя. ну тогда что-то вроде

Тз = СоздатьОбъект("ТаблицаЗначений");
Спр = СоздатьОбъект("Справочник.Номенклатура");
Спр.НайтиПоКоду("тут код группы изделия");
Фильтр = Спр.ТекущийЭлемент();
Запрос = СоздатьОбъект("Запрос");
ВыбНач = '01.01.01';
ВыбКон = ПолучитьДатуТА(); // ну или как у тебя конечная дата выглядит
текст = "
|Период с ВыбНач по ВыбКон;
|СпрН = Справочник.Номенклатура.ТекущийЭлемент,Справочник.Состав.Владелец;
|СпрНУзел = Справочник.Номенклатура.ТекущийЭлемент, Справочник.Состав.Состав, Справочник.Состав.Владелец;
|СпрСУзелСостав = Справочник.Состав.ТекущийЭлемент;
|Группировка СпрН ;
|Группировка СпрНУзел;
|Группировка СпрСУзелСостав;
|Условие (СпрН.Родитель = Фильтр);" // Чтобы не брало узлы - а только группу изделий
;
Если Запрос.Выполнить(Текст) = 0 Тогда
Возврат;
КонецЕсли;

Запрос.Выгрузить(ТЗ);

Тз.выбратьСтроки();
Пока Тз.ПолучитьСтроку() = 1 Цикл
Таб.вывестиСекцию("Строка");
КонецЦикла;

ежли не поможет - тогда прямыми запросами.
 
N

nikh848

Мдя. ну тогда что-то вроде

Тз = СоздатьОбъект("ТаблицаЗначений");
Спр = СоздатьОбъект("Справочник.Номенклатура");
Спр.НайтиПоКоду("тут код группы изделия");
Фильтр = Спр.ТекущийЭлемент();
Запрос = СоздатьОбъект("Запрос");
ВыбНач = '01.01.01';
ВыбКон = ПолучитьДатуТА(); // ну или как у тебя конечная дата выглядит
текст = "
|Период с ВыбНач по ВыбКон;
|СпрН = Справочник.Номенклатура.ТекущийЭлемент,Справочник.Состав.Владелец;
|СпрНУзел = Справочник.Номенклатура.ТекущийЭлемент, Справочник.Состав.Состав, Справочник.Состав.Владелец;
|СпрСУзелСостав = Справочник.Состав.ТекущийЭлемент;
|Группировка СпрН ;
|Группировка СпрНУзел;
|Группировка СпрСУзелСостав;
|Условие (СпрН.Родитель = Фильтр);" // Чтобы не брало узлы - а только группу изделий
;
Если Запрос.Выполнить(Текст) = 0 Тогда
Возврат;
КонецЕсли;

Запрос.Выгрузить(ТЗ);

Тз.выбратьСтроки();
Пока Тз.ПолучитьСтроку() = 1 Цикл
Таб.вывестиСекцию("Строка");
КонецЦикла;

ежли не поможет - тогда прямыми запросами.
Спасибо большое! Из двух щас точно должно получиться!
Вторую мне такую процедуру подсказали:
//*******************************************
Процедура Сформировать()
СпрН = СоздатьОбъект("Справочник.Номенклатура");
СпрС =СоздатьОбъект("Справочник.Состав");
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Таблица");
Таб.ВывестиСекцию("Шапка");

СпрН.ВыбратьЭлементы();
Пока СпрН.ПолучитьЭлемент()=1 Цикл
НаимИзд = СпрН.Наименование;
Таб.ВывестиСекцию("Строка1");
Вл1 = СпрН.ТекущийЭлемент();
СпрС.ИспользоватьВладельца(Вл1);
СпрС.ВыбратьЭлементы();
Пока СпрС.ПолучитьЭлемент()=1 Цикл
НаимУзла =СпрС.Состав;
КвоВИзд = СпрС.Кво;
Таб.ВывестиСекцию("Строка2");


СпрС1 =СоздатьОбъект("Справочник.Состав");
СпрС1.ИспользоватьВладельца(СпрС.текущийЭлемент().Состав);
СпрС1.ВыбратьЭлементы();
Пока СпрС1.ПолучитьЭлемент()=1 Цикл
НаимДет =СпрС1.Состав;
КвоВУзл = СпрС1.Кво;
Таб.ВывестиСекцию("Строка3")


КонецЦикла;


КонецЦикла;

КонецЦикла;


Таб.Опции(0,0,0,0);
Таб.Показать();
КонецПроцедуры
 
P

puh14

у то-же самое, только не через запрос.Кстати и будет и узлы наравне с изделиями выводить. а что быстрее - только по проверке. через запрос посложнее - мож что в условиях напутал - но идея именно такая.
 
M

mushita

Тема слишком заброшена
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!