Имя: Пароль:
1C
 
Как посчитать количество комплектов из комплектующих.
0 Maniac
 
19.02.05
17:10
Дано: остатки по коплектующим по мноржеству складов.
Справочник номенклатуры: позиции комплектов с подчиненным справочником комплектующих (с указанием количества в комплекте)
Нужно: реализовать информацию по выбору комплекта(ов) - соклько целых и не целых каждого комплекта на складе (и всех складах) в разрезе комплектующих.
Сижу, ничего придумать не могу. на 7.7 корявые запросы получаються.
1 Asmody
 
19.02.05
17:11
чего-то мне оно задачу про рюкзак напоминает...
2 insider
 
19.02.05
17:14
(0) одно и то же комплектующее может повторяться в разных комплектах?
3 Maniac
 
19.02.05
17:16
может, но это можно пропустить.
4 Дурочкааа 1С
 
19.02.05
17:17
+(2) Тогда - никак не посчитаешь.
5 Maniac
 
19.02.05
17:17
главное знать при выборе комплека(тов) сколько их может получиться и есть на остатке, даже если остатки комплектующих входят в разные комплекты.
6 Дурочкааа 1С
 
19.02.05
17:20
Даже если не учитывать то, что "остатки комплектующих входят в разные комплекты" подсчет "нецелых" комплектов это нонсенс.
7 insider
 
19.02.05
17:27
(3) ладно, допустим можно, тогда еще вопрос:
спр. номенклатуры подчинен спр. состав каждым эл-том которого явл. эл-т спр. номенклатура - это так?, т.е. есть доп. рекв. в спр. состав в котором прописано значение типа спр. номенклатура? (как в станд. конф.)
8 Maniac
 
19.02.05
17:29
(7) да так и есть.
9 insider
 
19.02.05
17:30
(6) объясни?
10 Дурочкааа 1С
 
19.02.05
17:33
Реально можно подсчитать только количество целых комплектов, и то без учета того, что одни и те же комплектующие входят в разные комплекты.
Перебирай все комплекты, перебирай все остатки для каждого комплектующего, вычисляя сколько комплектов можно собрать (для каждого комплектующего). Минимальное число возможных комплектов для каждого комплектующего и будет искомое число.
11 Maniac
 
19.02.05
17:38
(10) так и делаю, только коряво это всё в 7.7. может чето не так делаю.
12 insider
 
19.02.05
17:40
(7) хорошо, тогда пробуем так:
1. имеем остатки по регистру (запросом) и выгружаем их в ТЗ, добавляем колонки "кол-во компл. целых", "норма расхода" и "владелец"
2. выбираем строки из ТЗ.
3. в цикле для каждого из комплектующих в ТЗ ищем в спр. состав эл-т по реквизиту с типом спр. номенклатура (поставь предварительно реквизиту "сортировка"): найти можем вроде как только один эл-т и для него берем владельца и норму расхода, здесь же считаем теор. возм. кол-во комплектов (без учета др. составляющих), получаем число и заносим в др. таблицу с двумя колонками: "комплект", "кол-во целых"; если в таблице комплектов такая строка уже есть, заносим только в том случае, если новое значение менее старого (чтобы получить мимнимальное кол-во целых комплектов).
4. После всего можно выводить в печ. форму, правда по циклу пройти придется еще раз. Реальное кол-во комплектов будет во второй ТЗ, соотв. если вычесть его, умноженное на норму из остатка и поделить на норму - имеем "нецелые комплекты", правда выйдет, что по некторым компл. "нецелых" будет >1, т.к. на эту ед. может не хватать др. компл.
Не особо рационально наверное, но короче придумать пока не могу
13 Maniac
 
19.02.05
17:43
У меня еще задача чтобы это все по складам выводилось (по шапке). в общем сейчас код приведу. Чего то у меня остатки не выбираються методом "ЗапросОстатки.Получить(Запрос.Номенклатура,)"
14 Maniac
 
19.02.05
17:43
ТекстЗапроса = "  
   |Комплект     = Справочник.Комплектация.Владелец;
   |Номенклатура = Справочник.Комплектация.Номенклатура;
   |КолКомпл     = Справочник.Комплектация.Количество;
   |Группировка Комплект БЕЗ ГРУПП;
   |Группировка Номенклатура БЕЗ ГРУПП;    
   |Функция КонКолК = КонОст(КолКомпл);";              
   //
   НетОш = 1; // нет ошибок при наложении фильтров
   НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Номенклатура",,,ТекстЗапроса,Загол,"СвойстваНоменклатуры");  
   
   Запрос = СоздатьОбъект("Запрос");
   Если Запрос.Выполнить(ТекстЗапроса) = 0 тогда
       Возврат;
   КонецЕсли;
                       
   СписокНоменклатуры = СоздатьОбъект("СписокЗначений");
   Пока Запрос.Группировка(1) = 1 Цикл  
       Пока Запрос.Группировка(2) = 1 Цикл
           СписокНоменклатуры.ДобавитьЗначение(Запрос.Номенклатура);
       КонецЦикла;  
   КонецЦикла;      
   
   Если ДатаКонца >= ПолучитьДатуТА() Тогда
       ТекстЗапроса = "//{{ЗАПРОС(ПартииНаличие)";
       ДатаКонца = ПолучитьДатуТА();
   Иначе
       ТекстЗапроса = "//{{ЗАПРОС(ПартииНаличие)
       |ПЕРИОД С ДатаКонца По ДатаКонца;";
   КонецЕсли;
   
   ТекстЗапроса = ТекстЗапроса+"  
   |Номенклатура = Регистр.ПартииНаличие.Номенклатура;
   |Склад        = Регистр.ПартииНаличие.Склад;
   |КолОст       = Регистр.ПартииНаличие.Количество;  
   |Группировка Номенклатура БЕЗ ГРУПП;
   |Группировка Склад БЕЗ ГРУПП Все ВошедшиеВЗапрос;    
   |Функция КонКол  = КонОст(КолОст);";              
   //
   НетОш = 1; // нет ошибок при наложении фильтров  
   ТекстЗапроса = ТекстЗапроса + "Условие(Номенклатура в СписокНоменклатуры);";    
   //НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Номенклатура",,,ТекстЗапроса,,"СвойстваНоменклатуры");  
   НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Склад",,,ТекстЗапроса,Загол);  
   
   ЗапросОстатки = СоздатьОбъект("Запрос");
   Если ЗапросОстатки.Выполнить(ТекстЗапроса) = 0 тогда
       Возврат;
   КонецЕсли;
15 Maniac
 
19.02.05
17:43
ЧислоСтрок = 0;    
   //  Создание Таблицы для выходного отчета
   Таб = СоздатьОбъект("Таблица");
   Таб.ИспользоватьФормат("Ч08");
   
   ПечПериод = "Период с "+ДатаНачала+" по "+ДатаКонца;    
   Таб.ВывестиСекцию("Отчет|Начало");      
   Таб.ВывестиСекцию("Шапка|Начало");      
   
   СчетчикСкладовВПечать = 0;    
   //Таб.Область(4,8,5,50).ОриентацияТекста(90);
                 
   Пока ЗапросОстатки.Группировка("Номенклатура") = 1 Цикл
       Пока ЗапросОстатки.Группировка("Склад") = 1 Цикл
           СчетчикСкладовВПечать = СчетчикСкладовВПечать + 1;
           ПечСклад = ЗапросОстатки.Склад;
           //Таб.Область(4,8,5,50).ОриентацияТекста(90);
           Таб.ПрисоединитьСекцию("Шапка|Склад");
       КонецЦикла;
       Прервать;
   КонецЦикла;  
   Таб.ПрисоединитьСекцию("Шапка|Итого");
                         
   Пока Запрос.Группировка("Комплект") = 1 Цикл  
       ПечСтрока = Запрос.Комплект;
                   
       Пока Запрос.Группировка("Номенклатура") = 1 Цикл  
           ПечКолВКомпл     = Запрос.КонКолК;
           МинКолКомплектов = 0;
           Если ЗапросОстатки.Получить(Запрос.Номенклатура,) = 1 Тогда  
               ПечКонКол      = ЗапросОстатки.КонКол;
               ПечКолКомпл    = ?(ПечКолВКомпл>0,ПечКонКол/ПечКолВКомпл,0);
               Если МинКолКомплектов = 0 Тогда  
                   МинКолКомплектов = ПечКолКомпл;
               КонецЕсли;
               МинКолКомплектов = ?(МинКолКомплектов<ПечКолКомпл,МинКолКомплектов,ПечКолКомпл);    
           КонецЕсли;      
       КонецЦикла;      
       Таб.ВывестиСекцию("Комплект|Начало");  
           
       Пока Запрос.Группировка("Номенклатура") = 1 Цикл      
           ПечСтрока      = Запрос.Номенклатура;
           
           ПечТекстСтроки = ?(БезКодов=1,ПечСтрока,""+ПечСтрока.Код+"   "+ПечСтрока);        
           ПечКолВКомпл   = Запрос.КонКолК;
                           
           Таб.ВывестиСекцию("Строка|Начало");
               
           ПечКонКолИтого = 0;
           Если ЗапросОстатки.Получить(Запрос.Номенклатура,) = 1 Тогда
               Пока ЗапросОстатки.Группировка(2) = 1 Цикл  
                   ПечКонКол      = ЗапросОстатки.КонКол;          
                   ПечКонКолИтого = ПечКонКолИтого+ПечКонКол;  
                   
                   Если ПечКонКол < 0 Тогда
                       Сообщить("Обраружен отрицательный остаток по объекту: "+ПечСтрока);
                   КонецЕсли;
                   
                   Таб.ПрисоединитьСекцию("Строка|Склад");
               КонецЦикла;  
               Таб.ПрисоединитьСекцию("Строка|Итого");
           Иначе
               Для i=1 По СчетчикСкладовВПечать Цикл  
                   Таб.ПрисоединитьСекцию("Строка|Склад");
               КонецЦикла;
               Таб.ПрисоединитьСекцию("Строка|Итого");
           КонецЕсли;
       КонецЦикла;  
   КонецЦикла;
16 insider
 
19.02.05
18:00
(14-15) по-моему мой вариант все же несколько короче, да и работать быстрее будет,
для складов: лучше выбросить остатки еще в одну ТЗ и свернуть по складам, потом в зависимости от того, имеется ли остаток по данному складу данного компл. выводить или пустую секцию, могу пример бросить, если хочешь
17 Maniac
 
19.02.05
18:05
Да здесб вроде все работет, только почему то остаток по комплектующим по складам только по первой строке показывает.
Сижу ковыряю.
18 Maniac
 
19.02.05
18:10
Есть! Перед методом Запрос.получить(....)
нужно обязательно ставить ЗапросОстатки.вНачалоВыборки();
8)) вот жеж.