Имя: Пароль:
1C
1С v8
Ошибка платформы 8.3.26 и неработающий оператор сравнения в языке 1С
,
0 ZloyBrawler
 
20.02.25
18:34
Довольно давно сталкивался с ошибкой, что в платформе 1С при использовании расширений было такое, что обновишь базу данных динамически и начинались странные вещи.

Теперь же на тестовом сервере на платформе 8.3.26.1540 довольно часто платформа начала чудить, но ошибка плавающая и службу поддержки 1С не удается убедить в ее наличии.

После динамического обновления (не всегда) перестают работать такие конструкции языка как оператор сравнения "=", и так как по сути он же используется в платформе в некоторых классах типа Соответствие, то и он перестает корректно работать. Помогает рестарт веб-сервера 1С или самого сервера 1С

Пример кода

Есть перечисление НекоеПеречисление с двумя значениями: Значение1, Значение2.
Есть функция в которой есть обращение через точку к реквизитам ссылки.

Функция СуперФункция(СсылкаНаНекийЭлементСправочника)

    // куча полезного кода

    ЗначениеРеквизита = СсылкаНаНекийЭлементСправочника.НекийРеквизит;

    Если ЗначениеРеквизита = Перечисления.НекоеПеречисление.Значение1 Тогда
        Сообщить("Значение1");
    ИначеЕсли ЗначениеРеквизита = Перечисления.НекоеПеречисление.Значение2 Тогда
        Сообщить("Значение2");
    Иначе
        ВызватьИсключение "Неизвестное значение перечисления";
    КонецЕсли;

    // вторая куча полезного кода

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

Да как бы правильно использовать функцию ОбщегоНазначения.ЗначениеРеквизитаОбъекта и это прям реально помогает в контексте такой указанной функции, но не отменяет тот факт, что платформа содержит ошибку и может приводить к непредсказуемым ошибкам в прикладных решениях.

СсылкаНаНекийЭлементСправочника в нашем случае получалась при помощи запроса к базе данных к регистру сведений созданному в расширении конфигурации, сама ссылка это тоже созданный в расширении объект справочника. Перечисление так же создано в расширении. Ну это так уточнения для полноты картины.

Ошибка возникает в тонком клиенте (на стороне сервера 1С) подключенном через веб-сервер 1С развернутый на IIS.

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

На днях столкнулись с приколом, где и просто значения элементов справочников не могут правильно сравниться, и тут еще и было выявлено, что не работает функция НекоеСоответствие.Получить(Ссылка), возвращает Неопределено, хотя есть как минимум одна запись в нем, где в качестве ключа выступает ссылка, которая 100% совпадать по уникальному идентификатору с Ссылка.УникальныйИдентификатор(), тип значения так же совпадает, то есть на глаз это 100% один и тот же элемент справочника.

Как там удалось к такому прийти?

На стороне 1С ERP вызывается через вэб-сервис 1С ДО 2.1 куда передается некое имя некого элемента справочника некого справочника, и вот этот элемент находится успешно запросом.
После этого его ссылка гуляет по куче место в коде и в какой-то момент времени как не смешно ЧЕРЕЗ ТОЧКУ получается в нем один из реквизитов, ссылка на справочник видов внутренних документов, а потом уже из нее пытаются получить 4 реквизита при помощи ОбщегоНазначения.ЗначенияРеквизитовОбъекта, которая не возвращает нормального результата из-за ошибки платформы с оператором "=" проявляющейся в классе Соответствие.

Функция СуперФункция2(СсылкаНаНекийЭлементСправочника)

    // куча полезного кода

    ЗначениеРеквизита = СсылкаНаНекийЭлементСправочника.НекийРеквизит; // ссылка на элемент справочника тип СправочникСсылка.ИмяСправочника
    
    РеквизитыСсылки = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ЗначениеРеквизита, "Реквизит1, Реквизит2");

    Если РеквизитыСсылки <> Неопределено Тогда
        Сообщить("Ура");
    Иначе
        ВызватьИсключение "Косяк";
    КонецЕсли;

    // вторая куча полезного кода

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

В недрах ЗначенияРеквизитовОбъекта используется ЗначенияРеквизитовОбъектов, там как известно формируется запрос к объекту того типа, какой имеется у переданной ссылки, запрашиваются нужные реквизиты + ссылка к которой они принадлежат.
Так вот, когда формируется запрос и выполняется, платформа 1С еще может адекватно переварить значение в ЗначениеРеквизита и превратить его в нужный уникальный идентификатор по которому в нашем случае MS SQL и получает данные. Когда же запрос выполнится, платформа 1С как полагаем для поля Ссылка применяет что-то типа Справочники.ИмяСправочника.ПолучитьСсылку(УникальныйИдентификатор из результата запроса). Так вот ЗначенияРеквизитовОбъектов формирует СООТВЕСТВИЕ, где ключами выступают переданные в нее ссылки, но взятые из результата запроса, а значениями выступают структуры с нужными реквизитами. ЗначенияРеквизитовОбъекта пытается из этого соответствия выбрать только тот результат, который относится к ЗначениеРеквизита, вызывает по сути такой код НекоеСоответствие[ЗначениеРеквизита], что эквивалентно НекоеСоответствие.Получить(ЗначениеРеквизита). Выдается результат Неопределено, что есть косяк...

Дофига текста да, давайте упростим функцию.

Функция СуперФункция3(СсылкаНаНекийЭлементСправочника)

    // куча полезного кода

    ЗначениеРеквизита = СсылкаНаНекийЭлементСправочника.НекийРеквизит; // ссылка на элемент справочника тип СправочникСсылка.ИмяСправочника
    
    НекоеСоответствие = Новый Соответствие();
    
    НекоеСоответствие.Вставить(Справочники.ИмяСправочника.ПолучитьСсылку(ЗначениеРеквизита.УникальныйИдентификатор()), "ОГОГО!!!");

    ЗначениеОГОГО = НекоеСоответствие.Получить(ЗначениеРеквизита);

    Если ЗначениеОГОГО <> Неопределено Тогда
        Сообщить("Ура ОГОГО ЕСТЬ!!!");
    Иначе
        ВызватьИсключение "Косяк";
    КонецЕсли;

    // вторая куча полезного кода

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

Когда в платформе возникает ошибка после динамического обновления, то получим исключение "Косяк".

То есть ЗначениеРеквизита <> Справочники.ИмяСправочника.ПолучитьСсылку(ЗначениеРеквизита.УникальныйИдентификатор()), хотя должны совпадать на 100%

Размышляя на досуге, пришел к выводу, что "ЗначениеРеквизита = СсылкаНаНекийЭлементСправочника.НекийРеквизит" это и есть причина двух ошибок, проблема в методе GET у свойств/реквизитов класса ссылки. То есть обращение к реквизитам ссылки через точку видимо возвращает ссылки из совершенно других сеансов, которые были запущены до применения изменений в базе данных, как это произойти могло известно только фирме 1С, но пока они в дурочку играют...

Видимо в разных сеансах ссылки в КЭШах/СеансовыхДанных имеют еще какой-то служебный признак ВЕРСИИ выполняющегося кода, и оператор "=" его тоже сравнивает и для него это критично, а так как оператор "=" применяется при поиске значений в "НекоеСоответствие.Получить(ЗначениеРеквизита)" и там в коллекции объектов не может найти ссылку по ВЕРСИИ как у ЗначениеРеквизита, тогда как в коллекции точно содержится актуальная ссылка с новой ВЕРСИЕЙ, в качестве ключа, полученная платформой при помощи "Справочники.ИмяСправочника.ПолучитьСсылку(ЗначениеРеквизита.УникальныйИдентификатор())".

Класс Соответствие, - это видимо не один класс платформы, где могут наблюдаться ошибки из-за проблем с оператором "=".

Напомню, что ошибка проявляется при работе с веб-сервером 1С, после динамического обновления, именно в той базе, где это обновление было выполнено.
Может она проявляться в тонком клиенте подключенном к этой базе через веб-сервер, так же, если некая иная база данных подключается к этой же базе данных, но уже по технологии вэб-сервисов (а это делается тоже через веб-сервер 1С), вызывая некую команду в базе данных с целью получить некие данные или что-то в ней изменить.

Пытался этот текст как статью на инфостарте оформить в итоге столкнулся с тем, что модераторы не пропусксют ее. Мол несет негативный подтекст в алрес 1С и не имеет никакой методической ценности)))

А еще сказали, предсказуемо было, "не используйте динамические обновления", словно я должен их приказам следовать))) Инструмент есть и его используют. Есть ошибки в нем, значит 1С должна их чинить, все как бы логично.

Сталкивался ли кто-то с подобного рода ошибками?

Так для статистики интересно))
1 eddy_n
 
20.02.25
12:35
(0) Одно описание устанешь читать. На то, чтобы ответить, сил  уже не останется.
2 ZloyBrawler
 
20.02.25
12:39
(1) потому и хотел как статью оформить да отбрили))) пришлось сюда выложить чтобы может быть кому-то помогло в понимании происходящего, если нарвутся на похожие ошибки платформы
3 Stepashkin
 
20.02.25
12:42
(2) Код хотя бы можно было свернуть?
4 Волшебник
 
20.02.25
12:42
Абстрактные справочники, абстрактные реквизиты. Чушь какая-то
5 ZloyBrawler
 
20.02.25
12:47
(4) кому будут интересны не типовые имена объектов?
6 ZloyBrawler
 
20.02.25
12:48
(3) нет, копипаст на телефоне делал, что смог сделать, то и сделал
7 Волшебник
 
20.02.25
12:56
(5) А кому интересна абстрактная херня в какой-то туевой хуче говнокода с ERP+ДО, да ещё после динамического обновления?

Вы утверждаете, что платформа содержит ошибку? Ну так сделайте минимальный пример на пустой базе.
ДОКАЖИТЕ ОШИБКУ
8 PLUT
 
20.02.25
12:55
(0) демоническое обновление это зло

и в качестве гигиены неплохо рестартовать службы сервера 1С и скуля
9 Регистр
 
20.02.25
12:57
"вэб-сервера"
вас тоже бесит, когда говорят или пишут так?
10 PLUT
 
20.02.25
13:05
давеча на платформе 8.3.25.1445 вот такую ашипку поимели (около ста активных кнопконажимателей)

демоническое обновление. в общем модуле поменялась одна строчка кода

как тебе такое, Илон Маск?

теперь вот клепаю заплатки через расширения "изменение" :)
11 PLUT
 
20.02.25
13:08
(0) "не используйте динамические обновления"
12 ZloyBrawler
 
20.02.25
13:25
(11) в тестовой базе сижу только я и она валится и валится в эту ошибку, ты это динамическое обновление и не замечаешь как делаешь ибо клиент еще не отрубился или ты его в мобилке в принципе забыл отрубить
13 Lama12
 
20.02.25
13:26
(0) В конфигураторе встань курсором на "Если" и нажми Ctrl+F1. Справка не откроется, а конфигуратор закроется. И так во всех 26 версиях.
14 ZloyBrawler
 
20.02.25
13:28
(7) Негативьте в другом месте
Тут хоть как-то пытаешься мысль донести, помочь другим, не прося ничего взамен. После вашей срачи теряешь какое либо желание что-то для сообщества 1С делать.
15 ZloyBrawler
 
20.02.25
13:27
(13) в 8.3.26.1540 исправили эту ошибку
16 PLUT
 
20.02.25
13:28
(14) а что изменится от ваших попыток мысль донести и не расплескать?
17 d4rkmesa
 
20.02.25
13:29
(0) Спасибо, пока не буду обновлять платформу с 8.3.25.1394.
18 ZloyBrawler
 
20.02.25
13:35
(7) ошибку пытался воспроизводить, но она упорно не появляется в демо базе, плавающая ошибка. На разных версиях платформы пробовал. Рабочие базы естественно в 1С я не могу отправить. За все время общения с тех поддержкой только один раз удалось с ними по телефону пообщаться и то когда я прям потребовал заменить прослойку взаимодействующую с нами через линию тех поддержки. Тогда вопрос быстро решился и по стране устранили ошибки с кассовым оборудованием. А в основном они сидят как в танке. Я им бы и доступ удаленный дал для отладки, да видимо им это не нужно.
19 ZloyBrawler
 
20.02.25
13:37
(17) описанная мной ошибка в разной степени частоты появлялась со времен 8.3.12
Возможно вы не используете веб-сервер 1С и потому она вас обходит стороной
20 H A D G E H O G s
 
20.02.25
13:43
(0) Удивительно, но сталкивались.

8.3.20, в режиме совместимости 8.3.17, в расширении, ошибка сравнения со значением перечисления, веб-сервер под IIS, после динамического обновления расширения.

Вспотели кровавым холодным потом, остановили сервер 1С, почистили сеансовые данные, запустили, ошибка ушла и не возвращалась. Некоторое время не обновлялись динамически, потом перешли на 8.3.22 и стали обновляться, ошибка ушла. Епстественно, воевать с болотом поддержки 1С дурных нема.

Я действительно не верил своим глазам.
21 Asmody
 
20.02.25
13:56
(9) ДА!
22 ZloyBrawler
 
20.02.25
13:57
(16) Как показала практика, если развернуто людям отвечаешь просто в сообщениях, то по прошествии длительного периода времени эти ответы и самому позволяют вспомнить, что и как работает. Да сам свои же ответы нагугливал и читал. Да и коллеги находят порой, хихикают, типа это ты мне и помог ответ кому-то другому дать.
23 Волшебник
 
20.02.25
13:58
(14) Вы мне не указывайте, что мне делать или не делать на моём личном форуме.
24 ZloyBrawler
 
20.02.25
14:02
(20) в ситуации, когда почистил сеансовые данные и все временно прошло, крайне сложно с 1С бадаться, так как какой им пример не пошли, ошибку они скажут воспроизвести не могут. Нужно по факту ее искать по месту возникновения, на машинах клиентов, но 1С этим брезгует заниматься. Швыряют в тебя файлами для настройки технологического журнала, а ошибки тупо там не отражаются))) хотят поймать дапм памяти, а он не формируется ибо критического же падения платформы нет.
25 Волшебник
 
20.02.25
14:02
(24) Не пользуйтесь динамическим обновлением чаще 1 раза в сутки. При этом ночью перезагружайте 1С сервер. А лучше вообще не пользуйтесь.
26 Asmody
 
20.02.25
14:03
(14) да срать на "сообщество 1С" - толпа самодовольных напыщенных ублюдков.
не надо ничего делать для сообщества 1С. делайте под себя.
27 ZloyBrawler
 
20.02.25
14:07
(23) Будьте добрее и коммуникабельнее!
Вечная злоба людей не красит!
Вы для чего этот форум создали?
Чтобы угнетать людей?
Разгоняете сообщество таким образом?
Или все же чтобы тут была взаимопомощь и терпимость друг к другу?
Гениев тут нет думаю, все в разной степени специалисты и делятся своими мнениями.
28 ZloyBrawler
 
20.02.25
14:08
(26) Это походу девиз всей РФ. Человек человеку волк... Злоба зашкаливает
29 H A D G E H O G s
 
20.02.25
14:09
(24) Я давно забил на эти азартные игры. Особенно выбешивает, когда с партнерке, где тусуются разрабы, отправляют писать письма мелким почерком с указанием номера франча на линию поддержки. А иногда не отправляют. Принципиально не пишу.
30 Ненавижу 1С
 
гуру
20.02.25
14:13
>>То есть ЗначениеРеквизита <> Справочники.ИмяСправочника.ПолучитьСсылку(ЗначениеРеквизита.УникальныйИдентификатор()), хотя должны совпадать на 100%

вы хоть ссылку от нужного справочника получаете?
31 ZloyBrawler
 
20.02.25
14:21
(30) да тип справочника правильный и соответствует тому типу что в ЗначениеРеквизита
32 Asmody
 
20.02.25
14:30
(28) Вы что-то имеете сказать против РФ?
33 PLUT
 
20.02.25
15:10
(28) WickedSkandalist (наеборот если)
34 Волшебник
 
20.02.25
14:37
(27)(28) Вы на свой ник посмотрите... "Злой скандалист"
35 ZloyBrawler
 
20.02.25
14:40
Нашел старые скрины.
Смотрим на табло снизу
Приведена ситуация с кривой работой перечислений и соответствия
36 ZloyBrawler
 
20.02.25
14:40
(34) да я сам себя боюсь!!!
37 ЕRPe
 
20.02.25
14:43
(0) Похоже на ошибки в модуле менеджера когда вместо тонкого клиента запускается толстый и нет #Если Сервер Тогда
38 1Снеговик
 
гуру
20.02.25
16:18
(20) что такое динамическое обновление расширения?

Только основная конфа обновляется динамически при активных сеансах, расширению же побоку есть сеансы или нет.
39 KJlag
 
20.02.25
16:20
(38) добавь реквизит в объект в расширении. попросит монопольно обновится
40 Eiffil123
 
20.02.25
16:50
а как связаны динамическое обновление и расширения? вы чьих будете?
41 Eiffil123
 
20.02.25
16:58
и вообще зачем вы 8.3.26 ставили? типовые только 24 платформу требуют, которая плюс минус стабильна (кроме полнотекстового поиска)
42 ZloyBrawler
 
20.02.25
17:30
(41) вы думаете в мире существуют только типовые базы? У нас есть не типовые. Кто-то мешает нам режим совместимости устанавливать как нам хочется?
43 PLUT
 
20.02.25
17:51
(42) а платформу 8.5 пробовали? вдруг там уже исправили эту фичу?

https://releases.1c.ru/project/Platform85

* Более просторный/воздушный интерфейс (в веб-клиенте также доступен и компактный вариант масштаба интерфейса).
* Обновлена отрисовка всего интерфейса и большинства его элементов. Теперь интерфейс более современный.
* Поддержка светлой/тёмной темы. Весь интерфейс построен на определенной цветовой палитре, поэтому выглядит более целостным.
* Добавлена поддержка карточек.
* Все иконки платформы обновлены на более современные контурные, векторные иконки. Как эксперимент в веб-клиенте добавлен новый вариант оконной системы, фокусирующий пользователя на текущих задачах и препятствующий накоплению большого числа открытых окон.
* Команды на форме перераспределены.
* Переосмыслено использование двойных кликов. Во многих местах действие, ранее доступное по двойному клику, теперь доступно и по одинарному.

* Конвертация конфигураций, информационных баз, внешних обработок и внешних отчетов при переходе от предыдущей версии к версии 8.5.1 не требуется.
* Для использования некоторых новых возможностей версии 8.5.1 необходимо отключить режим совместимости. При отключении и включении режима совместимости выполняется изменение структуры некоторых объектов базы данных. Для того, чтобы иметь возможность работать с информационной базой предыдущими версиями, необходимо установить режим совместимости.

©пижжено отсюда: https://dl03.1c.ru/content/Platform/8_5_1_189/1cv8upd_8_5_1_189.htm#33f90aa2-bea9-11ef-963f-0050569f678a
44 ZloyBrawler
 
20.02.25
18:32
(43) Ради развлечения перед новым годом пробовали.

Не зашло))

Вскрылась туча новых ошибок... с нетерпением ждем релиза чтобы поржать))

Ошибку из этой темы не тестировали ибо она не проявлялась и не мешала жить на тот момент времени.
С другой стороны 8.5, - это те же 8.3.26-27-28, только с натянутой новой юзер мордой версии 8.5
45 Волшебник
 
20.02.25
18:57
(44) Ошибки после динамического обновления не считаются ошибками. Просто протух кэш конфигурации. Не зря такое обновление прозвали "демоническим".
46 Волшебник
 
20.02.25
18:59
На одной из прошлых работ мы как-то зачастили с динамическим обновлением, делали его несколько раз в день.
Посыпались совершенно необъяснимые ошибки! У части пользователей не найдено поле-измерение регистра, хотя оно там точно есть. У остальных всё ок.
С тех пор было введено правило еженочной перезагрузки 1С-сервера и максимум 1 динамическое обновление в сутки.
Если не срочно, то лучше подождать до обычного обновления.
47 Волшебник
 
20.02.25
19:01
В данном случае, ссылка не равна ссылке, хотя гуиды совпадают. Значит разные типы.
Где-то на уровне платформы в кэше застрял старый тип, а в рабочей конфе уже новый тип (точно такой же, но с другим id).
Если типы не совпадают, то внешне идентичные ссылки не равны.
48 Волшебник
 
20.02.25
19:05
Если я на форуме обновлю php-файл и js-файл, то первый обновится обязательно, а второй может оказаться протухшим в кэше браузера и не будет соответствовать файлу на сервере, который с ним взаимодействует.

Я буду просить пользователей жать Ctrl-F5, а они будут жаловаться и сыпать мне ошибками...
Я буду бесконечно просить пользователей жать Ctrl-F5, а они будут снова жаловаться и сыпать мне ошибками...

Поэтому мне проще переименовать js-файл в новое имя с датой-временем, чем слушать это нытьё.
49 Волшебник
 
20.02.25
19:10
Только не спрашивайте, почему протухает кэш. Такая у него природа. Он должен быть актуальным некое время. Значит что-то пошло не так с правилами обновления. Может у одного клиента лицензия отвалилась или фаза луны неудачная для скорпионов...
50 Волшебник
 
20.02.25
19:23
(26) Это в перлы, конечно
51 ZloyBrawler
 
20.02.25
20:11
(47) Про кэши я теорию и выдвигал, и подозреваю, что в платформе просто есть ряд методов/функций/процедур, которые тупо не учитывают некоторые изменившиеся обстоятельства после динамического обновления, а то падало бы вообще ВСЕ, но падает только лишь получение ссылок из реквизитов через точку от ссылочных типов, и потом эти ссылки НЕКОРРЕКТНЫЕ и вызывают сбой в операторе сравнения "=". Как бы фирме 1С нужно это бы пофиксить и все. Ведь корректно же работает Справочники.ИмяСправочника.ПолучитьСсылку, а там тоже GUID трансформируется в ссылочный тип (справочник, документ...) платформы 1С.

А = НекаяСсылка.РеквизитСсылочногоТипа; // вот корень проблемы.

В ООП, - это обращение к свойству экземпляра некого класса, и как правило для работы со свойствами есть методы SET и GET. позволяющие устанавливать значение и читать их из свойства, хотя для нас это выглядит как обращение к переменной/полю
В 1С в ссылочных типах нет SET, но есть GET, свойства же только на чтение.
Проблема в платформенной реализации метода GET, его нужно чинить и заставить работать не хуже Справочники.ИмяСправочника.ПолучитьСсылку.

Да, нам это очевидно, но фирме 1С это видимо не нужно чинить, устроили черти что, а не службу поддержки, а сайт инфостарт закрывает рот, не дает запустить обсуждение проблемы.

Ответ модератора инфостарта на запрос почему статья задержалась на кучу дней на модерации. По сути после ее ответа и было принято решение искать иную площадку близкую к 1С для публикации.

Ирина Пятакова (Alraune) 20.02.2025 10:45:02
Добрый день
https://infostart.ru/about/rules/publishing_rules/ 2.2.15. Запрещается публиковать статьи, которые не несут никакой методической ценности, а лишь описывают ошибки и негативное отношение к чему-либо или к кому-либо.
52 Волшебник
 
20.02.25
20:15
(51) Миста, получается, круче.
53 ZloyBrawler
 
20.02.25
20:18
(52) Сам себя не похвалишь... )))
54 Волшебник
 
20.02.25
20:39
(53) 💖
55 Волшебник
 
20.02.25
20:41
Вы поймите, что Инфостарт стал де-факто подразделением фирмы 1С, поэтому там очень жёсткие правила модерации.
У нас в правилах тоже есть похожие пункты, но де-факто Миста — мой личный ресурс, поэтому со мной лучше дружить.
56 Eiffil123
 
21.02.25
09:48
(55) они что-то скрывают от граждан. Хорошо что находятся такие смельчаки, как в (51), которые не готовы молчать об этом
57 PLUT
 
21.02.25
09:50
(56) у нас вся бюстгалтерия в полном составе:

"г@вно эта ваша 1С"

смелые
на солнце загорелые
58 Волшебник
 
21.02.25
09:50
(56) Наверное, они скрывают исходники платформы 1С, поэтому никто толком не знает, как там работает кэш.
59 shuhard
 
21.02.25
10:04
(51) не нравится 1С - иди в курьеры (с)
60 PLUT
 
21.02.25
10:07
(56) от обычных граждан скрыта багборда и партнерский
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс