|
|
|
Как посчитать количество комплектов из комплектующих. | ☑ | ||
|---|---|---|---|---|
|
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)) вот жеж. |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |