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

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

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

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

  1. Для привязки менеджеров к клиентам создаю регистр сведений «Менеджеры», Измерение – клиент- тип справочник Контрагенты, ресурс – пользователь, тип – справочник Пользователи.
    В документе «Контакт с клиентом » создаю реквизит «Менеджер»., добавляю код:
    в форме документа:

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

    В модуле документа:

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

    Для хранения цен на товары создаю регистр сведений “ЦеныНоменклатуры”,
    измерения : Тип цен(Справочник “Типы цен”), Номенклатура, Измерение – цена.
    В документах отгрузки и закупки создаю реквизит “ТипЦен”, для удобства
    реализую в форме следующий код:

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

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

    &НаСервереБезКонтекста
    Функция ПолучитьЕдиницуИзмерения(Товар)

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

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

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

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

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

       


    КонецФункции // ПолучитьЕдиницуИзмерения()



    &НаСервере
    Функция ПолучитьЦенуНоменклатурыНаСервере(Номенклатура)
         Возврат ЗаполнениеДокументовСервер.ПолучитьЦенуНоменклатуры(Номенклатура,Объект.Дата, объект.ТипЦен);
    КонецФункции


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

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

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


      &НаСервере
      Функция ПриИзмененииСуммыСервере(Цена, Количество, Сумма)
           Возврат   ЗаполнениеДокументовСервер.ПересчитатьВЗависимостиОтСуммы(Цена, Количество, Сумма);
     
      КонецФункции

    В общем модуле:

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

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

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


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

    Функция ПересчитатьСумму(Цена, Количество) Экспорт
       
    Возврат Цена*Количество;  
       
    КонецФункции

    Создаю регистр накопления “Остатки товаров”, измерения:
    Номенклатура, Качество, Единица измерения,
    ресурс количество.
    Конструктором движений по этому регистру создаю обработку проведения документа прихода:

    Процедура ОбработкаПроведения(Отказ, Режим)
        //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
        // Данный фрагмент построен конструктором.
        // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

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


    Функция  ПересчитатьВБазовуюЕдиницу(Номенклатура,БазЕдИзм, ЕдИзм)
       
        Если Не БазЕдИзм = ЕдИзм Тогда
            Возврат  ЕдИзм.К;
        Иначе
            Возврат 1 ;
        КонецЕсли;
       
    КонецФункции

    Создаю регистр накопления “Закупки”, измерения Поставщик, Товар, Качество, Ресурсы Количество, Стоимость.
    Проверка запрета изменения базовой единицы в модуле формы элемента справочника “Номенклатура” :

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


    &НаКлиенте
    Процедура ПередЗаписью(Отказ, ТекущийОбъект, ПараметрыЗаписи)
           Отказ = РазрешитьИзменениеБазовойЕдиницы();
           Если Отказ Тогда
           Сообщить("Изменить базовую единицу нельзя, так как она уже использована в документах!");
            КонецЕсли;                    
      КонецПроцедуры

    Создаю журнал документов “Документы закупки”. Для заполнения графы сумма в документах Потупление товаров и Авансовый отчет создаю реквизит “Сумма документа” и в модуле этих объектов добавляю код:

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

    Здравствуйте, не удается получить эталонные решения через переписку по почте. Откройте пожалуйста здесь. (я отстал от группы)

    • Lipinskiy Nikita 16.07.2013 в 08:22

      Добрый день!
      Нас запутал заголовок вашего письма: “Конвертация данных: объявляем перерыв”
      Вам по ошибке выслали инструкции по получению дз по Конвертации данных.
      Сейчас вам отправят решения по Базовому курсу.