Базовый курс. Занятие №8

Приступайте к восьмому занятию базового курса.

ps. На этой странице не нужно отчитываться о выполнении ДЗ.

комментария 2 на “Базовый курс. Занятие №8”

  1. Александр 30.10.2012 в 10:45

    1. В справочнике Контрагенты добавлен реквизит Менеджер (Тип Справочники.Пользователи) (либо можно сделать регистр сведений)

    Задача: “В документе «КонтактСКлиентом» … необходимо создать реквизит “Менеджер” ..”

    Решение:
    Документ Контакт: Модуль объекта

    Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
        Менеджер = ПараметрыСеанса.ТекущийПользователь;
    КонецПроцедуры

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

        Запрос.УстановитьПараметр("Контрагент", Контрагент);

        Результат = Запрос.Выполнить();
        ТаблицаДокументов = Новый ТаблицаЗначений;
        ТаблицаДокументов = Результат.Выгрузить();
        Если ТаблицаДокументов.Количество() <= 1 Тогда
            КонтрагентОбъект = Контрагент.ПолучитьОбъект();
            КонтрагентОбъект.Менеджер = Менеджер;
            КонтрагентОбъект.Записать();
            Сообщить("Для контрагента " + Контрагент + " установлен Менеджер " + Менеджер);
        КонецЕсли;

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

    Задача: “Обеспечьте хранение цен на товары…”
    Решение:

    Создан Справочник ТипыЦен.
    Создан Периодический (период=в пределах дня) регистр сведений “ЦеныНоменклатуры”. Измерения регистра – Номенклатура (справочник Номенклатура и ТипЦены (справочник Цена), ресурс Цена (Число 15,2).

    Создан остаточный регистр накопления “Остатки”. Измерения – Товар (справочник Номенклатура) и ВидБрака (справочник ВидыБрака). Ресурс – Количество (Число 15, 3)

    Создан оборотный регистр накопления “Закупки”. Измерения – Поставщик (справочник Контрагенты) и Товар, ресурсы – Количество и Стоимость

    Задача: “Необходимо поработать над удобством работы с документами системы.. ”
    В реквизиты документов ПоступлениеТоваров и РасходнаяНакладная добавлен Реквизит ТипЦены (справочник ТипыЦен)

    Общий модуль: Пересчет

    &НаСервере
    Функция ПолучитьВидПересчетаНаСервере() Экспорт
        Вид = Константы.ВидПересчетаСуммы.Получить();
        Результат = "";
        Если Вид = Перечисления.ВидыПересчетовСуммы.СуммаКоличество Тогда
            Результат = "СуммаКоличество";
        ИначеЕсли Вид = Перечисления.ВидыПересчетовСуммы.СуммаЦена Тогда
            Результат = "СуммаЦена";
        КонецЕсли;
        Возврат Результат; 
    КонецФункции // ПолучитьВидПересчетаНаСервере()

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

        Отбор = Новый Структура("Номенклатура, ТипЦены",Ссылка, ТипЦены );
        Таблица = РегистрыСведений.ЦеныНоменклатуры.СрезПоследних(Дата,Отбор);
        Цена = Таблица.Итог("Цена");
       
        Возврат Цена;   

    КонецФункции // ПолучитьЦену()

    Документ ПоступлениеТоваров: Модуль Формы

    &НаКлиенте
    Процедура ТоварыТоварПриИзменении(Элемент)
        ТаблицаДанных = Элементы.Товары.ТекущиеДанные;
        ТаблицаДанных.Цена = Пересчет.ПолучитьЦену(ТаблицаДанных.Товар, Объект.ТипЦены, Объект.Дата);
        ТаблицаДанных.Количество = 1;
        ПересчитатьСумму();
    КонецПроцедуры

    &НаКлиенте
    Процедура ТоварыКоличествоПриИзменении(Элемент)
        ПересчитатьСумму();
    КонецПроцедуры

    &НаКлиенте
    Процедура ТоварыЦенаПриИзменении(Элемент)
        ПересчитатьСумму();
    КонецПроцедуры
     
    &НаКлиенте
    Процедура ПересчитатьСумму()

        ТД = Элементы.Товары.ТекущиеДанные;
        ТД.Сумма = ТД.Цена*ТД.Количество;

    КонецПроцедуры // ПересчитатьСумму()

    &НаКлиенте
    Процедура ТоварыСуммаПриИзменении(Элемент)  
       
        ТД = Элементы.Товары.ТекущиеДанные;
        ВидПересчета = Пересчет.ПолучитьВидПересчетаНаСервере();
        Если ВидПересчета = "СуммаЦена" Тогда
            ТД.Цена = ТД.Сумма/ТД.Количество; 
        ИначеЕсли ВидПересчета = "СуммаКоличество" Тогда
            ТД.Количество = ТД.Сумма/ТД.Цена;
        КонецЕсли;
       
    КонецПроцедуры

    Документ ПоступлениеТоваров: Модуль объекта

    Процедура ОбработкаПроведения(Отказ, Режим)
        Движения.Остатки.Записывать = Истина;
        Для Каждого ТекСтрокаТовары Из Товары Цикл
            Движение = Движения.Остатки.Добавить();
            Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
            Движение.Период = Дата;
            Движение.Товар = ТекСтрокаТовары.Товар;
            Движение.ВидБрака = ТекСтрокаТовары.ВидБрака;
            Движение.Количество = ТекСтрокаТовары.Количество*ТекСтрокаТовары.ЕдиницаИзмерения.Коэффициент;
        КонецЦикла;
        Движения.Закупки.Записывать = Истина;
        Для Каждого ТекСтрокаТовары Из Товары Цикл
            Движение = Движения.Закупки.Добавить();
            Движение.Период = Дата;
            Движение.Поставщик = Поставщик;
            Движение.Товар = ТекСтрокаТовары.Товар;
            Движение.Количество = ТекСтрокаТовары.Количество*ТекСтрокаТовары.ЕдиницаИзмерения.Коэффициент;
            Движение.Стоимость = ТекСтрокаТовары.Сумма;
        КонецЦикла;
    КонецПроцедуры

    Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
        СуммаДокумента = Товары.Итог("Сумма");
    КонецПроцедуры

    Создан журнал документов “ДокументыЗакупки”, в нем – графы: “Поставщик” (документ ПоступлениеТоваров.Поставщик), ПодотчетноеЛицо (документ ПоступлениеТоваров.ПодотчетноеЛицо) и Сумма (документ ПоступлениеТоваров.СуммаДокумента)

  2. “РЕГИСТРЫ”
    1.Создан периодический независимый РегистрСведений МенеджерыКонтрагентов с измерением Контрагент – тип СправочникСсылка.Контрагенты
    и ресурсом Менеджер – тип СправочникСсылка.Пользователи.
    2.Создан периодический независимый РегистрСведений ЦеныТоваров с измерениями Товар- тип СправочникСсылка.Товары,ТипЦен – СправочникСсылка.ТипыЦен и ресурсом Цена – тип Число.
    3.Создан РегистрНакоплений ОстаткиТоваров (вид – “остатки”) с измерениями Товар – тип СправочникСсылка.Номенклатура;
    Качество – тип СправочникСсылка.Качества и ресурсом Количество – тип Число
    4.Создан РегистрНакоплений ЗакупкиТоваров (вид – “обороты”) с измерениями Товар – тип СправочникСсылка.Номенклатура,Контрагент – составной тип СправочникСсылка.Контрагенты,Сотрудники,
    ТипЦен – СправочникСсылка.ТипыЦен и ресурсами Количество,Сумма – тип Число
    ДОКУМЕНТ “КОНТАКТСКЛИЕНТОМ”

    1. В Документе КонтактСКлиентом реквизит Менеджер при вводе нового документа заполнять текущим пользователем.

    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
            Объект.Менеджер =  ОбщиеФункцииСервер.СинхронизацияПользователей();
        КонецЕсли;
    КонецПроцедуры

    2.При проведении документа необходимо выполнять анализ, если происходит первый контакт с
    контрагентом, то необходимо в качестве менеджера для контрагента нужно установить значение,указанное в документе.

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

        Запрос.УстановитьПараметр("Контрагент", Контрагент);
        Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
        Результат = Запрос.Выполнить();
        ВыборкаДетальныеЗаписи = Результат.Выбрать();
        Если Не ВыборкаДетальныеЗаписи.Следующий() Тогда
    набор = РегистрыСведений.МенеджерыКонтрагентов.СоздатьНаборЗаписей();
                     набор.Отбор.Период.Установить(Дата);
             набор.Отбор.Контрагент.Установить(Контрагент);
             Запись = набор.Добавить();
             Запись.Контрагент = Контрагент;
             Запись.Период = Дата;
             Запись.Менеджер = Менеджер;
             Набор.Записать();
        КонецЕсли;
    КонецПроцедуры

    3.Реквизиты “Менеджер” и “Контрагент” сделаны обязательными для заполнения в этом документе.
    4.Выбор контактных лиц в подчинении указанному в документе контрагента.
    ДОКУМЕНТЫ “ЗАКУПКИ И ОТГРУЗКИ”
    1.В документах закупки и отгрузки создан реквизит шапки ТипЦен – Тип Справочник.ТипыЦен, в котором пользователь будет выбирать прайс, для
    заполнения цен текущего документа

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

    &НаСервере
    Процедура ПроставитьЦеныНаСервере()
        Если ЗначениеЗаполнено(Объект.ТипЦен) Тогда
            Для каждого Строка Из Объект.Товары  Цикл
                       Строка.Цена =ПолучитьЦенуТовара(Объект.Дата,Строка.Номенклатура,Объект.ТипЦен);
        ОбщиеФункцииСерверКлиент.РассчитатьСуммуДокумента(Строка);
            КонецЦикла;
        КонецЕсли;
    КонецПроцедуры

    2.Автоматическую подстановку цен при выборе номенклатуры, согласно указанного прайса
    Создан новый Общий модуль ОбщиеФункцииСерверКлиент (флаги “Клиент”,”Сервер”,”ВызовСервера”)

    Процедура РассчитатьСуммуДокумента(ТекСтрока) Экспорт
        ТекСтрока.Сумма = ТекСтрока.Количество * ТекСтрока.Цена;
    КонецПроцедуры

    Процедура РассчитатьКвоИлиЦенуДокумента(ТекСтрока,Режим) Экспорт
        Если Режим Тогда
            ТекСтрока.Количество = ?(ТекСтрока.Цена=0,ТекСтрока.Количество,ТекСтрока.Сумма/ТекСтрока.Цена);
        Иначе
            ТекСтрока.Цена = ?(ТекСтрока.Количество=0,ТекСтрока.Цена,ТекСтрока.Сумма/ТекСтрока.Количество);
        КонецЕсли;
    КонецПроцедуры

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

        Запрос.УстановитьПараметр("ЕдиницаПоКлассификатору", Товар.БазоваяЕдиница);
        Запрос.УстановитьПараметр("Товар", Товар);

        Результат = Запрос.Выполнить();

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

        Если ВыборкаДетальныеЗаписи.Следующий() Тогда
            Возврат ВыборкаДетальныеЗаписи.Ссылка;
        Иначе
            Возврат Справочники.ЕдиницыИзмеренияНоменклатуры.ПустаяСсылка();
        КонецЕсли;
    КонецФункции // ПолучитьЕдиницуИзмерения()

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

        Запрос.УстановитьПараметр("ТипЦен", ТипЦен);
        Запрос.УстановитьПараметр("Товар", Товар);
        Запрос.УстановитьПараметр("Дата", Дата);

        Результат = Запрос.Выполнить();

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

        Если ВыборкаДетальныеЗаписи.Следующий() Тогда
            Возврат ВыборкаДетальныеЗаписи.Цена;
        Иначе
            Возврат 0;
        КонецЕсли;
    КонецФункции // ПолучитьЕдиницуИзмерения()

    3.Пересчет суммы по цене и количеству

    &НаКлиенте
    Процедура ТоварыКоличествоПриИзменении(Элемент)
        ТД = Элементы.Товары.ТекущиеДанные;
        ОбщиеФункцииСерверКлиент.РассчитатьСуммуДокумента(ТД);
    КонецПроцедуры

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

    4.Пересчет цены или количества при изменении суммы (сам вариант пересчета –
    количества или цены определена константой РеквизитТЧДляПерерасчетаПриИзмененииСуммы – Тип ПеречислениеСсылка.КоличествоЦена)
    В общем модуле ОбщиеФункцииСервер добавлена функция глПолучитьРежимПересчетаСумм() – для установки-получения режима расчета цены или количества

    Функция глПолучитьРежимПересчетаСумм()Экспорт
        МенеджерК = Константы.РеквизитТЧДляПерерасчетаПриИзмененииСуммы;
        Если Не ЗначениеЗаполнено(МенеджерК.Получить()) Тогда
               МенеджерК.Установить(Перечисления.КоличествоЦена.Цена);
        КонецЕсли;
        Возврат МенеджерК.Получить();
    КонецФункции

    Модуль формы:

    &НаКлиенте
    Процедура ТоварыСуммаПриИзменении(Элемент)
        ТД = Элементы.Товары.ТекущиеДанные;
        ОбщиеФункцииСерверКлиент.РассчитатьКвоИлиЦенуДокумента(ТД,ПоКоличеству());
    КонецПроцедуры
     
     &НаСервере
    Функция ПоКоличеству()
        РежимИзмененияСумм = ОбщиеФункцииСервер.глПолучитьРежимПересчетаСумм();
        возврат (РежимИзмененияСумм = Перечисления.КоличествоЦена.Количество);
    КонецФункции

    5.Отображение итоговой суммы документа – реализовано в подвале формы (свойства реквизита ТЧ – Сумма).
    6. Номенклатура и количество сделаны обязательными для заполнения.

    “ДОКУМЕНТ РЕАЛИЗАЦИИ”
    Реализован выбор контактных лиц в подчинении указанному в документе контрагента (на уровне свойства реквизитов объекта).

    “СПРАВОЧНИК НОМЕНКЛАТУРА”
    Реализована проверка, запрещающая изменять базовую единицу
    измерения для номенклатуры, если по ней уже есть движения в регистрах.

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

    Журнал “ДОКУМЕНТЫЗАКУПКИ”
    Создан журнал документов «Документы закупки» (Состав – “АвансовыйОтчет”,”Приходная”), в котором должна
    отображается информация о виде документа, контрагенте/подотчетном лице (графа Контрагент – Состав “Сотрудник” документа “АвансовыйОтчет” и “Контрагент” документа “Приходная”),
    сумме документа (Графа “Сумма” – реквизиты шапки “СуммаИтого” этих документов, которые заполняются
    в событии перед записью документа).