комментария 3 на “Продвинутый курс. Занятие №1”

  1. Денис 30.11.2012 в 10:35

    Добрый день.
    для логирования изменения цены добавил код в модуле формы документа Реализация товаров и услуг;

    &НаСервере
    Процедура РегистрацияИзмененийЦены(Данные)

        ЗаписьЖурналаРегистрации("Изменение цены",,Объект.Ссылка.Метаданные(),Объект.Ссылка,Данные,);
           
        КонецПроцедуры // РегистрацияИзменений()


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

    Создал новый отчет мастером создал предположительный макет и вывел в него таблицу значений полученную выгрузкой журнала регистрации.

    ТЗ = Новый ТаблицаЗначений;
        Фильтр = Новый Структура;
        Фильтр.Вставить("Событие ","Изменение цены");
        ВыгрузитьЖурналРегистрации(ТЗ,Фильтр);
        ТЗ.Сортировать("ИмяПользователя");
        ВыборкаДетальныеЗаписи = ТЗ;
        Пользователь="";
        Для Каждого Элемент Из ВыборкаДетальныеЗаписи Цикл
            Если Пользователь<>Элемент.ИмяПользователя Тогда
                            ОбластьДетальныхЗаписей1.Параметры.Заполнить(Элемент);
                            ТабДок.Вывести(ОбластьДетальныхЗаписей1);
            КонецЕсли;
            Пользователь = Элемент.ИмяПользователя;
            ОбластьДетальныхЗаписей.Параметры.Заполнить(Элемент);
            ТабДок.Вывести(ОбластьДетальныхЗаписей);
        КонецЦикла;
        ТабДок.Вывести(ОбластьПодвалТаблицы);
        ТабДок.Вывести(ОбластьПодвал);
        Возврат ТабДок;
  2. Александр 28.11.2012 в 09:56

    1. В документах ПоступлениеТоваровИУслуг и РеализацияТоваровИУслуг новый код

    &НаКлиенте
    Перем ЦенаСтарая;

    &НаСервереБезКонтекста
    Процедура ЗаписатьВЖурналРегистрации(СписокПараметров)

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

    КонецПроцедуры // ЗаписатьВЖурналРегистрации()

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

    &НаКлиенте
    Процедура ТоварыЦенаОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка)

        ЦенаСтарая = Элементы.Товары.ТекущиеДанные.Цена;
       
    КонецПроцедуры

    2.Создал внешний отчет, в нем макет и форму. В форме код

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

        РезультатВыполнения = СформироватьОтчетНаСервере();
       
    КонецПроцедуры
  3. Оформил подписку в документах ПоступлениеТоваровИУслуг и РеализацияТоваровИУслуг на событие ПередЗаписью и в общем модуле для сервера написал процедуру регистрации изменения цен.

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

    Запрос.УстановитьПараметр("ТЧ_Нов",Источник.товары);
    Запрос.УстановитьПараметр("Ссылка",Источник.Ссылка);

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

    Пока Выборка.Следующий() Цикл

    ОбъектМетаданных = Источник.Метаданные();

    Данные             = новый Структура;
    Данные.Вставить("Номенклатура",Выборка.Номенклатура);
    Данные.Вставить("Наименование",СокрЛП(Выборка.Номенклатура.Наименование));
    Данные.Вставить("ЦенаСтарая",Выборка.ЦенаСтарая);
    Данные.Вставить("ЦенаНовая",Выборка.ЦенаНовая);
    ДанныеСтр = ЗначениеВСтрокуВнутр(Данные);

    Комментарий         = "СтараЦена = "+Выборка.ЦенаСтарая+" новая цена = "+ Выборка.ЦенаНовая;              

    ЗаписьЖурналаРегистрации("Данные.ИзменениеЦеныПриПроведении"
                 , УровеньЖурналаРегистрации.Информация
                 , ОбъектМетаданных
                 , Источник.Ссылка
                 , ДанныеСтр
                 , );
    КонецЦикла;

    КонецЕсли;

    Создал отчет, Добавил форму СКД, В Скд добавил набор данных и прописал поля, сгенерил набор настроек отчета
    В Общем модуле отчета генерю таблицу значений чтением журнала и связываю с СКД отчета
    Модуль общей формы отчета

    Функция СоздатьТЗОтчета()

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

    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
        // Вставить содержимое обработчика.
       
        СтандартнаяОбработка = Ложь;
       
        ТЗ = СоздатьТЗОтчета();
        ВнешниеНаборыДанных = Новый Структура;
        ВнешниеНаборыДанных.Вставить("НаборДанных", ТЗ);
       
        настройки = КомпоновщикНастроек.Настройки;
       
        КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
        МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,Настройки);
       
        протцессорКомпановки = новый ПроцессорКомпоновкиДанных;
        протцессорКомпановки.Инициализировать(МакетКомпоновки,ВнешниеНаборыДанных);
       
        ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
        ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
        ПроцессорВывода.Вывести(протцессорКомпановки);
       
    КонецПроцедуры