Имя: Пароль:
1C
1С v8
Сравнение таблиц ДО и После изменения
,
0 kintevy
 
27.09.22
10:12
с 1с знаком чуть больше недели, дали задание в расширении сравнить результат таблицы до изменений и после и вывести результат истина или ложь в зависимости от того менялась таблица или нет. дали подсказку что нужно сравнивать объект и ссылку таблицы значений но как к ним обращаться, что именно делать нужно - нет понимания. если можно подробно объяснить как это делать, откуда брать данные , то был бы признателен
1 Ryzeman
 
27.09.22
10:16
(0) Объект - это то, что в оперативной памяти. По ссылке получаешь то, что хранится в базе данных физически на диске в табличке. Как сравнивать - тут уж сам должен определиться с алгоритмом.
В общем случае построчно - получаешь две таблицы, сравниваешь количество строк, если одинаковое - начинаешь каждую строку сверять. В частных случаях могут быть более изящные решения
2 kintevy
 
27.09.22
10:24
(1) Функция ТаблицаЗначенийСравнить (Продукция)
    ТабЗначений = Новый ТаблицаЗначений();
    ТабЗначений = Объект.Продукция.Выгрузить();
    ТабЗначенийСравниваемое = ТабЗначений.Скопировать(); я просто не понимаю, правильно ли я обращаюсь к таблице значений для данных, просто в моих глазах после этого я пишу цикл для перебора строк
3 Ногаминебить
 
27.09.22
10:24
Вероятно проверяющие ждут, что будет запрос с объединением двух таблиц по всем полям.
4 kintevy
 
27.09.22
10:46
&НаСервере
Функция ТаблицаЗначенийСравнить (Продукция)
    ТабЗначений = Новый ТаблицаЗначений();
    ТабЗначений = Объект.Продукция.Выгрузить();
    ТабЗначенийСравниваемое = ТабЗначений.Скопировать();
    
    Для НомерСтроки = 1 По ТабЗначений.КоличествоСтрок() Цикл
         ТабЗначений.ПолучитьСтрокуПоНомеру(НомерСтроки);
    КонецЦикла;

    Для НомерВТаблице = 1 По ТабЗначенийСравниваемое.КоличествоСтрок() Цикл
        ТабЗначенийСравниваемое.ПолучитьСтрокуПоНомеру(НомерВТаблице);
    КонецЦикла;
Если НомерСтроки <> НомерВТаблице Тогда Результат = Ложь;  
         Иначе Результат = Истина;
         КонецЕсли;
         Возврат Результат;
КонецФункции

не уверен так ли должно выглядеть условие для сравнения строк
5 Мультук
 
гуру
27.09.22
11:05
(4)

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

3)
https://infostart.ru/public/326983/
https://helpf.pro/faq8/view/1888.html


4) Только скорее всего, от вас хотят чего-то другого, а вот чего - в хрустальный шар не очень видно




P.S.
Я бы (интересно, а Си-шный компилятор бы смог?) сократил этот код до:
    
&НаСервере

Функция ТаблицаЗначенийСравнить (Продукция)
    Возврат Истина;
КонецФункции
6 kintevy
 
27.09.22
11:19
(5) Ну насколько я понял, хотят перебор строк - кол-во строк изменилось = истина
и проверка 4 колонки на изменение содержимого - изменилось = истина
7 AlvlSpb
 
27.09.22
15:23
(6) Бери первый способ из первой ссылки в (5) п.3. Если кол-во колонок мало, первый цикл для составления списка колонок можно не делать (в Свернуть просто перечислить их)
Делаешь
ТаблицаДО = Объект.Продукция.Выгрузить();
выполняются какие -то действия что могут поменять таблицу. По окончанию делаешь
ТаблицаПосле = Объект.Продукция.Выгрузить();
Объединяешь обе таблицы в одну в цикле
Добавляешь колонку и заполняешь ее единицей (1)
Сворачиваешь полученную таблицу по всем колонкам с суммированием по добавленной колонке
Ищешь в таблице строки в добавленной колонке имеющие значение 1 НайтиСтроки() (не свернулись, не сплюсовались, значит строки отличаются или добавленные)
Если массив пустой - изменений нет, если массив имеет строки - изменения были
8 kintevy
 
27.09.22
15:45
(7) У  меня при выгрузке таблицыДО и после на выходе одинаковые данные, он выгружает одну и ту же таблицу, либо я опять не догоняю
9 rudnitskij
 
28.09.22
00:33
(0) если колонки таблиц заведомо одинаковые - можно через запрос ОБЪЕДИНИТЬ прочитать эти две таблицы в одну, только во второй таблице числовые поля умножить на минус один. Если после группировки результата не остается строк - значит содержимое таблиц одинаковое.
Но если вы знакомы с 1С чуть больше недели - у вас такой номер скорее всего не пройдет, так что надежнее будет "позвать программиста"(с)
10 Bigbro
 
28.09.22
08:17
мне нравится вариант с объединением таблиц и сверткой.
это просто и минимум кода.
11 Мимохожий Однако
 
28.09.22
08:56
(8) Ты сделал копию таблицы и сравниваешь. Вот и одинаковые данные. Первая строка в функции  лишняя. А что ты делаешь с таблицей перед сравнением я не понял.
12 Serg_1960
 
28.09.22
09:05
(8) Если учитывать Ваше "сравнить результат таблицы до изменений и после"(0), то Ваш алгоритм должен находиться в обработчике события  ПередЗаписью() - там есть возможность обращаться к данным Объект(это Ваше "после") и Объект.Ссылка (это Ваше "до изменений").
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший