1с модифицированность при изменении реквизита формы

При изменении на форме появляется «*». Где это зашито?

Я
   leklerk

23.03.15 — 13:34

Всем привет! Подскажите пожалуйста, вот та звездочка, которая появляется на форме (признак модифицированности), это зашито внутри 1С, то есть в коде это не найти? (я работаю с УФ, БП 3.0) Не смог это нигде найти в коде… Мне просто надо такое же сделать для самописной формы.

  

Партнерская программа EFSOL Oblako

   GROOVY

1 — 23.03.15 — 13:36

В платформе. И не только в 1С

   Lexey_

2 — 23.03.15 — 13:43

(0) если нет связи с данными, но нужно чтобы устанавливалась модифицированность, то флаг ИзменяетДанные у элемента формы

   alex_shkut

3 — 23.03.15 — 13:44

По-памяти:

Если <Что-то произощло> Тогда

  ЭтотОбъект.Модифицирован(ность) = истина;

КонецЕсли;

   GROOVY

4 — 23.03.15 — 13:48

(3)  Не путайте модифицированность объекта и формы.

   Drac0

5 — 23.03.15 — 13:52

(4) ЭтотОбъект — может быть как текущей формой, так и объектом. От модуля зависит.

   leklerk

6 — 23.03.15 — 13:55

Lexey, у меня БП 3.0, там УФ, у элементов формы нет такого флага.

   Feunoir

7 — 23.03.15 — 13:58

СП. Дорого.

УправляемаяФорма.Модифицированность (ManagedForm.Modified)

УправляемаяФорма (ManagedForm)

Модифицированность (Modified)

Использование:

Чтение и запись.

Описание:

Тип: Булево.

Признак изменения (модифицированности) данных в форме. Модифицированность отображается символом (*) в заголовке окна формы.

Истина — изменена.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, мобильное приложение(клиент), мобильное приложение(сервер).

———————————————————————————

   GROOVY

8 — 23.03.15 — 14:02

(5) В таком случае зачем указывать контекст окружения?

   Lexey_

9 — 23.03.15 — 14:08

(6) не обратил внимания

   leklerk

10 — 23.03.15 — 14:09

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

   GROOVY

11 — 23.03.15 — 14:11

(6)  Есть у реквизитов формы.

   Feunoir

12 — 23.03.15 — 14:15

(10) Тогда тебе скорее всего поможет свойство СохраняемыеДанные у реквизита формы.

   Dmitriy_76

13 — 23.03.15 — 14:23

если модифицированность просто реквизитов формы, то попробуй менять заголовок формы ( влоб прибавляй, отбирай звездочку)

  

leklerk

14 — 23.03.15 — 14:23

Feunoir, большое спасибо!!! Твоя идея оказалось верной. Поставил для реквизита формы этот флаг и теперь при изменении реквизита появляется звездочка.

Допустим, стоит задача, необходимо в справочнике хранить дорожную карту в виде графической схемы и её описание в виде табличного документа. Для решения этой задачи необходимо создать в справочнике два реквизита с типом ХранилищеЗначений. В форме элемента справочника создать реквизиты с типами ГрафическаяСхема и ТабличныйДокумент. При открытии формы данные из реквизитов объекта загружаются в реквизиты формы, при записи выполняется обратная операция. Теперь давайте разберемся, нужно ли устанавливать для реквизитов формы свойство «Сохраняемые данные» или нет?

Для эксперимента создадим два реквизита формы с разным состоянием свойства «Сохраняемые данные» (см. рисунок 1):

  • ДорожнаяКарта — тип ГрафическаяСхема, свойство «Сохраняемые данные» установлено;
  • ОписаниеДорожнойКарты — тип ТабличныйДокумент, свойство «Сохраняемые данные» не установлено.
Рисунок 1. Реквизиты формы

В режиме 1С:Предприятие откроем элемент справочника, если мы изменим описание дорожной карты, то ничего не произойдет, но, если мы изменим дорожную карту, то в заголовке формы увидим звездочку (*) — признак модифицированности (см. рисунок 2). Данная звездочка означает, что данные, сохраняемые в базу данных, изменены.

Рисунок 2. Признак модифицированности у формы

Формы с установленным признаком модифицированности перед закрытием предупреждают пользователя о возможности потери изменений в данных и предлагают сохранить изменения (см. рисунок 3).

Рисунок 3. Вопрос о сохранении изменений

Согласитесь, не очень приятно оказаться в ситуации, когда вы изменили данные, которые сохраняются в базу данных, и случайно закрыли форму. Если говорить в контексте задачи, то редактирование обоих реквизитов должно приводить к установке признака модифицированности у формы, что бы изменения в их данных не потерять при закрытии формы без сохранения.

Установим для пользователя на уровне прав только просмотр элементов справочника (см. рисунок 4).

Рисунок 4. Право только просмотра справочника

В режиме 1С:Предприятие реквизит ДорожнаяКарта не доступен для редактирования в отличии от реквизита ОписаниеДорожнойКарты. Если говорить в контексте задачи, то оба реквизита формы не должны быть доступны для редактирования, так как нет смысла пользователю разрешать редактировать реквизиты формы, если элемент справочника доступен только для просмотра.

Теперь на уровне формы установим только просмотр элементов справочника, для этого в форме элемента в обработчике ПриСозданииНаСервере установим свойство ТолькоПросмотр в значение Истина.

	
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)	
    ЭтотОбъект.ТолькоПросмотр = Истина;	
КонецПроцедуры
  

В режиме 1С:Предприятие реквизит ДорожнаяКарта так же не доступен для редактирования в отличии от реквизита ОписаниеДорожнойКарты. Если говорить в контексте задачи, то оба реквизита формы должны быть доступны только для просмотра, так как форма, открытая только для просмотра, не позволит сохранить изменения в их данных.

Вывод

Свойство «Сохраняемые данные» у реквизита формы следует устанавливать, если его данные сохраняются в базу данных. В рамках нашей задачи нужно для обоих реквизитов формы установить свойство «Сохраняемые данные».

Реквизит с установленным свойством «Сохраняемые данные»:

  • Устанавливает признак модифицированности у формы после редактирования;
  • Не доступен для редактирования при отсутствии права редактирования объекта;
  • Не доступен для редактирования в форме, которая открыта только на просмотр.

на форме список значений с пометками. Вопрос почему установка / снятие пометки не влияет на результат Док.Модифицированность ? И как оследить установку / снятие модифицированности ?

а потому что список не является реквизитом документа

признак изменения реквизитов текущей формы документа, а не элементов формы.

2 Потому что этот метод показывает модифицированность объекта, а не формы. А список значений — это как раз реквизит формы, а не объекта.

В дополнение, если хочешь чтобы была модифицированность напиши например МойРеквизит=МойРеквизит;

И что мне вешать на форму функцию типа ? Форма.Обновить ПересчетПометок Мне проверять надо пометки , причем всегда это делать не надо а тока когда их трогали, а что вы предлогаете ?  всегда проверять по сути тогда и модифициранность смысл теряет

Жаль что такой объект нельзя сделать реквизитом дока ….

Почему нельзя? Сроку с разделителем и в реквизит(ы). ПриОткрытии загонять в переменную(ые), ПриЗакрытии сравнить…

Modify Синтаксис: Модифицированность Назначение: Возвращает признак изменения реквизитов текущей формы документа:  1 — если реквизиты текущей формы документа были изменены, 0 — иначе. Замечание: Метод доступен только в Модуле формы документа и работает с документом доступным в локальном контексте.

а пометки тоже в строку пишутся что ли ?

тьфу Form.Refresh(<?>); Синтаксис: Форма.Обновить(<Флаг>) Назначение: Обновить форму. Параметры: <Флаг> — число: 1 — установить флаг модифицированности (признак изменения реквизитов текущей формы справочника или документа); 0 — не устанавливать флаг модифицированности. Замечание: Доступ к методу возможен только в контексте Модуля формы через атрибут Форма.

спасибо, так и делал, просто думал может можно как нибудь обойти а то это постоянное дерганье на форме раздражает, а на слабых машинах ещё и проц отъедает

попробуй так … РеквизитДокумента = РеквизитДокумента;

Я дико извеняюсь — а зачем ты каждый раз опрашиваешь модифицированность? ПриЗакрытии достаточно один раз проверить

точно подмечено ..но тут другой случай, в зависимости от галочек идет пресчет реквитов дока, чтобы пользователь сразу видел результат

ты бы подробнее сказал чего хочешь

Убери Список, поставь ТЗ с картинкой пометка.

а нельзя в текстовом реквизите «за формой» эту процедуру пересчёта прописать?

, а просто на список процедуру повесить слабо?

Попробуй — не взлетит. Если ТЗ — то взлетит.

что показать, что никто ни разу на список процедуру не вешал проверяете потом по текущей строке пометку и делаете необходимые действия

Тебе уже два человека сказало — «НЕ СРАБАТЫВАЕТ» процедура при изменении пометки

думаешь… галку можно поставить пробелом… простым кликом… думаю тебе сюда

в зависимости от количества пометок персчитывается цена , всё просто

Ловить фокус, это обработка ожидания, банально, зачем для этого ВК, есть обработка ожидания Формы 1С

, действительно при установке пометки не сработает протупил

Не думаю. Мне не нужно ловит фокус. Есть ТЗ на форме. Столбец с картинкой галочка. При двойном клике на ячейке галочка меняется. Тут же обработчик.

Может сделать вместо списка с пометками ТЗ ? на него можно повесить процедуру … ?

На ТЗ пиктограммы с галочкой

Минус — нужно щелкать 2 раза вместо одного в списке с пометками.

Тэги:

Комментарии доступны только авторизированным пользователям

Если надо проверить, были ли изменены данные на форме, то поможет свойство формы управляемой формы «Модифицированность», доступный НаКлиенте.

Например

&НаКлиенте

Если Модифицированность Тогда

КонецЕсли;

Это свойство можно установить программно:

Модифицированность = Истина 

Чтобы обозначить, что были произведены какие-то программные изменения или наоборот после программного сохранения установить в Ложь, чтобы повторно не записывать объект.

Если 

Не надо путать с методом объекта Объект.Модифицированность(). Этот метод доступен НаСервере. С его использованием могут возникнуть проблемы, если мы хотим проверить были ли изменены данные на форме, так как если мы будем получать объект по ссылке, то Объект.Модифицированность() всегда вернет Ложь, так как мы только что считали его из базы. Если будем получать объект из реквизита формы, то этот метод всегда вернет Истина, так как изначально реквизит был пустой, а потом мы его заполнили контекстом.

Метод Объект.Модифицированность() возможно использовать только в том случае, если все манипуляции с объектом происходят программно: сначала получили, потом что-то поделали, а потом можно и проверить, изменился ли загруженный ранее объект.

Для того, чтобы однозначно определить отличается ли объект в форме от объекта в базе нужно сравнивать реквизиты полученные по ссылке и реквизиты объекта. Для этого можно воспользоваться универсальной функцией:

Функция ОбъектМодифицирован(Объект, ПроверятьТабличныеЧасти = Истина, ПроверятьСтандартные = Истина) 
 
 Ссылка = Объект.Ссылка;
 Метаданное = Ссылка.Метаданные();
 
 Для каждого Реквизит из Метаданное.Реквизиты Цикл
 Если Объект[Реквизит.Имя] <> Ссылка[Реквизит.Имя] Тогда
 Возврат Истина;
 КонецЕсли;
 КонецЦикла;
 
 Если ПроверятьСтандартные Тогда
 Для каждого Реквизит из Метаданное.СтандартныеРеквизиты Цикл
 Если Объект[Реквизит.Имя] <> Ссылка[Реквизит.Имя] Тогда
 Возврат Истина;
 КонецЕсли;
 КонецЦикла;
 КонецЕсли;
 
 
 Если ПроверятьТабличныеЧасти Тогда
 Для каждого ТЧ из Метаданное.ТабличныеЧасти Цикл
 
 Если Объект[ТЧ.Имя].Количество() <> Ссылка[ТЧ.Имя].Количество() Тогда
 Возврат Истина;
 КонецЕсли;
 
 Для Индекс = 0 по Объект[ТЧ.Имя].Количество()-1 Цикл
 ОбъектСтрокаТЧ = Объект[ТЧ.Имя][Индекс];
 СсылкаСтрокаТЧ = Ссылка[ТЧ.Имя][Индекс];
 Для каждого РеквизитТЧ из ТЧ.Реквизиты Цикл
 Если ОбъектСтрокаТЧ[РеквизитТЧ.Имя] <> СсылкаСтрокаТЧ[РеквизитТЧ.Имя] Тогда
 Возврат Истина;
 КонецЕсли;
 КонецЦикла;
 КонецЦикла;
 
 КонецЦикла; 
 КонецЕсли;
 
 Возврат Ложь;
 
КонецФункции

При прямой программном изменении данных флаг модифицированности формы НЕ УСТАНАВЛИВАЕТСЯ.

Для того чтобы система нормально отрабатывала событие «ПриЗакрытии», т.е. задавала вопрос «Сохранить/отменить», нужно установить флаг модификации формы:

	ЭтаФорма.Модифицированность = Истина;

Например:

&НаКлиенте
Процедура ДобавитьКомментарий()
	стрВведенныйКомментарий = "";
	Если НЕ ВвестиСтроку(стрВведенныйКомментарий, "Комментарий", 0, Истина) Тогда
		Возврат;
	КонецЕсли;
	Если стрВведенныйКомментарий = "" Тогда Возврат КонецЕсли;
	
	строка = Объект.Комментарии.Добавить();
	строка.Автор = Мета.ТекущийПользователь();
	строка.Дата = ТекущаяДата();
	строка.Комментарий = стрВведенныйКомментарий;
	
	Элементы.ТаблицаКомментариев.ТекущаяСтрока = Объект.Комментарии.Количество() - 1;
	ЭтаФорма.Модифицированность = Истина;
КонецПроцедуры

Определяем модифицированность объекта на сервере.

Задача для примера:

При записи документа «Заказ клиента», если у него при редактировании изменилось значение реквизита «Пометка удаления», нужно выполнить какой-то программный алгоритм. Если значение не изменилось, то алгоритм выполнять не нужно. В общем, цель – определить, изменилось ли значение реквизита «Пометка удаления» перед тем, как документ будет записан.

У управляемой формы есть свойство Модифицированность. Но в данном случае оно вряд ли пригодится, так как пометка удаления может устанавливаться не из формы документа. Дальше приходит на ум использовать метод объекта метаданых «ДокументОбъект» Модифицированность(). Однако в отладчике видно, что даже если ничего не менять в документе, то при записи метод Модифицированность() всё равно принимает значение Истина.

Но выход есть. Отследить и обработать изменение реквизита «Пометка удаления» можно с помощью метода ДополнительныеСвойства. Для этого нам понадобится внести небольшие дополнения в процедуры модуля объекта документа.

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

В процедуре ПередЗаписью() мы сравниваем значение реквизита «Пометка удаления» редактируемого документа с значением, которое записано в базе. Если значения не равны, то записываем признак изменённости в дополнительные свойства, и далее используем его в процедуре ПриЗаписи():

Процедура ПриЗаписи(Отказ)
	
	Если ДополнительныеСвойства.Свойство("ПометкаУдаленияИзменена", Истина) Тогда
		// Произвольная обработка условия...
	КонецЕсли;
	
КонецПроцедуры
Информация о материале
Категория: Программирование 1С

Опубликовано: 12 сентября 2018

Понравилась статья? Поделить с друзьями:
  • Автомобиль проехал расстояние между двумя поселками
  • 1с отбор регистра сведений по нескольким реквизитам
  • Автомобильные бизнес идеи с минимальными вложениями
  • 1с получить дополнительный реквизит справочника бсп
  • Автомобильные страховые компании в санкт петербурге