Подбор в управляемой форме — что может быть проще?

Технологии модальности сейчас меняются на технологии асинхронности, многопоточности и прочие дивные вещи, что, в свою очередь, заставляет людей еще чаще спрашивать о том, что да как в этой новой нелегкой жизни. Разбираемся!

Добрый день, коллеги!

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

Навела меня на мысль рассказать об этом еще раз некая Анна, создавшая эту вот тему, в которой в очередной раз встречаю я богомерзкие слова "Результат = Форма.ОткрытьМодально()", а нервы то уже не те!!! )))

Итак, приступим к тому, чтобы внести ясность.

СУТЬ ЗАДАЧИ

Есть форма документа, есть справочник, данные из которого нужно поместить в таблицу формы документа (или в реквизит формы, или еще куда — тут это вопрос второй).

Некоторые "программисты" (ну да, назовем так), которые еще не вкусили прелестей нового мира и нового мирового порядка, все еще для подобных действий не находят ничего лучше, чем использовать старый и проверенный "Элементик = ОткрытьФормуМодально(ИмяФормы, …);", а кое-кто сначала форму получает в переменную и только потом открывает (как в том самом вопросе на форуме, с которого все началось). Ну не на олимпиаде он — за дополнительную переменную балл не снижают (зряплату не понижают).

СУТЬ ВЕЩЕЙ

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

Давайте ответим на главный вопрос статьи: "как организовать подбор в управляемой форме?" Для этого откроем форму с признаком "ЗакрыватьПриВыборе = ложь"  и "РежимВыбора = истина":

&НаКлиенте
Процедура Подбор(Команда)

ОткрытьФорму(
"Справочник.Справочник1.ФормаВыбора",
Новый Структура("ЗакрыватьПриВыборе, РежимВыбора",
Ложь, Истина),
ЭтаФорма
, , , ,
Новый ОписаниеОповещения(
"ПриЗакрытииФормыПодбора",
ЭтаФорма,
"Подбор"),
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца
);

КонецПроцедуры

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

Т.к. у нас параметр "ЗакрыватьПриВыборе" установлен в "ложь", то форма справочника при двойном клике или нажатии клавиши "Энтер" на элементе закрываться не будет. При этом т.к. параметр "РежимВыбора" установлен в "Истина", то каждый даблклик и "Энтер" будет генерировать событие "ОбработкаВыбора" во владельце. Таким образом, если у нас, например, каждый раз, когда выбирают элемент в форме выбора, должна добавиться строка табличной части, код дополнится вот такой процедурой:

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Объект.ТабличнаяЧасть1.Добавить().ФИО = ВыбранноеЗначение;
КонецПроцедуры

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

Код, приведенный выше, всего-то добавляет новую строку в табличную часть "ТабличнаяЧасть1" и устанавливает там в реквизит "ФИО" выбранный в форме подбора элемент справочника.

Для красочности картины давайте дополним код процедурой, обрабатывающей закрытие формы выбора:

&НаКлиенте
Процедура ПриЗакрытииФормыПодбора(Рез, Доп) Экспорт
Сообщить("Ура, форма подбора закрыта!");
КонецПроцедуры

В данном случае при закрытии формы владельца просто вывалится сообщение: "Ура, форма подбора закрыта!".

 

РАЗВИТИЕ НАСТУПЛЕНИЯ

Мы можем, конечно, вообще не использовать обработку выбора при выборе единичного значения. Для этого достаточно переписать открытие формы выбора таким образом, чтобы параметр "ЗакрыватьПриВыборе" устанавливался в "Истина". Но и обработку выбора значения нужно будет реализовать в асинхронной процедуре, указанной в описании оповещения:

&НаКлиенте
Процедура ПриЗакрытииФормыПодбора(Рез, Доп) Экспорт
// если ничего не выбрали, то в рез будет пусто...
Если НЕ Рез = Неопределено Тогда
Объект.ТабличнаяЧасть1.Добавить().ФИО = Рез;
КонецЕсли;
//Сообщить("Ура, форма подбора закрыта!");
КонецПроцедуры

//&НаКлиенте
//Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
// Объект.ТабличнаяЧасть1.Добавить().ФИО = ВыбранноеЗначение;
//КонецПроцедуры

В этом коде мы убрали процедуру обработки выбора, т.к. если бы мы ее оставили, то у нас создались бы две строки. Почему? Над этим вопросом рекомендую подумать факультативно (в качестве домашнего задания, если кто хочет).

Также в обработке асинхронного оповещения необходимо контролировать возвращенный результат. Если результат пустой, то это говорит о том, что форму просто закрыли, не выбрав никакого значения. Для этого в коде добавлена проверка на "Рез = Неопределено".

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


&НаКлиенте
Процедура ПриЗакрытииФормыПодбора(Рез, Доп) Экспорт
//если ничего не выбрали, то в рез будет пусто...
//Если НЕ Рез = Неопределено Тогда
// Объект.ТабличнаяЧасть1.Добавить().ФИО = Рез;
//КонецЕсли;
// снова "Уга, товагищи!"
Сообщить("Ура, форма подбора закрыта!");
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)

ПоказатьВводЧисла(
Новый ОписаниеОповещения("ПриВводеЧисла",
ЭтаФорма,
ВыбранноеЗначение), , // вот тут у нас как раз появился доппараметр
"Введите количество ФИО",
10,
0
);

КонецПроцедуры

&НаКлиенте
Процедура ПриВводеЧисла(Рез, Доп) Экспорт

// найдем строки с этим "ФИО"
НайденныеСтроки = Объект.ТабличнаяЧасть1.НайтиСтроки(Новый Структура("ФИО", Доп));

// если не нащли - добавим
Если НайденныеСтроки.Количество() = 0 Тогда
Ст = Объект.ТабличнаяЧасть1.Добавить();
Ст.ФИО = Доп;
Ст.Колво = рез;
Иначе
// если нашли - увеличим колчество
НайденныеСтроки[0].Колво = НайденныеСтроки[0].Колво + рез;
КонецЕсли;

КонецПроцедуры

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

ЗАКЛЮЧЕНИЕ

В действительности у управляемых форм есть масса преимуществ перед формами обычными. И асинхронность — это еще не самый интересный механизм. Вот, например, статья о том, как передавать параметры отбора (фильтр) в форму выбора, чтобы показывать пользователю не весь справочник, а только нужную его часть (даже если эта часть определяется значением строки табличной части).

49 Comments

  1. nomadon

    Сначала задается планка где лишняя переменная — это плохо, а потом в, собственном коде, Рез и Доп. Отсюда вывод, даже несколько, но некоторые до конца не ясны:

    1. Если обгадил чужой код — самому можно плохокодить

    2. Чужой код гадь, а в свой не смотри

    3. Даже если знаешь что плохогодить нельзя, но ничего с этим сделать не можешь — посмотри в чужой код и скажи что там еще хуже

    Доброе утро;)

    Reply
  2. starik-2005

    (1) рез и доп — обязательные аргументы функции оповещения. Без них она работать не будет. Учим мат.часть.

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

    Reply
  3. Сурикат

    Имелось ввиду, что название переменных не отображает их суть.

    Неужели так сложно написать Результат, ДополнительныеПараметры?

    А если процедура получиться не маленькая в конце уже и можно запутаться в сокращениях…

    Reply
  4. TODD22

    Очень похоже на пример из книги Радченко «Практическое пособие разработчика» из главы «Организация подборов» или нет?

    На экзамене на спеца «подбор» заставляют делать через ВременноеХранилище.

    Reply
  5. starik-2005

    (5) по-разному подбор организовать можно. Радченко? Кто это?

    Reply
  6. starik-2005

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

    Reply
  7. TODD22

    (6)https://its.1c.ru/db/pubdevguide

    по-разному подбор организовать можно.

    Для полноты картины можно было и подбор через ВХ привести…

    Reply
  8. nomadon

    (2) я не про наличие параметров в процедуре (кстати это процедура а не функция), а про смысловое наименование переменных

    Reply
  9. nomadon

    (7) моя придирка в общем впечатлении, если сами себе поднимаете планку — то приводить дурацкие ошибки в пример — глупо.

    Reply
  10. starik-2005

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

    Reply
  11. starik-2005

    (10) ошибки с именем переменной? Это не ошибки. Но да, горизонт завален)))

    Reply
  12. nomadon

    (12) если не считать нарушение стандартов разработки ошибкой то не ошибка)

    Reply
  13. nomadon

    (11) ну тогда можно вообще в нулях и единицах пример писать, функция процедуры тоже будет выполняться)

    Reply
  14. starik-2005

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

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

    Reply
  15. nomadon

    (15) а мы пишем код что бы кому было ясно?

    1. машине?

    2. тому кто писал это код?

    3. тому кто не писал этот код?

    Если учитывать последнее, то принимает решение о допустимости кода совсем не тот кто его писал а тот для кого.

    Reply
  16. pbazeliuk

    (5) На экзамене можно доказать свою позицию, но экзаменаторы могут иметь уровень ниже чем у программиста.

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

    Очень давно сдавал специалиста, и решил задачу контроля остатков с помощью «нового» метода проведения и опции «БлокироватьДляИзменения» 🙂 Почти влепили «-1» за решение пока не ткнул носом в литературу и новую на то время конфигурацию УТ 11.

    Reply
  17. webester

    (6)

    Радченко? Кто это?

    Вот и выросло молодое поколение… «программистов (ну да, назовем так)»(с)кто-то из (0)

    Reply
  18. TODD22

    (18)Речь была не столько о конкретном методе, сколько о том что не плохо было бы рассказать о нескольких методах.

    А на экзамене не всегда есть возможность что то доказывать, не все сдают очно и не у всех есть возможность из за экзамена ехать за 5000 км.

    Reply
  19. starik-2005

    (19) ага, когда мы писали машинный код в тетрадках по русскому языку, их еще и в проекте не было))) И Радченко тоже не было.

    Reply
  20. webester

    (21)Не было конечно,не радченко, ни чуства юмора, ничего не было. Зато ЧСВ было точно.

    Reply
  21. starik-2005

    (22)

    Зато ЧСВ было точно.

    Ну как без него-то, родимого. Это как без Радченко современным говнокодерам )))

    Reply
  22. webester

    (23)Это точно. 90% людей считают, что их способности выше средних. Хотя лурк утверждает, что 95% населения — идиоты. Вроде как нонсенс,но на самом деле, все логично.

    Reply
  23. starik-2005

    (24) ну с учетом того, что в спейсикс и тесла народу работает крайне мало, то ЛУРК сильно завысил цифру.

    Reply
  24. webester

    (25)Скорее занизил, судя по тому, что происходит вокруг.

    И я не знаю каков процент

    Сумасшедших на данный час,

    Но если верить глазам и ушам —

    Больше в несколько раз. (с)ИзвестноКто

    Reply
  25. TODD22

    (26)

    Скорее занизил, судя по тому, что происходит вокруг.

    ЧСВ разум затуманил… бывает….

    Reply
  26. starik-2005

    (26)

    Скорее занизил

    Занизил одно, завысил второе. Я о количестве умных говорил, а Вы о дураках )))

    Reply
  27. webester

    (27)ну я то себя отношу к тем 95% куда уж нам уж….

    (28)кхм )))

    Reply
  28. starik-2005

    (29)

    куда уж нам уж

    Я, лично, всегда за левелап. Но, как говорил мудрец, что можно привести верблюда к воде, но заставить его пить не получится. Хочет — будет пить, не хочет — не будет.

    Вот, кстати, придумал хорошую задачку для собеседования: есть куб или квадрат с ребром/стороной Х. Какая длина стороны/ребра будет у куба/квадрата с объемом/площадью, в два раза меньше исходного. Сильно сложная? )))

    Reply
  29. webester

    (30)Я пробую. Но вроде как уже напился. Не знаю может влезет еще немного.

    >>Сильно сложная.

    Что вы хотите выяснить этой задачей? Я тоже ищу, что бы спросить у кандидата в программисты, если он не умеет ничего. От слова вообще.

    Reply
  30. KapasMordorov

    (30)

    Он над нами издевался. Ну сумасшедший, что возьмешь!
    Reply
  31. Labotamy

    А это точно статья из 2017 года? =)

    Reply
  32. nomadon

    (33) нет конечно..

    Пока действие происходит в одном месте весь фокус происходит в другом,

    Статья про то что нужно все-таки не забывать про пользователей и делать им подбор, тем более это просто, а в комментах батл в стиле мисты)

    Reply
  33. Rustig

    (0)

    1) в УТ 10.3, в КА 1.1, которые на обычных формах, до сих пор используется форма подбора, и весь механизм, описанный в данной статье, используется в данной форме подбора. Что было на обычных формах, перешло в управляемые. Ничего нового. 🙂

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

    2) У самой популярной методички по изучению 1с от автора Радченко методы организации подбора освещаются в отдельной главе книги.

    3) В чем смысл статьи — я не понимаю.

    Всякий раз в статьях посвященных управляемым формам замечаю одну и ту же тенденцию — «сложность» — как будто все прекрасное должно быть сложным — уберите из статьи слова «многопоточность», «асинхронность» , «НаКлиенте» — и идея подбора станет чуточку понятнее. 🙂

    Reply
  34. starik-2005

    (35)

    Всякий раз в статьях посвященных управляемым формам замечаю одну и ту же тенденцию — «сложность»

    Статья как раз и говорит о том, что никакой сложности нет. В этом основная ее цель. А причина, по которой она появилась, в статье описана.

    Reply
  35. Jestery
    Если НЕ Рез = Неопределено Тогда

    Сорри за возможно очевидный вопрос, я новичок. А почему не написать

    Рез <> Неопределено?

    Reply
  36. starik-2005

    (37)

    А почему не написать

    А вломы переключать раскладку.

    Reply
  37. strange2007

    (37) Потому что начинающие программисты всегда гнут пальцы знаниями «крутых» языков. Вот когда автор поймёт, что программирование в бизнесе, это работа с объектами этого самого бизнеса, а не методами сортировки пузырьком, тогда будет писать код грамотный и может даже профессиональный.

    Каюсь, 20 лет назад я тоже считал единственным настоящим языком программирования ассемблер.

    Reply
  38. starik-2005

    (39)

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

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

    Reply
  39. strange2007

    (40) Хм, спорное утверждение. Во многих российских компаниях используется семёрка, а в западных компаниях даже попадаются системы, работающие на алгоритмах, написанных в прошлом тысячелетии. При этом большинство из этих примеров — успешные зарабатывания денег и программисты в этих компаниях зачастую в совершенстве владеют всякими современными средствами разработки!

    Reply
  40. strange2007

    (40) Всё. Нигде не нашёл в рекомендациях по программированию на 1С хоть какое-то упоминание про запутывание читаемости. И вообще, трудночитаемый код применяется только в некоторых случаях. Например, при создании защищённых модулей или для попытки зарабатывания дополнительных денег с невезучего клиента. В других случаях «трудный» код только вредит и значит гордое «А вломы переключать раскладку.» является показателем не совсем высокого профессионализма.

    Reply
  41. starik-2005

    (42) Вы даже не представляете, на сколько смешным может быть Ваш комментарий. Но точно могу сказать одно — комплексы вполне себе лечатся. Обратитесь к специалисту, ибо кроме как нарушением психики мне сложно объяснить проидирки к логическому оператору НЕ или к сокращению наименования переменных. Но, повторюсь, это лечится, при том весьма успешно.

    Reply
  42. strange2007

    (43) В единичном случае всё прекрасно понятно и без разницы как написано. А вот когда блок большой и его трудно анализировать, то такие мелочи вносят ещё большую сумятицу. Что часто приводит к мысли (часто тоже непрофессиональной) — «да я лучше тут всё перепишу». Именно поэтому код должен быть правильным во всём, в т.ч. и в мелочах.

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

    Примечание: придирка не к конкретно сокращению переменных, а именно к ошибочному понимаю по поводу культуры программирования.

    Reply
  43. starik-2005

    (44)

    Именно поэтому код должен быть правильным во всём, в т.ч. и в мелочах.

    С этим утверждением легко спорить исходя из тезиса, что лучше работающий прототип, чем теоретическая идеальная модель. Но я рад, что разговор вернулся в зону конструктива — это прогресс.

    (44)

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

    Подобный аргумент говорит о том, что Вы не особо разбираетесь в проблемматике. Фактически С++ и Asm (сейчас в крайних случаях) используются для достижения скорости, а скорость — это плоский код, с низким уровнем абстракции и высокой плотностью полезной нагрузки. К понятному же коду стремятся за счет повышения уровня абстракции, декларативности, замыканий. Но все эти механизмы понятны тем, кто в курсе, как они работают, начинающим же кодерам данный уровень заведомо недоступен и вызывает шок.

    (44)

    Примечание: придирка не к конкретно сокращению переменных, а именно к ошибочному понимаю по поводу культуры программирования.

    Я так начал писать после того, как увидел однажды в коде подобную конструкцию (типа «Если НЕ а = 5»), а для меня логика, как совокупность булевых преобразований, проста и понятна, какой бы уровень вложенности условий бы ни был. Да, вложенность условий (та же логическая инверсия НЕ) повышает цикломатическую сложность кода, но в одном условии на «НЕ (РАВНО)» эта сложность повышается на единицу всего, что в рамках даже функции величина несущественная.

    Reply
  44. strange2007

    (45)

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

    Очень сильно не соглашусь. И в СССР и в Западном мире давно уже доказано, что для человека максимальное количество анализируемых сущностей от 5 до 8. Всё что больше, это резкое повышение вероятных ошибок и как следствие, ухудшение во всём. Именно поэтому при декомпозиции любого процесса принято за один раз анализировать только 5-8 сущностей. В том числе это применимо и при анализе кода.

    Проще говоря, когда всего одна строка кода, всё понятно и красиво. Но как только получаем большой модуль, состоящий из кучи противоречивых и/или непонятных кусков, то упираемся в стену «КАРАУЛ!». Кому это выгодно? Как писал выше, только тем, кто не хочет что бы его код читали или тем, кто зарабатывает таким образом.

    И да, хорошая работа — оплачиваемая работа. Ну а ковыряние даже в своём коде с важным лицом, мало кому нравится.

    Скажем так — если Ваши утверждения верны и имеют право жить, тогда большинство поддержит данные тезисы и, уверяю, 1С-вцы издадут целую главу рекомендаций, на тему как надо сокращать переменные. Ну а пока этого нет….

    А про культуру программирования на ассемблере тоже много всего написано. Например, общепринятое обнуление регистра (против майкрософтовского).

    Reply
  45. starik-2005

    (46)

    А про культуру программирования на ассемблере тоже много всего написано. Например, общепринятое обнуление регистра (против майкрософтовского).

    А которого регистра не подскажите? В Ассемблере x86 этих регистров до чертиков, при том регистр указателя стека, регистр указателя команды, регистры сегментов и некоторые другие регистры обнулять — это в принципе нонсенс. А SUB (E/X)AX,(E/X)AX или XOR (E/X)AX,(E/X)AX, как обнуление аккумулятора в соответствующей архитектуре (Х — 64 бита, Е — 32 бита, без них — 16 бит) — это все-же потребность, а не «культура».

    Ну и уж если просто на Вашем уровне придираться к последнему Вашему сообщению, то вот знаками препинания вы, увы, пользоваться не умеете, а тексты читают куда большее количество людей, чем код. Удачи Вам и добра )))

    Reply
  46. strange2007

    (47) Да, это позор, когда делаешь элементарные ошибки в переписках и я этого стыжусь, а не горжусь этим)))

    Reply
  47. starik-2005

    (48)

    и я этого стыжусь

    Ну так учитесь не делать их, ведь процитированная мной часть Вашего сообщения — это второе простое предложение, связанное с первым союзом «и», перед которым, как всем известно (не, ну правда всем, ибо оное в школе проходят), ставится запятая.

    Reply
  48. spacecraft

    (46)

    1С-вцы издадут целую главу рекомендаций, на тему как надо сокращать переменные. Ну а пока этого нет….

    Вообще-то есть. Давно. Может не в полной мере, но все же.

    https://its.1c.ru/db/v8std#content:-2145783193:hdoc

    Reply
  49. acanta

    По аллегории Лукьяненко Иные — это аутисты, которые объединились и нашли себя в нашем мире, а сумрак — депрессия/неспособность вести себя как все. Короче, всем выйти из сумрака.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *