Продвинутый курс. Домашнее задание №1
Первое задание по 0-му блоку продвинутого курса.
Для выполнения рекомендуется изучить следующие главы 0-го курса.
Глава 1. Запуск информационных баз.
Глава 2. Автоматическая установка платформы.
Глава 3. Архитектура системы.
Глава 4. Клиент-серверный вариант работы ИБ.
Глава 5. Журнал регистрации.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.
Задание выполнил
Регистрация журнала:
Для логирования используется подписка на событие (Передзаписью) для документов Поступление товаров и Реализация товаров.
В обработчике данной процедуры сравниваются 2 таблицы (таблица товаров из объекта и таблица товаров из ссылки). Они связываются по номенклатуре и если они расходятся по цене то мы формируем запись в журнале регистрации (“Изменения цен после проведения”).
Отчет:
Выгружаем журнал регистрации в таблицу значений с фильтром.
по периоду отчета. Получившуюся таблицу значений устанаавливаем внешним набором данных для схемы компановки.
По ходу решения возник вопрос:
Как установить внешний источник данных (таблица значений) схеме компановки, который впоследствии будет использоваться методом СкомпановатьРезультат
Регистрация журнала:
Для логирования используется подписка на событие (Передзаписью) для документов Поступление товаров и Реализация товаров.В обработчике данной процедуры сравниваются 2 таблицы (таблица товаров из объекта и таблица товаров из ссылки). Они связываются по номенклатуре и если они расходятся по цене то мы формируем запись в журнале регистрации (“Изменения цен после проведения”).
Отчет:
Выгружаем журнал регистрации в таблицу значений с фильтром. по периоду отчета. Получившуюся таблицу значений устанаавливаем внешним набором данных для схемы компановки.
По ходу решения возник вопрос:
Как установить внешний источник данных (таблица значений) схеме компановки, который впоследствии будет использоваться методом СкомпановатьРезультат
Задание выполнено.
По записи изменения цен в ЖР отчитывался ниже. По отчету – выгрузка ЖР методом ВыгрузитьЖурналРегистрации с отбором по датам, пользователю (если задали в отчете) и имени своего нового события. Вывод результирующей таблицы значений в табличный документ.
Задание № 1 выполнила.
1) В модулях документов Поступления и Реализации в процедуре ПередЗаписью для проведенных документов сделала вызов функции общего серверного модуля, в которой запросом по табличным частям ссылки и объекта, получаю таблицу с изменениями. Если она не пустая, то делаю вызов процедуры из общего серверного модуля, в которой производится запись в журнал регистрации. Не стала делать через подписки на события, т.к. этот материал еще не изучали.
2) В отчете выгружаю журнал регистрации с фильтром по событию, загружаю в таблицу на форме для просмотра. Сделала кнопку Печать, по нажатию на которую формируется печатная форма с группировкой по пользователям.
Задание выполнено. 1. ЗаписьЖурналаРегистрации подпиской на событие ПриЗаписи документов.
2.ВыгрузитьЖурналРегистрации в ТЗ.
3.Отчет СКД.
Не ПриЗаписи, а ПередЗаписью
Задание выполнено.
Решил сделать универсальный метод, поэтому использовал подписку на событие ПередЗаписью, Источник: ДокументОбъект. В параметре Источник имеем новые значения, в Источник.Ссылка перед записью старые значения.
Остальное дело техники:
Если Источник.Проведен Тогда
Для каждого ТЧ Из Источник.Метаданные().ТабличныеЧасти Цикл
Если (ТЧ.Реквизиты.Найти(“Номенклатура”) <> Неопределено) И ТЧ.Реквизиты.Найти(“Цена”) <> Неопределено Тогда
Запрос = Новый Запрос;
Запрос.Текст = ”
|ВЫБРАТЬ
| ТЗОбъект.Номенклатура,
| ТЗОбъект.Цена
|ПОМЕСТИТЬ ТЧОбъект
|ИЗ
| &ТЗОбъект КАК ТЗОбъект
|;
|ВЫБРАТЬ
| ТЧОбъект.Номенклатура Номенклатура,
| ТЧСсылка.Цена СтараяЦена,
| ТЧОбъект.Цена НоваяЦена
|ИЗ
| ТЧОбъект КАК ТЧОбъект
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.”+Источник.Метаданные().Имя+”.”+ТЧ.Имя+” КАК ТЧСсылка
| ПО ТЧОбъект.Номенклатура = ТЧСсылка.Номенклатура
| ГДЕ
| ТЧСсылка.Ссылка = &Ссылка
| И ТЧОбъект.Цена <> ТЧСсылка.Цена”;
Запрос.УстановитьПараметр(“Ссылка”, Источник.Ссылка);
Запрос.УстановитьПараметр(“ТЗОбъект”, Источник[ТЧ.Имя].Выгрузить(,”Номенклатура,Цена”));
ТЗРасхождений = Запрос.Выполнить().Выгрузить();
Если ТЗРасхождений.Количество() > 0 Тогда
ПроцедурыЖурналаРегистрации.ЗаписатьРасхожденияЦен(Источник.Ссылка, ТЗРасхождений);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли; // Источник.Проведен
В процедуре ЗаписатьРасхожденияЦен прозлжу по ТЗ, в комментарий записываю номенклатуру, старую и новую цену. Для отчета использую ВыгрузитьЖурналРегистрации с отбором по датам и имени события.
Странно. У меня запрос
Запрос.Текст = “ВЫБРАТЬ
| ТЧБыло.Номенклатура,
| ТЧБыло.Цена
|ПОМЕСТИТЬ ТЧБыло
|ИЗ
| &ТЧБыло КАК ТЧБыло
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТЧСтало.Номенклатура,
| ТЧСтало.Цена
|ПОМЕСТИТЬ ТЧСтало
|ИЗ
| &ТЧСтало КАК ТЧСтало
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТЧБыло.Номенклатура,
| ТЧБыло.Цена,
| ТЧСтало.Цена КАК ЦенаСтало
|ИЗ
| ТЧБыло КАК ТЧБыло
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТЧСтало КАК ТЧСтало
| ПО ТЧБыло.Номенклатура = ТЧСтало.Номенклатура
| И ТЧБыло.Цена <> ТЧСтало.Цена”;
Запрос.УстановитьПараметр(“ТЧБыло”, Источник[ТЧ.Имя].Выгрузить());
Запрос.УстановитьПараметр(“ТЧСтало”, Источник.Ссылка.ПолучитьОбъект()[ТЧ.Имя]);
Работать отказался. Временные таблицы были пустыми.
Разбил на 3 запроса, все заработало.
Релиз платформы 1С:Предприятие 8.2 (8.2.11.232). Хотя может и мой косяк где то, но вроде все было правильно.
У меня релиз 8.2.12.80 файловый. Но думаю дело не в этом. Такие пакеты у меня и в 8.1 прекрасно работают. Меня смущает установка параметра Источник.Ссылка.ПолучитьОбъект()[ТЧ.Имя]. А выгрузка в таблицу значений где? По-моему тут ошибочный подход.
Запрос.УстановитьПараметр(«ТЧБыло», Источник[ТЧ.Имя].Выгрузить());
В Источнике (если ПередЗаписью) находится как раз “Стало”. А “Было” лучше брать напрямую из базы. Доставать через ссылку и выгружать в ТЗ не вижу смысла.
А ведь не только ТЗ можно передавать в запрос.
Табличная часть и Результат запроса тоже доступные объекты.
Точно, спасибо за напоминание. Т.е. Источник.Ссылка.ПолучитьОбъект()[ТЧ.Имя] должно работать? Сам пока не пользовался, с ТЗ оно как-то спокойнее :) Обычно ещё предшествует какая-то обработка. Просто смутило, что у коллеги Леонида в другом параметре стоит:
Источник[ТЧ.Имя].Выгрузить() Т.е. тут ТЗ, а “там” табличная часть. Может поэтому внутреннее соединение и не работает? Я настолько хорошо временными таблицами не владею (надеюсь, что пока:)
Я источников не менял, просто разбил запрос на 3 части.
Так что Источник[ТЧ.Имя] тоже работает.
Просто когда я разбирался с тем, почему пакетный запрос возвращал пустой результат, пробовал и так и так. Результат все равно оставался пустым. Потом забыл убрать выгрузку в ТЗ, имхо это лишнее действие.
А из базы действительно можно было тащить по ссылке динамически меняя текст запроса под каждый документ/ТЧ, просто решил проверить и такой варинет. И наткнулся на то что из ссылки получение ТЧ по индексу не работает. Тоже опыт. :)
Попробую все таки вернуться к пакету запросов и попытатся выяснить в чем была причина пустого результата.
Вернул пакет запросов. Все нормально работает. Наверно тогда не та фаза луны была. :))
Бывает :))
Насчет фазы Луны поддержу. Когда отлаживал запрос на расходной накладной, оператор:
Источник.Метаданные().Имя
возвращал “РеализацияТоваровИУслуг” – смотрел Отладчиком. А в тексте запроса упорно “ПоступлениеТоваровИУслуг” (проходил перед этим). Грешил на кэширование, но так и не понял в чём дело. Перезапустил программу и всё заработало. Загадка…
Да, знакомая ситуация.
Особенно часто она бывает с внешними обработками.
Глюки кэширования…
Константин, если строчку грохнут с номенклатурой, то у тебя твое левое соединение в новой цене даст null. И он запишется в журнал в коммент. Как считаешь?
Скорее, если не грохнут, а добавят – в левой части ТЧОбъект (новое содержимое). Да, именно так и будет. По-хорошему надо бы вместо NULL выводить что-то более вразумительное. Например,
|ISNULL( ТЧСсылка.Цена, “Не было”) СтараяЦена,
…
Я специально хотел различать моменты добавления новой номенклатуры и изменения цены с нулевой на ненулевую. Делал на скорую руку, поэтому не всё учтено. Например, наличие строк с одинаковой номенклатурой.
Привет. Запрос в цикле – дурная примета :)
Запрос запросу рознь.
В данном примере ничего страшного нет :)
Тут цикл по метаданным. То есть по коллекции табличных частей документа. Реализованно для универсальности. При добавлении разработчиком нового документа алгоритм будет работать.
Есть более изящное решение?
Ура! Готово! Сначала было не понятно, как же доставать старые цены… подсмотрев в комментарии, вспомнила…. Запись в ЖР через подписки на события. Отчет через выгрузку из журнала регистрации без использования СКД. Не очень красивый, конечно.
Задание выполнил.
Сделал одну подписку на событие ПередЗаписью для всех документов.
В ней проверяю проведен ли источник, затем обхожу метаданные на наличие табличных частей с реквизитами Номенклатура и Цена. Если такие есть, то выбираю во временные таблицы табличную часть из источника и табличную часть из Источник.Ссылка.
Запросом выбираю только те строки, где цена изменилась.
Записываю в журнал через ЗаписьЖурналаРегистрации.
Отчет построил по тому же принципу, выгружаю в таблицу значений журнал, использую ее как источник для временной таблицы, по временной таблице строю запрос.
Из сложностей:
1. Ожидал что временные таблицы заполнятся в пакете запросов, но не получилось. Пришлось для каждой временной таблицы делать Запрос.Выполнить().
2. Получение ТЧ для ссылки по индексу Источник.Ссылка[ТЧ.Имя] не работает, пришлось получать объект Источник.Ссылка.ПолучитьОбъект()[ТЧ.Имя].
Задание выполнил. Запись в ЖР делаю в подписке на событие ПередЗаписью любого документа. Перебираю через метаданные все табличные части, если в табличной части есть реквизит Цена, то начинаю перебирать строки. Старую цену получаю через ссылку.
Долго пытался запихнуть в Данные ЖР структуру, таблицу значений – не получилось :(
Оставил в Данных ссылку на документ, а номенклатуру и старую и новую цены поместил в комментарий. Пока время до публикации решения еще есть, попробую поэкспериментировать еще.
Задание выполнил.
Старые цены получал запросом в процедуре “ПередЗаписью”, новые – в процедуре “ПослеЗаписи” (проверяя заначение режима записи). При обнаружении изменения цены делал запись в журнал регистрации методом ЗаписьЖурналаРегистрации. Уровень записи указал “информация”. В данных поставил ссылку на документ, событие указал “Изменение цены и проведение”.
Для отчета получил таблицу значений методом ВыгрузитьЖурналРегистрации. Отбор записей делал по уровню записи (“Информация”) и названию события (“Изменение цены и проведение”).
Задание выполнил, как многие через подписку на событие. Отчет сделал через выгрузку в ТЗ (ЖР с фильтрами) попробовал ТЗ обработать в СКД, но пока не получилось, пришлось сделать “не изящно” но работает.
1)Логирование изменения цены в проведенных документах
– реализовал с помощью подписки на событие, (ПередЗаписью()),
– формирую Таблицу в которую попадают только те позиции номенклатуры, у которых была изменена цена. В случае если есть новые строки, которых ранее не было, то для цены старой проставляется 0. В случае если удалились строки, то для цены новой проставляется цена 0. Допущение: принимаем что в документе нет одинаковой номенклатуры, с разными ценами.
2) Отчет об изменных ценах.
Получаю ТаблицуЗначений из журнала регистрации, с заданным фильтром по моему событию, с указанием периода, и с необходимыми колонками.
Далее формирую печатную форму на основании полученной ТЗ.
Задание выполнил, использовал:
1.ПодпискуНаСобытие ПередЗаписью для док-тов : Пост и Реализ на случай изменения цены. Проверял Источник.Проведен на выполнение условия задачи. Изменение цены получал сравнивая Источник.Ссылка.Товары (пред состояние) с Источник.Товары (текущее состояние). Регистрировал изменения ЗаписьЖурналаРегистрации.
2.Таблицу для отчета получил ВыгрузитьЖурналРегистрации используя фильтр
Задание по записи в журнал выполнено, но наверное не очень оптимально – я использовала обработчик при изменении цены в табличных частях документов.
да, не очень. эдак вам во все документы придется прописывать.
Задание выполнено.
Первая часть выполнял через подписки на событие и ЗаписьЖурналаРегистрации(), после “отметания” варианта с УстановитьИспользованиеСобытияЖурналаРегистрации(_$Data$_.Update…) т.к. данные изменяются не только у проведенных документов.
Отчет выполнил используя ВыгрузитьЖурналРегистрации с наложением фильтров(Период,событие изменения цены и вид документа).
Задание выполнено.
Добавил две подписки на событие ПередЗаписью и ПриЗаписи. В первой делается запрос на получение данных старых цен, результат помещается во временную таблицу. В структуре ДополнительныеСвойства передается МенеджерВременныхТаблиц. В событии ПриЗаписи сравниваются данные из временной таблицы и записанного документа. В колонку Данные журнала регистрации пишется строковое представление структуры “Документ, Номенклатура, СтараяЦена, НоваяЦена” полученное с помощью метода ЗначениеВСтрокуВнутр. Отчет сделан на СКД, при построении фильтра для метода ВыгрузитьЖурналРегистрации данные берутся из параметров отчета.
Задание выполнил.
Поскольку в задании говорилось о добавлении в журнал регистрации изменение цен пользователем, я использовал обработчики событий формы «ПриОткрытии» и «ПослеЗаписи». Делал только для табличной части «Товары» документа «Реализация товаров».
В процедуре «ПриОткрытии» выгрузил из табличной части товары в таблицу значений «ТЗ_ЦеныПриОткрытии» информацию о ценах и товарах – то есть два столбца «Номенклатура» и «Цена».
В процедуре «ПослеЗаписи» если РежимЗаписи = проведение, добавил вызов процедуру с для проверки цен.
В этой процедуре выгружаю колонки «Номенклатура» и «цена» табличной части «Товары» в таблицу значений «ТЗ_ЦеныПослеЗаписи».
Обхожу строки таблицы «ТЗ_ЦеныПриОткрытии», ищу для каждой номенклатуры и цены аналогичную строку (метод «НайтиСтроки») в таблице значений «ТЗ_ЦеныПослеЗаписи», если нахожу – удаляю ее из ТЗ_ЦеныПослеЗаписи. Если не нахожу, то строку таблицы ТЗ_ЦеныПриОткрытии добавляю в массив «СтрокиСИзмененнойЦеной».
Затем еще одним циклом обхожу массив «СтрокиСИзмененнойЦеной» и ищу в таблице значений «ТЗ_ЦеныПослеЗаписи» строку с такой же номенклатурой (методом «Найти»). Если нахожу ее – значит эта и есть строка с измененной ценой. Вывожу в журнал регистрации строку методом «ЗаписьЖурналаРегистрации», в параметр «Данные» передаю ссылку на документ, строку с информацией о номенклатуре, старой и новой цене передаю в параметр «комментарий», в параметре «ИмяСобытия» указываю “Данные.Изменение цены”.
Считаю, что такой алгоритм работает для случаев, когда меняется цена номенклатуры и при этом может быть несколько строк с одной и той же номенклатурой и разными или одинаковыми ценами, строки с номенклатурой могут сдвигаться перед проведением (например, была первой, стала третьей).
В отчете журнал регистрации выгружал в таблицу значений – с фильтром по событию «Данные.Изменение цены».
а первую ТЗ где храните до тех пор пока не будет после записи?
В переменной модуля формы, на клиенте.
Задание 1 сделал.
Использовал событие ПередЗаписью и процедуры
ЗаписьЖурналаРегистрации
и ВыгрузитьЖурналРегистрации
Задание выполнил.
Данные в журнал писал через подписку. Потом для отчета выгружал данные в ТЗ. При большом объеме не очень хорошо наверное будет так делать. Ну а из ТЗ отчет быстро получился. Я ТЗ передал в запрос как источник данных.
Задание выполнено через подписку на события, процедура обхода метаданных подсмотрена в типовой от 1С.
Отчет реализовал на СКД
ДЗ выполнено. При записи в журнал в качестве данных пытался передать структуру (Номенклатура, СтараяЦена, НоваяЦена), но она не записывается. При анализе строки журнала значение поля данные – Неопределенно. Пришлось формировать несколько строк. Вопрос- а можно поместить в качестве данных структуру?
Структуру скорее всего нельзя поместить.
Если просматривать события связанные с аутентификацией, то в поле данные хранится структура. А вот если сам хочешь добавить , то не получается :(
Что-нибудь придумаем в видео-решении :)
Я вообще хотел ТЗ запихать. Оно не отобразилось в пользовательском режиме, и я подумал – а дайка выгружу в ТЗ посмотрю – вдруго оно там…надежды не оправдались (
Задание выполнил
Сделал через подписку на событие. Немного не хватило универсальности при проверке наличия реквизита цена табличных частей документов. Приходится жестко проверять …Источник.Метаданные().ТабличныеЧасти.Товары.Реквизиты.Найти(“Цена”) <> Неопределено.
А если другой разработчик добавит тч с другим именем – универсальность теряется.
Отчет сделал вывод в таблицу значений на форме.
Жаль нельзя здесь ПРОСТО схемой компоновки данных воспользоваться )))
СКД можно воспользоваться, но мы этого пока не проходили :)
Позже узнаете.
В СКД все возможно, но придется руками писать
http://prntscr.com/14783
Можно ли метод ЗаписьЖурналаРегистрации передавать данные в виде массива? Чтобы регистрировать цены не разными строками журнала товар, старая цена, новая цена, а одной? Не получилось.
Первая половина ДЗ выполнена (пока без отчета). Проверку цен сделал подпиской на событие ПередЗаписью документа. Чтобы не происходило “лишних” записей в ЖР использовал транзакционный режим записи журнала регистрации. Иначе, даже если документ не записывается в ИБ (транзакция не фиксируется), изменение цены все равно попадает в ЖР, что неверно.
Событие изменения цены в ЖР лучше регистрировать 1 на документ или по каждому факту изменения цены в документе отдельная запись ЖР? Можно ведь поменять цену сразу для нескольких товаров в табличной части…
Вы являетесь проектировщиком решения.
У пользователя особых пожеланий по этому вопросу нет.
Поэтому выбирайте лучшее, на ваш взгляд, решение.
Для выполнения данного задания логично было воспользоваться подпиской на событие. Но такой объект еще не изучался в курсе. Можно ли использовать объекты, которые еще не изучались? Или стоит искать решение, опирающееся лишь на уже полученные знания?
Можно использовать все объекты, которыми владеете.
Но я в решении не буду использовать подписку на событие, хотя с помощью ее получается наиболее оптимальное решение.
С нетерпением жду ответа Мастера… :)
Чуть позже.
Дадим время на решение участникам, которые подключатся сегодня-завтра :)
Задание выполнил.
1. По подписке на событие перед записью при необходимости проверяются нужные табличные части документов
2 Поиск в прежней ТЧ по номенклатуре (допущение – не должно быть строк с одной номенклатурой но разной ценой )
3. При расхождениях в цене – запись в журнал регистрации
4 Отчет : по таблице значений с фильтром по своему событию, группировки табличного документа – вручную.
Сделал.
Проведение отлавливал подпиской на событие, перед записью. В ней определял какие цены поменялись и делал записи методом ЗаписьЖурналаРегистрации()
Причем запись делал как по самому объекту, так и по каждой измененной номенклатуры, чтобы построить нормальный отчет.
Задание выполнил. Алгоритм выполнения такой:
создал подписку на событие перед записью и подписал все документы;
в подписке проверяю проведен ли документ и есть ли у него тч товары и есть ли в ней реквизит цена;
если все что надо в доке есть, дальше дергаю запрос:
Выбрать * Поместить ТЗ1 Из &ТЗ1 ТЗ1
;
|Выбрать * Поместить ТЗ2 Из &ТЗ2 ТЗ2
;
Выбрать
ТЗ1.Номенклатура,
ТЗ1.Цена СтараяЦена,
ТЗ2.Цена НоваяЦена
Из ТЗ1 Как ТЗ1
Внутреннее Соединение ТЗ2 Как ТЗ2
По ТЗ1.Номенклатура = ТЗ2.Номенклатура
И ТЗ1.Цена <> ТЗ2.Цена
И ТЗ1.НомерСтроки = ТЗ2.НомерСтроки
В ТЗ1 и ТЗ2, соотвественно выгруженные тз из модифицированного объекта и ссылки. Запрос (при условии что порядок строк не менялся) вернет сразу же те строки, в которой цена у номенклатуры – разная. Дальше циклом обхожу эту номенклатуру и через процедуру ЗаписьЖурналаРегистрации пишу свое событие, при этом в данных указываю сам документ, а в комментарии – такую строку “Номенклатура:старая_цена:новая_цена”.
Далее отчет совсем просто делается – данные уже в подготовленном построчном виде :)
На данный момент, что-то подсказывает, что информацию об измененных ценах номенклатуре не правильно хранить в виде строки (хотя требуемый отчет рисуется просто. В тоже время “завтра” номенклатура должна стать ссылкой и что тогда делать – не особо понятно). С другой стороны, если строкой не писать, тогда непонятно как ссылку на документ-изменятор хранить (опять в комментарии получается засовывать). Вообщем, оптимальная структура хранения информации об изменении цены (номенклатура, документ, цены) пока не найдена. Буду ждать эталонного решения!
1. использовал подписку “перед записью”
2. выгружал ТабЧАсть из Источник.Ссылка.Товары в ТЗ а из просто Источник.Товары в массив. в ТЗ в качестве новой колонки загружал массив. сравнивал строки ТЗ. ну и писал различия в журнал. в поле Комментарий писал знак “www”
3. журнал выгрузил в ТЗ с фильтром по своему признаку. ну а из готовой ТЗ отчет уже всяко сделать не сложно.
да, кстати, задание выполнил.
Подписка на события хорошая идея! Не вспомнил про эту возможность.
Я делал процедуру общего модуля, к которой обращался перед записью документов поступления и реализации товаров – передавал табличную часть документа и ссылку.
Дальше сравнивал старую и новую цены и при различии делал запись командой ЗаписьЖурналаРегистрации(“Изменение цены товара”,УровеньЖурналаРегистрации.Информация,,,СтрСообщения);
УстановитьИспользованиеСобытияЖурналаРегистрации
нельзя применить, так как невозможно проверить проведен документ или нет
Домашнее задание №1 выполнено.
Сначала кинулся думать в сторону использования событий “Доступ”… В итоге сделал с помощью подписки на события перед записью всех документов – добавил проверку изменились ли цены в текущем объекте по сравнению с объектом хранимым в базе. Если цена изменилась, вручную формировал запись журнала регистрации со ссылкой на документ (для удобства открытия) и комментарием о том, у какой номенклатуры с какой на какую изменилась цена. Таким образом на каждый товар у меня получилась отдельная запись журнала регистрации.
Отчет сделал с помощью ВыгрузитьЖурналрегистрации с применением необходимых фильтров.
Забыл уточнить – конечно делал проверки на то, проведен документ или нет. Есть ли у него табличные части с реквизитом “Цена” и т.п.
Не качается что-то каркасная база – предлагает записать в файл с расширением GIF
Really? Только что скачал.
Попробуйте:
1. Другой браузер.
2. Использовать DM.
Задание выполнил.
Запись ЖР осуществляется через подписки на событие перед записью документов. Использовал процедуру ЗаписьЖурналаРегистрации.
Сравнение старой и новой цены – через данные Ссылки и Объекта. Т.е. через две ТЗ (можно было и запросом). Есть проблема при дублях строк – т.к. ищем построчно из одной ТЗ в другой по “Номенклатура”.
Информацию по номенклатуре, ценам получилось бросить только в комментарий строкой. Данные, метаданные – сам документ.
Отчет на СКД с передачей полученной ТЗ (ВыгрузитьЖурналРегистрации) в набор данных Объект.
Что такое отчет о выполнении задания?
Нужно доложить о выполнении или описывать решение?
Нужно описать основные моменты вашего решения.
задание выполнил.
Фиксирую информацию следующим образом в подписке на событие перед записью:
1) Проверяю, проведен ли источник
2) Используя метаданные документа, прохожу по всем его табличным частям. В попытке обращаюсь к реквизиту “Цена” (можно конечно поискать по типу, но могут быть сложности).
3) Сравниваю значение цены в строке объекта и строке ссылки. Если значения разные – фиксирую запись в журнале.
4) Отчет создан
Делал также.
Так проверял есть ли цена в ТЧ.
ТабличнаяЧасть.Реквизиты.Найти(“Цена”) = Неопределено
Продолжить;
КонецЕсли;
Задание выполнено.
Только сделал в ИБ из https://mg.spec8.ru/2010/10/25/%D0%BF%D1%80%D0%BE%D0%B4%D0%B2%D0%B8%D0%BD%D1%83%D1%82%D1%8B%D0%B9-%D0%BA%D1%83%D1%80%D1%81-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5-%D0%BC%D0%B0%D1%82%D0%B5%D1%80/
Пока получается по документам – только для реквизитов Шапки события регистрировать.
К табличной части для всех вариантов выдает ошибку:
{Форма.Форма.Форма(33)}: Ошибка при вызове метода контекста УстановитьИспользованиеСобытияЖурналаРегистрации(“_$Access$_.Access”, Использование);
по причине:
Недопустимое значение параметра (параметр номер ‘2’) (Неверное описание регистрации доступа: Документ.РеализацияТоваров.Товары.)
У меня:
Описание.Объект=”Документ.РеализацияТоваров.Товары”;
Запросом пробовала, так там тоже получается обращение Документ.РеализацияТоваров.Товары
Что не так делаю?
Получилось добраться до цены, когда сделала объектом документ, а ТЧ – указала в поле.
Сделала.
Но, не так, как хотела сначала – Использовать УстановитьИспользованиеСобытияЖурналаРегистрациитслеживания для изменения цен в проведенном документе – полностью не получилось, хотя, очень хотелось бы понять, принципиально невозможно или это я не знаю как.
Подписку на события еще не проходили.
Пришлось сделать в процедурах Перед записью для старых цен и После записи для новых, ЗаписьЖурналаРегистрации – при отличиях.
Сделала другой вариант.
Разобралась с подписками на события – сделала подписку для документов Поступления и Реализации ПередЗаписью.
Запрос для Ссылка – старые цены, для объекта (источник) – новые. При различии – ЗаписьЖурналаРегистрации.
Такой вариант больше понравился, без вмешательства в код имеющихся документов, но, все-таки хотелось бы понять, можно ли сделать через УстановитьИспользованиеСобытияЖурналаРегистрациитслеживания
Опечатка – наоборот, конечно.
Ссылка – новые цены, Объект – старые цены.
Отчет – выгрузила Журнал регистрации в ТЗ.
Сделала без СКД – пока не знаю, как передавать ТЗ в набор данных Объект.
Здравствуйте, информационная база с примерами нулевого блока это и есть каркасная конфигурация? Если нет, то где ее взять?
Нет, Денис.
Каркасная конфигурация только что стала доступна в текущей записи.
А где можно скачать каркасную конфигурацию для решения домашних заданий продвинутого курса ?
Ссылка добавлена.
Евгений, каркасная конфигурация – это сегодняшняя 02-1Cv8_Adv_After0Block.dt ? И ещё вопрос по выполнению ДЗ. Если есть возможность создать клиент-серверную базу на MS SQL Server, лучше создавать её или особой разницы не будет?
1. В записи https://mg.spec8.ru/2010/10/25/%D0%BF%D1%80%D0%BE%D0%B4%D0%B2%D0%B8%D0%BD%D1%83%D1%82%D1%8B%D0%B9-%D0%BA%D1%83%D1%80%D1%81-%D0%B4%D0%BE%D0%BC%D0%B0%D1%88%D0%BD%D0%B5%D0%B5-%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%E2%84%961/ выложена каркасная конфигурация.
2. Клиент-серверную базу создавать не обязательно, будет работать в файловой базе.
Поскольку далеко не у всех есть серверный ключ.