Харлампию. Наш ответ Чемберлену, особенности дублей...

Автор Злоп, 02 сентября 2024, 00:13

« назад - далее »

Злоп

На примере константы.
Сделаем константу, например, ДемоЗащита, строка(20)
Установим значение, например, "ЗащитаВключена"
Программно прочитаем, а потом изменим константу, ожидаемо значение константы изменилось.
Провернем финт.
Внешним редактором ПРОДУБЛИРУЕМ запись о константе в 1SConst.dbf (переиндексироваться после этого, убив индекс констант), скрин 2024-09-01_234348
Выполним код

Процедура Сформировать()
	ОчиститьОкноСообщений();
	Сообщить(ТекущееВремя()+" -- начало сеанса -------------------");	
	Сообщить("читаем значение Константа.ЗащитаДемо"); 
	Значение = Константа.ЗащитаДемо;
	Сообщить("Константа.ЗащитаДемо = "+Значение);
	Сообщить("установим значение Константа.ЗащитаДемо как ЗащитаАтата!"); 
	Значение = "ЗащитаАтата!";
	Константа.ЗащитаДемо = Значение;
	Сообщить("читаем значение Константа.ЗащитаДемо"); 
	Значение = Константа.ЗащитаДемо;
	Сообщить("Константа.ЗащитаДемо = "+Значение);
	Сообщить(ТекущееВремя()+" -- конец сеанса -------------------");	
КонецПроцедуры

23:54:41 -- начало сеанса -------------------
читаем значение Константа.ЗащитаДемо
Константа.ЗащитаДемо = ЗащитаВключена     
установим значение Константа.ЗащитаДемо как ЗащитаАтата!
читаем значение Константа.ЗащитаДемо
Константа.ЗащитаДемо = ЗащитаВключена     
23:54:41 -- конец сеанса -------------------

посмотрим значение константы визуально через менюшку "Константы", увидим значение "ЗащитаВключена", посмотрим внешним редактором, что там унутре, скрин 2024-09-01_235631

выполним код повторно, слегка изменив устанавливаемое значение
23:58:54 -- начало сеанса -------------------
читаем значение Константа.ЗащитаДемо
Константа.ЗащитаДемо = ЗащитаВключена     
установим значение Константа.ЗащитаДемо как ЗащитаАтатаДважды!
читаем значение Константа.ЗащитаДемо
Константа.ЗащитаДемо = ЗащитаВключена     
23:58:54 -- конец сеанса -------------------
посмотрим визуально: ЗащитаВключена, посмотрим унутре: 2024-09-02_000016

Итого: когда читаем - получаем "последнее" значение.
Когда пишем: пишем в "первое" значение, в т.ч. когда изменяем константу интерактивно - после энтера (например, ЗащитаОйОйОй) значение константы снова волшебным образом вернется к ЗащитаВключена, ибо "читаем первое значение").

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

Когда-то вот обнаружил такое, глубже не исследовал.
ТиИ при этом при первом исполнении обругается "Таблица - 1SCONST. Длина файла не соотвествует количеству и длине записей" (именно не "соотвеСТвует" ;-) и убъет "лишнюю" запись (в моем случае - вторую), и тут кодом можно проанализировать что если не то значение которое типа железобетонное должно быть - значит систему "сломали" ;-)

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

MWW_Ruza

Не понял... ТиИ убъет эту лишнюю запись, в данном случае - не важно, первую или вторую, и что?
Вернется все "на круги своя", останется одна запись...
Или после такого "финта" нельзя делать ТиИ - ?

Или я чего-то не понял?

PS А ТиИ еще, даже если и не убъет эту запись, то при проверке логики, скорее всего будет ругаться, что-то типа того, что "повторяющееся значение ID, исправьте вручную"...

trad

Цитата: Злоп от 02 сентября 2024, 00:13Вангую, что аналогичным образом будет работать и с элементами справочника и тогда можно реализовать что-то типа "предопределенных элементов справочника"...
В справочнике такое не получится сделать, т.к. там дубли ID запрещены на уровне уникального индекса в отличии от констант, где индекса гарантирующего уникальность ID - нет

Харлампий Дымба

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

Что касается справочников:
Если дубли в справочнике делать, то оба элемента интерактивно вполне себе выводятся в списке, в отличие от значения констант. А вот эффект интерактивной/программной записи похожий в случае, если позиционирование через "НайтиЭлемент()": тогда запись всегда идёт в первое значение.
Но если позиционирование через "ВыбратьЭлементы() - ПолучитьЭлемент()", то перезаписать можно оба элемента.
ТиИ дубли Id видит и ругается - но сделать ничего не может (в т.ч и в режиме "Очищать/удалять"):
Проверка уникальности внутреннего идентификатора в справочнике.ХХХ. Элемент 1(ЯЯЯ). Вн. идентификатор 1. Исправить вручную.
Выгрузка-загрузка тоже проблемный элемент не убирает.

Что касается констант:
Цитата: MWW_Ruza от 02 сентября 2024, 11:02Не понял... ТиИ убъет эту лишнюю запись, в данном случае - не важно, первую или вторую, и что?
Посмотрел. Оказалось, ТиИ эту запись не тронет и даже глазом не моргнёт. И ругаться не будет.
А вот выгрузка-загрузка лишнюю запись уничтожит.


Arbuz

Т.е. по факту, такая "защита" запрещает делать ТиИ. Такое себе...

ЗЫ: Интересно, а свои записи добавлять в таблицы 1С можно ли, так чтобы стандартными средствами они не виделись, но и не убивались ТиИ?

Харлампий Дымба

Цитата: Arbuz от 02 сентября 2024, 16:39Т.е. по факту, такая "защита" запрещает делать ТиИ
Не, наоборот. Тут же 2 вопроса Злоп поднял:
1. защита через константу
2. а как ведут себя справочники?

Так вот для константы - вполне себе рабочий вариант - ТиИ проблем не видит и лишние записи не трогает. Но нельзя делать выгрузку-загрузку.
А вот для справочника - вообще не вариант.


Arbuz

В смысле, не видит?

Цитата: Злоп от 02 сентября 2024, 00:13ТиИ при этом при первом исполнении обругается "Таблица - 1SCONST. Длина файла не соотвествует количеству и длине записей" (именно не "соотвеСТвует" ;-) и убъет "лишнюю" запись (в моем случае - вторую),

Харлампий Дымба

Цитата: Злоп от 02 сентября 2024, 00:13ТиИ при этом при первом исполнении обругается "Таблица - 1SCONST. Длина файла не соотвествует количеству и длине записей" (именно не "соотвеСТвует" ;-) и убъет "лишнюю" запись (в моем случае - вторую),
Не наблюдаю такого поведения. Видимо, от редактора таблиц зависит: вношу копию константы с помощью wDBFview 1.4а от Гэндальфа, никакой ругани при ТиИ нет.

Злоп

Цитата: Харлампий Дымба от 02 сентября 2024, 18:44
Цитата: Злоп от 02 сентября 2024, 00:13ТиИ при этом при первом исполнении обругается "Таблица - 1SCONST. Длина файла не соотвествует количеству и длине записей" (именно не "соотвеСТвует" ;-) и убъет "лишнюю" запись (в моем случае - вторую),
Не наблюдаю такого поведения. Видимо, от редактора таблиц зависит: вношу копию константы с помощью wDBFview 1.4а от Гэндальфа, никакой ругани при ТиИ нет.
Возможно. Я редактором LookDBF вставлял в Far.
Тогда еще лучше если дубли записей останутся...