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

Как проверить объект на модифицированность(), при вводе на основании?

Я
   SherifSP

08.05.13 — 11:03

Как проверить объект на модифицированность(), при вводе на основании?

  

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

   cw014

1 — 08.05.13 — 11:03

Зачем?

   cw014

2 — 08.05.13 — 11:03

Нет, не так…

Да…

   SherifSP

3 — 08.05.13 — 11:05

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

   cw014

4 — 08.05.13 — 11:06

При открытии формы создавай ключ уникальности у нее. При вводе на основании ищи форму с этим ключом. Если форма найдена, она открыта и модифицированна — тогда швах

   SherifSP

5 — 08.05.13 — 11:10

(4) Вот что то нашел ДанныеЗаполнения.ПолучитьФорму().ЭтотОбъект.Модифицированность() )))

   SherifSP

6 — 08.05.13 — 11:11

+(5) Ток не понятно что такое ДанныеЗаполнения

   cw014

7 — 08.05.13 — 11:12

ДанныеЗаполнения — произвольный объект, который может быть «Неопределено», «Структура», «Объект» ну или любой другой параметр

   cw014

8 — 08.05.13 — 11:13

(5) Кстати, если док не сохранен, в ДанныеЗаполнения объект до изменения

   SherifSP

9 — 08.05.13 — 11:15

(8) А если так Основание.ПолучитьФорму().ЭтотОбъект.Модифицированность() ?

   cw014

10 — 08.05.13 — 11:17

(9) Если юзверь открыл форму но еще не записал ее — в базе данных старые данные. Поэтому получая ссылку или объект этого добра — ты получаешь данные, а форма создается с новым ключем уникальности.

   SherifSP

11 — 08.05.13 — 11:26

Как можно прервать процедуру ввода на основании? Возврат; не предлагать)

   Ненавижу 1С

12 — 08.05.13 — 11:28

(11) в модуле формы перед открытием

   SherifSP

13 — 08.05.13 — 11:30

(12) Нужно в процедуре ОбработкаЗаполнения()

   ssh2012

14 — 08.05.13 — 11:31

(13) ВызватьИсключение(«еба!»)

   cw014

15 — 08.05.13 — 11:32

ДокументОбъект.<Имя документа> (DocumentObject.<Имя документа>)

ОбработкаЗаполнения (Filling)

Синтаксис:

ОбработкаЗаполнения(<ДанныеЗаполнения>, <СтандартнаяОбработка>)

Параметры:

<ДанныеЗаполнения>

Тип: Произвольный.

Значение, которое используется как основание для заполнения.

Если обработчик вызван при выполнении метода Заполнить, параметр равен параметру «Данные заполнения» метода Заполнить.

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

При интерактивном вводе нового из формы списка параметр является структурой, элементы которой соответствуют тем параметрам отбора формы списка, у которых способ сравнения Равно или ВСписке с единственным элементом списка. Если таких элементов отбор списка не содержит, данный параметр равен Неопределено. Если параметр «Стандартная обработка» по окончании работы обработчика равен Истина (установлен по умолчанию), система автоматически произведет заполнение одноименными элементами структуры.

<СтандартнаяОбработка>

Тип: Булево.

В данный параметр передается признак выполнения стандартной (системной) обработки события. Если в теле процедуры-обработчика установить данному параметру значение Ложь, стандартная обработка события производиться не будет. Отказ от стандартной обработки не отменяет действие.

Значение по умолчанию: Истина

Описание:

Возникает при вводе документа на основании, а также при выполнении метода Заполнить, при вводе на основании, а также при интерактивном вводе нового. В процедуре-обработчике этого события должен быть описан сам алгоритм заполнения реквизитов документа на основании переданного значения.

Примечание:

При копировании (как интерактивном, так и средствами встроенного языка), данный обработчик не вызывается.

См. также:

ДокументОбъект, метод Заполнить

   SherifSP

16 — 08.05.13 — 11:33

(15) Не знаю как в 8.2, у меня 8.1 и там нет в параметре СтандартнаяОбработка

   cw014

17 — 08.05.13 — 11:36

(16) тогда только (4)

   mxs089

18 — 08.05.13 — 11:37

фейспалм,

   cw014

19 — 08.05.13 — 11:38

(18) ООПшник? )))

   SherifSP

20 — 08.05.13 — 11:38

(17) Есть стандартная функция не помню какая, которая прерывает процедуру с сообщением

   cw014

21 — 08.05.13 — 11:40

(20) ВызватьИсключение???

   mxs089

22 — 08.05.13 — 11:40

отказ = истина

   mxs089

23 — 08.05.13 — 11:41

при записи, организовать подпиской

   cw014

24 — 08.05.13 — 11:41

(22) В обработке заполнения нету Отказ. Есть СтандартнаяОбработка, но она только в 8.2

   ssh2012

25 — 08.05.13 — 11:41

(20) см (14)

   SherifSP

26 — 08.05.13 — 11:42

(21) Да)

   Aprobator

27 — 08.05.13 — 11:45

(11) Честно говоря, непонятно чем Возврат плох.

Лови как вариант в ОбработкаЗаполнения.

...
Если УсловиеСоблюдается Тогда
 // тут действия по заполнению
 
КонецЕсли;
...
   cw014

28 — 08.05.13 — 11:45

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

   mxs089

29 — 08.05.13 — 11:51

передоткрытием

отказ = документоснование.получитьформу().модифицированность()

   Aprobator

30 — 08.05.13 — 11:54

(28) вопрос был как прервать. Про все отменить — речи не было.

   SherifSP

31 — 08.05.13 — 11:56

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

   SherifSP

32 — 08.05.13 — 11:56

+(31) А нужно не дать дойти до открытия формы

   SherifSP

33 — 08.05.13 — 11:58

(29) Как вариант, но процедура ввода на основании все равно будит задействована, а это не есть хорошо для производительности

   mxs089

34 — 08.05.13 — 12:00

(33)

обработказаполнения(){

если документоснование.получитьформу().модифицированность() тогда

возврат;

конецесли;

}

   Aprobator

35 — 08.05.13 — 12:01

(32) в модуле объекта экспортную переменную для контрольки. В модуле формы ПриОткрытии Отказ = ПеремннаяКонтролька <> Неопределено И ПеременнаКонтролька.

   SherifSP

36 — 08.05.13 — 12:01

(34) Тогда обработка заполнения не пройдет, но форма все равно откроется

   mxs089

37 — 08.05.13 — 12:02

(35) опередил)

   mxs089

38 — 08.05.13 — 12:02

(36) в комплексе

   Aprobator

39 — 08.05.13 — 12:07

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

   SherifSP

40 — 08.05.13 — 12:11

Сделаю по другому, у объекта есть дополнительные свойства в виде структуры, буду в них записывать данные и проверять если в структуре есть эти данные, тогда отказ = истина;

   Aprobator

41 — 08.05.13 — 12:15

(40) если речь о 8.2, то там было такое. Тут просто в соседней ветке речь про 8.1. потому переключиться не успел )

   SherifSP

42 — 08.05.13 — 12:19

(41) У 8.1 тоже есть такое)

  

Aprobator

43 — 08.05.13 — 12:23

(42) не помню уже — с 8.1 года 3 уже не общался.

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

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

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

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

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

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

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

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

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

Перейти в раздел примеры кода 1С 8.3:

Программно проверить модифицирован ли объект в 1С 8.3:

Функция ОбъектМодифицирован(Объект, ПроверятьТабличныеЧасти = Истина, ПроверятьСтандартные = Истина)

   Ссылка = Объект.Ссылка;
   Метаданное = Ссылка.Метаданные();

   Для Каждого Реквизит Из Метаданное.Реквизиты Цикл
       Если Объект[Реквизит.Имя] <> Ссылка[Реквизит.Имя] Тогда
           Возврат Истина;
       КонецЕсли;
   КонецЦикла;

   Если ПроверятьСтандартные Тогда
       Для Каждого Реквизит Из Метаданное.СтандартныеРеквизиты Цикл
           Если Объект[Реквизит.Имя] <> Ссылка[Реквизит.Имя] Тогда
               Возврат Истина;
           КонецЕсли;
       КонецЦикла;
   КонецЕсли;

   Если ПроверятьТабличныеЧасти Тогда
       Для Каждого ТЧ Из Метаданное.ТабличныеЧасти Цикл

           Если Объект[ТЧ.Имя].Количество() <> Ссылка[ТЧ.Имя].Количество() Тогда
               Возврат Истина;
           КонецЕсли;

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

       КонецЦикла;
   КонецЕсли;

   Возврат Ложь;

КонецФункции

Программно проверить модифицирован ли объект одним запросом (как рекомендует стандарт вендора) в 1С 8.3:

Функция ОбъектМодифицирован(Объект)

   МетаданныеОбъекта = Объект.Метаданные();
   Если Метаданные.Справочники.Содержит(МетаданныеОбъекта) Тогда
       Вид = «Справочник»;
   ИначеЕсли Метаданные.Документы.Содержит(МетаданныеОбъекта) Тогда
       Вид = «Документ»;
   Иначе
       ВызватьИсключение СтрШаблон(
       НСтр(«ru=’Проверка модифицированности для объекта %1 не предусмотрена.'»),
       МетаданныеОбъекта);
   КонецЕсли;

   Запрос = Новый Запрос(
   «ВЫБРАТЬ
    |    *
    |ИЗ
    |    « + Вид + «.» + МетаданныеОбъекта.Имя + »
    |ГДЕ
    |    Ссылка = &Ссылка»);
   Запрос.УстановитьПараметр(«Ссылка», Объект.Ссылка);

   РезультатЗапроса = Запрос.Выполнить();

   Возврат ПроверитьМодифицированностьРеквизитов(Объект, РезультатЗапроса, «»);

КонецФункции

Функция ПроверитьМодифицированностьРеквизитов(Объект, РезультатЗапроса, Префикс)
   НеобрабатываемыеРеквизиты = СтрРазделить(«Ссылка,НомерСтроки», «,»);

   Выборка = РезультатЗапроса.Выбрать();
   НомерСтроки = 0;
   Пока Выборка.Следующий() Цикл
       ТабличнаяЧасть = ?(Не ПустаяСтрока(Префикс), Объект[Префикс], Неопределено);
       Если ТабличнаяЧасть <> Неопределено И Выборка.Количество()
             <> ТабличнаяЧасть.Количество() Тогда
           Возврат Истина;
       КонецЕсли;

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

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

   Возврат Ложь;

КонецФункции

Copyright©, «Программист 1С в г.Минске», 05.12.2020

Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник

Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить — сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ
НаСервере
П


17 правил для составления оптимального ЗАПРОСа к данным базы 1С 47
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ


1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш


1С 8.x : Как убрать лидирующие нули в номере Документа (вариант2) 0
Скопировать строку с номером, с лидирующими нулями, в числовом поле (с форматом без групп, без группировки), и вернуть(скопировать) обратно в строковом поле с номером. Возвращает без нулей.


1С Предприятие что это? 12
Что такое 1С?
1С — это фирма , у которой одно из направлений деятельности — разработка программного обеспечения для автоматизации бизнес-процессов предприятий. « 1С:Предприятие » — конкретный продукт, который выпускает компания 1С .
Что такое


Посмотреть все результаты поиска похожих

Цитата
Сообщение от Tklwegsd
Посмотреть сообщение

Если Модифицированность() тогда а=0; КонецЕсли;

так не работает, выдает ошибку

1C
1
2
3
Ошибка при выполнении обработчика - 'ПередЗаписью'
по причине:
{Справочник.Номенклатура.МодульОбъекта(116)}: Метод объекта не обнаружен (Модифицированность)[quote="Dethmontt;14015893"]Модифицированность() - это свойство формы или объекта в памяти (но уж точно не ссылки)[/quote]

Модифицированность() — это свойство формы или объекта в памяти (но уж точно не ссылки)

это надо понимать так?

1C
1
ЭтаФорма.Модифицированность()

так тоже не понимает

1C
1
{(1,1)}: Переменная не определена (ЭтаФорма)

Цитата
Сообщение от Yulunga
Посмотреть сообщение

;-)

чувство юмора это хорошо, а решение где, поспешил вам плюс поставить)

Добавлено через 17 минут
Или ошибка в том, что я проверяю в Модуле менеджера справочника в событии Перед записью, а надо проверять в Модуле Формы?

еще потестировал, в модуле объекта Справочника номенклатуры работает.
Работает и просто в форме по событию ПриИзменении элемента, но использовал это событие чисто для тестирования. В идеале нужно, что бы работало в Модуле Объекта ПередЗаписью().
Результат положительный, но пока нет четкого понимания, как это работает.

Добавлено через 24 минуты

Цитата
Сообщение от Tklwegsd
Посмотреть сообщение

А так?
1C
Выделить код
1
2
3
Если Модифицированность() тогда
а=0;
КонецЕсли;

еще потестировал
Оказалось, что даже если выбран тот же самый реквизит, программа думает что данные в форме изменилась, причем так думает и сама форма и Модуль объекта перед записью?

Можно ли где то узнать алгоритм этой функции, 1С ведь на си вроде написана, эти модули есть где нибудь или нет? Или может есть описание таких функциональных модулей?

Не по теме:

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

Добавлено через 1 час 34 минуты
Пока получается так
Разные действия на форме име.ют разные действия:
1. Если меняем реквизит на другой признак Модифицированности
устанавливается в ИСТИНУ, * в шапке
2. Если не меняем реквизит, но открываем форму реквизита (если это ссылка) => Модифицированность
в ИСТИНУ и * в шапке формы.
3. Если нажимаем на крестик в открывшейся форме, => Модифицированность ложь и * НЕТ

Добавлено через 42 минуты
вот Синтаксис помощник

1C
1
2
3
Если Объект.Модифицированность() Тогда
    Объект.Записать();
КонецЕсли;

как это правильно применить в коде?
У объекта — Метод, у формы — свойство — в чем зазница?
У объекта событие ПередЗаписью, у формы событие ПередЗакрытием

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

Форма — поля формы вроде бы не где не сохраняются и их изменение при закрытии формы разве можно как то проверить сразу все на уровне программы?

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

так или нет?

Хотя при сохранению в базу программа может и не проверять поля (старые и новые) [такой вывод можно сделать из статьи https://forum.infostart.ru/forum9/topic129997/ там сохраняется каждое поле и потом сверяется перед записью], а тоже работать только по этому флагу

Форма — поля формы вроде бы не где не сохраняются и их изменение при закрытии формы разве можно как то проверить сразу все на уровне программы?

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

так или нет?

Хотя при сохранению в базу программа может и не проверять поля (старые и новые) [такой вывод можно сделать из статьи https://forum.infostart.ru/forum9/topic129997/ там сохраняется каждое поле и потом сверяется перед записью], а тоже работать только по этому флагу

При открытии формы уже в ПриСозданииНаСервере объект модифицирован. Где до этого он может модифицироваться?

там в УФ с формами вообще все плохо в плане последовательности событий для привыкших к обычным

+ Жизненный цикл формы объекта Давайте рассмотрим, что происходит, когда мы открываем форму существующего элемента справочника. На клиенте вызывается метод «ОткрытьФорму» или мы просто открываем форму из какого-либо списка справочника. Начинается серверный вызов В памяти сервера создается новый СправочникОбъект, выполняется код модуля объекта (тот, что написан в самом низу модуля) Данные объекта считываются из базы данных, присваиваются значения реквизитов, наполняются табличные части объекта СправочникОбъект. В памяти сервера создается новая управляемая форма элемента Вызывается событие формы ПриЧтенииНаСервере, куда передается свежесозданный СправочникОбъект в параметре ТекущийОбъект Основной реквизит формы «Объект», тот, что в списке реквизитов выделен жирным шрифтом наполняется данными на основании данных СправочникОбъект. Здесь происходит обычное поэлементное присваивание свойствам объекта ДанныеФормы значений, записанных в одноименных свойствах объекта СправочникОбъект. По сути, происходит «ЗаполнитьЗначенияСвойств(ДанныеФормы, СправочникОбъект) СправочникОбъект уничтожается. Все его данные стираются из памяти сервера. Вызывается событие формы «ПриСозданииНаСервере», в котором мы получаем уже заполненные ДанныеФормы Данные формы сериализуются и отправляются на клиента, где форма отображается пользователю не факт

Сверил программно каждый реквизит с БД — никаких изменений, а Модифицированность = истина

Там пусто и там он тоже уже модифицирован

а если поменяли на тоже самое? я давным давно любил автоименования элементов в ПриОткрытии загонять типа ФИО = Ф+» «+И» «+О

А ничего страшного, что Модифицированность есть только у , которых в УФ не наблюдается, если их только самому не создавать?

Можно конечно своую ПроверитьМодифицированностьОбъекта(ИсточникОбъект) использовать, но хотелось бы понять — что там меняется

РеквизитФормыВЗначение(«Объект»)

Проверяй ЭтаФорма.Модифицированность

Проверить нужно в модуле объекта

Этим ты создаешь новый экземпляр объекта, если что.

У Объекта не бывает модифицированности, в отличие от Формы Объекта У него есть только новизна, т.е. записан он в базу или нет…

а что такое модифицированность объекта в базе данных? про время модификации = времени записи ничего не говорю

Так как я не знаю, что такое «объект в базе данных», то ничего ответить не могу. Объект — он в памяти живет, а не в БД.

да согласен, неправильно выразился в если считать что объект это то что считано в память из бд то да есть модифицированность СправочникОбъект.<Имя справочника> (CatalogObject.<Имя справочника>) Модифицированность (Modified) Синтаксис: Модифицированность Возвращаемое значение: Тип: Булево. Истина — объект изменен; Ложь — в противном случае. Описание: Определяет, был ли изменен объект после считывания из базы данных. Доступность: Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер). Примечание: Метод не позволяет определить, был ли изменен объект другими пользователями.

Тэги: 1С 8

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

Понравилась статья? Поделить с друзьями:
  • Как проверить наличие обязательных реквизитов
  • Как проверить отзывную компанию митсубиси асх
  • Как проверить официально ли работает компания
  • Как проверить подлинность фирмы по реквизитам
  • Как проверить реквизиты в личном кабинете фсс