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