Продвинутый курс. Домашнее задание №1

Первое задание по 0-му блоку продвинутого курса.

Для выполнения рекомендуется изучить следующие главы 0-го курса.
Глава 1. Запуск информационных баз.
Глава 2. Автоматическая установка платформы.
Глава 3. Архитектура системы.
Глава 4. Клиент-серверный вариант работы ИБ.
Глава 5. Журнал регистрации.

К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.

комментариев 166 на “Продвинутый курс. Домашнее задание №1”

  1. Задание выполнено:
    1. Использую подписку на событие ПередЗаписью для Документ.Объект
    2. Проверяю, что документ проведен и содержит таб части с колонками “Номенклатура” и “Цена”
    3. Сравниваю данные таб. части, записанные в базе (получаю запросом), и данные
    таб.части, переданные с истчником в подписку. Если цена изменилась – записываю в журнал регистрации
    4. Отчет вывожу с использованием ВыгрузитьЖурналРегистрации и наложением фильтра на событие и период
    Задание выполнено:
    1. Использую подписку на событие ПередЗаписью для Документ.Объект
    2. Проверяю, что документ проведен и содержит таб части с колонками “Номенклатура” и “Цена”
    3. Сравниваю данные таб. части, записанные в базе (получаю запросом), и данные таб.части, переданные с истчником в подписку. Если цена изменилась – записываю в журнал регистрации
    4. Отчет вывожу с использованием ВыгрузитьЖурналРегистрации и наложением фильтра на событие и период

  2. Задание выполнено. Получилось сделать через модуль документов в процедуре ПередЗаписью. Есть две таблицы: СтараяТТ = Ссылка.Товары.Выгрузить();
      НоваяТТ  = Товары.Выгрузить();
    потом перебираю и сравниваю изменения. полученные данные записываю в таблицу значений и ее сохраняю в ЖР, предварительно преобразовав в строку. Подумала, что так будет меньше места занимать в ЖР.  В отчете  таблицу ЖР вытаскиваю по фильтру события “ИзменениеЦены”. Потом вывожу в табличный документ.

  3. spec20091c 29.10.2010 в 01:21

    Доброго дня!
    Проблем с выполнением дз не возникло. Алгоритм выполнения следующий:
    1) Подписка на событие ПередЗаписью. Источник типа ДокументОбъект
    2) В процедуре обработчика обходим табличные части метаданных документа и ищем реквизиты Номенклатура и Цена. Если реквизиты найдены строим запрос на получения предыдущих цен обращением к табличной части Ссылки источника.
    3) Обходим ТЧ Источника и ищем расхождения между старой и новой ценой путем поиска значения номенклатуры в результате запроса и сравнения цен.
    4) Если расхождения найдены формируем структуру, преобразуем в строку методом ЗначениеВСтрокуВнутр и записываем в журнал регистрации. Устанавливаем событие.
    5) В отчете отбираем записи журнала регистрации за определенный период. Дополнительно отбор накладывается на Событие.

  4. Сергей Матченко 28.10.2010 в 16:56

    Выполнил проверку изменения цены через подписку на событие ПередЗаписью.
    Проверяю что документ-источник уже проведен, через Источник.Метаданные().Реквизиты.Найти(“Цена”) <> Неопределено
    И
    Для каждого ТаблЧасть Из Источник.Метаданные().ТабличныеЧасти Цикл
       Если ТаблЧасть.Реквизиты.Найти(“Цена”)<> Неопределено Тогда
        РеквизитыТЧ.Добавить(ТаблЧасть.Имя);
       КонецЕсли;
      КонецЦикла;

    проверяю наличие поля “Цена” в документе, затем формирую запрос по табличным частям, где есть поле “Цена” . По списку табличных частей, в которых есть Цена проверяю ТЧ документа и ТЧ из запроса и если номенклатура из ТЧ документа и из запроса имеют разные цены, то формирую структуру “Номенклатура,СтараяЦена, НоваяЦена” и через
    ЗначениеВСтрокуВнутр(Структура) записываю это значение в поля комментарий. Хотел передать в параметр данные, но он принимает только единичное значение.

    Отчет  сделал через табличный документ, хотя думаю можно было передать таблицу как источник для СКД, но я так пока не умею :(

  5. Задание выполнила. Принималась за задачу несколько раз и в результате получилось совсем не то, что предполагала в начале.
    Во-первых не получилось настроить регистрацию события _$Data$_.Update – так, как нужно по условию.
    Пришлось регистрировать программно в общем модуле, используя подписку на событие ПередЗаписью для документов ПоступлениеТовара и Реализация.
    Определяю, проведен ли документ. Затем, перебираю коллекцию табличных частей метаданных документа и ищу реквизит табличной части Цена.
    Как только найдена подходящая табличная часть, хорошо было бы перебрать ее строки, но это то же
    не получилось.
    Пришлось в ущерб универсальности обращаться к табличной части Товар сравнивать цену в Документе и в Ссылке и делать запись в журнал.
    Отчет затруднений не вызвал.

  6. Сергей Ермаков 28.10.2010 в 12:53

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

  7. Денис Гончаренко 28.10.2010 в 11:49

    Очень невнятное описание поля “Данные” в записи ЖР. Написано что тип произвольный, а на практике оказывается , что кроме событий Доступ,  ОтказВДоступе и некоторых других – очень даже не произвольный, а только ссылочный. Кто-нибудь смог записать ТЗ или Структуру в поле Данные (к примеру для события Данные.Изменение)

  8. Сергей 28.10.2010 в 10:48

    1. Запись в журнал регистрации реализовал в общем модуле, в качестве единой процедуры для документов “Поступление” и “Реализация”.
    2. Для хранения данных использовал преобразование структуры в строку (Хотелось бы понять как это сделать грамотнее).
    2.1. Как понимаю, чтобы при выборке из журнала можно было бы получать ТЗ сразу необходимой структуры (Пользователь, Номенклатура, цена…), то необходимо использовать процедуру УстановитьИспользованиеСобытияЖурналаРегистрации
    3. Отчет не на СКД

  9. Александр Кононов 28.10.2010 в 07:54

    Событие $Access$_.Access”.В качестве объекта для регистрации выбрал оборотный РегистрНакопления.Продажи,исходя из того наименее ресурсоемкий. Добавил два реквизита    ЦенаНовая , ЦенаСтарая. ЦенаСтарая .Для процедуры УстановитьИспользованиеСобытияЖурналаРегистрации :настроил поля регистрации (регистратор ,номенклатура ,ЦенаНовая,ЦенаСтарая).Поля доступа (ЦенаНовая, ЦенаСтарая).При проведении документа РеализацияТоваровИУслуг: ЦенаСтарая-получаю запросом из табличной части ЭтотОбъект.Ссылка в процедуре ПередЗаписью ,потому что если к регистру то будет запись в журнале регистрации , выгружаю в таблицу значений.В процедуре ОбработкаПроведения запрос табличнаяЧасть Товары левое соединение Таблица значений , результат записываю регистр . В результате получаем в записях регистра Продажи (ЦенаНовая ,ЦенаСтарая) ,в записях журнала регистрации (ЦенаНовая ,ЦенаСтарая)  -но запись $Access$_.Access” в журнал регистрации происходит перед  событиями изменение и проведения(не новые данные,а те что были перед проведением) .В начале когда начинал проектировать ,я считал что мне хватит только ресурса цена и не нужен запрос .

  10. Первоначально идея состояла в том, чтоб с помощью УстановитьИспользованиеСобытияЖурналаРегистрации
    регистрировать момент введения/изменения цен в документах Прихода и расхода. Но не получилось. Пришлось обратиться к ПриИзменении в в форме поля Цены.  Полозреваю что первоначальная мысль была верной, просто не хватило знаний…

    • А лишних регистраций не появляется? Ведь цену можно поменять и 10 раз, и фиксировать есть смысл лишь старой и новой цены. А в Вашем подходе будет фиксация всех 10ти изменений?

      • ИМХО в задании сказано: логирование цены пользователем в проведенных документах – так видно все :)

        • Спорно… спорно… Любопытно чего скажет Евгений :)
          Ну тут уже мое ИМХО, что явно может быть избыточная логизация. Ну мало ли пользователю вздумалось пошалить? ))) А потом он документ просто закроет, и  даже изменения принимать не будет, линеечкой его по рукам, типа “ай-ай-ай Олеся Петровна, как же так. Ручки то шаловливые!” :-D

          • И к слову при такой реализации будет довольно сложно отделить “шалости” в изменении цен, от действительно важных – сохраненных в системе изменений цены.

  11. Задание выполнено. Запись в ЖР данных об изменении цены организована с помощью подписки на событие “ПередЗаписью” для документов “ПоступлениеТиУ” и “РеализацияТиУ”.  В пакетный запрос в качестве источников данных передаются табличные части документа объекта и ссылки. Данные связываются полным соединением по номенклатуре и отбрасываются записи с неизмененными ценами. 
    Для каждой строки полученной таблицы измененных цен добавляется запись в журнал регистрации (как и у многих, номенклатура, новая и старая цены – в комментарии записи ЖР).
    Отчет сделала на СКД. В набор данных-объект передается таблица значений, с выгруженными записями из ЖР. Правда почти весь код для программного формирования отчета позаимствовала из какой-то статьи..

  12. Задание выполнил.
    В ЖР пишу из подписки на событие перед записью документа. Описание изменений храню в “Данных”, использую процедуру ЗначениеВСтрокуВнутр.
    При формировании отчета данные получаю из соответственно с помощью процедуры ЗначениеИзСтрокиВнутр.
    Очевидно что такое решение имеет смысл только при наличии подобного отчета. Отсутствие читабельного представления ТЗ делает анализ из журнала регистрации непосредственно невозможным :(. Действительно интересно, каким образом в ЖР можно записывать именно ТЗ.

  13. Событие вызывается подпиской на событие ПриЗаписи.
    Поместил Источник.Товары и Источник.Ссылка.Товары во временные таблицы, избежав
    выяснения типов документов и сделав процедуру более менее универсальной.
    3 запросом Левое соединение междуними где цены не =. Поместил результат
    в ЖурналРегистраций.
    ЗаписьЖурналаРегистрации(“Смена цены!”,,,Источник.ссылка,выб.Номенклатура.Наименование+”/”+Строка(выб.Цена1)+”/”+Строка(выб.Цена2),)
    Отчет: ВыгрузитьЖурналРегистрации(тз,Новый Структура(“ДатаНачала,ДатаОкончания,Событие”,ДатаНачала,ДатаОкончания,”Смена цены!”),”Пользователь,Событие,Данные,Комментарий”)

  14. Задание выполнил. Изменине цены сформировал в процедуре ПередЗаписью в виде таблицы значений, в обработке проведения вывел в журнал через ЗаписьЖурналаРегистрации().
    Отчет сформировал .
     

  15. Задание выполнено:
    1.  Использовал, как и большинство, подписку на событие “ПередЗаписью” документа. Через метаданные нашел табличные части содержащие реквизиты “Цена” и “Номенклатура”. С помощью пакетного запроса сравнил цены до и после изменения, и вывел в отдельную ТЗ только измененные строки.
    2. Через ЗаписьЖурналаРегистрации сохранил данные в ЖР, номенклатуру в поле “Данные”, информацию по ценам – в “Комментарий”.
    3. В обычном отчете вывел с помощью ВыгрузитьЖурналРегистрации и наложением отборов информацию по измененным ценам.
     

  16. Задание выполнено. Из модуля объектов документов обращение к процедуре в общем модуле. В общем модуле сравниваются 2 таблицы: ТЗ.Товары – новое значение, ТЗ.Ссылка.Товары – старое значение. Проверка на наличие необходимых колонок. Запись события методом ЗаписьЖурналаРегистрации(). Отчет через СКД не получился, очень бы хотелось увидеть.

    • Через СКД я пока не буду реализовывать.
      У нас позже будет эта тема. Всему свое время.

  17. Задание выполнил.
    1.Запись в журнал регистрации реализовал через подписку на событие “ПередЗаписью”.
    2.  Факт изменения цены определял позиционируясь в выборке запроса с помощью метода “НайтиСледующий” на текущую позицию номенклатуры из обхода коллекции строк таб.части документа. Предполагал отсутствие дубляжей номенклатуры в таб.части.
    3. Отчет сделал в СКД. Процессор компоновки инициализировал таблицей значений, возвращаемой методом “ВыгрузитьЖурналРегистрации”.

  18. Сергей Калмыков 27.10.2010 в 19:12

    В процедуре ПередЗаписью формируем таблицу значений из ТЧ ЭтотОбъект.Товары.Выгрузить().
    Формируем временную таблицу из тз. Далее в запросе сравниваем ТЧ товары объекта с ТЧ товары ссылки в запросе левым соединением, в секции ГДЕ условие ценастарая<>цена новая.
    Если запрос не пустой, регистрируем при помощи ЗаписьЖурналаРегистрации().
    Отчет
    Выгружаем журнал в тз. Не забываем про фильтр и перечислим нужные колонки:
    ВыгрузитьЖурналРегистрации(Тз,Фильтр,”Дата,ИмяПользователя,Событие,Данные” );
    Вывод через табличный документ.

  19. Константин Павленко 27.10.2010 в 19:05

    Ещё есть “рабоче-крестьянский” способ сохранить в журнале регистрации универсальные коллекции значений. В т.ч. Структуру и Таблицу значений. С помощью функций глобального контекста
    ЗначениеВСтрокуВнутр(<Значение>)
    ЗначениеИзСтрокиВнутр(<Строка>)
    Мой пример:
     Для каждого Расхождение Из ТаблицаРасхождений Цикл
      Комментарий = “”+ДокСсылка+” Номенклатура: “+Расхождение.Номенклатура+”, Старая цена: “+Расхождение.СтараяЦена+”, Новая цена: “+Расхождение.НоваяЦена;
      СтруктураРасхождения = Новый Структура();
      СтруктураРасхождения.Вставить(“Документ”, ДокСсылка);
      СтруктураРасхождения.Вставить(“Номенклатура”, Расхождение.Номенклатура);
      СтруктураРасхождения.Вставить(“СтараяЦена”, Расхождение.СтараяЦена);
      СтруктураРасхождения.Вставить(“НоваяЦена”, Расхождение.НоваяЦена);
      ЗаписьЖурналаРегистрации(ИмяСобытия, , ДокСсылка.Метаданные(), ЗначениеВСтрокуВнутр(СтруктураРасхождения), Комментарий);
     КонецЦикла;
    // Далее проверяем последнюю запись
     ТЗВыгр = Новый ТаблицаЗначений();
     ВыгрузитьЖурналРегистрации(ТЗВыгр);
     ПоследняяСтрока = ТЗВыгр[ТЗВыгр.Количество()-1];
     ВосстановленнаяСтруктура = ЗначениеИзСтрокиВнутр(ПоследняяСтрока.Данные);
     
    Конечно, в журнале регистрации поле “Данные” выглядит не очень презентабельно, установить “Представление данных” вообще не получается (хотя жаль). Интересно взглянуть в каком формате хранятся Данные у событий _$Access$_.Access и _$Access$_.AccessDenied. Можно ли сгенерировать что-то подобное вручную?

  20. CreativeGroup 27.10.2010 в 17:02

    Задание выполнено.
    1) В процедуры формы “ПередЗаписью” формируется две ТЗ: по старым ценам берется из ссылки и по новым ценам – с объекта. Эти две ТЗ сравниваются и если были замечены несоответсвтия по ценам то формируется запись в журнал регистрации. Данные об изменении цены помещается в комментарий.
    2) Отчет был создан через обычный макет типа табличный документ и заполнялся вручную из таблицы значений, сформированной с помощью  метода ВыгрузитьЖурналРегистрации с наложением фильтров.

  21. Сделал. Подписка на событие ПередЗаписью, далее запрос по сравнению данных текущего объекта и ссылки. Далее сравнение по ТЧ по номенклатуре и выборка раличных, их обход и занесение записей в журнал регистрации. Отчет в СКД не получился, сделал без СКД и через выгрузку журнала регистрации.

  22. Быков Анатолий 27.10.2010 в 14:55

    ДЗ выполнил
    Отслеживаю событие “При изменении”поля формы “Цена” и если док проведен и цена изменилась записываю методом ЗаписьЖурналаРегистрации в общем модуле информацию о документе.О номенклатуре цене старой цене новой в комментарии.
    Информация при этом может и излишняя. но отслеживается даже попытка изменния цены в проведенном документе. Далее отчет по ТЗ, полученной из  ВыгрузитьЖурналРегистрации с наложением фильтров.

  23. Готово, единственное в подписке ПередЗаписью – при отмене проведения – Источник.Проведен..
    Отчет на СКД..
    Илья Чернов – Вы делали ч/з Процедура ПриКомпоновкеРезультата(..)
    СтандартнаяОбработка    = Ложь;
    Или как-то по другому?!..
    И как добавили Доки и Номенклатуру – двумя строками в ЖР?!..

    • Кто нибуть может популярно объяснить как – Устанавливать внешний набор данных для СКД
      Я сделел:
      Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
      СтандартнаяОбработка    = Ложь;
      ТЗ        = Новый ТаблицаЗначений;
      Отбор    = Новый Структура(“Событие”, “Данные.Изменение”);
      ВыгрузитьЖурналРегистрации(ТЗ, Отбор, “Дата, ИмяПользователя, Комментарий, Метаданные, Данные”);

      ВнешниеНаборыДанных    = Новый Структура(“Данные”, ТЗ);

      СКД            = ЭтотОбъект.СхемаКомпоновкиДанных;
      Настройки    = СКД.НастройкиПоУмолчанию;

      КомпоновщикМакета    = Новый КомпоновщикМакетаКомпоновкиДанных;
      МакетКомпоновки        = КомпоновщикМакета.Выполнить(СКД, Настройки);

      ПроцессорКД            = Новый ПроцессорКомпоновкиДанных;
      ПроцессорКД.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных);

      ПроцессорВывода    = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
      ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
      ПроцессорВывода.Вывести(ПроцессорКД);
      КонецПроцедуры

      • Правда, настройки не подхватываются, т.е. получается – эмуляция..

        • Заработало..
          МакетКомпоновки        = КомпоновщикМакета.Выполнить(СКД, ЭтотОбъект.КомпоновщикНастроек.Настройки);

          Но все равно как-то кривовато – помоему..

  24. Выполнил.
    Использовал процедуру “ПередЗаписью” в модуле объекта. Для необходимых документов вызывал процедуру из общего модуля в которой производил проверку на изменения цены, все что менялось загонял в ТЗ и записывал в ЖР. Отчет написал вручную без использования СКД, хотелось бы увидеть как строить СКД на основе данных полученных определенным кодом, а не запросом.

  25. Денис Гончаренко 27.10.2010 в 14:23

    Поскольку в задании не сказано что нужно использовать именно журнал регистрации, ДЗ выполнил через подписку на событие ПередЗаписью и рег. сведений РегистрацияИзменений.
    Зато регистр получился универсальным и в нем можно регистрировать изменения любых реквизитов любых объектов.
    Отчет тоже сделал через этот регистр.

    • Александр Горлов 27.10.2010 в 15:52

      “…в задании не сказано что нужно использовать именно журнал регистрации…”
      Да ну!
      Из текста ДЗ: “Информацию требуется сохранять в журнаде регистрации.” У Вас какое-то другое ДЗ?

      • Такое возможно. Этой фразы не было в первой версии.
        Для тех, кто сделал без использования ЖР переделывать задание не требуется.

    • Александр Горлов 27.10.2010 в 15:54

      Аналог Вашего универсального механизма наиболее полно реализован в УПП в виде подсистемы “ВерсионированиеОбъектов”. Посмотрите ее – как любителю универсальных решений Вам определенно понравится! :)

  26. ДЗ 1 выполнил. для отлова изменений ввел подписку на событий “ПередЗаписью” для документов.  В общем модуле проверяю был ли проведен документ и если был то сравнением цен из старой и новой табличных частей определяю строки для записи в журнал регистрации.  Имя события ввел “Данные.ОбновлениеЦены”.
    Для создания отчета выбираю в Таблицу значений записи из журнала регистрации с фильтром по созданному  событию “Данные.ОбновлениеЦены”. В форму отчета добавил поле табличного документа – затем в нее выводятся циклом выгруженные данные из Таблицы значений с нужной группировкой.

  27. Тимофей Житков 27.10.2010 в 12:03

    Использовал подписку,
    Вопрос на самом деле в этой куче появился один, почему журнал регистрации не поместили в ИБ?
    Типа как одельный регистр или что то вроде этого, или даже полностью на откуп разработчиков не отдали. Представляю сколько времени будут занимать отчеты по подобным событиям когда платформе придутся разбирать лог в гиг размеров, без индексов и тд…

  28. Александр Тарасов 27.10.2010 в 11:29

    В процедуре “Перез записью” документа формировал и выгружал ТЗ , изменения записывал в регистр сведений (Документ, Товар, ЦенаСтарая, ЦенаНовая), то же самое в ЖР.
    Отчет быстро делается из СКД по регистру.

  29. Евгений Пехов 27.10.2010 в 10:53

    Задание выполнено,
    запись в ЖР использую подписку на событие ДокументаОбъекта, Перед Записью. Использовал функцию методанные() для получение новых данных.
    Можно было ли как нить использовать УстановитьИспользованиеСобытияЖурналаРегистрации(_$Data$_.Update…) только надо еще отслеживать что изменения происходят при проведение документа,а не при любом изменении?
    Отчет сделан

  30. Не удалось соригинальничать – воспользовался подпиской на событие ПередЗаписью, остальное дело техники.

  31. elitekGAVA 27.10.2010 в 10:22

    Выполнил через подписку

  32. Выполнил. Подписку на события не использовал, СКД тоже.  Записывал изменения в журнал в в событии поля цены –  “Окончание ввода текста”. при записи в  имя события записывал: Тип Документа и его номер. Товар в поле данных саму ссылку на товар, Тип Документа и его номер. СтараяЦена в поле данные – цена . Тип Документа и его номер. НоваяЦена в поле данные – цена . Пытался Таблицузначений поместить в структуру и передать в поле данные , но не получилось :(

    • По моему, при записи в  имя события записывать  Тип Документа и его номер – не верно..
      Представляю сколько будет событий – как их отбирать?!..

      • По комменту :) зато в журнале целый раздел… приятно посмотреть :)  вообще конечно не оптимально… но “в лоб” получилось так

        • Событие ИзменениеЦен.Поступление товаров и услуг№000000001.НовЦена
          Комментарий –  ” Изменение цен ” т.е. у всех один коммент – по нему отбор . по событию ИзменениеЦен не получилось почемуто.. попробую еще вечером

  33. С заданием справился.
    1) В процедуре формы «Перед записью» вызывается процедура общего модуля, которая возвращает таблицу с изменениями цен. Таблица с изменениями выгружается из пакетного запроса, в котором по определенному условию связи «сшиты» две таблица. Одна из ссылки (содержит старые цены), а вторая из внешнего источника, в качестве которого выступает ТЗ выгруженная из ТЧ объекта (данная ТЗ содержит новые цены).
    2) Для каждой строки таблицы изменений цен делается запись журнала регистрации с помощью метода «ЗаписьЖурналаРегистрации».
    3) С помощью метода глобального контекста журнал регистрации с наложенным фильтром выгружается в ТЗ. Данная ТЗ вставляется в структуру внешних наборов и используется в качестве внешнего набора данных для отчета на СКД. Код пришлось писать руками. Использовались объекты: компоновщик макета компоновки данных, процессор компоновки данных, процессор вывода результата компоновки данных в табличный документ.

  34. Александр Кононов 27.10.2010 в 00:44

    Можно уточнить задание
    1.Конфигурация закрыта от редактирования разработчиком.
    2.Можем добавлять новые объекты ,но не меняем алгоритмы разработчика,(Не используем даже подписку на события)
    3.Можем все

    • Ответ 3.
      Для варианта 1 трудно представить рабочее решение этой задачи :)

  35. Выполнил ДЗ № 1.
    1. Изменение цен и проведение документов отслеживаю в подписке на события “ПередЗаписью”. Содержимое ТЧ документа помещаю в две временные таблицы
    “ВЫБРАТЬ * ПОМЕСТИТЬ ТаблицаДО ИЗ &ТЗ КАК ТЗ” и “ВЫБРАТЬ * ПОМЕСТИТЬ ТаблицаПосле ИЗ &ТЗ КАК ТЗ” и далее собираю информацию из них по отклонению в стоимости и по фактам добавления/удаления строк:
    “ВЫБРАТЬ
      | ЕСТЬNULL(ТаблицаДо.Номенклатура, ТаблицаПосле.Номенклатура) КАК Номенклатура,
      | ЕСТЬNULL(ТаблицаДо.Цена, 0) КАК ЦенаДо,
      | ЕСТЬNULL(ТаблицаПосле.Цена, 0) КАК ЦенаПосле,
      | ЕСТЬNULL(ТаблицаПосле.Цена, 0) – ЕСТЬNULL(ТаблицаДо.Цена, 0) КАК Отклонение,
      | ВЫБОР
      |  КОГДА ЕСТЬNULL(ТаблицаДо.Цена, 0) = 0
      |   ТОГДА ИСТИНА
      |  ИНАЧЕ ЛОЖЬ
      | КОНЕЦ КАК ДОБАВИЛИ,
      | ВЫБОР
      |  КОГДА ЕСТЬNULL(ТаблицаПосле.Цена, 0) = 0
      |   ТОГДА ИСТИНА
      |  ИНАЧЕ ЛОЖЬ
      | КОНЕЦ КАК УДАЛИЛИ
      |ИЗ
      | ТаблицаПосле КАК ТаблицаПосле
      |  ПОЛНОЕ СОЕДИНЕНИЕ ТаблицаДо КАК ТаблицаДо
      |  ПО (ТаблицаДо.Номенклатура = ТаблицаПосле.Номенклатура)”. Далее стандартно выгружаю в ТЗ и формирую запись в ЖР.
    2. Выгружаю по фильтру, анализирую и вывожу ТЗ. Единственное, что не получилось, так это сделать запрос к ТЗ и выгрузить в виде дерева….  надо над этим подумать….

  36. Асатрян Армен 26.10.2010 в 23:02

    Задание выполнил.
    1. Подписка на событие перед записью документа (любого). В ней проверка на модифицированность, поиск реквизита Цена в ТЧ (безотносительно к названию ТЧ).
    2. Ищу разные цены по одной номенклатуре в ссылке и в объекте, кидаю в таблицу с результатом – номенклатура, старая, новая цена
    3. Запись события методом ЗаписьЖурналаРегистрации.
    4. Отчет из готовой результирующей таблицы вывести уже не составило труда.
    Хммм… не нравится мне такое решение, а по-другому не получилось. Пытался воспользоваться для ТЧ методом УстановитьИспользованиеСобытияЖурналаРегистрации , но как его не крутил – ничего не вышло. Да и проверять изменение цен неплохо бы по событию ПриИзменении в поле Цена, а не при записи документа (т.к. однозначно связать строки в ТЧ старого и нового документа в общем случае нельзя – количество строк может различаться, 2 строки для одной номенклатуры с разной ценой и т.п.). Короче говоря ждем эталонного решения, которое устранит все непонятности и шероховатости :)
     

  37. К сожалению, не удалось сделать задание без подписки на событие. Хотя поначалу трудностей не было. На оба документа, в которых присутствует цена, создал описание доступа для сбора событий _$Access$_.Access. Т.е. все сделал так, как рассказано на уроке и описано в синтакс-помощнике. При этом доступ к объекту задал как “Документ.ПоступлениеТоваровИУслуг”, а в описании нужных полей регистрации и доступа перед названием полей указал “Товары.”.
    После небольшого исследования ЖР выяснил, что для логирования цены достаточно уже настроенного события _$Access$_.Access, которое содержит значение цены до изменения. А для получения значения цены после изменения достаточно события _$Data$_.Post. Для этой же цели не подходит использование события _$Data$_.Update, поскольку оно возникает также и при отмене проведения.
    Ну, а дальше алгоритм представлялся простым. В процедуре чтения лога ЖР установил фильтр, включающий оба события (Доступ и Проведение) и период дат. После получения таблицы значений предполагал обойти ее в цикле от последней строки до первой и для события _$Data$_.Post искать ближайшее событие _$Access$_.Access, после чего сравнивать искомые значения по свойству Данные.
    Однако при отладке возникли трудности. И самая главная – это то, что почему-то в списке полей регистрации кроме поля Цена никакие другие поля задать не получилось (задавал их как массив строк). В результате невозможно было понять к какому документу и к какой номенклатуре относится событие _$Access$_.Access.
    Кроме того, обнаружил, что при проведении одного документа в ЖР отражалось второе событие _$Access$_.Access, которого как бы и не должно быть. К тому же у него в поле Данные.Данные имелось неопределенное значение. 
    После нескольких попыток пришлось отказаться от дальнейшей реализации этого алгоритма и сделать задание через подписку на событие. Видимо проблема заключается в настройке полей регистрации для логирования объектов с табличной частью. В синтакс-помощнике мудренное описание этой настройки.
    По ходу выполнения этого задания возникли вопросы.
    1. При повторной установке использования того же события журнала регистрации, но с другим его вариантом, будет ли осуществляться его регистрация по предыдущим вариантам?
    2. Где хранится настройка вариантов использования событий журнала регистрации? Для эксперимента перенес только dt-файл на другой компьютер, однако настройка регистрации событий сохранилась.
    3. Есть ли такое понятие, как настройка вариантов использования событий ЖР по умолчанию?

    • 1. С большой вероятностью событие будет регистрироваться в двух вариантах.
      2. В 8.2 многое храниться в таблицах ИБ, в том числе и эти настройки.
      3. Нет, описывать использование событие нужно всякий раз вручную.

  38. Добрый вечер! Задание выполнил.
    1. В подписке на событие перед записью пакетным запросом собирал данные по ТЧ у проведенных доков с проверкой на проведенность -> получал выборку по изменившейся цене у номенклатуры.
    2. В цикле по выборке формировал ЗаписьЖурналаРегистрации.
    3. Отчет формировал передавая ТЗ (ВыгрузитьЖурналРегистрации) как внешний источник в отчет на СКД (благо, опыт программной работы с СКД есть).

  39. Задание выполнил, но довольно извращенным способом.
    С поиском измененных цен проблем не было, сделал через подписку. Трудности были с помещением информации о номенклатуре и ценах в журнал регистрации. Сохранить в ЖР таблицу с ценами (как в случае с событием Доступ) с помощью ЗаписьЖурналаРегистрации не 
    получилось, а использовать для этого комментарий не додумался, поэтому решил сделал через событие Доступ.
    В подписке формируется таблица с измененными ценами и записывается через набор записей вспомогательного регистра сведений, затем
    включается событие Доступ к записям регистра, набор записей прочитывается, и событие Доступ отключается.
    Минусы: 1) включение/ отключение занимает доп. время 2) лишний регистр 3) событие Доступ может использоваться другими механизмами.
    Хорошо бы точно узнать, ЗаписьЖурналаРегистрации() в качестве данных воспринимает только примитивные типы или еще что-нибудь? В синтаксис-помощнике написано, что тип – произвольный.

    • Посмотрел замер производительности. Оказалось, что включение/отключение события занимают мало времени.
      Включение – 0,000865 с, а отключение – 0,001830 с (чуть меньше, чем чтение одной записи из регистра сведений методом Прочитать)
      Так что п. 1 можно исключить.

  40. Сделал, как многие, через подписку на событие. Отчет сформировал не в СКД…