Один Ответ на “Базовый курс. Занятие №9”

  1. Воронцов Сергей 08.01.2013 в 15:19

    1. Обеспечьте проведение документа по регистру учета остатков
    номенклатуры.

    Справочники – “Пользователи”, новый реквизит – “ОтключитьКонтроль”, тип – булево.
    – модуль документа:

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

    2. Но должна существовать возможность отключения контроля для конкретного пользователя.
    Общий модуль – “ГлобальныеПеременные”, сервер, повторное использ. возвр. знач. – На время сеанса;

    Функция ПолучитьКонтрольОстатков() Экспорт

        ТекущийПользователь = РаботаСПользователями.СинхронизацияПользователя();
        Возврат НЕ ТекущийПользователь.ОтключитьКонтроль;

    КонецФункции // ПолучитьКонтрольОстатков()

    3. В списке реализаций должна существовать кнопка .
    В форме списка – Документы – “РеализацияТоваров” – создал кнопку “Провести без контроля”

    &НаКлиенте
    Процедура ПровестиБезКонтроля(Команда)
        ПровестиБезКонтроляСервер();
    КонецПроцедуры

    &НаСервере
    Процедура ПровестиБезКонтроляСервер()

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

    КонецПроцедуры // ПровестиБезКонтроляСервер()

    Документы – “РеализацияТоваров” – модуль:

    Процедура ВыполнитьДвиженияОстаткиНоменклатуры(КонтрольОстатков, РежимПроведения) Экспорт

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

        Запрос.УстановитьПараметр("ВидНабор", Перечисления.ВидыНоменкклатуры.Набор);
        Запрос.УстановитьПараметр("ВидУслуга", Перечисления.ВидыНоменкклатуры.Услуга);
        Запрос.УстановитьПараметр("Ссылка", Ссылка);

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

    4. Создайте регистр для учета продаж и обеспечьте его заполнение при проведении
    реализации.
    Создал Регистр накопления “Продажи”, вид – оборотный:
    – измерения “Контрагент”, тип – СправочникСсылка.Контрагенты;
    – измерения “Номенклатура”, тип – СправочникСсылка.Номенклатура;
    – измерения “Менеджер”, тип – СправочникСсылка.Пользователи;
    – ресурс “Сумма”, тип – Число, 15,2;
    – ресурс “Количество”, тип – Число, 15,3;
    – регистратор “РеализацияТоваров”.

    5. Необходимо обеспечить ведение взаиморасчетов (долгов) с покупателями и поставщиками.
    Создал Регистр накопления “Взаиморасчеты”, вид – Остатки:
    – измерения “Контрагент”, тип – СправочникСсылка.Контрагенты;
    – ресурс “Сумма”, тип – Число, 15,2;
    – регистратор “ПоступлениеТоваров”;
    – регистратор “РеализацияТоваров”;
    – регистратор “Выписка”.

    Документ “ПоступлениеТоваров” – модуль:

    Процедура ОбработкаПроведения(Отказ, Режим)

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

    Аналогично делаем и процедуре “ОбработкаПроведения” докмента “РеализацияТоваров”;

    Документ “РеализацияТоваров”:
    новый реквизит – “СуммаДокумента”, тип – число, 15,2;
    – модуль:

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

    6. Для учета оплат по банку создайте документ .
    Создал документ “Выписка”:
    – табл. часть “Оплаты”:
    – реквизит “Контрагент”, тип – СправочникСсылка.Контрагенты;
    – реквизит “Приход”, тип – Число, 15,2;
    – реквизит “Расход”, тип – Число, 15,2;
    – движение по регистру накопления “Взаиморасчеты”.

    – модуль:

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

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

    7. Объект, где будут храниться данные набора.
    Создал Регистр сведений “СоставНабора”, непереодический:
    – измерения “Набор”, тип – СправочникСсылка.Номенклатура;
    – измерения “Комплектующая”, тип – СправочникСсылка.Номенклатура;
    – ресурс “Количество”, тип – Число, 15,3.

    В общем модуле “ДвиженияПоРегистрам”, создаем два запроса, с помощью конструктора запросов, первый для получения данных регистра остатка номенклатуры, а второй для регистра закупки:

    Процедура ПриходНоменклатуры(Движения, Ссылка, ЭтоАвансовыйОтчет = Ложь) Экспорт

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

    8. Созданы отчеты “ДолгиМенеджерам”, “Прогнозируемый финансовый результат”, “Рейтинг менеджеров”.