Загрузка данных



&НаСервереБезКонтекста
Функция ПолучитьДанныеЦены(Номенклатура, ТипЦены, Характеристика)

    РезультатСтруктура = Новый Структура("Цена, ИсточникЦены", 0, "");

    Если Не ЗначениеЗаполнено(Номенклатура)
        Или Не ЗначениеЗаполнено(ТипЦены) Тогда
        Возврат РезультатСтруктура;
    КонецЕсли;

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |   ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
    |ИЗ
    |   РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
    |       &Период,
    |       Номенклатура = &Номенклатура
    |       И ТипЦены = &ТипЦены
    |       И Характеристика = &Характеристика
    |   ) КАК ЦеныНоменклатурыСрезПоследних";

    Запрос.УстановитьПараметр("Период", ТекущаяДатаСеанса());
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    Запрос.УстановитьПараметр("ТипЦены", ТипЦены);
    Запрос.УстановитьПараметр("Характеристика", Характеристика);

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

    Если Выборка.Следующий() И Выборка.Цена > 0 Тогда

        РезультатСтруктура.Цена = Выборка.Цена;
        РезультатСтруктура.ИсточникЦены = "Регистр";

    Иначе

        РезультатСтруктура.Цена = Номенклатура.ЦенаПоступления;
        РезультатСтруктура.ИсточникЦены = "Номенклатура";

    КонецЕсли;

    Возврат РезультатСтруктура;

КонецФункции


&НаКлиенте
Процедура ОбновитьДоступностьТиповЦен()

    ПервыйТипЦены = Неопределено;
    РазныеТипыЦен = Ложь;

    Для Каждого СтрокаТаблицы Из Объект.Растения Цикл

        Если Не ЗначениеЗаполнено(СтрокаТаблицы.ТипЦены) Тогда
            Продолжить;
        КонецЕсли;

        Если Не ЗначениеЗаполнено(ПервыйТипЦены) Тогда
            ПервыйТипЦены = СтрокаТаблицы.ТипЦены;
        ИначеЕсли ПервыйТипЦены <> СтрокаТаблицы.ТипЦены Тогда
            РазныеТипыЦен = Истина;
            Прервать;
        КонецЕсли;

    КонецЦикла;

    Если ЗначениеЗаполнено(Объект.ТипЦены) Тогда

        // Общий тип цены документа.
        Элементы.ТипЦены.Доступность = Истина;
        Элементы.РастенияТипЦены.Доступность = Ложь;

    Иначе

        // Разные типы цен в строках блокируют шапку.
        Элементы.ТипЦены.Доступность = Не РазныеТипыЦен;
        Элементы.РастенияТипЦены.Доступность = Истина;

    КонецЕсли;

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


&НаКлиенте
Процедура РастенияНоменклатураПриИзменении(Элемент)

    ТекущиеДанные = Элементы.Растения.ТекущиеДанные;

    Если ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;

    // Если тип задан в шапке, используем его.
    Если ЗначениеЗаполнено(Объект.ТипЦены) Тогда
        ТекущиеДанные.ТипЦены = Объект.ТипЦены;
    КонецЕсли;

    ТипЦеныСтроки = ТекущиеДанные.ТипЦены;

    Если Не ЗначениеЗаполнено(ТипЦеныСтроки) Тогда
        ТипЦеныСтроки = Объект.ТипЦены;
    КонецЕсли;

    Если Не ЗначениеЗаполнено(ТекущиеДанные.Номенклатура)
        Или Не ЗначениеЗаполнено(ТипЦеныСтроки) Тогда

        ТекущиеДанные.Цена = 0;
        ТекущиеДанные.Сумма = 0;

        Объект.СуммаДокумента = Объект.Растения.Итог("Сумма");

        ОбновитьДоступностьТиповЦен();
        Возврат;

    КонецЕсли;

    ДанныеЦены = ПолучитьДанныеЦены(
        ТекущиеДанные.Номенклатура,
        ТипЦеныСтроки,
        ТекущиеДанные.Характеристика
    );

    ТекущиеДанные.Цена = ДанныеЦены.Цена;

    ПересчитатьСуммуСтроки(
        ТекущиеДанные,
        ДанныеЦены.ИсточникЦены
    );

    ОбновитьДоступностьТиповЦен();

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


&НаКлиенте
Процедура РастенияТипЦеныПриИзменении(Элемент)

    ТекущиеДанные = Элементы.Растения.ТекущиеДанные;

    Если ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;

    Если Не ЗначениеЗаполнено(ТекущиеДанные.ТипЦены) Тогда

        ТекущиеДанные.Цена = 0;
        ТекущиеДанные.Сумма = 0;

        Объект.СуммаДокумента = Объект.Растения.Итог("Сумма");

        ОбновитьДоступностьТиповЦен();
        Возврат;

    КонецЕсли;

    // Не смешиваем общий тип цены документа
    // с индивидуальными типами цен строк.
    Если ЗначениеЗаполнено(Объект.ТипЦены) Тогда

        ТекущиеДанные.ТипЦены = Объект.ТипЦены;

        ОбновитьДоступностьТиповЦен();
        Возврат;

    КонецЕсли;

    // Тип цены можно выбрать до выбора номенклатуры.
    Если Не ЗначениеЗаполнено(ТекущиеДанные.Номенклатура) Тогда
        ОбновитьДоступностьТиповЦен();
        Возврат;
    КонецЕсли;

    ДанныеЦены = ПолучитьДанныеЦены(
        ТекущиеДанные.Номенклатура,
        ТекущиеДанные.ТипЦены,
        ТекущиеДанные.Характеристика
    );

    ТекущиеДанные.Цена = ДанныеЦены.Цена;

    ПересчитатьСуммуСтроки(
        ТекущиеДанные,
        ДанныеЦены.ИсточникЦены
    );

    ОбновитьДоступностьТиповЦен();

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


&НаКлиенте
Процедура РастенияЦенаПриИзменении(Элемент)

    ТекущиеДанные = Элементы.Растения.ТекущиеДанные;

    Если ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;

    ПересчитатьСуммуСтроки(
        ТекущиеДанные,
        "Ручная"
    );

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


&НаКлиенте
Процедура РастенияКоличествоПриИзменении(Элемент)

    ТекущиеДанные = Элементы.Растения.ТекущиеДанные;

    Если ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;

    ИсточникЦены = "Ручная";

    Если ЗначениеЗаполнено(ТекущиеДанные.Номенклатура) Тогда

        ТипЦеныСтроки = ТекущиеДанные.ТипЦены;

        Если Не ЗначениеЗаполнено(ТипЦеныСтроки) Тогда
            ТипЦеныСтроки = Объект.ТипЦены;
        КонецЕсли;

        Если ЗначениеЗаполнено(ТипЦеныСтроки) Тогда

            ДанныеЦены = ПолучитьДанныеЦены(
                ТекущиеДанные.Номенклатура,
                ТипЦеныСтроки,
                ТекущиеДанные.Характеристика
            );

            Если ТекущиеДанные.Цена = ДанныеЦены.Цена Тогда
                ИсточникЦены = ДанныеЦены.ИсточникЦены;
            КонецЕсли;

        КонецЕсли;

    КонецЕсли;

    ПересчитатьСуммуСтроки(
        ТекущиеДанные,
        ИсточникЦены
    );

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


&НаКлиенте
Процедура ПересчитатьСуммуСтроки(
    СтрокаТаблицы,
    ИсточникЦены = "Регистр"
)

    Коэффициент = 1;

    Если ИсточникЦены = "Номенклатура" Тогда
        Коэффициент = 1.25;
    КонецЕсли;

    Если СтрокаТаблицы.Количество > 0
        И СтрокаТаблицы.Цена > 0 Тогда

        СтрокаТаблицы.Сумма =
            СтрокаТаблицы.Количество
            * СтрокаТаблицы.Цена
            * Коэффициент;

    Иначе

        СтрокаТаблицы.Сумма = 0;

    КонецЕсли;

    Объект.СуммаДокумента = Объект.Растения.Итог("Сумма");

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


&НаКлиенте
Процедура ТипЦеныПриИзменении(Элемент)

    Если ЗначениеЗаполнено(Объект.ТипЦены) Тогда

        // Общий тип цены применяется ко всем строкам.
        Для Каждого СтрокаТаблицы Из Объект.Растения Цикл

            СтрокаТаблицы.ТипЦены = Объект.ТипЦены;

            Если ЗначениеЗаполнено(СтрокаТаблицы.Номенклатура) Тогда

                ДанныеЦены = ПолучитьДанныеЦены(
                    СтрокаТаблицы.Номенклатура,
                    СтрокаТаблицы.ТипЦены,
                    СтрокаТаблицы.Характеристика
                );

                СтрокаТаблицы.Цена = ДанныеЦены.Цена;

                ПересчитатьСуммуСтроки(
                    СтрокаТаблицы,
                    ДанныеЦены.ИсточникЦены
                );

            Иначе

                СтрокаТаблицы.Цена = 0;
                СтрокаТаблицы.Сумма = 0;

            КонецЕсли;

        КонецЦикла;

    Иначе

        // При очистке шапки разрешаем типы цен по строкам.
        Для Каждого СтрокаТаблицы Из Объект.Растения Цикл

            СтрокаТаблицы.ТипЦены = Неопределено;
            СтрокаТаблицы.Цена = 0;
            СтрокаТаблицы.Сумма = 0;

        КонецЦикла;

        Объект.СуммаДокумента = 0;

    КонецЕсли;

    ОбновитьДоступностьТиповЦен();

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


&НаКлиенте
Процедура РастенияПослеУдаления(Элемент)

    Объект.СуммаДокумента = Объект.Растения.Итог("Сумма");

    ОбновитьДоступностьТиповЦен();

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


&НаКлиенте
Процедура ПриОткрытии(Отказ)

    Если ЗначениеЗаполнено(Объект.ТипЦены) Тогда

        Для Каждого СтрокаТаблицы Из Объект.Растения Цикл

            СтрокаТаблицы.ТипЦены = Объект.ТипЦены;

            Если ЗначениеЗаполнено(СтрокаТаблицы.Номенклатура) Тогда

                ДанныеЦены = ПолучитьДанныеЦены(
                    СтрокаТаблицы.Номенклатура,
                    СтрокаТаблицы.ТипЦены,
                    СтрокаТаблицы.Характеристика
                );

                СтрокаТаблицы.Цена = ДанныеЦены.Цена;

                ПересчитатьСуммуСтроки(
                    СтрокаТаблицы,
                    ДанныеЦены.ИсточникЦены
                );

            КонецЕсли;

        КонецЦикла;

    КонецЕсли;

    ОбновитьДоступностьТиповЦен();

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