Имя: Пароль:
1C
1С v8
Регистр заполненности склада
0 Serglih
 
20.03.13
15:31
Доброго времени суток. Подскажите, пожалуйста, метод решения такого вопроса: есть склад, объем которого равен константе(задается пользователем). Необходим регистр заполненности склада, то есть Приход товаров заполняет склад, Расход освобождает. Склад всего один и по товарам разбиение не нужно. Как лучше реализовать регистр? В последствии будет отчет выдающий диаграмму свободно/заполнено. Насколько я понимаю, делов на 5 минут. Но опыта сделать самому не хватило. Сам попытался примерно так: регистр накоплений(Остатки) без реквизитов и измерений с одним ресурсом "Занято" числового типа. Документы прихода и расхода двигают его(соответственно приход в плюс, расход в минус). Но в таком случае не нашел как ограничить максимальный объем пользовательской константой. Может кто поможет, или скажет что делаю не так и как переделать, буду очень благодарен. Заранее спасибо.
1 Maxus43
 
20.03.13
15:35
не взлетит. 1000 марок и 1000 кирпичей занимают разное место
2 Maxus43
 
20.03.13
15:40
По сабжу - регистр не нужен дополнительный. Пир поступлении делай запрос к регистру где лежат товары, запрос по остаткам в общем, и сравнивай с константой
3 Serglih
 
20.03.13
15:41
Товары забиты в справочнике и имеют разный объем. В документе прихода(соответственно расхода так же) в табличную часть заносятся товары и их количество. Дальше рассчитывается суммарный объем всех и он должен заносится в регистр(при расходе выносится). Регистр количества товаров пока не нужен(будет позже, но сейчас не об этом). Нужен именно такой - заполненность склада по объему. И при проведении документа Приход если с ним заполненность превысит максимальный объем склада, то не проводит документ и выдавать ошибку.
4 Maxus43
 
20.03.13
15:42
в какой регистр пишется Объём?
5 Serglih
 
20.03.13
15:44
Конфигурация пишется с нуля. Создан регистр ЗаполненностьСклада(название не совсем удачно наверно, но еще подумаем). А в документах есть реквизит ОбщийОбъем. Вот он и должен двигать регистр.
6 Kondarat
 
20.03.13
15:45
(5) Ну двигайте, что мешает?
7 Serglih
 
20.03.13
15:52
Недостаток опыта. Основная проблема пока как проверить что еще не заполнится склад выше меры(То что было+то что пришло должно быть <=Максимальный объем склада заданный пользователем в константе).
8 Maxus43
 
20.03.13
15:53
(7) не зная как работает ваша самописка - этого никто тут не напишет за вас.
Логика в (2), что там непонятно?
9 mehfk
 
20.03.13
15:55
(0) Единица измерения мест.
10 Maxus43
 
20.03.13
15:56
(8) не типовая у него, а в типовой разобраться с малым опытом сложней ещё
11 mikecool
 
20.03.13
15:58
нахрена доп. регистр, если будет/есть остатки товаров?
12 sapphire
 
20.03.13
15:58
(0) Бред, ИМХО.
Плевать какими величинами забит склад?
Что нужно?
Учет в разрезе ячеек?
13 Serglih
 
20.03.13
15:58
Самописка слишком хорошо сказано для того что сделано. 2 справочника, 3 константы, 2 документа, несколько отчетов. И этот регистр на котором все застопорилось. Документы пока что только заполняются(из справочников берется объем товаров и еще пара реквизитов). И теперь нужно сделать движение документов по регистру заполненности склада. Там двигать то нужно лишь один ресурс. Числового типа. То есть нужно что то подобное:
14 mikecool
 
20.03.13
16:01
(13) омг, что же там за писька то само?
15 Serglih
 
20.03.13
16:01
Конструктором сделанная обработка проведения документа приход:
Движения.ЗаполненностьСклада.Записывать = Истина;
Движение = Движения.ЗаполненностьСклада.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Занято =Движение.Занято + ОбщийОбъем; //тут нужно что то подобное. Но вот загвоздка, не придумаю никак как это правильно написать.
16 Serglih
 
20.03.13
16:02
(11) Задача на преддипломной практике знакомой. Какое ТЗ так и делаю. Сам понимаю что нет смысла в доп регистрах.
17 Serglih
 
20.03.13
16:03
(12) Важно только на какой объем забит. Чем не важно. Объем в данном случае просто число.
18 ivanov-i-i
 
20.03.13
16:04
(15) В чем проблема? При проведении получаешь запросом текущую заполненность склада, к ней прибавляешь объем по накладной и полученную цифру сравниваешь с константой.
19 Serglih
 
20.03.13
16:08
(18) Так и предполагал. Такие затруднения:
1). Код в движении: Движение.Занято =РезультатЗапроса + ОбщийОбъем; - так?
2). Если получится больше чем нужно как делается отказ проведения?
20 Maxus43
 
20.03.13
16:10
(19) отказ проведения - Отказ = Истина;
писать в регистр не надо ничего кроме объёма этого документа, запрос на Остатки в регистре делать и сверять с константой просто.
Регистр Остаточный же?
21 ivanov-i-i
 
20.03.13
16:10
(19) Не в обиду, не подставляй знакомую.
22 Serglih
 
20.03.13
16:16
(20) Да, регистр остаточный.
Вроде все понятно. Еще один(надеюсь последний) глупый вопрос:
Запрос и проверку делать сразу и если выход за границу то отказ проведения, а если нормально все то стандартная процедура проведения. Так?
23 Maxus43
 
20.03.13
16:19
(22) в обработке проведения проверку, если облом то отказ = истина, норм - идём дальше
24 Serglih
 
20.03.13
16:20
(23) Спасибо щас попробуем.
25 mistеr
 
20.03.13
16:21
(22) Делай все движения, потом проверяй остаток. Если превышен - отказ и откат транзакции.
26 Serglih
 
20.03.13
16:23
(25) А не проще сразу проверку? Чтоб не делать лишнее движение если оно не нужно.
27 Maxus43
 
20.03.13
16:24
(25) чем лучше? мучать субд бесполезными записями?
28 sapphire
 
20.03.13
16:25
(17) Так объем объему рознь, или у тебя сыпучка?
29 Serglih
 
20.03.13
16:27
(27) Не совсем понял. Какими бесполезными? Проверка ведь все равно нужна, ее можно сделать после движения и если не пройдет проверку сделать откат, либо сделать сразу и не делать движения если не нужно. Вроде же второй предпочтительнее? Или нет?
30 Serglih
 
20.03.13
16:28
(28) Не указано. Наверно используют такое допущение что Склад заполняется равномерно и непрерывно.
31 AndyD
 
20.03.13
16:28
а зачем вообще движения эти?

есть регистр остаткот товаров на складе?

умножай на объем попозиционно и сравнивай сумму с общей емкостью
32 AndyD
 
20.03.13
16:29
и самый ценный совет на сегодня: купи УТ и загрузи в нее все остатки
33 AndyD
 
20.03.13
16:30
аа, это вообще не реальная задача. тогда не надо ут
34 Serglih
 
20.03.13
16:30
(31) (32) Все советы такие хороши. Тем более что есть УТ. Но есть одно но: задание учебное и нужно реализовать ТЗ. Не смотря на его нелогичность.
35 Maxus43
 
20.03.13
16:31
(29) это не тебе, а то что человек предлагает сначала записать движения, потом проверять. В этом случае писать ничего не надо, ибо бессмысленно
36 Serglih
 
20.03.13
16:32
(35) Спасибо за ответы. Всем спасибо. Пойду пробовать реализовать.
37 mistеr
 
20.03.13
16:40
(29) Пока логика движений простая, второй предпочтительнее. Но вот в последних версиях УТ все-таки перешли на первый способ, ибо там столько всего наворочено, что легко допустить ошибку при проверках.
Раз задача учебная, думаю разницы нет.
38 MSII
 
20.03.13
16:41
(37) Первый способ хорош тем, что не требует блокировки между чтением остатков и записью.
39 mistеr
 
20.03.13
16:56
(38) Как это не требует? Оперативный контроль без блокировки не сделать.
40 Serglih
 
20.03.13
17:06
Процедура ОбработкаПроведения(Отказ, Режим)

Запрос = Новый Запрос;
Запрос.Текст =
 "ВЫБРАТЬ
 | ЗаполненностьСклада.Занято
 |ИЗ
 | РегистрНакопления.ЗаполненностьСклада КАК ЗаполненностьСклада";

РезультатЗапроса = Запрос.Выполнить();

Если РезультатЗапроса.Выбрать().Занято+ОбщийОбъем > Константы.ОбъемСклада.Получить() Тогда
 Отказ=Истина
Иначе
// регистр ЗаполненностьСклада Приход
Движения.ЗаполненностьСклада.Записывать = Истина;
Движение = Движения.ЗаполненностьСклада.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Занято =ОбщийОбъем;
КонецЕсли;

КонецПроцедуры
41 Serglih
 
20.03.13
17:07
РезультатЗапроса.Выбрать().Занято через отладчик показывает что значение не определено. Что я сделал не так?
Завтра надо уже сдать, потому времени кропотливо искать ошибку нет. Может кто увидит сразу?
42 ScreamSaw
 
20.03.13
17:09
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();

Если Выборка.Занято + ОбщийОбъем > Константы.ОбъемСклада.Получить() Тогда
43 ScreamSaw
 
20.03.13
17:09
Судя по всему, дело в этом.
44 Maxus43
 
20.03.13
17:16
|ИЗ
 | РегистрНакопления.ЗаполненностьСкладаОстатки(&ДатаПроверки) КАК ЗаполненностьСклада";
45 Maxus43
 
20.03.13
17:18
>>Завтра надо уже сдать
Аминь.

З.ы. нашёл бы знакомого 1сника, за пивко бы сделал за 30 минут всё
46 Serglih
 
20.03.13
17:24
(42) Так тоже не определено.
47 Serglih
 
20.03.13
17:24
(45) Так уж вышло что я и есть "знакомый 1сник"
48 ScreamSaw
 
20.03.13
17:34
(46) тогда попробуй (44)
49 Serglih
 
20.03.13
17:44
(48) Как это поможет? Это, как я понимаю, просто использование виртуальной таблицы, может ускорить работу базы, но не исправить мою ошибку.
50 ScreamSaw
 
20.03.13
17:51
(46) а не определено что? Выборка.Занято?

Почему-то мне это кажется странным.
51 Serglih
 
20.03.13
17:57
Да. Нельзя скрин приложить жаль. Выдает ошибку "Невозможно привести к типу Число". Начинаю отладку, высчитываю выражение Выборка.Занято показывает значение Неопределено
52 ivanov-i-i
 
20.03.13
19:07
Процедура ОбработкаПроведения(Отказ, Режим)
   
   Запрос = Новый Запрос;
   Запрос.Текст =
       "ВЫБРАТЬ
       |    ЗаполненностьСкладаОстатки.ЗанятоОстаток КАК УжеЗанято
       |ИЗ
       |    РегистрНакопления.ЗаполненностьСклада.Остатки КАК ЗаполненностьСкладаОстатки";

   Результат = Запрос.Выполнить();

   ВыборкаДетальныеЗаписи = Результат.Выбрать();

   Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
       Темп = ВыборкаДетальныеЗаписи.УжеЗанято;
   КонецЦикла;
   
   Если (Темп + Объем) > Константы.ОбъемСклада.Получить() Тогда
       Отказ = Истина;
   КонецЕсли;    

   Движения.ЗаполненностьСклада.Записывать = Истина;
   Движение = Движения.ЗаполненностьСклада.Добавить();
   Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
   Движение.Период = Дата;
   Движение.Занято = Объем;

КонецПроцедуры

Попробуй так, надеюсь у тебя и константа, и ресурс регистра, и реквизит объем в документе - это числа.
53 Serglih
 
21.03.13
11:51
(52) Спасибо. Все получилось. Разумеется числа. Еще не до конца понял почему раньше не получалось, но думаю разберусь. Сначала нужно сделать отчет о заполненности склада.
54 Serglih
 
21.03.13
14:36
Возникла еще загвоздка с отчетом. В общем используется схема компоновки данных, в ней данные берутся запросом. Берется из регистра заполненный объем склада и берем рассчитанное поле КонстантаМаксимальныйОбъем-ЗаполненныйОбъем как Свободно. В СКД берем это все в качестве ресурсов и закидываем в диаграмму. Все работает правильно за исключением одного момента: Свободный объем склада увеличивается при проведении документа на константу. То есть если у нас проведены 3 документа с занятыми объемами 100, 200 и 300, а константа равна 1000, то в диаграмме покажет, что занято 600 а свободно 2400. Хотя должно быть занято 600 а свободно 400. Что я делаю не так?
55 ivanov-i-i
 
21.03.13
19:00
Посмотри здесь http://yadi.sk/d/4pvHuvMY3RM2g
56 Serglih
 
22.03.13
11:55
(55) Спасибо, сейчас посмотрим.