Имя: Пароль:
1C
1С v8
Тестовое задание: как отследить изменение в табличной части?
0 laby1
 
03.02.16
08:49
Кок определить перед записью документа, изменения в табличной части, например цены - определить старое и новое значение

То есть вот такой код пишу:

Процедура РегистрацияИзмененияЦен()
    Для Каждого ТекСтрокаТовары Из Товары Цикл
        //ТекСтрокаТовары.Цена;
    КонецЦикла;
КонецПроцедуры;    

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

ТекСтрокаТовары - это строка у меня новых значений, а как мне соответствующее старое получить?
1 NcSteel
 
03.02.16
08:50
из ссылки
2 Fedor-1971
 
03.02.16
08:53
Об = Объект.Ссылка.ПолучитьОбъект(); - то что записано в БД.
А по алгоритму сравнения - это уже тебе виднее.
3 NcSteel
 
03.02.16
08:57
(2) Глупость больше не пиши...
4 laby1
 
03.02.16
09:03
(3) Я понял, ща попробую
5 Fedor-1971
 
03.02.16
09:08
(3) обоснуй?
1. Будешь утверждать, что в ПередЗаписьюНаСервере объект сохранённый в БД уже изменён данными из текущей формы?
2. При обращении: Ссылка.Реквизит - ты откуда получишь данные?
6 Рэйв
 
03.02.16
09:09
(5)Получать объект не надо. Просто сравнить ссылку и тек данные
7 Fedor-1971
 
03.02.16
09:16
(6) так, всё равно, из БД будет неявно прочитан весь объект даже при обращении Ссылка.Номер, тем более, что ТС собрался сравнивать ТЧ, пусть уж явно получит Объект из БД и сравнивает себе на здоровье.
8 laby1
 
03.02.16
09:18
Я вот тут чуток налобал посмотрите:

Процедура РегистрацияИзмененияЦены(НовыйТовар, СтараяЦена, НоваяЦена);
    // Тута будет еще кодус
КонецПроцедуры

Процедура РегистрацияИзмененияЦен()
    Для Каждого СтрокаНовогоТовара Из Товары Цикл
        НовыйТовар = СтрокаНовогоТовара.Номенклатура;
        СтрокаСтарогоТовара=Ссылка.Товары.Найти(СтрокаНовогоТовара.НомерСтроки,"НомерСтроки");
        СтараяЦена=СтрокаСтарогоТовара.Цена;
        СтарыйТовар=СтрокаСтарогоТовара.Номенклатура;
        Если СтарыйТовар=НовыйТовар И НЕ СтараяЦена=Неопределено Тогда
            РегистрацияИзмененияЦены(НовыйТовар, СтараяЦена, НоваяЦена);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры;

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Если Проведен Тогда
        РегистрацияИзмененияЦен();
    КонецЕсли;
КонецПроцедуры
9 Одинесю
 
03.02.16
09:18
(7) По ссылке ты залез в БД, прочитал и отправил нужные данные, а получив объект ты его весть грузишь и потом читаешь.
10 famnam
 
03.02.16
09:19
(8) не забываем, что пользователь может изменить порядок строк в ТЧ
11 laby1
 
03.02.16
09:20
(10) Да я понимаю, тогда по номенклатуре искать что-ли, а если несколько строк с одной наменклатурой???
12 Рэйв
 
03.02.16
09:21
(0)Нафига ему весь объект целиком в памяти когда ему нужно только ТЧ прочитать
13 Рэйв
 
03.02.16
09:21
(12)к (7)
14 mikecool
 
03.02.16
09:22
(11) если разное кол-во строк - уже изменение
15 laby1
 
03.02.16
09:23
(14) Но мне надо зафиксировать изменение цены в документе
16 Рэйв
 
03.02.16
09:24
(11)Сначала проверяешь на совпадение количества строк, если не совпадает - уже считаешь изменением и закругляешься.Дальше бессмысленно копать
17 laby1
 
03.02.16
09:24
По каждой строке ТЧ, а вот если новая строка добавилась тут я не знаю ...
18 laby1
 
03.02.16
09:25
(16) мне не надо закругляться, мне надо изменения все зафиксировать
19 Рэйв
 
03.02.16
09:25
(15)Как вариант- держи в отдельной колонке номера строк и заполняй их перед записью. Тогда даже если пользователь их все перемешал - ты точно будешь знать как было изначально
20 Рэйв
 
03.02.16
09:26
(18)см (19)
21 laby1
 
03.02.16
09:26
(19) Сам то понял, что написал
22 Рэйв
 
03.02.16
09:27
(21)Вполне.А что неясного?
23 mikecool
 
03.02.16
09:27
(18) выборка номенклатура, цена, группировка по ним что в сылке, что в объекте - дальше сравнивай
24 Рэйв
 
03.02.16
09:28
(21)запишешь тек номера строк перед записью.При след. открытии пользоыватель перемешивает строки - тут приходишь ты весь в белом, сортируешь по сохраненной колонке и имеешь первоначальный вид
25 Рэйв
 
03.02.16
09:28
+(24)заодно знаешь какие строки новые.Потому что в них в этой колонке будет пустой номер
26 Бледно Золотистый
 
03.02.16
09:29
(12) Ну вот в (8) ТС и дергает объект 100500 раз по твоему совету. Это есть хорошо? В любом случае нужно держать в памяти всю ТЧ.
(11) А чем не устраивает поиск по номенклатуре для цен? Просто в начале нужно убедиться что нет несколько строк одной номенклатуры с разными ценами.
27 Рэйв
 
03.02.16
09:31
(26)Я ему не советовал каждый раз лезть к тч в цикле:-). Достаточно ее получить один раз
28 laby1
 
03.02.16
09:31
Тогда так

Процедура РегистрацияИзмененияЦен()
    Для Каждого СтрокаНовогоТовара Из Товары Цикл
        НовыйТовар = СтрокаНовогоТовара.Номенклатура;
        СтрокаСтарогоТовара=Ссылка.Товары.Найти(СтрокаНовогоТовара.НомерСтроки,"НомерСтроки");
        СтараяЦена=СтрокаСтарогоТовара.Цена;
        СтарыйТовар=СтрокаСтарогоТовара.Номенклатура;
        Если СтарыйТовар<>НовыйТовар Тогда
            СтрокаСтарогоТовара=Ссылка.Товары.Найти(СтрокаНовогоТовара.Номенклатура,"Номенклатура");
            СтараяЦена=СтрокаСтарогоТовара.Цена;
            СтарыйТовар=СтрокаСтарогоТовара.Номенклатура;
        КонецЕсли;
        Если СтарыйТовар=НовыйТовар И НЕ СтараяЦена=Неопределено Тогда
            РегистрацияИзмененияЦены(НовыйТовар, СтараяЦена, НоваяЦена);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры;
29 famnam
 
03.02.16
09:32
(16) Тут еще замороченнее может быть: удалили одну строку, добавили другую. Количество строк осталось прежднее, а вот данные уже другие :)
30 Рэйв
 
03.02.16
09:32
(28)кажется ты так и не понял что я тебе предлагал.
Ну бог в помощь тогда.Мучайся:-).
31 Рэйв
 
03.02.16
09:33
(29) в (24) решается
32 Бледно Золотистый
 
03.02.16
09:36
(28) Делай как написано в (23).
33 laby1
 
03.02.16
09:38
Чот не пойму я всех постов, что в моем коде (28) не так?
34 laby1
 
03.02.16
09:39
Или вы мне какой-то запрос предлагаете написать?
35 laby1
 
03.02.16
09:40
(23) что значит тут выборка
36 Fedor-1971
 
03.02.16
09:40
(27) Если дело ограничится только ТЧ, то получать её желательно запросом
Иначе без проблем получим в цикле:          СтрокаСтарогоТовара=Ссылка.Товары.Найти(СтрокаНовогоТовара.НомерСтроки,"НомерСтроки");

(33) МояТЧ=Ссылка.Товары;
в цикле        СтрокаСтарогоТовара=МояТЧ.Найти(СтрокаНовогоТовара.НомерСтроки,"НомерСтроки");

Не дёргай БД каждый раз за одной строкой, получи всё и сразу
37 laby1
 
03.02.16
09:40
(24) Куда запишешь???
38 Бледно Золотистый
 
03.02.16
09:41
(33) Г*внокод потомучта в (28). Я бы сам делал запросом.
39 Мэс33
 
03.02.16
09:41
(0) А что потом? Вот получил изменения ПЕРЕД записью. Узнал, что изменилось. Что потом?
40 laby1
 
03.02.16
09:42
(38) И как запросом решить если одна и та же номенклатура в разных строках а в новой строки перемешаны
41 Рэйв
 
03.02.16
09:42
(37)Ты как читаешь? Реквизит добавь в таб часть для этого дела.Например НомерСтрокиСсылки
В ПередЗаписью() пробегайся по таб части и заполняй текущими номерами строк.
42 laby1
 
03.02.16
09:42
(39) Я запишу в лог что изменилось
43 Рэйв
 
03.02.16
09:44
+(41)потом как бы юзер не мешал строки у тебя всегда у строк в этом реквизите будут те номера которыми они стояли  до изменений
44 laby1
 
03.02.16
09:44
(41) а смысл, что так я нахожу, что еще писать зачемто
45 Рэйв
 
03.02.16
09:45
(44)У тебя половину строк удалили и вместо них добавили половину новых.как ты в этой каше собрался разбираться?
46 laby1
 
03.02.16
09:45
(41) Еще городить доп реквизит ...
47 Рэйв
 
03.02.16
09:46
(46)дело хозяйской..Как я уже сказал -Мучайся :-)
48 Мэс33
 
03.02.16
09:46
(42) любите изобретать велосипеды ))).
Все уже написано.

У меня в УПП была реализация системы для аудиторского контроля - при проведении сохранялся сериализованный в xml объект справочника/документа (выборочно, настривается).

И был отчет - который показывал по ним изменения. Все.
49 hhhh
 
03.02.16
09:46
(33) вообще какой-то бред там написан. Отдельные слова понятны, а в целом бред.
50 famnam
 
03.02.16
09:47
(39) я кажется понял, что хочет ТС. Свой аналог версионирования. да?
51 laby1
 
03.02.16
09:47
(49) где бред?
52 laby1
 
03.02.16
09:48
(50) та не, задачка тут
53 Рэйв
 
03.02.16
09:48
(50)Оо... ну тогда это не велосипед.Это ВЕЛОСИПЕДИЩЕ!:-)
54 Мэс33
 
03.02.16
09:48
(50) угу.

(51) Версионирование объектов есть в типовом.
55 Бледно Золотистый
 
03.02.16
09:48
(50) Нет. Ему не нужно сохранять все изменения в ТЧ, не обращайте внимание на название темы. Все что нужно - фиксировать изменение цены номенклатуры.
56 laby1
 
03.02.16
09:49
(54) Да не версионирование, просто логгирование имзменения цены в ТЧ документа
57 laby1
 
03.02.16
09:50
(55) Да, просто я как бы сначала нужно было отследить изменение чтоб его логгировать, поэтому я собственно само логирование не выношу в тему
58 Лефмихалыч
 
03.02.16
09:53
(56) Например, у тебя была одна строка:
1. Номенклатура 1, количество 10, Цена 100, Сумма 1000

потом стало две строки:
1. Номенклатура 1, количество 1, Цена 10, Сумма 10
2. Номенклатура 2, количество 10, Цена 100, Сумма 1000

это какие изменения произошли? Что ты в свое логирование в этом случае записывать будешь?
59 Fedor-1971
 
03.02.16
09:53
(56) Это и называется мудрёным словом "Версионирование" - сохранение некой части данных с указанием автора изменений, "Логирование" -  цены в документе изменял Вася, а что было и что стало без разницы
60 laby1
 
03.02.16
09:55
(58) Изменена цена Номенклатура1 Была 100 Стала 10

А вот по второй строке не знаю, в условии задачи надо фиксировать изменение цены
61 laby1
 
03.02.16
09:56
(59) Да, точно, надо еще и автора изменения как-то зафиксить, как его получить?
62 Лефмихалыч
 
03.02.16
09:57
(60) а на самом деле я в имеющейся строке изменил номенклатуру, потом добавил новую строку, потом поменял порядок строк.
И обгадилось все твое логирование. Используй версионирование, не изобретай велокатов.
63 laby1
 
03.02.16
09:57
Можно конечно фиксить была неопределено стала 100
64 laby1
 
03.02.16
09:58
(62) Это учебное задание надо сделать мне ручками
65 laby1
 
03.02.16
09:59
Через УстановитьИспользованиеСобытияЖурналаРегистрации (64)
66 laby1
 
03.02.16
09:59
(65) или чтото типа того
67 famnam
 
03.02.16
10:00
(64)ееееееемое :) надо было сразу сказать что это учебное. а то тебе накидали бизнес-решений
68 Fedor-1971
 
03.02.16
10:00
(61) Аппетит приходит во время еды, посмотри в сторону ТекущийПользователь, автор документа как-то заполняется, примерно тот-же механизм используй для определения автора изменений.

(64) Да уж, юный падаван, ты бы написал в теме "Хелп, надо сделать тест" и условие задачи полностью
69 Лефмихалыч
 
03.02.16
10:00
(64) ручками своими прикрути версионирование из БСП.
Если БСП нельзя использовать, сделай сам. Это не сложно:
1. Добавь регистр для хранения версий
2. Придумай, как тебе удобнее будет хранить версию
3. Добавь подписку при записи, в которой будешь формировать и записывать в регистр текущую версию
4. добавь форму для просмотра версий
70 DomovoiVShoke
 
03.02.16
10:00
Начните с того что вообще в документе? Какие реквизиты чем заполнено, что конкретно нужно фиксировать? А пока общаетесь общими словами: спецы предлагают общий вариант, а ТС хочет специализированный под свой некий док, возможно со своими правилами заполнения и не может понять что ему предлагают.
71 NcSteel
 
03.02.16
10:01
Что то много чего написали, из постановки задачи предлагаю так:

Запрос = Новый Запрос;
Запрос = "Выбрать *, 1 ПризнакИзменения Из Документ.НашДокумент.НашаТЧ Где Ссылка = &Ссылка";

ТаблицаСтарыеДанные = Запрос.Выполнить().Выгрузить();

Для Каждого СтрокаТекущиеДанные Из Объект.НашаТЧ  Цикл
НоваяСтрока = ТаблицаСтарыеДанные.Добавить();
ЗаполнитьЗначениеСвойств(НоваяСтрока, СтрокаТекущиеДанные);
НоваяСтрока.ПризнакИзменения = -1;
КонецЦикла

Далее сворачиваем таблицу и ищем стркои с признаком отличным от 0.
72 Лефмихалыч
 
03.02.16
10:03
(71) фу! гадость!
73 laby1
 
03.02.16
10:04
(28) Может это прокатит?
74 famnam
 
03.02.16
10:06
(73) а куда тест, если не секрет? На работу устраиваетесь или курсы проходите?
75 Лефмихалыч
 
03.02.16
10:06
(73) ты это куда понесешь - в ВУЗ или на собеседование?
76 hhhh
 
03.02.16
10:06
предлагаю более простой вариант. Идем по ТЧ, смотрим товар в таблице зарегистрированных цен. Если цена другая там, то перерегистрируем.
77 laby1
 
03.02.16
10:07
(74) Продвинутый курс Гилев
78 Лефмихалыч
 
03.02.16
10:07
надуднах.
исходную постановку задачи покажи
79 famnam
 
03.02.16
10:08
(77) Зашел бы он сюда, всем двойки поставил >:D
80 laby1
 
03.02.16
10:08
Создайте новую информационную базу на основе выгрузки каркасной конфигурации.
Необходимо обеспечить логирование следующих действий: изменение цены
пользователем в проведенных документах. Необходимо фиксировать детальную информацию о
событии: цена какого товара была изменена, старое и новое значения цены. Информацию
требуется сохранять в журнале регистрации.
Создайте отчет, в котором будут выводиться данные о событиях изменения цены.
Информация должна быть сгруппирована по пользователю.
81 laby1
 
03.02.16
10:09
(76) Да, там есть в конфе регистр сведений цен, но он независимыйй а в документ можно что попало вводить, по заданию вроде отследить надо именно документ
82 famnam
 
03.02.16
10:11
83 Лефмихалыч
 
03.02.16
10:17
гилёвский курс низко пал в моих глазах...

(80) тебе нужно полное соединение таблицы из базы и таблицы из объекта пере записью. При обходе результата строить текст комментария, потом ЗаписьЖурналаРегистрации().

Следующий!
84 NcSteel
 
03.02.16
10:25
(72) Давай обоснование.... или как всегда?
85 laby1
 
03.02.16
10:27
(83) Это самое первое задание, разминочное, часть которого я вынес в тему, а мне вынесли мозг
86 Лефмихалыч
 
03.02.16
10:27
(84) это делается одним запросом без всяких сворачиваний и циклов
87 laby1
 
03.02.16
10:36
(82) Там тоже спецы еще те ...
88 NcSteel
 
03.02.16
10:36
(86) Зачем мучать сервер.... обработать пару десятков строк в оперативной памяти явно выгоднее чем гонять таблицу во временную .

Так что обоснование крайне спорно.
89 laby1
 
03.02.16
10:38
(86) (88) Вы достали все, мой код (8) походу нормальный, в задании ничего не сказано про перестановку строк
90 Одинесю
 
03.02.16
10:38
(83) "гилёвский курс низко пал в моих глазах... "
Можно узнать почему? Хотел пройти его.
91 laby1
 
03.02.16
10:39
(90) Это за бабло ...
92 Одинесю
 
03.02.16
10:40
(91) Я в курсе.
93 NcSteel
 
03.02.16
10:41
(90) Лучший курс это книга профразработка. Лучше пока не придумали.
94 NcSteel
 
03.02.16
10:41
(89) Этот вопрос тебе надо уточнить у постановщика задачи.
95 Одинесю
 
03.02.16
10:44
(93) Профессиональная
разработка в системе
«1С:Предприятие 8»
В двух томах?
Эта книга, скорее, как справочник. Курсы более прикладные что ли, предметная область затронута, решаются конкретные задачи.
96 hhhh
 
03.02.16
10:44
(89) вот у тебя написано  И НЕ СтараяЦена=Неопределено Тогда

вот объясни эту проверку, в каком случае у тебя в поле СтараяЦена может попасть значение Неопределено? Ведь бредишь.
97 NcSteel
 
03.02.16
10:46
(96) Ну в коде там явно будет ошибка если строку добавили или удалили...
98 igork1966
 
03.02.16
10:47
(0) А цель какая? А то я сильно подозреваю что глупость задумана...
99 NcSteel
 
03.02.16
10:47
(95) Предметная область для программирования мало нужна. Что бы уметь программировать надо уметь программировать. А вот этот справочник объясняет и теорию и дает листинги примеров
100 Fedor-1971
 
03.02.16
10:48
(89) плохой код
(93) Книга + Задачник + Форум, там где непонятно, только с предупреждением "Решаю тестовую задачу"
101 Бледно Золотистый
 
03.02.16
10:51
(100) Эффективнее: Реальная задача + Голова + СП + Форум.
102 lEvGl
 
гуру
03.02.16
10:53
(83) +1 согласен. Задание бредовое, слишком много если. Надо понимать для чего это нужно - что бы наказывать пользователей, которые не в свои документы лезут или что бы видеть историю изменения Установленных цен или кто и что делал с ТЧ (даже без проведения документа). Что бы предусмотреть большинство вариантов я бы сделал полный "слепок" документа или только ТЧ, без разницы - таблица со строковым реквизитом неограниченной длины, туда писать измененные версии документа в XMLе например. Потом доставать из хранилища варианты, выстраивать их в линию и сравнивать. Минус в том, что храниться будет все - измененное и нет, а если хочется чтобы совсем все оптимально было, надо четко понимать что нужно
(101) +1
103 Fedor-1971
 
03.02.16
10:56
(101) Это Идеально, но где ему взять реальную задачу, если он только учится?
104 Мэс33
 
03.02.16
10:57
ТС негодяй.. )))
Домашку решает на мисте.
105 NcSteel
 
03.02.16
11:14
(104) Интересуется , узнает. Это полезное свойство.
106 laby1
 
03.02.16
11:17
(104) да не, часть домашки пытаюсь разобраться, но ладно, раз никто не знает, буду сам, по логгированию щас еще тему создам
107 DomovoiVShoke
 
03.02.16
11:17
Да уж только зачем было в 1с лезть с таким мышлением? Сначала научился бы программить. А то толку от такого курса ноль.
108 laby1
 
03.02.16
11:18
(107) чо за гон
109 DomovoiVShoke
 
03.02.16
11:22
1с - это верхушка программирования. Ты б сначала внизу поковырялся. А то ничего не умея сразу за мамонта хватаешься - время убьешь, в голове ничего не останется - зачем?
110 NcSteel
 
03.02.16
11:23
(109) чо за гон
111 Одинесю
 
03.02.16
11:23
(109) Кнута ему предлагаешь?)
112 DDwe
 
03.02.16
11:25
(108) Это не гон, это суровая правда.
113 NcSteel
 
03.02.16
11:27
(112) ТО есть , что бы научиться программировать надо учиться программировать, но не программировать?
114 Одинесю
 
03.02.16
11:28
(113) Ассемблер же)
115 DomovoiVShoke
 
03.02.16
11:38
(113)Да он 10 дней в программировании, он условие "Если" нормально составить не сможет, циклами не сможет пользоваться, про запросы я уже молчу, а тут анализ данных лупит. Вы тему почитайте: он пишет код и вообще не понимает что происходит, ему 10летние спецы говорят он все равно не понимает. Задача без языка решается за минуту в голове, он этого не смог, ему говорят о подводных камнях о решении он не понимает - мозг не заточен еще на решение логических задач. Да еще ко всему этому подход "лишь бы сделать", что в голове вообще останется?
116 laby1
 
03.02.16
11:39
(111) Кнута я в детстве читал еще первое издание
117 DomovoiVShoke
 
03.02.16
11:39
+(115)А когда пойдут реальные прикладные задачи, он будет по пол года их решать?)
118 laby1
 
03.02.16
11:39
(115) бебебе
119 DomovoiVShoke
 
03.02.16
11:40
+(117)С миллионом косяков
120 laby1
 
03.02.16
11:40
(119) Я пишу красиво и без ошибок
121 DomovoiVShoke
 
03.02.16
11:42
(120)Да тут уже фирма влетела на пару миллионов. Сколько киллеров можно нанять чтоб тебя убить?)
122 laby1
 
03.02.16
11:44
(121) куку
123 Рэйв
 
03.02.16
11:45
124 DDwe
 
03.02.16
12:11
(116) Ха-ха-ха... не смешно...
125 DDwe
 
03.02.16
12:14
(115) Ему в голове ничего не нужно. Они сейчас 95% такие. Поколение ... уже и не пепси даже, а хрен знает чего.
126 AceVi
 
03.02.16
12:37
Если еще не было точного ответа:
Задача - отследить все изменения в табличной части.
Решение - сравнение строк таб части ссылки и текущего объекта.

1. По номеру строки сравнивать никак нельзя.
2. Посмотри как сделано, например, для документа "Корректировка реализации" - в таб часть введен новый реквизит . не помню точное название, но смысл ИД строки.
При создании новой строки в реализации - помимо номера строки идет свой счетчик ИД строки. и получается что когда удалят или поменяют местами строки это всегда будет видно по ид строки. Счетчик написан в коде, и выполняется в процедуре "ПриОкончанииРедактирования". Вместо счетчика можно использовать Строка(Новый УникальныйИдентификатор()) - если хочешь уж совсем уникальности.
127 DomovoiVShoke
 
03.02.16
12:41
(126)Предлагали уже. ТС не хочет заводить реквизит. И не хочет понимать, что вся соль этой задачи в реквизите ИДСтроки :)
128 Новиков
 
03.02.16
12:45
(127) так везде в типовых сделано :) Как начпокается, может просветлеет.