Версия для печати темы (https://pro1c.org.ua/index.php?s=31838a579adbde7951c5e168a4b13ae7&showtopic=42664)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ Изменение цены в табличной части документа

Автор: Constantus 14.12.17, 8:57

Приветствую, форумчане!
"Управление торговлей 10.3", (Моби-С 5.5). "ABBYY Ukraine", 2003-2014 (2.3.20.1)

Функция ПоПоступлению()
    
        Отбор = Новый Структура;
        Отбор.Вставить("Объект", ДокументОбъект.Ссылка);
        Отбор.Вставить("Свойство", ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("По поступлению"));
        
        Если РегистрыСведений.ЗначенияСвойствОбъектов.Получить(Отбор).Значение Тогда
            Сообщить("Хорошо");
            Возврат 1;
        Иначе
            Сообщить("Плохо");
            Возврат 0;
        КонецЕсли;    
    
КонецФункции


Свойство документа Оприходования "По поступлению" тип булево.
При срабатывании этой функции получения значения этого свойства, если ранее это свойство вообще не было заполнено, то выдает ошибку:

{Документ.ОприходованиеТоваров.Форма.ФормаДокумента.Форма(1386)}: Преобразование значения к типу Булево не может быть выполнено
Если РегистрыСведений.ЗначенияСвойствОбъектов.Получить(Отбор).Значение Тогда


Нужно сначала вызвать свойство объекта, потом выбрать это свойство и присвоить ему хоть какое либо значение. Я так понимаю изначально это свойство НУЛЛ.

Как правильно написать код проверки значения, чтобы не выдавало подобной ошибки?

Автор: Petre 14.12.17, 9:04

Constantus @ Сегодня, 8:57 * ,
Не используйте неявное преобразование, а пишите конкретно:

Если РегистрыСведений.ЗначенияСвойствОбъектов.Получить(Отбор).Значение = Истина Тогда

Автор: Vidocq05 14.12.17, 9:08


Если ЗначениеЗаполнено(РегистрыСведений.ЗначенияСвойствОбъектов.Получить(Отбор).Значение) Тогда


Vidocq05 @ Сегодня, 10:05 * ,
Нет, так наверное не правильно.

Автор: Constantus 14.12.17, 9:33

Приветствую, форумчане!
"Управление торговлей 10.3", (Моби-С 5.5). "ABBYY Ukraine", 2003-2014 (2.3.20.1)

В документе Оприходования товара делаю изменение цен по последнему поступлению. Посмотрев код изменения цены на текущей строке (типовой код) видно, что происходит несколько операций. Правильно ли я учел все изменения при изменении цены в каждой строке ТЧ?

    Для Каждого Стр Из ДокументОбъект.Товары Цикл
        Если ПоПоступлению() = 1 Тогда
            Стр.Цена = ПолучитьЦену(Стр.Номенклатура, ПолучитьПоследнееПоступление(Стр.Номенклатура));
            ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(Стр, ЭтотОбъект);
            Стр.СуммаРегл   = МодульВалютногоУчета.ПересчитатьИзВалютыВВалюту(Стр.Сумма, ПолучитьВалютуУпрУчета(),
                                ПолучитьВалютуРегламентированногоУчета(), ПолучитьКурсУпрУчета(), 1, ПолучитьКратностьУпрУчета(), 1);

            
        КонецЕсли;    
    КонецЦикла;


Результат работы визуально вроде правильный, но всё ли учел? Ведь там столько "тайных махинаций" :-)



Автор: logist 14.12.17, 9:59

Цитата(Constantus @ 14.12.17, 9:33) *
Если ПоПоступлению() = 1 Тогда

Зачем это условие в цикле? Если туда никакие параметры не передаются, и ответ один и тот же, то оно должно быть за циклом, иначе зачем его в холостую гонять.

upd: прочел другую тему, выносите условие за цикл, да и вообще, я бы не писал отдельную функцию, а проверил это условие запросом и если запрос не пустой то выполнить цикл.

upd2: объединил темы, потому что это по сути одна задача, одна и должен быть один кусок процедуры

Автор: Constantus 14.12.17, 10:22

logist @ Сегодня, 12:59 * ,

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


Я правильно понял?

Автор: logist 14.12.17, 15:22

Цитата(Constantus @ 14.12.17, 10:22) *
правильно понял?

Да

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua