Как отследить изменение реквизита? |
Я |
18.01.08 — 15:28
Есть ли какая-то предопределенная процедура или метод, чтобы отследить модифицированность конкретного реквизита формы, а не всей формы?
1 — 18.01.08 — 15:30
(0) Да.
2 — 18.01.08 — 15:34
какая?
3 — 18.01.08 — 15:35
Формула на конкретный реквизит
4 — 18.01.08 — 15:36
Сообщить(?(НужныйРеквизит = ТекущийДокумент().НужныйРеквизит,» не меняли»,»изменили гады :(«)); //для документа
Сообщить(?(НужныйРеквизит = ТекущийЭлемент().НужныйРеквизит,» не меняли»,»изменили гады :(«)); //для справочника
5 — 18.01.08 — 15:37
(3) И чего в ней писать будешь? :)))
6 — 18.01.08 — 15:40
Как вариант
Перем МодифицированностьРеквизит1;
Процедура ОбработкаВыбораЗначения(ВыбЗн,Идент,ФлСтОб)
//в самом конце процедуры
Если Идент=»Реквизит1″ Тогда
Если ВыбЗн<>Реквизит1 Тогда
МодифицированностьРеквизит1=1;
КонецЕсли;
КонецЕсли;
КонецПроцедуры;
МодифицированностьРеквизит1=0;
7 — 18.01.08 — 15:41
А «ВыполнятьФормулуТолькоПриИзменении» не хочешь попробовать?
8 — 18.01.08 — 15:41
(4)С точки зрения модифицированности тоже немного не корректно — могли модифицировать на такое же значение
9 — 18.01.08 — 15:41
(6) Ну и нафига ему это знать? А если значение не менялось? …
10 — 18.01.08 — 15:43
Так тебе не модифицированность нужна, а именно изменение….
11 — 18.01.08 — 15:43
+9 Кстати да…. (0)А нафига?
12 — 18.01.08 — 15:44
(9)Если не менялось —значит и модифицированности не буит
13 — 18.01.08 — 15:44
(8) Та нафига обычная модифицированность сдалась то?, мало ли юзверь шарится по реквизитам …
14 — 18.01.08 — 15:49
(13)А если чел ищет причину постоянного «Сохранить» после открытия?
Помниться как то в хитровымученном документе несколько дней искал — как результат нашел три места где модифицировались реквизиты. к сожалению просто отладчиком это дело отследить было тяжело.
15 — 18.01.08 — 15:51
Мне нужно знать — был ли изменен конкретный реквизит или нет.
Я не понимаю разницы между модифицированностью и измененностью.
16 — 18.01.08 — 15:52
(7) пробовал. Формула элемента срабатывает даже в том случае, если я выбираю то значение, которое было до этого. А это не подходит.
17 — 18.01.08 — 15:53
(13) короче стоит задача менять цвет поля элемента, который был изменен.
18 — 18.01.08 — 15:54
(16) Смотри (4) — это ответ на твой вопрос …
19 — 18.01.08 — 15:55
(17) А, извините, форма чего?
20 — 18.01.08 — 15:55
+18 А обычная модифицированность — это просто реквизит «потрогали» …
21 — 18.01.08 — 16:00
Хм. Вот с цветом интересно будет
22 — 18.01.08 — 16:17
(19) документа
23 — 18.01.08 — 16:19
(4) Не понял суть.
С чем мы сравиниваем ТекущийДокумент().НужныйРеквизит ?
24 — 18.01.08 — 16:20
(21) вернее цвет надписи возле элемента
25 — 18.01.08 — 16:21
(23)Прокатит для ранее записанного документа — сравнивается текущий реквизит на форме с тем что ранее сохранено в базе.
26 — 18.01.08 — 16:22
+25 а если не был сохранен — проверку на Выбран() воткнешь …
27 — 18.01.08 — 16:23
(25) теперь понял
28 — 18.01.08 — 16:25
(24)А ну тогда другое дело. Кстати, дамал что если реально выделять нужно измененный реквизит. Как вариант картинку на форму — цветной прямоугольник под реквизит и играться видимостью — получиться цветная рамка
29 — 18.01.08 — 16:28
(28) вариант. Только у меня на форме реквизиты расположены как рижский шпроты, подустану под каждый прямоугольник лепить
30 — 18.01.08 — 16:32
Посетила мысль: при открытии документа выгрести в таблицу значений значения всех реквизитов документа и сравнивать текущие значения реквизитов с записанными в ТЗ. Если обнаружено изменение, то менять цвет.
Только как в цикле получить значения всех реквизитов? Как-то может через Метаданные?
31 — 18.01.08 — 16:50
(30) Через метаданные получишь только реквизиты документа, реквизиты формы — только с ВК, или заранее где-то хранить их список …
32 — 18.01.08 — 17:21
(31) так мне и надо реквизиты документа.
Как их получить через метаданные?
33 — 19.01.08 — 14:36
Я это сделал напролом, то есть написал глПротокол(р1,р2), которая заносит данные в стандартный протокол.
в документе в ПриЗаписи() ставлю глПротокол(Контекст,ТекущийДокумент())
и все доступно и видно стандартными средствами просмотра протокола.
Алгоритм, как в (4) с обходом реквизитов по Метаданным, в Комментарий ставлю идентификатор, было, стало(преобразованные в текст).
Сам тект модуля длинноватый(обработка особенностей), но основу могу показать.
34 — 19.01.08 — 14:45
(32) Уверен? Реквизит формы может влиять на невидимый реквизит документа. Например у тебя наформе список «Цена включает НДС/Цена без НДС», а в реквизит ЦенаВклНДС пишется 0 или 1, в зависимости от того что выбрали. Придется тебе тогда обратно все просчитывать, в зависимости от того какое значение в реквизите дока выяснять что есть в списке. Для каждого отдельно. Опять же цвет текста не поменяешь обходом через метаданные, только по каждому в отдельности.
35 — 19.01.08 — 14:47
+(34) Ну, в смысле узнал ты какой реквизит изменен, а вот какой текст разукрасить только через череду ИначеЕсли. Ну и что тогда толку от метаданных, если все равно все реквизиты в модуле перепишешь.
G-Re
36 — 19.01.08 — 15:01
Вот очень сокращенній текст модуля(только для реквизитов шапки) и без всяких извращений.
//*******************************************
Функция глПротокол(Конт,бДок) Экспорт
Если ПустоеЗначение(бДок)=1 Тогда
Возврат(«»);
КонецЕсли;
ВидДок=бДок.Вид();
тДок=Конт;
Для ц=1 по Метаданные.Документ(ВидДок).РеквизитШапки() Цикл
ид=Метаданные.Документ(ВидДок).РеквизитШапки(ц).Идентификатор;
Попытка
Было =бДок.ПолучитьАтрибут(ид);
Стало =тДок.ПолучитьАтрибут(ид);
Если Было<>Стало Тогда
ТхТ=»»+Ид+», Было=»+СокрЛП(«»+Было)+», Стало=»+СокрЛП(«»+Стало);
ЗаписьЖурналаРегистрации(ТхТ,»МодификацияДок»,»Модификация реквизита»,бДок,2);
КонецЕсли;
Исключение
КонецПопытки;
КонецЦикла;
КонецФункции
1 |
|
Как програмно отследить изменения на форме?26.06.2005, 14:01. Показов 46739. Ответов 10
Как можно програмно определить произошла ли смена значений в элементах диалога (поле со списком, поле ввода и т.д.)? Можно ли вообще отследить изменения на форме? Положим в окне ввода есть какоето значение… Если мы тыкнулись в него (нажали Enter) то сработает процедура, заданная в окне Дополнительно, для этого поля… Дак вот мне нужно проверить было ли изменено значение в поле, или пользователь просто навел на него курсор, а потом тыкнул Ентер ничего не меняя (или ввел тоже значение)… Если было изменено, то вывести сообщение… |
0 / 0 / 0 Регистрация: 28.03.2004 Сообщений: 1,913 |
|
26.06.2005, 14:24 |
2 |
Иногда очень полезно почитать ЖКК:
0 |
26.06.2005, 14:28 |
3 |
Любой формы? Я в Обработке работаю… |
26.06.2005, 14:36 |
4 |
Был бы этот ЖЖК, у меня вообще док нормальных нету блин… = |
26.06.2005, 14:39 |
5 |
Ну и опятьже из твоего примера непонять как узнать старое значение и как сравнивать с новым… = |
0 / 0 / 0 Регистрация: 10.05.2004 Сообщений: 209 |
|
27.06.2005, 09:48 |
6 |
Модифицированность() Синтаксис: Назначение: Замечание: Вроде бы этим все сказано!
0 |
27.06.2005, 16:15 |
7 |
Это только выдержка из хелпа, без примера она не имеет реальной ценности… = |
0 / 0 / 0 Регистрация: 10.05.2004 Сообщений: 209 |
|
27.06.2005, 17:20 |
8 |
Иногда можно самим дойти до простых основ!
0 |
28.06.2005, 10:09 |
9 |
Можно, но это если есть литература, а если ее нет, то даже догадки непомогут… = |
0 / 0 / 0 Регистрация: 09.11.2003 Сообщений: 283 |
|
28.06.2005, 17:23 |
10 |
Да ладно не обижайся. Просто в обработке да и в остальных формах стандартными средствами 1с отследить изменение (модификацию) реквизита — НЕВОЗМОЖНО!
0 |
29.06.2005, 09:36 |
11 |
Блин, а я сижу мучаюсь… = |
Определяем модифицированность объекта на сервере.
Задача для примера:
При записи документа «Заказ клиента», если у него при редактировании изменилось значение реквизита «Пометка удаления», нужно выполнить какой-то программный алгоритм. Если значение не изменилось, то алгоритм выполнять не нужно. В общем, цель – определить, изменилось ли значение реквизита «Пометка удаления» перед тем, как документ будет записан.
У управляемой формы есть свойство Модифицированность. Но в данном случае оно вряд ли пригодится, так как пометка удаления может устанавливаться не из формы документа. Дальше приходит на ум использовать метод объекта метаданых «ДокументОбъект» Модифицированность(). Однако в отладчике видно, что даже если ничего не менять в документе, то при записи метод Модифицированность() всё равно принимает значение Истина.
Но выход есть. Отследить и обработать изменение реквизита «Пометка удаления» можно с помощью метода ДополнительныеСвойства. Для этого нам понадобится внести небольшие дополнения в процедуры модуля объекта документа.
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) Если НЕ Ссылка.ПометкаУдаления = ПометкаУдаления Тогда ДополнительныеСвойства.Вставить("ПометкаУдаленияИзменена", Истина); КонецЕсли; КонецПроцедуры
В процедуре ПередЗаписью() мы сравниваем значение реквизита «Пометка удаления» редактируемого документа с значением, которое записано в базе. Если значения не равны, то записываем признак изменённости в дополнительные свойства, и далее используем его в процедуре ПриЗаписи():
Процедура ПриЗаписи(Отказ) Если ДополнительныеСвойства.Свойство("ПометкаУдаленияИзменена", Истина) Тогда // Произвольная обработка условия... КонецЕсли; КонецПроцедуры
- Информация о материале
- Категория: Программирование 1С
-
Опубликовано: 12 сентября 2018
- Опубликовано 12.08.2021 10:30
- Просмотров: 8919
Наша статья «Документ в 1С изменен. Как узнать, кто это сделал?» очень популярна среди пользователей. Благодаря ей вы можете узнать общие данные: кто и когда создал документ, изменил его или удалил. Но вот что именно удалил либо поменял пользователь в конкретном документе, вы не увидите. А хотелось бы, правда? Для решения этого вопроса разработчики внедрили в программу 1С специальный механизм хранения версий объектов, так называемое версионирование, с помощью которого вы как раз можете увидеть всю конкретику измененных документов. В этой статье мы расскажем обо всех плюсах и минусах версионирования, а также покажем на конкретном примере в 1С: Зарплата и управление персоналом ред. 3.1 как именно работает этот механизм.
Начиная с платформы 8.3.11, механизм версионирования встроен в систему и называется «История данных». Он имеется во всех конфигурациях, работающих на основе библиотеки стандартных подсистем (БСП). Например, в 1С: Бухгалтерии предприятия он реализован начиная с версии 3.0.35.
Использование данного механизма актуально как на этапах начала работы с программой, так и при дальнейшем ее использовании, когда имеются пользователи «новички», которые могут что-то «подпортить» в учете.
Версионирование – это механизм хранения истории изменения объектов в 1С, который позволяет:
• просматривать, какие изменения внес пользователь в объект (справочник, документ);
• анализировать версии объектов;
• сравнивать эти версии между собой;
• восстанавливать любую из версий объекта.
Механизм версионирования позволяет пользователю выполнять гибкую настройку хранения данных, выборочно применять к объектам или табличным частям, сохранять данные лишь в определенный пользователем момент, например, при проведении документов.
Плюсов данного функционала, конечно, много.
Но есть и минусы, их тоже нужно учитывать. Важно грамотно подходить к настройке версионирования, т.к. использование данного функционала однозначно приводит к замедлению работы 1С. Это связано с тем, что история данных занимает какое-то место и при неправильной, беспорядочной настройке она может занимать больше места, нежели чем сам объект.
Как включить версионирование в 1С?
Данный механизм может включить как разработчик в конфигураторе, так и сам пользователь в пользовательском режиме.
Для включения версионирования объектов выполните следующие пункты.
Шаг 1. Перейдите в раздел «Администрирование» — «Общие настройки».
Пример раздела в 1С: Зарплата и управление персоналом, ред. 3.1.
Пример раздела в 1С: Бухгалтерия предприятия ред. 3.0.
Шаг 2. Разверните подраздел «История изменений» и установите галочку «Хранить историю изменений». Для перехода к настройкам нажмите гиперссылку «Настроить».
Как видите, в 1С: ЗУП и 1С: Бухгалтерии предприятия эти пункты выглядят совершенно одинаково. Соответственно, и настройка версионирования во всех конфигурациях 1С выполняется аналогично, т.к. это одна подсистема.
Настройки истории хранения изменений
Рассмотрим основные настройки подсистемы «Версионирование» и механизма «Хранение данных» на примере программы 1С: Зарплата и управление персоналом ред. 3.1.
В составе объектов настройки два пункта: справочники и документы.
Настройку можно выполнить для каждого справочника отдельно, задав срок хранения и указав, когда сохранять версии.
В разделе «Документы» перечислены все имеющиеся в конфигурации документы, для которых также отдельно выполняется настройка хранения данных.
Параметр «Когда сохранять версии»
Для изменения параметра выделите ячейку и нажмите стрелочку. В выпадающем списке выберите нужное значение.
Значение параметра «Когда сохранять версии» может принимать значение:
• «При записи» — версия сохраняется при создании или изменении справочника либо документа.
• «При проведении» — применима для документов, для которых предусмотрено проведение. Запись производится при их проведении.
• «Никогда» — запись истории изменения объекта не ведется.
Применить настройки можно и к группе объектов.
Выберите несколько объектов с помощью кнопки Shift (в указанном диапазоне «с какого по какой») или Ctrl (выборочное выделение) и, нажав кнопку «Установить когда сохранять версии», выберите нужное значение для указанных объектов.
В данном пункте, кроме описанных выше вариантов, доступна настройка «По умолчанию». В данном случае устанавливаются рекомендуемые настройки. Для справочников это – «Никогда», для документов – «При проведении».
Для справочников варианты значений параметров отличаются от значений параметров для документов.
Параметр «Срок хранения версий»
Аналогично задается параметр «Срок хранения версий».
Выделите ячейку и выберите вариант срока хранения заданного элемента.
Он может принимать значение:
• «За последнюю неделю»;
• «За последний месяц»;
• За последние три месяца»;
• «За последний год»;
• «Бессрочно».
Для выбранной группы объектов изменить данные параметр также можно с помощью кнопки «Установить срок хранения версий».
Выделите объекты, нажмите вышеуказанную кнопку и выберите нужное значение.
Рассмотрим настройку на примере.
Пример настройки версионирования в 1С: ЗУП ред. 3.1
Установите настройки хранения истории изменений для документа «Начисление зарплаты и взносов». Значение параметра «Когда сохранять версии» — При проведении», «Срок хранения» — «За последнюю неделю» (для примера).
После того, как активировано версионирование, в объектах 1С станут доступны кнопки в виде карандаша с часиками – «Перейти к истории изменений».
В нашем примере она расположена в журнале документов на панели инструментов, а также по нажатию кнопки «Еще».
Во втором варианте она выглядит как строка – «История изменений».
При открытии документа, в нем также присутствует такая кнопка и команда по нажатию кнопки «Еще».
Рассмотрим пример, когда бухгалтер вносила изменения в документ «Начисление зарплаты и взносов».
Конечно, когда изменения производились по одному сотруднику, проще исправить и пересмотреть начисления этого сотрудника. Но предположим, что возникла ситуация, когда «массово напортачили» в программе и данные изменены.
Для иллюстрации примера изменим заработную плату Булочкиной О.И. с 67000 руб. на 75000 руб. и посмотрим, как программа сохранит версии документов и сможем ли мы, используя механизм хранения данных, вернуться к прежней версии.
Нажмите «кнопку-карандашик» — «Перейти к истории изменений».
Становится видно информацию о версиях документа «Начисление зарплаты и взносов»: кто изменил данный объект, а также дату и время изменения.
Для просмотра версии выделите строку и нажмите кнопку «Открыть версию».
В отчете представлены вся информация, показатели и данные документа выделенной версии. Кнопками «+» и «-» можно свернуть и развернуть блоки для удобства чтения.
В нашем примере мы знаем, что пользователь изменил зарплату по окладу Булочкиной О.И. на 75000 руб.
Но как же пользователь проанализирует такой объем информации и определит, какие изменения произведены в какой версии?
Для этого есть функция сравнения с помощью одноименной кнопки «Сравнить».
Для сравнения версий выделите нужные строки (с помощью Shift или Ctrl) и нажмите кнопку «Сравнить».
Обратите внимание, при выделении нескольких версий другие команды неактивны, т.к. предназначены для работы с одной строкой-версией.
В отчете отобразится таблица по выделенным версиям объекта. Голубым цветом выделены измененные данные, пролистав и проанализировав которые, пользователь может сопоставить произведенные изменения и при необходимости вернуться к той версии, которая его более устроит.
Пролистав таблицу, мы видим, что пользователем Кругловой О. были изменены данные по Булочкиной О.И. Сохраненные версии №1 и №2 идентичные, а в версии №3 прослеживаются изменения.
Обратите внимание на значение поля «Изменения в реквизитах». По умолчанию установлено – «Все». Поэтому отчет получился объемным. Нажав кнопку выбора с тремя точками, пользователь может задать выводимые реквизиты, отметив нужные галочками.
Главный бухгалтер, проанализировав ситуацию, приняла решение восстановить данные документа «Начисления зарплаты и взносов» до внесения изменений зарплаты.
Как это сделать?
Выделите версию объекта, на который хотите перейти и нажмите кнопку «Перейти на версию».
В моделируемом примере нас устроит версия №2 (до внесения изменений). На нее и перейдем.
В результате проведенных манипуляций в таблице «История изменений: Начисление зарплаты и взносов от 31.08.2021» появилась четвертая версия документа с пометкой – «Выполнен переход к версии №2 от 10.08.2021 18:32:49» (пример моделировался 10.08.2021).
Откройте документ и проверьте, что в нем изменилось.
Документ перешел к варианту до внесения в него изменений. В нашем примере зарплата сотрудника Булочкиной О.И. автоматически изменилась на 67000 руб. (напомним, она была изменена ранее на 75000 руб.). Начисление НДФЛ и страховых взносов также приняло прежние значения. Т.е. документ полностью принял первоначальный вид.
Этот способ очень удобен. Он позволяет не только отслеживать, когда и кем были произведены изменения, но и «откатывать» состояние объекта в предшествующее состояние. Перейдя на версию объекта и не получив результата, пользователь может повторить операцию снова. Переходы от версии к версии не ограничены и их можно выполнять в пределах хранящихся версий.
Напоминаем, единственный минус версионирования – это то, что хранящиеся данные занимают место и при больших объемах накопленной информации программа может начать притормаживать и подвисать, особенно при работе на слабых компьютерах. Поэтому возможно имеет смысл устанавливать версионирование только для конкретных документов в программе, по которым могут быть спорные моменты.
Объем хранимых версий объектов и их удаление в 1С
Вернемся к разделу «Настройка и хранение истории изменений».
Нажмите гиперссылку «Количество и объем хранения версий объектов».
Нажмите «Сформировать».
В отчете представлена информация в графическом и в табличном варианте, где пользователь видит структуру данных версий хранения объектов.
В нашем примере видно, что объект – документ «Начисление зарплаты и взносов» имеет четыре версии и этот объем данных занимает 0,01Мб.
Но это всего лишь один документ. Поэтому, если вы настраиваете версионирование и активно им пользуетесь, смотрите какой объем занимают данные.
Обратите внимание на строку «Очистка устаревших версий». У нас пока таковых не имеется, но при их появлении появится кнопка «Очистить». Здесь также выводится информация об их количестве и объеме. Нажав на эту кнопку старые, неактуальные версии удаляются.
Для автоматизации процесса удаления устаревших версий, установите одноименную галочку «Автоматически удалять устаревшие версии» и вам не придется постоянно отвлекаться на контроль этого процесса.
Теперь вы знаете что такое версионирование и как настроить хранение истории изменения справочников и документов в программах 1С.
Как говорится: «Все гениальное – просто!». Экспериментируйте, используйте данный функционал программы и, главное, не бойтесь что-то испортить, ведь всегда можно вернуть версию объекта. Если вы сочтете это ненужным, то в любой момент вы сможете отключить данную настройку.
Автор статьи: Ольга Круглова
Понравилась статья? Подпишитесь на рассылку новых материалов
Добавить комментарий
Обычная задача — перед записью поймать изменение реквизита (пусть это будет реквизит ВремяНачала)и выполнить некоторое действие.
Раньше оно было совсем просто в процедуре ПередЗаписью
Если Ссылка.ВремяНачала <> Объект.ВремяНачала Тогда
// реквизит изменен - выполняем нужные действия
КонецЕсли
Сейчас такой фокус не пройдет — придется написать чуть побольше кода.
&НаСервере
Функция ИзменениеВРасписании(ВремяНачалаАктуальное)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ОказаниеУслуг.ВремяНачала
|ИЗ
| Документ.ОказаниеУслуг КАК ОказаниеУслуг
|ГДЕ
| ОказаниеУслуг.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Если Выборка.Следующий() Тогда
ВремяНачалаСохраненное = Выборка.ВремяНачала;
Если ВремяНачалаСохраненное <> ВремяНачалаАктуальное Тогда
Возврат Истина;
КонецЕсли;
КонецЕсли;
Возврат Ложь;
КонецФункции
Ну и используем новую функцию в процедуре ПередЗаписью
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
Если ИзменениеВРасписании(Объект.ВремяНачала) Тогда
// реквизит изменен - выполняем нужные действия
КонецЕсли;
КонецПроцедуры
Контроль изменений реквизитов справочников и документов
16.05.2017
Контроль изменения всех реквизитов любых справочников и документов в любой конфигурации
Очень часто бывает необходимость выяснить, кто же изменил значение реквизита или каким оно было на определенную дату. Поискал недолго на сайте, не нашел и решил написать что-то свое.
Обработка использует внешние компоненты FormEx.dll и 1sqlite.dll. Легко подключается к любой конфигурации без доработок. Данные хранятся во внешнем файле.
При открытии формы справочника или документа делается снимок его состояния на момент открытия. После закрытия формы опять делается снимок состояния объекта и сравнение с предыдущим снимком. Если были изменения реквизитов, предлагает ввести причину изменений.
Снимки состояния и изменения реквизитов пишутся в БД history.sdb в каталоге базы. Для того, чтобы посмотреть изменения, нужно открыть форму интересующего справочника или документа и нажать на кнопку F4.
Подключение: в процедуре ПриНачалеРаботыСистемы добавить
парам=СоздатьОбъект("СписокЗначений"); парам.ДобавитьЗначение(1,"Режим"); ОткрытьФорму("Отчет",парам,КаталогИБ()+"ExtFormsИсторияОбъекта.ert");
22.10.2023г Добавил настройки контроля. В любом случае изменения фиксируются все, но запрос комментария и отражение изменений в карточке можно настраивать. Изменил сам интерфейс просмотра истории.