Загрузка данных
&НаСервереБезКонтекста
Функция ПолучитьДанныеЦены(Номенклатура, ТипЦены, Характеристика)
РезультатСтруктура = Новый Структура("Цена, ИсточникЦены", 0, "");
Если Не ЗначениеЗаполнено(Номенклатура)
Или Не ЗначениеЗаполнено(ТипЦены) Тогда
Возврат РезультатСтруктура;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
| &Период,
| Номенклатура = &Номенклатура
| И ТипЦены = &ТипЦены
| И Характеристика = &Характеристика
| ) КАК ЦеныНоменклатурыСрезПоследних";
Запрос.УстановитьПараметр("Период", ТекущаяДатаСеанса());
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("ТипЦены", ТипЦены);
Запрос.УстановитьПараметр("Характеристика", Характеристика);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() И Выборка.Цена > 0 Тогда
РезультатСтруктура.Цена = Выборка.Цена;
РезультатСтруктура.ИсточникЦены = "Регистр";
Иначе
РезультатСтруктура.Цена = Номенклатура.ЦенаПоступления;
РезультатСтруктура.ИсточникЦены = "Номенклатура";
КонецЕсли;
Возврат РезультатСтруктура;
КонецФункции
&НаКлиенте
Процедура ОбновитьДоступностьТиповЦен()
ПервыйТипЦены = Неопределено;
РазныеТипыЦен = Ложь;
Для Каждого СтрокаТаблицы Из Объект.Растения Цикл
Если Не ЗначениеЗаполнено(СтрокаТаблицы.ТипЦены) Тогда
Продолжить;
КонецЕсли;
Если Не ЗначениеЗаполнено(ПервыйТипЦены) Тогда
ПервыйТипЦены = СтрокаТаблицы.ТипЦены;
ИначеЕсли ПервыйТипЦены <> СтрокаТаблицы.ТипЦены Тогда
РазныеТипыЦен = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЗначениеЗаполнено(Объект.ТипЦены) Тогда
// Общий тип цены документа.
Элементы.ТипЦены.Доступность = Истина;
Элементы.РастенияТипЦены.Доступность = Ложь;
Иначе
// Разные типы цен в строках блокируют шапку.
Элементы.ТипЦены.Доступность = Не РазныеТипыЦен;
Элементы.РастенияТипЦены.Доступность = Истина;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура РастенияНоменклатураПриИзменении(Элемент)
ТекущиеДанные = Элементы.Растения.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
// Если тип задан в шапке, используем его.
Если ЗначениеЗаполнено(Объект.ТипЦены) Тогда
ТекущиеДанные.ТипЦены = Объект.ТипЦены;
КонецЕсли;
ТипЦеныСтроки = ТекущиеДанные.ТипЦены;
Если Не ЗначениеЗаполнено(ТипЦеныСтроки) Тогда
ТипЦеныСтроки = Объект.ТипЦены;
КонецЕсли;
Если Не ЗначениеЗаполнено(ТекущиеДанные.Номенклатура)
Или Не ЗначениеЗаполнено(ТипЦеныСтроки) Тогда
ТекущиеДанные.Цена = 0;
ТекущиеДанные.Сумма = 0;
Объект.СуммаДокумента = Объект.Растения.Итог("Сумма");
ОбновитьДоступностьТиповЦен();
Возврат;
КонецЕсли;
ДанныеЦены = ПолучитьДанныеЦены(
ТекущиеДанные.Номенклатура,
ТипЦеныСтроки,
ТекущиеДанные.Характеристика
);
ТекущиеДанные.Цена = ДанныеЦены.Цена;
ПересчитатьСуммуСтроки(
ТекущиеДанные,
ДанныеЦены.ИсточникЦены
);
ОбновитьДоступностьТиповЦен();
КонецПроцедуры
&НаКлиенте
Процедура РастенияТипЦеныПриИзменении(Элемент)
ТекущиеДанные = Элементы.Растения.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
Если Не ЗначениеЗаполнено(ТекущиеДанные.ТипЦены) Тогда
ТекущиеДанные.Цена = 0;
ТекущиеДанные.Сумма = 0;
Объект.СуммаДокумента = Объект.Растения.Итог("Сумма");
ОбновитьДоступностьТиповЦен();
Возврат;
КонецЕсли;
// Не смешиваем общий тип цены документа
// с индивидуальными типами цен строк.
Если ЗначениеЗаполнено(Объект.ТипЦены) Тогда
ТекущиеДанные.ТипЦены = Объект.ТипЦены;
ОбновитьДоступностьТиповЦен();
Возврат;
КонецЕсли;
// Тип цены можно выбрать до выбора номенклатуры.
Если Не ЗначениеЗаполнено(ТекущиеДанные.Номенклатура) Тогда
ОбновитьДоступностьТиповЦен();
Возврат;
КонецЕсли;
ДанныеЦены = ПолучитьДанныеЦены(
ТекущиеДанные.Номенклатура,
ТекущиеДанные.ТипЦены,
ТекущиеДанные.Характеристика
);
ТекущиеДанные.Цена = ДанныеЦены.Цена;
ПересчитатьСуммуСтроки(
ТекущиеДанные,
ДанныеЦены.ИсточникЦены
);
ОбновитьДоступностьТиповЦен();
КонецПроцедуры
&НаКлиенте
Процедура РастенияЦенаПриИзменении(Элемент)
ТекущиеДанные = Элементы.Растения.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
ПересчитатьСуммуСтроки(
ТекущиеДанные,
"Ручная"
);
КонецПроцедуры
&НаКлиенте
Процедура РастенияКоличествоПриИзменении(Элемент)
ТекущиеДанные = Элементы.Растения.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
ИсточникЦены = "Ручная";
Если ЗначениеЗаполнено(ТекущиеДанные.Номенклатура) Тогда
ТипЦеныСтроки = ТекущиеДанные.ТипЦены;
Если Не ЗначениеЗаполнено(ТипЦеныСтроки) Тогда
ТипЦеныСтроки = Объект.ТипЦены;
КонецЕсли;
Если ЗначениеЗаполнено(ТипЦеныСтроки) Тогда
ДанныеЦены = ПолучитьДанныеЦены(
ТекущиеДанные.Номенклатура,
ТипЦеныСтроки,
ТекущиеДанные.Характеристика
);
Если ТекущиеДанные.Цена = ДанныеЦены.Цена Тогда
ИсточникЦены = ДанныеЦены.ИсточникЦены;
КонецЕсли;
КонецЕсли;
КонецЕсли;
ПересчитатьСуммуСтроки(
ТекущиеДанные,
ИсточникЦены
);
КонецПроцедуры
&НаКлиенте
Процедура ПересчитатьСуммуСтроки(
СтрокаТаблицы,
ИсточникЦены = "Регистр"
)
Коэффициент = 1;
Если ИсточникЦены = "Номенклатура" Тогда
Коэффициент = 1.25;
КонецЕсли;
Если СтрокаТаблицы.Количество > 0
И СтрокаТаблицы.Цена > 0 Тогда
СтрокаТаблицы.Сумма =
СтрокаТаблицы.Количество
* СтрокаТаблицы.Цена
* Коэффициент;
Иначе
СтрокаТаблицы.Сумма = 0;
КонецЕсли;
Объект.СуммаДокумента = Объект.Растения.Итог("Сумма");
КонецПроцедуры
&НаКлиенте
Процедура ТипЦеныПриИзменении(Элемент)
Если ЗначениеЗаполнено(Объект.ТипЦены) Тогда
// Общий тип цены применяется ко всем строкам.
Для Каждого СтрокаТаблицы Из Объект.Растения Цикл
СтрокаТаблицы.ТипЦены = Объект.ТипЦены;
Если ЗначениеЗаполнено(СтрокаТаблицы.Номенклатура) Тогда
ДанныеЦены = ПолучитьДанныеЦены(
СтрокаТаблицы.Номенклатура,
СтрокаТаблицы.ТипЦены,
СтрокаТаблицы.Характеристика
);
СтрокаТаблицы.Цена = ДанныеЦены.Цена;
ПересчитатьСуммуСтроки(
СтрокаТаблицы,
ДанныеЦены.ИсточникЦены
);
Иначе
СтрокаТаблицы.Цена = 0;
СтрокаТаблицы.Сумма = 0;
КонецЕсли;
КонецЦикла;
Иначе
// При очистке шапки разрешаем типы цен по строкам.
Для Каждого СтрокаТаблицы Из Объект.Растения Цикл
СтрокаТаблицы.ТипЦены = Неопределено;
СтрокаТаблицы.Цена = 0;
СтрокаТаблицы.Сумма = 0;
КонецЦикла;
Объект.СуммаДокумента = 0;
КонецЕсли;
ОбновитьДоступностьТиповЦен();
КонецПроцедуры
&НаКлиенте
Процедура РастенияПослеУдаления(Элемент)
Объект.СуммаДокумента = Объект.Растения.Итог("Сумма");
ОбновитьДоступностьТиповЦен();
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если ЗначениеЗаполнено(Объект.ТипЦены) Тогда
Для Каждого СтрокаТаблицы Из Объект.Растения Цикл
СтрокаТаблицы.ТипЦены = Объект.ТипЦены;
Если ЗначениеЗаполнено(СтрокаТаблицы.Номенклатура) Тогда
ДанныеЦены = ПолучитьДанныеЦены(
СтрокаТаблицы.Номенклатура,
СтрокаТаблицы.ТипЦены,
СтрокаТаблицы.Характеристика
);
СтрокаТаблицы.Цена = ДанныеЦены.Цена;
ПересчитатьСуммуСтроки(
СтрокаТаблицы,
ДанныеЦены.ИсточникЦены
);
КонецЕсли;
КонецЦикла;
КонецЕсли;
ОбновитьДоступностьТиповЦен();
КонецПроцедуры