Имя: Пароль:
1C
 
Помогите спроектировать регистр
0 pro3ri
 
30.04.15
12:58
День добрый!

поставили тз:

Создайте регистр для хранения остатков товаров, при этом номенклатура должна
храниться в разрезе качества (степеней брака). Количество в регистре храниться в базовых
единицах измерения.

http://savepic.ru/6955423.png
сделал, поправьте если ошибся
1 jsmith82
 
30.04.15
12:58
реквизит накуй
2 Ненавижу 1С
 
гуру
30.04.15
12:59
зачем реквизит?
3 jsmith82
 
30.04.15
12:59
В остальном молодец, справился
4 pro3ri
 
30.04.15
12:59
(2) (1) дак, Количество в регистре храниться в базовых
единицах измерения.
5 zenik
 
30.04.15
13:02
(4) базовая единица - привязывается к номенклатуре, а не к регистру.
6 jsmith82
 
30.04.15
13:02
(4) ну ты.... ваще....
сам понял чо сказал?
7 pro3ri
 
30.04.15
13:04
в конторе сделано так, что Номенклатура док поступление товаров и услуг может быть в разных ед измерения, и в справочнике ЕдиницыИзмеренияНоменклатуры есть коэффициенты пересчета
8 jsmith82
 
30.04.15
13:05
(7) Ну так расчёт в базовую единицу выполняется до записи в регистр. В регистр уже будет в базовых
9 pro3ri
 
30.04.15
13:05
(8) согласен однако
10 pro3ri
 
30.04.15
13:06
всем спс!
11 jsmith82
 
30.04.15
13:06
Допустим, карандаш
2 единицы: шт, упак (коэффициент 10)
Пришло 2 упак
Рассчитываешь в базовую - 20 шт
В регистр пишешь Карандаш, Новый, 20
12 pro3ri
 
30.04.15
14:18
Процедура ОбработкаПроведения(Отказ, Режим)

    // регистр ОстаткиТоваров Приход
    Движения.ОстаткиТоваров.Записывать = Истина;
    Для Каждого ТекСтрокаТовары Из Товары Цикл
        Движение = Движения.ОстаткиТоваров.ДобавитьПриход();
        Движение.Период = Дата;
        Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
        Движение.Качество = ТекСтрокаТовары.Качество;
        Если ТекСтрокаТовары.ЕдИзм = ТекСтрокаТовары.Номенклатура.БазоваяЕдиницаИзмерения Тогда
            Движение.Количество = ТекСтрокаТовары.Количество;
        Иначе
        
            Запрос = Новый Запрос;
            Запрос.Текст =
                "ВЫБРАТЬ
                |    ЕдиницыИзмеренияНоменклатуры.Коэффициент,
                |    ЕдиницыИзмеренияНоменклатуры.ЕдиницаИзмерения
                |ИЗ
                |    Справочник.ЕдиницыИзмеренияНоменклатуры КАК ЕдиницыИзмеренияНоменклатуры
                |ГДЕ
                |    ЕдиницыИзмеренияНоменклатуры.Владелец = &Владелец
                |    И ЕдиницыИзмеренияНоменклатуры.Наименование = &Наименование";
            
            Запрос.УстановитьПараметр("Владелец", ТекСтрокаТовары.Номенклатура);
            Запрос.УстановитьПараметр("Наименование", ТекСтрокаТовары.ЕдИзм.Наименование);

            РезультатЗапроса = Запрос.Выполнить();
            
            ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
            
            ВыборкаДетальныеЗаписи.Следующий();
            Движение.Количество = ТекСтрокаТовары.Количество * ВыборкаДетальныеЗаписи.Коэффициент;
        КонецЕсли;
        
    КонецЦикла;

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

не думаю что сильно оптимально, скорее надо создать реквизит дока СуммаПоТЧВБазЕд, не?
13 jsmith82
 
30.04.15
14:20
пестец
14 User_Agronom
 
30.04.15
14:22
(12) Запрос в цикле. Не сдал.
15 jsmith82
 
30.04.15
14:24
Процедура ОбработкаПроведения(Отказ, Режим)

Движения.ОстаткиТоваров.Записывать = Истина;

Запрос = Новый Запрос();
Запрос.УстановитьПараметр("Ссылка", ЭтотОбъект.Ссылка);
Запрос.Текст =
"ВЫБРАТЬ
|    Товары.Номенклатура КАК Номенклатура,
|    Товары.Качество КАК Качество,
|    Товары.Количество * Товары.ЕдиницаИзмерения.Коэффициент КАК Количество
|ИЗ
|    Документ.ПриходнаяНакладная.Товары КАК Товары
|ГДЕ
|    Товары.Ссылка = &Ссылка";
Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    Движение = Движения.ОстаткиТоваров.ДобавитьПриход();
        Движение.Период = Дата;
        Движение.Номенклатура = Выборка.Номенклатура;
        Движение.Качество = Выборка.Качество;
    Движение.Количество = Выборка.Количество;
КонецЦикла;

КонецПроцедуры
16 Ёпрст
 
30.04.15
14:25
(12) в тч дока втыкаешь Коэффициент, при записи движений
пихаешь Рег.Количество = Количество*Коэффициент;

наслаждаешься
17 Ёпрст
 
30.04.15
14:25
и никаких запросов там вообще не надо, и друга из Сибая не слушай - а то тоже, забухаешь
18 Ненавижу 1С
 
гуру
30.04.15
14:26
(15) не нужен там цикл, результат запроса выгружай в ТЗ, а набор записей заполни по ТЗ
19 jsmith82
 
30.04.15
14:26
>>Если ТекСтрокаТовары.ЕдИзм = ТекСтрокаТовары.Номенклатура.БазоваяЕдиницаИзмерения Тогда

ТекСтрокаТовары.ЕдИзм тип СправочникСсылка.ЕдиницыИзмеренияНоменклатуры (как ты назвал)

ТекСтрокаТовары.Номенклатура.БазоваяЕдиницаИзмерения тип КлассификаторЕдиницИзмерения
20 jsmith82
 
30.04.15
14:28
ну или без запроса пишешь
Движение.Количество = ТекСтрокаТовары.ЕдиницаИзмерения.Коэффициент * ТекСтрокаТовары.Количество
21 jsmith82
 
30.04.15
14:29
(17) с фига ли запрос не нужен
в каноничном случае нужен
я конеш понимаю, что кэширование все дела, но всё-таки
22 jsmith82
 
30.04.15
14:30
по ходу ТС как-то криво запроектировал единицы измерений
23 pro3ri
 
30.04.15
17:46
(22) пришлось поработать:

    Процедура ОбработкаПроведения(Отказ, Режим)
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ЕдиницыИзмеренияНоменклатуры.Владелец КАК Владелец,                                  
    |    ЕдиницыИзмеренияНоменклатуры.Наименование КАК Наименование,
    |    ЕдиницыИзмеренияНоменклатуры.Коэффициент КАК Коэффициент
    |ИЗ
    |    Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ЕдиницыИзмеренияНоменклатуры КАК ЕдиницыИзмеренияНоменклатуры
    |        ПО (ПоступлениеТоваров.Товары.ЕдИзм.Наименование = ЕдиницыИзмеренияНоменклатуры.Наименование)
    |ГДЕ
    |    ЕдиницыИзмеренияНоменклатуры.Владелец В
    |            (ВЫБРАТЬ
    |                ПоступлениеТоваровТовары.Номенклатура
    |            ИЗ
    |                Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары
    |            ГДЕ
    |                ПоступлениеТоваровТовары.Ссылка = &Ссылка)
    |    И ПоступлениеТоваров.Ссылка = &Ссылка";    
    
    Запрос.УстановитьПараметр("Ссылка",Ссылка);
    
    
    РезультатЗапроса = Запрос.Выполнить().Выгрузить();
    
    Для каждого СтрокаТЧ Из Товары Цикл
    
        СтрокаТЧ.Коэффициент = РезультатЗапроса.Найти(СтрокаТЧ.Номенклатура).Коэффициент;    
    
    КонецЦикла;
    
    Движения.ОстаткиТоваров.Записывать = Истина;
    
    Для Каждого ТекСтрокаТовары Из Товары Цикл
        
            Движение = Движения.ОстаткиТоваров.ДобавитьПриход();
            Движение.Период = Дата;
            Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
            Движение.Качество = ТекСтрокаТовары.Качество;
            Движение.Количество = ТекСтрокаТовары.Количество * ТекСтрокаТовары.Коэффициент;
        
    КонецЦикла;
24 2S
 
30.04.15
17:48
зачем два цикла друг за другом?
25 zenik
 
30.04.15
17:50
При проведении изменять коэфициент? серьезно? Коэфициент должен быть проставлен при заполнении ТЧ документа.
26 Ёпрст
 
30.04.15
17:51
(24) так же веселее, как и получение наименования в тексте запроса
27 pro3ri
 
30.04.15
17:51
(24) да, согл:


Процедура ОбработкаПроведения(Отказ, Режим)//
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ЕдиницыИзмеренияНоменклатуры.Владелец КАК Владелец,                                  
    |    ЕдиницыИзмеренияНоменклатуры.Наименование КАК Наименование,
    |    ЕдиницыИзмеренияНоменклатуры.Коэффициент КАК Коэффициент
    |ИЗ
    |    Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ЕдиницыИзмеренияНоменклатуры КАК ЕдиницыИзмеренияНоменклатуры
    |        ПО (ПоступлениеТоваров.Товары.ЕдИзм.Наименование = ЕдиницыИзмеренияНоменклатуры.Наименование)
    |ГДЕ
    |    ЕдиницыИзмеренияНоменклатуры.Владелец В
    |            (ВЫБРАТЬ
    |                ПоступлениеТоваровТовары.Номенклатура
    |            ИЗ
    |                Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары
    |            ГДЕ
    |                ПоступлениеТоваровТовары.Ссылка = &Ссылка)
    |    И ПоступлениеТоваров.Ссылка = &Ссылка";    
    
    Запрос.УстановитьПараметр("Ссылка",Ссылка);
    
    
    РезультатЗапроса = Запрос.Выполнить().Выгрузить();
    
    Движения.ОстаткиТоваров.Записывать = Истина;
    
    Для каждого СтрокаТЧ Из Товары Цикл
    
        СтрокаТЧ.Коэффициент = РезультатЗапроса.Найти(СтрокаТЧ.Номенклатура).Коэффициент;    
        Движение = Движения.ОстаткиТоваров.ДобавитьПриход();
        Движение.Период = Дата;
        Движение.Номенклатура = СтрокаТЧ.Номенклатура;
        Движение.Качество = СтрокаТЧ.Качество;
        Движение.Количество = СтрокаТЧ.Количество * СтрокаТЧ.Коэффициент;
    
    КонецЦикла;
28 Ёпрст
 
30.04.15
17:52
(270 ничего, как (16) осилишь, так всё перепишешь..
29 pro3ri
 
30.04.15
17:56
(25) коэффиц находятся в справочнике ЕдиницыИзмеренияНоменклатуры, менеджер при поступлении указывает любую ед изм. из справочника ЕдиницыИзмеренияНоменклатуры
30 pro3ri
 
30.04.15
17:57
+ а родителем спр ЕдиницыИзмеренияНоменклатуры явл спр Номенклатура
31 jsmith82
 
30.04.15
17:58
ты бы глянул как в типовых сделано
в той же ут 10.3
32 jsmith82
 
30.04.15
17:58
чёто какой-то велосипед у тебя с квадратными колёсами
33 zenik
 
30.04.15
21:05
(29) житейская практика показывает, что коэффициент будут менять. Так же, она подсказывает, что документы будут перепроводить задним числом (или исправлять или последовательность восстанавливать) и получится, что остаток твой будет меняться.
Поэтому коэффициент должен быть прописан в документ в момент заполнения и храниться в нем.
34 1С_Fitness
 
30.04.15
21:31
35 ДенисЧ
 
30.04.15
21:43
(33) Как может поменяться количество штук в упаковке? Если оно поменялось, то это уже другая упаковка.
А за заднее число - руки отрывать
36 zenik
 
01.05.15
08:55
(35) Я не имею в виду ситуацию, с другой упаковкой, я имею в виду ситуацию с ошибкой при  изначальном назначении. К примеру упаковка чая, "всю жизнь" продавали упаковкой, а тут решили открыть и продавать пакетики. Продавать 0.001 упаковки "не гуманно", и поменяли коэффициент у базовой единицы и вуаля.
Руки то отрывать - понятно... Прям даже рад, что у Вас никто не ошибается. Или отсутствие рук не позволяет? :)
37 jsmith82
 
01.05.15
11:03
(36) На самом деле это от балды
Вот договоры, например, нельзя менять после проведения документов
38 ДенисЧ
 
01.05.15
11:40
(36) так и продавай штуку, а не упаковку
39 zenik
 
01.05.15
12:04
(38) Ды это не мне надо. Ты не видишь, что человек изменяет коэффициент у товара при его проведении? Это норма да?
40 pro3ri
 
05.05.15
10:25
(33) однако данное дело учтено-с:
это справ-к номенклатура:

Процедура ПередЗаписью(Отказ)
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ОстаткиТоваровОстатки.Номенклатура
        |ИЗ
        |    РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки";
    
    РезультатЗапроса = Запрос.Выполнить();
    Если Не РезультатЗапроса.Пустой() Тогда
    
        Отказ = Истина;
        Сообщить("Нельзя изменять базовую единицу уже проведенной номенклатуры");
    
    КонецЕсли;    
    
    
КонецПроцедуры
41 pro3ri
 
05.05.15
10:29
если поточнее то так:
Процедура ПередЗаписью(Отказ)
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ОстаткиТоваровОстатки.Номенклатура
        |ИЗ
        |    РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
        |ГДЕ
        |    ОстаткиТоваровОстатки.Номенклатура = &Номенклатура";
        
    Запрос.УстановитьПараметр("Номенклатура", Ссылка);
    РезультатЗапроса = Запрос.Выполнить();
    Если Не РезультатЗапроса.Пустой() Тогда
    
        Отказ = Истина;
        Сообщить("Нельзя изменять базовую единицу уже проведенной номенклатуры");
    
    КонецЕсли;    
    
    
КонецПроцедуры
42 Ёпрст
 
05.05.15
10:33
(41) п....ц
43 Бубка Гоп
 
05.05.15
10:41
(41) У вас интересный подход к решению проблем, которые вы сами себе и придумываете. Оригинальный. Однако с такими решениями ваша конфигурация далеко не уплывет. Лучше изучите реализацию в типовом решении.
44 zenik
 
05.05.15
10:45
Товар пришел - товар ушел = остаток 0 - можем менять коэфициент... перепроводить приходы по товару - получать интересный результат.
Вы бы действительно, посмотрели парочку типовых товароучетных.
з.ы. Целиком бы эту нетленку глянуть :)
45 Бубка Гоп
 
05.05.15
10:50
(44) +1. ТС, просим в пятницу создать ветку ;)