Как проверить объект на модифицированность(), при вводе на основании? |
Я |
08.05.13 — 11:03
Как проверить объект на модифицированность(), при вводе на основании?
1 — 08.05.13 — 11:03
Зачем?
2 — 08.05.13 — 11:03
Нет, не так…
Да…
3 — 08.05.13 — 11:05
(1) Пользователь изменил реквизит на форме и при вводе на основании, в документ основание подтягивается старый реквизит, нужно отловить модифицированность и дать пользователю сообщение, чтобы записал документ
4 — 08.05.13 — 11:06
При открытии формы создавай ключ уникальности у нее. При вводе на основании ищи форму с этим ключом. Если форма найдена, она открыта и модифицированна — тогда швах
5 — 08.05.13 — 11:10
(4) Вот что то нашел ДанныеЗаполнения.ПолучитьФорму().ЭтотОбъект.Модифицированность() )))
6 — 08.05.13 — 11:11
+(5) Ток не понятно что такое ДанныеЗаполнения
7 — 08.05.13 — 11:12
ДанныеЗаполнения — произвольный объект, который может быть «Неопределено», «Структура», «Объект» ну или любой другой параметр
8 — 08.05.13 — 11:13
(5) Кстати, если док не сохранен, в ДанныеЗаполнения объект до изменения
9 — 08.05.13 — 11:15
(8) А если так Основание.ПолучитьФорму().ЭтотОбъект.Модифицированность() ?
10 — 08.05.13 — 11:17
(9) Если юзверь открыл форму но еще не записал ее — в базе данных старые данные. Поэтому получая ссылку или объект этого добра — ты получаешь данные, а форма создается с новым ключем уникальности.
11 — 08.05.13 — 11:26
Как можно прервать процедуру ввода на основании? Возврат; не предлагать)
12 — 08.05.13 — 11:28
(11) в модуле формы перед открытием
13 — 08.05.13 — 11:30
(12) Нужно в процедуре ОбработкаЗаполнения()
14 — 08.05.13 — 11:31
(13) ВызватьИсключение(«еба!»)
15 — 08.05.13 — 11:32
ДокументОбъект.<Имя документа> (DocumentObject.<Имя документа>)
ОбработкаЗаполнения (Filling)
Синтаксис:
ОбработкаЗаполнения(<ДанныеЗаполнения>, <СтандартнаяОбработка>)
Параметры:
<ДанныеЗаполнения>
Тип: Произвольный.
Значение, которое используется как основание для заполнения.
Если обработчик вызван при выполнении метода Заполнить, параметр равен параметру «Данные заполнения» метода Заполнить.
При обработке заполнения во время ввода на основании параметр имеет значение основания.
При интерактивном вводе нового из формы списка параметр является структурой, элементы которой соответствуют тем параметрам отбора формы списка, у которых способ сравнения Равно или ВСписке с единственным элементом списка. Если таких элементов отбор списка не содержит, данный параметр равен Неопределено. Если параметр «Стандартная обработка» по окончании работы обработчика равен Истина (установлен по умолчанию), система автоматически произведет заполнение одноименными элементами структуры.
<СтандартнаяОбработка>
Тип: Булево.
В данный параметр передается признак выполнения стандартной (системной) обработки события. Если в теле процедуры-обработчика установить данному параметру значение Ложь, стандартная обработка события производиться не будет. Отказ от стандартной обработки не отменяет действие.
Значение по умолчанию: Истина
Описание:
Возникает при вводе документа на основании, а также при выполнении метода Заполнить, при вводе на основании, а также при интерактивном вводе нового. В процедуре-обработчике этого события должен быть описан сам алгоритм заполнения реквизитов документа на основании переданного значения.
Примечание:
При копировании (как интерактивном, так и средствами встроенного языка), данный обработчик не вызывается.
См. также:
ДокументОбъект, метод Заполнить
16 — 08.05.13 — 11:33
(15) Не знаю как в 8.2, у меня 8.1 и там нет в параметре СтандартнаяОбработка
17 — 08.05.13 — 11:36
(16) тогда только (4)
18 — 08.05.13 — 11:37
фейспалм,
19 — 08.05.13 — 11:38
(18) ООПшник? )))
20 — 08.05.13 — 11:38
(17) Есть стандартная функция не помню какая, которая прерывает процедуру с сообщением
21 — 08.05.13 — 11:40
(20) ВызватьИсключение???
22 — 08.05.13 — 11:40
отказ = истина
23 — 08.05.13 — 11:41
при записи, организовать подпиской
24 — 08.05.13 — 11:41
(22) В обработке заполнения нету Отказ. Есть СтандартнаяОбработка, но она только в 8.2
25 — 08.05.13 — 11:41
(20) см (14)
26 — 08.05.13 — 11:42
(21) Да)
27 — 08.05.13 — 11:45
(11) Честно говоря, непонятно чем Возврат плох.
Лови как вариант в ОбработкаЗаполнения.
...
Если УсловиеСоблюдается Тогда
// тут действия по заполнению
КонецЕсли;
...
28 — 08.05.13 — 11:45
(27) Ничем, только он не отменит выполненные действия и откроет наполовину заполненную форму
29 — 08.05.13 — 11:51
передоткрытием
отказ = документоснование.получитьформу().модифицированность()
30 — 08.05.13 — 11:54
(28) вопрос был как прервать. Про все отменить — речи не было.
31 — 08.05.13 — 11:56
(27) В данной ситуации плох, потому что форма после обработки заполнения открывается пустая
32 — 08.05.13 — 11:56
+(31) А нужно не дать дойти до открытия формы
33 — 08.05.13 — 11:58
(29) Как вариант, но процедура ввода на основании все равно будит задействована, а это не есть хорошо для производительности
34 — 08.05.13 — 12:00
(33)
обработказаполнения(){
если документоснование.получитьформу().модифицированность() тогда
возврат;
конецесли;
}
35 — 08.05.13 — 12:01
(32) в модуле объекта экспортную переменную для контрольки. В модуле формы ПриОткрытии Отказ = ПеремннаяКонтролька <> Неопределено И ПеременнаКонтролька.
36 — 08.05.13 — 12:01
(34) Тогда обработка заполнения не пройдет, но форма все равно откроется
37 — 08.05.13 — 12:02
(35) опередил)
38 — 08.05.13 — 12:02
(36) в комплексе
39 — 08.05.13 — 12:07
(37) да такая фигня уже на кончике пальцев. У меня даже мозг для такой ерунды не включается )
40 — 08.05.13 — 12:11
Сделаю по другому, у объекта есть дополнительные свойства в виде структуры, буду в них записывать данные и проверять если в структуре есть эти данные, тогда отказ = истина;
41 — 08.05.13 — 12:15
(40) если речь о 8.2, то там было такое. Тут просто в соседней ветке речь про 8.1. потому переключиться не успел )
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 | ||
|
Модифицированность() — это свойство формы или объекта в памяти (но уж точно не ссылки)
это надо понимать так?
1C | ||
|
так тоже не понимает
1C | ||
|
Сообщение от Yulunga
чувство юмора это хорошо, а решение где, поспешил вам плюс поставить)
Добавлено через 17 минут
Или ошибка в том, что я проверяю в Модуле менеджера справочника в событии Перед записью, а надо проверять в Модуле Формы?
еще потестировал, в модуле объекта Справочника номенклатуры работает.
Работает и просто в форме по событию ПриИзменении элемента, но использовал это событие чисто для тестирования. В идеале нужно, что бы работало в Модуле Объекта ПередЗаписью().
Результат положительный, но пока нет четкого понимания, как это работает.
Добавлено через 24 минуты
Сообщение от Tklwegsd
А так?
1C
Выделить код
1
2
3
Если Модифицированность() тогда
а=0;
КонецЕсли;
еще потестировал
Оказалось, что даже если выбран тот же самый реквизит, программа думает что данные в форме изменилась, причем так думает и сама форма и Модуль объекта перед записью?
Можно ли где то узнать алгоритм этой функции, 1С ведь на си вроде написана, эти модули есть где нибудь или нет? Или может есть описание таких функциональных модулей?
Не по теме:
интернет видимо медленный и проходит дребезг клавиши, почему то иногда выходят повторы ответов через 15 сек)
Добавлено через 1 час 34 минуты
Пока получается так
Разные действия на форме име.ют разные действия:
1. Если меняем реквизит на другой признак Модифицированности
устанавливается в ИСТИНУ, * в шапке
2. Если не меняем реквизит, но открываем форму реквизита (если это ссылка) => Модифицированность
в ИСТИНУ и * в шапке формы.
3. Если нажимаем на крестик в открывшейся форме, => Модифицированность ложь и * НЕТ
Добавлено через 42 минуты
вот Синтаксис помощник
1C | ||
|
как это правильно применить в коде?
У объекта — Метод, у формы — свойство — в чем зазница?
У объекта событие ПередЗаписью, у формы событие ПередЗакрытием
Логика понятна.
Объект — прочитали данные из базы, что то изменили и пробуем записать обратно, все поля можно проверить , в базе они отличаются от новых.
Форма — поля формы вроде бы не где не сохраняются и их изменение при закрытии формы разве можно как то проверить сразу все на уровне программы?
У формы по идее в программе настроен простой механизм, если был открыт хоть один реквизит на изменение и не важно изменили там что либо или нет, проверяется только сам факт, сохранили действие или отменили по крестику к примеру и все флаг Модификации перещелкивается и при закрытии формы, проверяется просто его значение ложь или истина.
так или нет?
Хотя при сохранению в базу программа может и не проверять поля (старые и новые) [такой вывод можно сделать из статьи https://forum.infostart.ru/forum9/topic129997/ там сохраняется каждое поле и потом сверяется перед записью], а тоже работать только по этому флагу
Форма — поля формы вроде бы не где не сохраняются и их изменение при закрытии формы разве можно как то проверить сразу все на уровне программы?
У формы по идее в программе настроен простой механизм, если был открыт хоть один реквизит на изменение и не важно изменили там что либо или нет, проверяется только сам факт, сохранили действие или отменили по крестику к примеру и все флаг Модификации перещелкивается и при закрытии формы, проверяется просто его значение ложь или истина.
так или нет?
Хотя при сохранению в базу программа может и не проверять поля (старые и новые) [такой вывод можно сделать из статьи https://forum.infostart.ru/forum9/topic129997/ там сохраняется каждое поле и потом сверяется перед записью], а тоже работать только по этому флагу
При открытии формы уже в ПриСозданииНаСервере объект модифицирован. Где до этого он может модифицироваться?
там в УФ с формами вообще все плохо в плане последовательности событий для привыкших к обычным
+ Жизненный цикл формы объекта Давайте рассмотрим, что происходит, когда мы открываем форму существующего элемента справочника. На клиенте вызывается метод «ОткрытьФорму» или мы просто открываем форму из какого-либо списка справочника. Начинается серверный вызов В памяти сервера создается новый СправочникОбъект, выполняется код модуля объекта (тот, что написан в самом низу модуля) Данные объекта считываются из базы данных, присваиваются значения реквизитов, наполняются табличные части объекта СправочникОбъект. В памяти сервера создается новая управляемая форма элемента Вызывается событие формы ПриЧтенииНаСервере, куда передается свежесозданный СправочникОбъект в параметре ТекущийОбъект Основной реквизит формы «Объект», тот, что в списке реквизитов выделен жирным шрифтом наполняется данными на основании данных СправочникОбъект. Здесь происходит обычное поэлементное присваивание свойствам объекта ДанныеФормы значений, записанных в одноименных свойствах объекта СправочникОбъект. По сути, происходит «ЗаполнитьЗначенияСвойств(ДанныеФормы, СправочникОбъект) СправочникОбъект уничтожается. Все его данные стираются из памяти сервера. Вызывается событие формы «ПриСозданииНаСервере», в котором мы получаем уже заполненные ДанныеФормы Данные формы сериализуются и отправляются на клиента, где форма отображается пользователю не факт
Сверил программно каждый реквизит с БД — никаких изменений, а Модифицированность = истина
Там пусто и там он тоже уже модифицирован
а если поменяли на тоже самое? я давным давно любил автоименования элементов в ПриОткрытии загонять типа ФИО = Ф+» «+И» «+О
А ничего страшного, что Модифицированность есть только у , которых в УФ не наблюдается, если их только самому не создавать?
Можно конечно своую ПроверитьМодифицированностьОбъекта(ИсточникОбъект) использовать, но хотелось бы понять — что там меняется
РеквизитФормыВЗначение(«Объект»)
Проверяй ЭтаФорма.Модифицированность
Проверить нужно в модуле объекта
Этим ты создаешь новый экземпляр объекта, если что.
У Объекта не бывает модифицированности, в отличие от Формы Объекта У него есть только новизна, т.е. записан он в базу или нет…
а что такое модифицированность объекта в базе данных? про время модификации = времени записи ничего не говорю
Так как я не знаю, что такое «объект в базе данных», то ничего ответить не могу. Объект — он в памяти живет, а не в БД.
да согласен, неправильно выразился в если считать что объект это то что считано в память из бд то да есть модифицированность СправочникОбъект.<Имя справочника> (CatalogObject.<Имя справочника>) Модифицированность (Modified) Синтаксис: Модифицированность Возвращаемое значение: Тип: Булево. Истина — объект изменен; Ложь — в противном случае. Описание: Определяет, был ли изменен объект после считывания из базы данных. Доступность: Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер). Примечание: Метод не позволяет определить, был ли изменен объект другими пользователями.
Тэги: 1С 8
Комментарии доступны только авторизированным пользователям