Имя: Пароль:
1C
 
Странное решение
0 Vartigon
 
11.07.25
18:10
Доброго времени суток.
Столкнулся с одной проблемой.

Хотел сделать так:
Себестоимость = ВыборкаНоменклатура.Количество / ВыборкаНоменклатура.СуммаОстаток;

Но не смог!!!
Пришлось делать так:
ВыбКол = ВыборкаНоменклатура.Количество;
ВыбСум = ВыборкаНоменклатура.СуммаОстаток;
Себестоимость = ВыбКол / ВыбСум;

Почему не получился первый вариант?
1 Волшебник
 
11.07.25
18:12
Нам надо угадать текст ошибки? Это викторина?
2 Волшебник
 
11.07.25
18:13
Кстати, числитель и знаменатель поменяйте местами
3 Волшебник
 
11.07.25
18:14
(0) наверняка в запросе не обрабатываются значения NULL
4 Vartigon
 
11.07.25
18:17
Да, я примерно написал. Часть кода:

Пока ВыборкаНоменклатура.Следующий() Цикл  
        
                
        Если ВыборкаНоменклатура.КоличествоОстаток <> 0 Тогда    
            
            Если  ВыборкаНоменклатура.Количество = ВыборкаНоменклатура.КоличествоОстаток Тогда
                
                Себестоимость = ВыборкаНоменклатура.СуммаОстаток;
            Иначе
                СумОс = ВыборкаНоменклатура.СуммаОстаток;
                КолОс =  ВыборкаНоменклатура.КоличествоОстаток;
                Себестоимость = СумОс / КолОс;
                            
            КонецЕсли;
            
        Иначе
            Себестоимость = 0;
            
        КонецЕсли;  
        
         
        Выборка = ВыборкаНоменклатура.Выбрать();
    
        Пока Выборка.Следующий() Цикл
            
            Если Выборка.Склад <> Склад Тогда    
                Продолжить;
            КонецЕсли;
            
            Если Выборка.Количество > Выборка.КоличествоОстаток Тогда
                
                Сообщить("Недостаточно товара");
                Отказ = Истина;
                
                Продолжить;
                
            КонецЕсли;
5 Ильф
 
11.07.25
18:19
ага, а ВыбКол и ВыбСум  - это реквизиты числового типа
6 Бычье сердце
 
11.07.25
18:20
Сообщить("Недостаточно товара");
Весьма неожиданно, сударь
7 Vartigon
 
11.07.25
18:21
"ага, а ВыбКол и ВыбСум  - это реквизиты числового типа"

Получается, что числового. Почему "Себестоимость" не хочет быть числом сразу? Только через костыль получается числовое значение
8 Vartigon
 
11.07.25
18:22
"Сообщить("Недостаточно товара");
Весьма неожиданно, сударь"

Это задачка из спеца по бухгалтерии. Упростил)
9 Бычье сердце
 
11.07.25
18:25
Покажите, что показывает в отладке в точке:
1. ВыборкаНоменклатура.Количество
2. ВыборкаНоменклатура.СуммаОстаток
3. ВыборкаНоменклатура.Количество / ВыборкаНоменклатура.СуммаОстаток
4. Себестоимость

Прям в табло выведите этот список и сюда выложите
10 Злоп
 
11.07.25
18:26
"Но не смог".
Автор "угадал все буквы, но не смог прочитать слово
Ну и про "паровозик, который смог" надо знать...
12 Vartigon
 
11.07.25
18:39
13 Волшебник
 
11.07.25
18:44
(7) Потому что см (3)
В запросе надо использовать функцию ЕСТЬNULL(поле, 0)
14 Vartigon
 
11.07.25
18:49
(13) Вроде я так и сделал: https://iimg.su/i/ppw9f1
15 Волшебник
 
11.07.25
18:54
(14) Покажите текст запроса целиком
16 Волшебник
 
11.07.25
18:55
И покажите текст ошибки, наконец.
17 Vartigon
 
11.07.25
18:57
(16) Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура,
        |    РасходнаяНакладнаяСписокНоменклатуры.Проект КАК Проект,
        |    СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество,
        |    СУММА(РасходнаяНакладнаяСписокНоменклатуры.Цена) КАК Цена,
        |    РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад КАК Склад
        |ПОМЕСТИТЬ врТаблица
        |ИЗ
        |    Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
        |ГДЕ
        |    РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка
        |
        |СГРУППИРОВАТЬ ПО
        |    РасходнаяНакладнаяСписокНоменклатуры.Номенклатура,
        |    РасходнаяНакладнаяСписокНоменклатуры.Проект,
        |    РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад
        |
        |ИНДЕКСИРОВАТЬ ПО
        |    Номенклатура,
        |    Проект,
        |    Склад
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    врТаблица.Номенклатура КАК Номенклатура,
        |    ПРЕДСТАВЛЕНИЕ(врТаблица.Номенклатура) КАК НоменклатураП,
        |    УправленческийОстатки.Субконто2 КАК Склад,
        |    врТаблица.Проект КАК Проект,
        |    врТаблица.Количество КАК Количество,
        |    врТаблица.Цена КАК Цена,
        |    ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) КАК СуммаОстаток,
        |    ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) КАК КоличествоОстаток
        |ИЗ
        |    врТаблица КАК врТаблица
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки(
        |                &Период,
        |                Счет = &Счет,
        |                ,
        |                Субконто1 В
        |                        (ВЫБРАТЬ
        |                            врТаблица.Номенклатура КАК Номенклатура
        |                        ИЗ
        |                            врТаблица КАК врТаблица)
        |                    И Субконто2 = &Склад) КАК УправленческийОстатки
        |        ПО врТаблица.Номенклатура = УправленческийОстатки.Субконто1
        |ИТОГИ
        |    СУММА(Количество),
        |    СУММА(СуммаОстаток),
        |    СУММА(КоличествоОстаток)
        |ПО
        |    Номенклатура";
    
    Запрос.УстановитьПараметр("Период", МоментВремени());
    Запрос.УстановитьПараметр("Склад", Склад);
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    Запрос.УстановитьПараметр("Счет", ПланыСчетов.Управленческий.Товары);
18 Vartigon
 
11.07.25
18:59
(16) Я выгрузил скан ошибки. Себестоимость - неопределённо.
19 Волшебник
 
11.07.25
19:00
В последнем запрос не нужны ИТОГИ
20 Волшебник
 
11.07.25
19:01
Пока Вы будете скрывать куски кода, Вы будете мучаться.

Например, нет куска кода, который выполняет запрос и начинает выборки
21 Vartigon
 
11.07.25
19:02
(20) Весь код:

ПВХ = ПланыВидовХарактеристик.ВидыСубконто;
    ВидыСубконто = Новый Массив;
    ВидыСубконто.Добавить(ПВХ.Номенклатура);
    ВидыСубконто.Добавить(ПВХ.Склады);
    
    Движения.Управленческий.Записывать = Истина;
    Движения.Управленческий.Записать();
    
    Блокировка = Новый БлокировкаДанных;
    ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий");
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары);
    ЭлементБлокировки.УстановитьЗначение("Субконто2", Склад);
    ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;
    ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Субконто1", "Номенклатура");
    Блокировка.Заблокировать();
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура,
        |    РасходнаяНакладнаяСписокНоменклатуры.Проект КАК Проект,
        |    СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество,
        |    СУММА(РасходнаяНакладнаяСписокНоменклатуры.Цена) КАК Цена,
        |    РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад КАК Склад
        |ПОМЕСТИТЬ врТаблица
        |ИЗ
        |    Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
        |ГДЕ
        |    РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка
        |
        |СГРУППИРОВАТЬ ПО
        |    РасходнаяНакладнаяСписокНоменклатуры.Номенклатура,
        |    РасходнаяНакладнаяСписокНоменклатуры.Проект,
        |    РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад
        |
        |ИНДЕКСИРОВАТЬ ПО
        |    Номенклатура,
        |    Проект,
        |    Склад
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    врТаблица.Номенклатура КАК Номенклатура,
        |    ПРЕДСТАВЛЕНИЕ(врТаблица.Номенклатура) КАК НоменклатураП,
        |    УправленческийОстатки.Субконто2 КАК Склад,
        |    врТаблица.Проект КАК Проект,
        |    врТаблица.Количество КАК Количество,
        |    врТаблица.Цена КАК Цена,
        |    ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) КАК СуммаОстаток,
        |    ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) КАК КоличествоОстаток
        |ИЗ
        |    врТаблица КАК врТаблица
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки(
        |                &Период,
        |                Счет = &Счет,
        |                ,
        |                Субконто1 В
        |                        (ВЫБРАТЬ
        |                            врТаблица.Номенклатура КАК Номенклатура
        |                        ИЗ
        |                            врТаблица КАК врТаблица)
        |                    И Субконто2 = &Склад) КАК УправленческийОстатки
        |        ПО врТаблица.Номенклатура = УправленческийОстатки.Субконто1
        |ИТОГИ
        |    СУММА(Количество),
        |    СУММА(СуммаОстаток),
        |    СУММА(КоличествоОстаток)
        |ПО
        |    Номенклатура";
    
    Запрос.УстановитьПараметр("Период", МоментВремени());
    Запрос.УстановитьПараметр("Склад", Склад);
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    Запрос.УстановитьПараметр("Счет", ПланыСчетов.Управленческий.Товары);
    
    РезультатЗапроса = Запрос.Выполнить();  
    
         
    ВыборкаНоменклатура = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    
    Пока ВыборкаНоменклатура.Следующий() Цикл  
        
                
        Если ВыборкаНоменклатура.КоличествоОстаток <> 0 Тогда    
            
            Если  ВыборкаНоменклатура.Количество = ВыборкаНоменклатура.КоличествоОстаток Тогда
                
                Себестоимость = ВыборкаНоменклатура.СуммаОстаток;
            Иначе
                //СумОс = ВыборкаНоменклатура.СуммаОстаток;
                //КолОс =  ВыборкаНоменклатура.КоличествоОстаток;
                Себестоимость = ВыборкаНоменклатура.СуммаОстаток / ВыборкаНоменклатура.КоличествоОстаток;
                            
            КонецЕсли;
            
        Иначе
            Себестоимость = 0;
            
        КонецЕсли;  
        
         
        Выборка = ВыборкаНоменклатура.Выбрать();
    
        Пока Выборка.Следующий() Цикл
            
            Если Выборка.Склад <> Склад Тогда    
                Продолжить;
            КонецЕсли;
            
            Если Выборка.Количество > Выборка.КоличествоОстаток Тогда
                
                Сообщить("Недостаточно товара");
                Отказ = Истина;
                
                Продолжить;
                
            КонецЕсли;  
            
            Если Не Отказ Тогда
                
                Движение = Движения.Управленческий.Добавить();
                Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки;
                Движение.СчетКт = ПланыСчетов.Управленческий.Товары;
                Движение.Период = Дата;
                Движение.Сумма =  Выборка.Количество * Себестоимость;
                Движение.КоличествоКт = Выборка.Количество;
                Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Проекты] = Выборка.Проект;
                Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура;
                Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = Склад;
                
                Движение = Движения.Управленческий.Добавить();
                Движение.СчетДт = ПланыСчетов.Управленческий.Дебиторка;
                Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки;
                Движение.Период = Дата;
                Движение.Сумма = Выборка.Количество * Выборка.Цена;
                Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура;
                Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Проекты] = Выборка.Проект;
                
                
            КонецЕсли;
                    
        КонецЦикла;
    КонецЦикла;
22 Волшебник
 
11.07.25
19:10
в последнем запросе не нужны ИТОГИ
23 Волшебник
 
11.07.25
19:18
Кстати, при таком режиме проверки остатков в запросе должно быть ключевое слово ДЛЯ ИЗМЕНЕНИЯ
24 Волшебник
 
11.07.25
19:27
Есть другой способ контроля отрицательных остатков.
Сначала сделать движения по регистру, потом в рамках той же транзакции проверить на наличие минусов обычным запросом.
25 Vartigon
 
11.07.25
19:32
(24) Спасибо. Буду знать)
26 Злоп
 
11.07.25
20:05
(25) милять. Это знаю даже я, старый тупой клюшечник.
Как низко PAL SECAM
27 Волшебник
 
11.07.25
20:08
(26) Зацените, с чего всё началось. Но потом мы смогли вытащить контекст из этого партизана.
28 Волшебник
 
11.07.25
20:10
(0) С вероятностью 90%, судя по развитию контекста ветки, я думаю, что программирование это не Ваше.
Лучше идите в курьеры. Говорят, там сейчас высокие зарплаты, если умеете управлять электровелосипедом.
29 Волшебник
 
11.07.25
23:24
У программистов должна быть жилка: "сформулировать свою проблему".
Перед этим конечно надо немного осознать, но без осознания можно же собрать информацию, хотя бы текст ошибки. Потом ещё раз осознать и собрать информацию о контексте. И тут уже в тексте ошибки будет номер строки.

Ну это же БАЗА! Это базовое мышление "причина-следствие". Если у Вас такого нет, значит Вы вообще не человек. Значит Вы созданы по промту, по запросу, нихуя ничего не понимаете. И Вы должны об этом заявить Вашему создателю: какого хуя он меня создал без базовых знаний?! Ну типа того.
30 Волшебник
 
11.07.25
23:23
Люди вырастают с врождённым чувством "причины и следствия", потому что у них есть тело. Они своё тело изучают в первые годы жизни, когда крутят погремушки, пытаются говорить и ходить, падают... Это же гравитация! Так формируется базовое мышление типа "причина-следствие"
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший