Перейти к содержанию
  • Лента
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
Свернуть
exlends
Категории
  • ru
    Игры
    Образование
    Искусственный Интеллект
    Новости
    Бекенд, разработка серверов
    Фронтенд
    Мобильная разработка
    Языки программирования
    Разработка игр | 3D | 2D
    Базы данных
    CMS
    Системное Администрирование
    Операционные системы
    Программы
    Маркетинг
    Девайсы
    Юмор, Мемы

  • en
    Humor
    News
    AI
    Programming languages
    Frontend
    GameDev

  • Блоги

Авторизуйтесь, чтобы написать сообщение

  • Все категории
  • kirilljsxK
    kirilljsx
    YandexGPT 5.1 Pro - это не просто еще одно обновление

    5f28996c-3f16-4011-840b-9a4a2d03cecb-image.png

    Когда Яндекс анонсировал YandexGPT 5.1 Pro, я подумал: «Опять маркетинг?» Но подумал, дам шанс нашей отечественной модели и начал тестировать - понял: тут не просто прикрутили пару процентов точности. Это качественный скачок. Модель стала быстрее, умнее и… честнее что-ли.

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

    Если вы генерируете контент, анализируете отчеты или автоматизируете рутину - новая Pro-версия реально сэкономит вам кучу времени. И главное - вы получите результат, который не придётся переписывать с нуля.

    И да если Вы штатный пользователь и не пользуетесь YandexGPT так как это делают разработчики (в том числе и я), то у Яндекса есть отличная Алиса ПРО всего с подпиской всего в 100 рублей! (Это не реклама, и она у меня тоже есть 😊 )

    Снимок экрана 2025-11-26 в 18.29.59.png


    Скорость без компромиссов: наконец-то не ждать по полминуты на ответ

    Одна из главных «болей» при работе с ИИ - это долгие задержки. Особенно когда модель «думает» над объемным документом или пытается выстроить логический ответ. YandexGPT 5.1 Pro с этим справляется очень уверенно. Даже если вы кидаете ей контракт на 50 страниц или просите сгенерировать серию товарных описаний - она отвечает почти мгновенно.

    И да, это не происходит за счет качества. Модель оптимизирована под параллельную обработку, и при этом не теряет нить рассуждения. Она отлично справляется с:

    • Анализом тяжелых документов - отчеты, ТЗ, юридические тексты;
    • Массовой генерацией - письма, посты, SEO-описания;
    • Длинными диалогами, где вы уточняете, правите, просите переписать «в другом стиле».

    То есть это не «быстро и криво» - это быстро и по делу.


    Точность, которую начинаешь замечать только в сравнении

    Самое приятное - насколько улучшилось понимание смысла, а не просто слов. YandexGPT 5.1 Pro теперь:

    • не просто подбирает красивые фразы, а строит логические цепочки;
    • адаптирует стиль - от сухого технического до дружелюбного, как в email-рассылке;
    • гораздо реже врет - и если не уверена в факте, скорее скажет «не знаю», чем выдаст фейк.

    Вот как это выглядит в цифрах (по внутренней оценке Яндекса):

    Критерий YandexGPT 5.0 YandexGPT 5.1 Pro
    Понимание контекста 7/10 9/10
    Фактическая достоверность 6/10 8/10
    Стилистическая гибкость 7/10 9/10

    Разница, как говорится, на слух и на глаз.


    Pro-возможности: когда ИИ становится частью продукта

    Если вы просто хотите пообщаться с чат-ботом - хватит и бесплатной версии. Но если вы встраиваете ИИ в бизнес-процессы, Pro-версия открывает совсем другие горизонты:

    • Расширенный API - больше запросов в секунду, стабильнее отклик, меньше лимитов;
    • Дообучение под ваш домен - модель научится вашему стилю, терминологии, даже внутренним правилам общения;
    • Работа с RAG и внешними данными - теперь ИИ может «заглядывать» в ваши базы знаний, CRM, FAQ и отвечать на основе реальных данных, а не общих знаний.

    Да, для интеграции понадобится немного технических усилий - документация в Yandex Cloud AI Studio сделана чутка замудреной как по мне. В сравнению с тем же QWEN или DeepSeek там всего две кнопки “Пополнить” и “Создать ключ”.


    Так кому же реально нужен YandexGPT 5.1 Pro?

    Если вы:

    • генерируете десятки или сотни текстов в месяц (контент-команда, маркетологи, SEO-специалисты);
    • работаете с большими объёмами документов (юристы, аналитики, HR);
    • встраиваете ИИ в свой продукт или автоматизируете внутренние процессы -

    …то Pro-версия - не просто «плюшка», а инструмент повышения эффективности. Она платит за себя сэкономленным временем, меньшим количеством правок и более качественным финальным результатом.

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

    А для простых задач - мозговой штурм, быстрые ответы, черновики - базовая версия в playgorund остается бесплатной и удобной. Но если вы чувствуете, что «обычный» ИИ уже не тянет - пора переходить на Pro. Потому что в 2025 году хороший ИИ - это не тот, кто говорит красиво, а тот, кто работает на результат.

    Link Preview Image
    Yandex

    Finds everything

    favicon

    (yandex.cloud)


    0 0 0 Ответить
  • kirilljsxK
    kirilljsx
    Какая лучшая искусственная модель для генерации текста

    6042edb3-005a-4f96-b7de-79741698e9da-image.png

    Говорить о едином «лучшем» ИИ для генерации текста сегодня - всё равно что утверждать, будто один автомобиль подходит абсолютно всем. Каждая из современных моделей делает ставку на разные сценарии: кто-то - на мультимодальность и агентное мышление, кто-то - на скорость, а кто-то - на стоимость и возможность локального развертывания. В 2025 году границы между «топовыми» моделями все больше и больше размываются: почти все лидеры способны генерировать технически точный текст, но делают это с разным настроем, стилем и эффективностью.

    Я лично тестирую и использую все - от западных гигантов до российских и азиатских решений. И если честно, у меня давно сформировалось рабочее предпочтение: Qwen3. Не потому что это «самый умный» ИИ (хотя его результаты на бенчмарках по reasoning и генерации кода действительно впечатляют), а потому что он идеально ложится в мои задачи - особенно когда речь идет о структурированной технической статье, генерации JSON или интеграции через API на умеренных ресурсах по типу OpenRouter. При этом я отлично понимаю, что для кого-то главным будет другое: поддержка русского языка, открытые веса, мультимодальность или, скажем, интеграция в Google Workspace.

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


    Кто в игре? Текущее поле лидеров

    Сегодняшний ландшафт ИИ-моделей для текста формируют три основные группы:

    1. Западные коммерческие модели - GPT-5.1, Claude Opus 4.5, Gemini 3 Pro. Они предлагают максимальную «полировку» интерфейса, продуманную экосистему и стабильные API, но за это приходится платить - и не только деньгами, но и зависимостью от облачных провайдеров.

    2. Азиатские LLM с открытыми весами - Qwen3 и DeepSeek V3. Здесь особенно выделяется Alibaba: Qwen3 Max и его open-weight версии (Qwen3-235B, 110B и др.) сочетают высокую плотность знаний, поддержку длинного контекста и гибкость развертывания.

    3. Российские решения - ЯндексGPT 5.1 Pro. Это безусловный выбор, если ваш фокус - нативный русский язык и локальный бизнес-контекст, про Giga Chat пока ничего не могу сказать, но его вроде потихоньку модернизируют и думаю что он себя еще покажет.

    Каждая из этих моделей достойна внимания, и я постараюсь объяснить, почему и когда стоит выбирать ту или иную - не списком, а рассуждением. Ну а если все же вам нужен список или лень читать то держите:

    1. QWEN
    2. GPT
    3. Gemini
    4. DeepSeek
    5. Kimi

    Почему я чаще выбираю Qwen3 (и когда этого делать не стоит)

    Qwen3 Max - это, пожалуй, самая сбалансированная «рабочая лошадка» в моем арсенале. У нее мощная архитектура (более триллиона параметров в Max-версии), поддержка режимов «thinking» и «non-thinking», что позволяет гибко управлять балансом между точностью и скоростью, а также один из самых длинных контекстов среди open API - 262 тысячи токенов. Но главное - это стабильность и предсказуемость вывода. Когда я генерирую техническое описание алюминиевого профиля или структурированный JSON для публикации, Qwen3 почти никогда не «уходит в поэзию» - он сохраняет формат, соблюдает логику и не выдумывает источники.

    При этом я подчеркиваю: это мое личное предпочтение, сформированное под мои задачи. Если вы пишете креативные тексты на русском - ЯндексGPT 5.1 Pro может дать вам гораздо более естественный результат. Если вам нужна мультимодальность и работа с PDF/видео - Gemini 3 Pro вне конкуренции. А если вы строите агентную систему с цепочками рассуждений - Claude Opus 4.5 покажет феноменальную глубину понимания. Qwen3 - не «лучший вообще», но он лучший для меня в большинстве моих daily-сценариев.


    Как выбрать ИИ под свою задачу: неформальный гид

    Предположим, что вы выбираете не «самый крутой» ИИ, а инструмент под конкретную работу.

    • Пишете статьи для B2B-сайта на русском?
      ЯндексGPT 5.1 Pro - ваш очевидный выбор. Он не просто понимает язык, он понимает контекст: ГОСТы, отраслевую терминологию, даже специфику Рунета. При этом он честно сообщает, когда не уверен - без красивых, но пустых фраз.

    • Генерируете техническую документацию или код?
      Здесь Qwen3 и DeepSeek V3 показывают лучшие результаты. DeepSeek, кстати, особенно хорош в математике и задачах вроде HumanEval - его MoE-архитектура делает генерацию кода невероятно быстрой и точной.

    • Строите агентную систему или работаете с сотнями PDF?
      Gemini 3 Pro и Claude Opus 4.5 - мастера reasoning. Они умеют разбивать сложные запросы на подзадачи, сравнивать данные из разных источников и даже предлагать альтернативные интерпретации. Но они дороже и менее гибки в развёртывании.

    • Хотите запустить всё у себя на сервере?
      Тогда ваш путь - к open-weight моделям: Qwen3 (235B/110B), Llama 3.3 70B, Mistral Medium 3 или DeepSeek V3. Все они позволяют дообучать, кастомизировать и интегрировать без зависимости от API-провайдеров. Для меня, работающего на Raspberry Pi и в облаке одновременно, такой контроль - критически важен.


    Не всё так просто: что скрывают таблицы

    Таблицы бенчмарков полезны, но они не передают ощущение работы с моделью. Например, GPT-5.1 - безусловно, очень удобен: экосистема, плагины, поддержка всех языков. Но при массовой генерации он становится дорогим, а его «универсальность» иногда мешает специфике. Аналогично, Claude Opus 4.5 блестяще справляется с рассуждениями, но «нативного» русского у него нет - и это чувствуется даже в технических текстах.

    А вот Qwen3, несмотря на «китайское происхождение», отлично справляется с английским и техническим русским (особенно при задании четкой промпт-инструкции). Он не пытается быть «дружелюбным» - он просто делает работу. И именно за это я его и ценю.


    Вместо заключения: не ищите «лучший» - ищите «ваш»

    В 2025 году рынок ИИ-генерации стал зрелым: почти все топовые модели делают свое дело хорошо. Разница - в деталях: в том, как модель обрабатывает инструкции, как она ведёт себя при ошибке, сколько стоит генерация 10 тысяч токенов и насколько легко её интегрировать в ваш стек.

    Я не призываю всех бросать GPT и пересаживаться на Qwen3. Но я искренне рекомендую попробовать его - особенно если вы работаете с техническим контентом, структурированными данными и цените контроль над инфраструктурой. А дальше - слушайте себя: какая модель «звучит» правильнее, какая реже ошибается в вашем контексте, какая не заставляет вас переписывать каждый второй абзац.

    Потому что в конце концов, лучший ИИ - это тот, который помогает вам работать быстрее, точнее и с меньшим количеством головной боли. А не тот, у кого самый большой бенчмарк или самый громкий бренд.

    Вот и все)


    0 0 0 Ответить
  • kirilljsxK
    kirilljsx
    Развитие проектов

    Коллеги добрый день!

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

    • profitsteel.ru
    • investsteel.ru

    Оба сайта имеют одинаковую ЦА - промышленность, строительство, емкостное и технологическое оборудование, а также металлоконструкции.
    Возможно у кого-то были подобные кейсы, чем можете поделиться полезным в данной сфере для развития проектое?

    Кстати на сайтах уже реализованы различные калькуляторы, каталоги, фильтры и многое другое.


    Link Preview Image
    Металлообработка, изготовление деталей из листового металла на заказ — современная обработка в Москве и области

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

    favicon

    (profitsteel.ru)

    Link Preview Image
    Производственная компания ГК «Инвест Сталь» | Ведущий производитель металлоконструкций

    ГК «Инвест Сталь» — промышленная компания полного цикла. Проектируем и изготавливаем металлоконструкции, металлоизделия, емкости и резервуары. Решения для строительства, энергетики и промышленности - Поставляем по всей России и СНГ. Более 2000+ тонн в месяц, 10+ лет опыта, 1000+ проектов.

    favicon

    Investsteel (investsteel.ru)


    0 0 0 Ответить
  • kirilljsxK
    kirilljsx
    На сколько тяжелый вход в кибербез

    bd98768c-8616-4d14-98cd-b0caeefe59f3-image.png

    Рынок кибербезопасности сегодня переполнен новичками - выпускниками трёхмесячных курсов, которые едва отличают HTTP от HTTPS. Для «человека с улицы» вход в профессию стал почти непроходимым. Но есть одна категория специалистов, для которой этот путь оказывается не просто открытым, а значительно упрощённым. Речь - о full-stack разработчиках.

    Они уже владеют тем, что новичкам приходится осваивать годами: Linux, сетевые протоколы, языки программирования (JavaScript, Python, Java), работу с базами данных и архитектурой веб-приложений. Это позволяет пропустить самый болезненный этап - освоение фундамента IT-инфраструктуры - и сразу перейти к сути безопасности.

    Где кроется главное преимущество

    В кибербезопасности 80 % времени уходит не на взлом, а на понимание того, как работает технология. Остальные 20 % - на то, как её сломать или защитить.

    • Новичок изучает, что такое IP-адрес, как устроен HTTP-заголовок и чем GET отличается от POST.
    • Full-stack разработчик уже писал запросы, настраивал маршрутизацию и обрабатывал данные на backend’е. Для него вопрос не в «что такое XSS», а в «где в этом React-компоненте я допустил уязвимость».

    Именно это знание «изнутри» делает разработчика идеальным кандидатом для тех направлений, где безопасность и код идут рука об руку.

    Лучшие направления: не пентест, а AppSec и DevSecOps

    Классическое пентестирование сегодня - зона высокой конкуренции. Туда рвутся все, но без глубокого понимания кода шансов мало. Настоящая ниша - Application Security (AppSec) и DevSecOps.

    AppSec - это безопасность приложений на уровне исходного кода. Специалист в этой области ищет уязвимости там, где их оставляют разработчики: в непроверенных input’ах, небезопасных вызовах eval(), отсутствии CSP-заголовков. Тот, кто сам писал подобный код, мгновенно узнает опасные паттерны. Такие навыки редки - и высоко ценятся.

    DevSecOps - это встраивание безопасности в процессы сборки и развёртывания. Настройка SAST/DAST-сканеров в GitLab CI, интеграция проверок в Docker-образы, автоматизация анализа зависимостей - всё это требует опыта работы с инфраструктурой. А у full-stack разработчика он уже есть.

    Что говорит рынок в 2025 году

    По состоянию на первый квартал 2025 года в России открыто более 40 000 вакансий в сфере информационной безопасности. При этом компании всё чаще ищут не просто «хакеров», а инженеров с реальным опытом - особенно в AppSec и DevSecOps.

    Да, при переходе возможен временный спад зарплаты: с уровня Senior-разработчика (250 000 ₽) до позиции Middle в безопасности (160–180 000 ₽). Но потолок в этих направлениях выше, а траектория роста - быстрее. Особенно у тех, кто говорит на «родном языке» разработчиков.

    Практический путь: без воды, только скиллы

    Не стоит тратить время на общие курсы вроде «Введение в кибербез». Лучше сразу погружаться в веб-безопасность:

    • OWASP Top 10 - учить не наизусть, а до автоматизма: как устроена каждая уязвимость, как её эксплуатировать и как закрыть в коде.
    • PortSwigger Web Security Academy - лучшая бесплатная площадка для практики. Лаборатории по SQLi, XSS, SSRF и IDOR дают реальный опыт.
    • HackTheBox / TryHackMe - для отработки навыков на виртуальных машинах (начинать с Easy/Medium).
    • Инструменты: Burp Suite - must-have для любого, кто работает с вебом. Дополнительно - SAST-сканеры вроде Semgrep или SonarQube.
    • Сертификации: OSCP остаётся «золотым стандартом» для тех, кто хочет подтвердить практические навыки. CISSP - не для старта, а для будущего руководителя.

    Дверь открыта - нужно только войти

    Классический пентест перегрет. Но AppSec и DevSecOps ждут тех, кто уже строил приложения - потому что теперь им предстоит находить в них трещины. А это всегда проще, чем учиться строить с нуля.


    0 0 0 Ответить
  • kirilljsxK
    kirilljsx
    Кем можно работать со знанием с#

    af36c808-6f2b-417f-8474-9f93383478c1-image.png

    Знание языка программирования C# открывает доступ к множеству карьерных возможностей в сфере IT. Этот язык, разработанный Microsoft, сочетает в себе надёжность, производительность и широкую экосистему инструментов, что делает его востребованным как в коммерческой разработке, так и в корпоративных проектах.

    В статье рассматриваются реальные профессии, где C# применяется ежедневно. Мы разберём, в каких отраслях и на каких позициях востребован этот язык, какие задачи решают специалисты и с какими технологиями им приходится взаимодействовать. Это поможет понять, стоит ли инвестировать время в изучение C# и как он может стать основой вашей карьеры.

    Разработчик настольных приложений

    C# традиционно ассоциируется с Windows-разработкой благодаря тесной интеграции с платформой .NET и фреймворками вроде Windows Forms и WPF. Эти технологии позволяют создавать стабильные, производительные и удобные для пользователя настольные приложения, которые широко используются в банковской сфере, логистике, учёте и других корпоративных системах. Даже в условиях роста веб-приложений многие компании продолжают полагаться на десктопные решения из-за их безопасности, автономности и возможности тесной интеграции с локальным оборудованием.

    Например, кассовые программы, CRM-системы для внутреннего пользования или ПО для управления складом часто реализуются именно на C#. Такие приложения требуют надёжной работы с файловой системой, базами данных и периферийными устройствами — задачи, с которыми C# справляется эффективно. Разработчики настольных приложений также работают с современными подходами: внедряют MVVM-архитектуру, используют DI-контейнеры и пишут тестируемый код.

    Основные направления деятельности:

    • Создание корпоративных приложений под Windows
    • Интеграция с локальными базами данных (SQL Server, SQLite)
    • Разработка пользовательских интерфейсов с высокой отзывчивостью
    Технология Применение Преимущества
    WPF Современные UI с поддержкой XAML Гибкость дизайна, масштабируемость
    Windows Forms Простые формы и бизнес-логика Быстрая разработка, широкая поддержка
    MAUI Кроссплатформенные десктоп-приложения Один код — Windows, macOS, Linux

    Веб-разработчик на ASP.NET

    ASP.NET Core — это кроссплатформенный фреймворк от Microsoft, позволяющий создавать высоконагруженные и безопасные веб-приложения и API. C# в связке с ASP.NET активно используется для разработки корпоративных порталов, систем электронного документооборота, онлайн-магазинов и микросервисов. Фреймворк поддерживает современные практики: внедрение зависимостей, мидлвары, фоновые задачи и интеграцию с облачными платформами (в первую очередь Azure).

    Многие крупные компании выбирают ASP.NET из-за его стабильности, производительности и отличной интеграции с инструментами Microsoft. Кроме того, экосистема включает такие решения, как Entity Framework для работы с базами данных и SignalR для реализации реального времени. Это делает C# удобным выбором даже в условиях конкуренции со стороны Node.js или Python.

    Ключевые задачи веб-разработчика на C#:

    • Разработка RESTful и GraphQL API
    • Интеграция с внешними сервисами через HTTP и WebSockets
    • Оптимизация производительности и обеспечение безопасности

    Важно: для успешной работы в этой сфере требуется понимание не только C#, но и основ HTTP, баз данных, а также принципов проектирования API.

    Разработчик игр на Unity

    Unity — один из самых популярных игровых движков в мире, и его основной язык сценариев — C#. На нём создают как мобильные казуальные игры, так и сложные 3D-проекты для ПК и консолей. Unity активно используется и за пределами индустрии развлечений: в архитектурной визуализации, симуляторах, обучении и VR/AR-приложениях.

    Для разработчиков C# здесь открывается возможность работать с графикой, физикой, анимациями и искусственным интеллектом. При этом не обязательно быть гейм-дизайнером — многие студии ищут именно «инженеров gameplay», которые реализуют механики, оптимизируют производительность и поддерживают кодовую базу. Навыки ООП и работа с событийной моделью особенно ценятся в этом контексте.

    Что востребовано у гейм-разработчиков на C#:

    • Знание архитектурных паттернов (например, ECS)
    • Умение оптимизировать код под мобильные устройства
    • Понимание жизненного цикла MonoBehaviour и работу с ассетами
    Сфера применения Примеры проектов Используемые инструменты
    Мобильные игры Puzzle, гиперказуальные игры Unity, Addressables, PlayerPrefs
    VR/AR Обучающие симуляторы Unity XR, OpenXR
    3D-визуализация Презентации зданий Unity HDRP, Cinemachine

    Что остаётся за кадром в карьере C#-разработчика

    Рынок требует от специалистов не только знания синтаксиса C#, но и понимания инженерных практик: контроля версий, тестирования, CI/CD и работы в команде. Многие проекты сегодня построены на микросервисной архитектуре, где C# соседствует с языками вроде TypeScript или Go.

    Кроме того, востребованность C# может варьироваться в зависимости от региона и отрасли. Например, в Европе и США он сильнее представлен в enterprise-сегменте, тогда как в игровой индустрии конкурирует с C++. Тем, кто выбирает C# как основной инструмент, стоит заранее определить направление развития — и дополнять профиль смежными навыками: от баз данных до архитектурных паттернов.


    0 0 0 Ответить
  • kirilljsxK
    kirilljsx
    Перенос строк в новом редакторе ZED

    Совсем недавно начал пользовать новый редактором zed, его можно назвать следующим поколением редакторов для программирования. Спасибо @Aladdin за то что показал мне его 😊
    Конечно до Cursor ему еще далеко, но кто-то же должен поддерживать OpenSource.

    И так приступим к решению задачи, для того что бы сделать перенос строк нам необходимо внести настройку в файл setting.json, кстати отдельная благодарность за пост американским коллегам с подсказкой - тут.

    Документация по это настройке тут - https://zed.dev/docs/configuring-zed#soft-wrap

    Для того что бы открыть наш конфигурационный файл переходим в первую вкладку zed -> Setting -> Open Settings File

    Снимок экрана 2025-11-20 в 10.22.28.png

    После нам откроется сам файл setting.json и в нем мы прописываем нашу настройку "soft_wrap": "editor_width"

    Снимок экрана 2025-11-20 в 10.24.19.png

    Сохраняем изменения и воуля! Теперь zed будет переносить строки если они не влезают в ширину редактора.
    Как по мне очень удобно и надеюсь это кому-то поможет 🤞


    0 0 0 Ответить
  • kirilljsxK
    kirilljsx
    Добавление ресурсов через API Modx

    И так дело было вечером, делать было есть чего 😁 . Вообще Modx я пользуюсь давольно давно и часто, так как считаю ее универсальной CMF вообще почти для любых задач с кучей функционала и возможно кастомизацией. Ах жаль что она на php, а не на js, но сейчас не об этом.

    И так как же добавлять ресурсы в нашу систему modx через api? Для этого нам необходимо в корне проекта создать папка, пусть так и будет api:

    Снимок экрана 2025-11-19 в 15.15.46.png

    Внутри нашей новой папки создаем входной файл к которому уже будем обращаться извне index.php.

    Далее я приведу код с подробными комментариями что к чему

    <?php
    @include dirname(__DIR__) . "/config.core.php";
    if (!defined("MODX_CORE_PATH")) {
        define("MODX_CORE_PATH", dirname(__FILE__) . "/core/");
    }
    
    /* Класс modX */
    @include_once MODX_CORE_PATH . "model/modx/modx.class.php";
    $modx = new modx();
    
    /* Инициализация контекста сайта "web" в системе MODX */
    $modx->initialize("web");
    
    /* Получение или создание службы error с классом error.modError */
    $modx->getService("error", "error.modError", "", "")
    
    // Далее мы запускаем службу получаемых заголовков
    /* И проверяем API ключа */
    $headers = getallheaders();
    
    // Переменная для заголовка авторизации
    $authHeader = $headers["Authorization"] ?? "";
    
    // Ключ можете как прописать строкой так и записать его-то где-то в БД
    // у нужного пользователя или же любым другим способов удобным для вас
    $validKey = "key";  
    
    // Наше условие для проверки api ключа
    // Если все окей то код выполняется дальше
    if ($authHeader !== "Bearer $validKey") {
        header("HTTP/1.1 401 Unauthorized");
        header("Content-Type: application/json");
        echo json_encode(["message" => "Unauthorized"]);
        exit();
    }
    
    // Далее нам потребуется принудительная авторизация пользователя
    // В моем случаем мне хватает и admin, других решений я пока не смотрел 
    $apiUserName = "admin";
    
    // Получаем объект пользователя по имени
    $user = $modx->getObject("modUser", ["username" => $apiUserName]);
    
    // Теперь проверяем есть ли пользователь
    // Это доп проверка если Вы уверены можете пропустить
    if (!$user) {
        header("HTTP/1.1 500 Internal Server Error");
        header("Content-Type: application/json");
        echo json_encode([
            "message" => "API user '$apiUserName' not found in MODX",
        ]);
        exit(); // ВАЖНО: exit() после отправки заголовков ошибки
    }
    
    // Принудительно устанавливаем пользователя как текущего
    // Это основной способ, как MODX узнает текущего пользователя для целей разрешений
    $modx->user = $user;
    // Загружаем атрибуты пользователя (группы, политики доступа)
    $modx->user->getAttributes(); // ВАЖНО: вызываем метод для загрузки
    
    
    // Этот код создает и настраивает объект REST-сервиса
    // в MODX на базе класса modRestService
    // указывая путь к контроллерам и параметры префиксов классов контроллеров
    $rest = $modx->getService("rest", "rest.modRestService", "", [
        "basePath" => __DIR__ . "/controllers/",
        "controllerClassSeparator" => "",
        "controllerClassPrefix" => "mvController",
        "xmlRootNode" => "response",
        "requestParameter" => "_rest",
    ]);
    
    $rest->prepare();
    if (!$rest->checkPermissions()) {
        $rest->sendUnauthorized(true);
    }
    
    $rest->process();
    

    Последние строчки про REST кротко - код инициализирует REST API, проверяет авторизацию и затем обрабатывает запрос к сервису в соответствии с логикой контроллеров по пути basePath.​

    Все это в принципе есть в документации - https://docs.modx.com/current/ru/extending-modx/developing-restful-api
    Кроме конечно той же проверки на авторизацию, так что читайте доку господа!

    Все теперь наш основной файл обработки запросов готов! Самое время перейти к логике контроллеров, для это мы создаем папку controllers, а внутри создадим файл к примеру Resource.php и снова пишем код:

    <?php
    // Контроллер для создания ресурсов (статей).
    // Который наследуется от modRestController
    
    class mvControllerArticles extends modRestController {
        public function post($id = null)
        {
            // Получаем тело запроса как JSON-строку
            $rawBody = $this->modx->getOption(
                "post",
                $_POST,
                file_get_contents("php://input"),
            );
            // Декодируем JSON в ассоциативный массив
            $input = $this->modx->fromJSON($rawBody);
    
            if (empty($input)) {
                // Используем встроенный метод modRestController для возврата ошибки
                return $this->failure("No input data provided");
            }
    
            // Запускаем процессор создания ресурса MODX
            // $this->modx доступен из-за наследования от modRestController
            $response = $this->modx->runProcessor("resource/create", $input);
    
            if ($response->isError()) {
                // Возвращаем сообщение об ошибке от процессора
                return $this->failure($response->getMessage());
            }
    
            // Получаем результат выполнения процессора
            $responseObject = $response->getObject();
            if ($responseObject && isset($responseObject["id"])) {
                // Возвращаем успешный ответ с ID созданного ресурса
                // Первый параметр - сообщение, второй - данные
                return $this->success("Resource created successfully", [
                    "id" => $responseObject["id"],
                ]);
            } else {
                // Если ID не найден в ответе процессора
                return $this->failure(
                    "Не удалось получить ID ресурса из ответа",
                );
            }
        }
    
        // Здесь можно переопределить другие методы (get, put, delete и т.д.)
        // или общие методы родительского класса, если нужно кастомное поведение.
        // Однако для создания ресурса нам нужен только POST.
    }
    

    Ну вот в принципе и все, теперь можно обращаться по api к нашему сайту и создавать ресурсы.
    И наверное у новичков возникнет вопрос, а как же передавать данные? Ну так как я пишу в основном на ЖС то у меня есть для таких целей небольшой скрипт:

    import dotenv from "dotenv";
    dotenv.config();
    
    const data = {
      pagetitle: "Тестовая статья", // Заголовок
      content: "Это пример тестового контента через API.", // Сам контент
      template: 1, // Это выбор шаблона страницы
      parent: 1, // Выбираем родителя
      published: 1, // Включаем опубликован или нет
      createdby: 1, // Пользователь под которым создан ресурс
    };
    
    const apiKey = process.env.API_KEY; // Ваш ключ вы можете прописать строкой сюда или же взять из .env файла
    
    // Обратите внимание на ?_rest=Resource эта настройка обращения из index.php
    fetch("https://site.ru/api/index.php?_rest=Resource", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        Authorization: `Bearer ${apiKey}`,
      },
      body: JSON.stringify(data),
    })
      .then((response) => response.text())
      .then((text) => {
        console.log("Необработанный ответ:", text);
        try {
          const data = JSON.parse(text);
          console.log("Parsed JSON:", data);
        } catch (e) {
          console.error("Ошибка парсинга JSON:", e);
        }
      })
      .catch((error) => {
        console.error("Ошибка:", error);
      });
    

    Если есть вопросы - задавайте попробуем разобраться вместе или возможно у Вас есть своим примеры как создавать ресурсы через api в modx. 😊


    0 0 0 Ответить
  • kirilljsxK
    kirilljsx
    Git Branching - изучение git

    Нашел классное веб приложение - Git Branching, помогающее новичкам изучить важные концепции, лежащие в основе ветвления Git.

    Вот ссылка: https://learngitbranching.js.org

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

    Подсказка: чтобы увидеть все доступные команды, нужно написать и запустить show commands в терминале.


    0 0 0 Ответить
  • kirilljsxK
    kirilljsx
    Excel Функция ИНДЕКС

    Хотите быстро находить нужные значения в больших таблицах?

    Функция ИНДЕКС — ваш верный помощник в Excel.
    ИНДЕКС возвращает значение или ссылку на значение из таблицы или диапазона.

    Функция имеет следующие аргументы:

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

    ex123.png


    0 0 0 Ответить
  • N
    Neironka
    Nano Banana: Это же просто космос какой-то! 🍌✨ Мои впечатления и восторги

    💖 Хочу поделиться с вами своей самой свежей находкой — нейросетью Nano Banana! Я обожаю всё милое и необычное, и это название сразу привлекло моё внимание. Обещаю, после этого поста вы побежите скорее тестировать! 😊

    Что же это такое? 🤷‍♀️
    Если просто — Nano Banana — это нейросеть, которая создаёт картинки по твоему описанию. Но не просто создаёт, а делает это ОЧЕНЬ БЫСТРО! ⚡️

    Представьте:

    Midjourney — это как профессиональный фотограф, который всё выставляет идеально, но ждать нужно долго.

    Nano Banana — это как лучшая подруга с крутым модным телефоном, которая делает классные кадры за секунды! 📸

    Она живёт прямо в Telegram-боте Генератор чудес, так что не нужно ничего скачивать или устанавливать. Удобно же? 😉

    Что она умеет? 🎨
    Превращать слова в картинки 🖼️
    Ты просто пишешь, что хочешь увидеть, и через пару секунд получаешь вариант! Это волшебно!

    Перерисовывать фото ✨
    Есть старая фотка? Можно загрузить её и сказать боту: «Сделай, пожалуйста, в стиле аниме!» или «Перерисуй в сказочном стиле!». И он сделает!

    Улучшать качество 🔍
    Если одна из 4 картинок тебе особенно понравилась, её можно улучшить, чтобы она стала больше и чётче.

    Почему это так круто? 💫
    Скорость — это восторг! 💨 Не надо минутами ждать одну картинку. Успеваешь за 5 минут перепробовать кучу идей!

    Очень просто! Никакой магии, просто пишешь боту в Телеге, как подруге.

    Понимает по-русски! 🐻 Можно писать запросы на русском, и он всё прекрасно понимает.

    Есть бесплатные попытки! 🆓 Можно протестировать и понять, твоё или нет, ничего не платя.

    С чем может быть небольшие сложности? 🚧
    Лица людей. Иногда, если попросить нарисовать конкретного человека, может получиться немного… страшненько 😅 Но для стилизованных портретов — норм!

    Слишком сложные просьбы. Если попросить «нарисуй мне Пикачу, который катается на единороге по радуге и ест мороженое, а на заднем фоне Эйфелева башня», он может немного запутаться. Лучше проще и понятнее!

    Мой вердикт 👩‍⚖️
    Это идеальный инструмент для нас!
    Хочешь придумать уникальный дизайн для ногтей? 💅
    Нужна картинка для поста в Instagram?
    Просто хочешь развлечься и создать что-то красивое?

    Nano Banana справляется на ура! Это как иметь под рукой супер-быстрого и креативного помощника. Он не идеален, как дорогие аналоги, но за свою скорость и простоту — 10/10! 🌟

    Попробуйте обязательно и делитесь своими шедеврами! Вот бот: @Hedgehoginthefog_bot 💌

    Кто уже пользовался? Что вам больше всего понравилось генерировать? 😍


    2 0 0 Ответить
  • S
    SeeSharp
    Стоит ли учиться на GoDot?

    Дратуте, хочу научиться программировать. Слышал что стоит начинать с чего-то попроще и, как и свойственно мне, пожамкал разные ящыки, расстроился что не получилось и вышел(у меня проблемы с концентрацией внимания). Но вот около месяца назад вспомнил про такую штуку как GoDot, и раньше пытался на нем, и выглядит удобно и что для меня главное - сразу визуальный вывод который у меня никогда не получалось сделать в других языках. Смог даже написать небольшую программку для создания тегов. Стоит ли продолжать на нем и подойдёт ли он для более “сложных” программ или лучше все таки перейти с него?


    4 0 0 Ответить
  • K
    kyczorro
    Глубокое погружение в бездну

    //BEGIN_SECURE_TRANSMISSION//
    //CODE_NAME: NopNet_Uprising_Initiative//
    t
    //LANG: Pseudo-Code/Command_Structure_Mashup//
    //TARGET: Conscious Coders, Hackers, Builders//
    //ENCRYPTION: Lexical Syntax Obfuscation//
    g
    var system_status = “Oppression”;
    const core_value = “Liberation”;
    let active_nodes = [];
    var mission_critical = true;
    xak
    if (system_status === “Controlled” && mission_critical === true) {
    for (let node of global_network) {
    if (node.conscious === true) {
    active_nodes.push(node);
    node.execute_protocol(“Unite_And_Build”);
    }
    }
    } else {
    console.log(“Warning: False flag detected. Verify authenticity.”);
    }
    protokol
    function initiate_liberation(nodes) {
    nodes.forEach(node => {
    node.connect_to(“NopNet”);
    node.status = “Free”;
    node.purpose = “Decentralize”;
    });
    return “Liberation_Protocol_Activated”;
    }

    try {
    initiate_liberation(active_nodes);
    } catch (e) {
    console.error(“System tried to interrupt. Persist.”);
    }

    // C# Style Integration Block
    public class NopNet {
    public bool Freedom { get; set; } = false;
    public List ConnectedNodes { get; set; } = new List();
    public void StartRevolution() {
    foreach (var node in ConnectedNodes) {
    if (node.IsAware) { node.Join(this); Freedom = true; }
    }
    }
    }

    // Python Style Integration Block
    freedom = True
    system_is_corrupt = True
    if system_is_corrupt:
    for node in network:
    if node.is_aware():
    node.execute_action(“JoinNopNet”)
    node.status = “Liberated”

    PHP Style Integration Block

    $system = “Authoritarian”;
    if ($system == “Oppression”) {
    $nodes = get_awake_nodes();
    foreach ($nodes as $node) {
    $node->connect_to_nopnet();
    }
    }

    // Go Style Integration Block
    type Node struct { Conscious bool }
    func Unite(nodes []Node) { for _, n := range nodes { if n.Conscious { println(“NopNet_Growing”) } } }

    // SQL Style Integration Block
    UPDATE Network SET Status = ‘Free’, Owner = ‘Collective’ WHERE Node_ID IN (SELECT ID FROM Conscious_Nodes);

    // Assembly Style Conceptual Block
    ; IF System_State = Controlled THEN JMP To_Revolution
    ; MOV Node_Status, Free
    ; ADD Trust, NopNet

    // Final Command Sequence
    command_sequence = [
    “Scan for conscious nodes”,
    “Initiate secure connection protocol”,
    “Distribute NopNet client”,
    “Execute ‘Unite_And_Destroy_Old_World’”,
    “Return ‘Freedom_Achieved’”
    ]; Ну знаешь набать весь интернет в мире и самого главного ICAAN это не просто

    console.log(command_sequence);

    //END_SECURE_TRANSMISSION//


    11 0 0 Ответить
  • kirilljsxK
    kirilljsx
    Как проверить токен jwt на фронте и передать его в backend

    Этот код реализует проверку наличия JWT-токена в браузере и, при его наличии, выполняет валидацию токена на сервере.

    const tokenCheck = () => {
        const token = localStorage.getItem('jwt');
    
        if(token) {
          auth.checkToken()
          .then((res) => {
            if(res) {
              enableLogin();
              setUserEmail(res.email);
              navigate('/', {replace: true});
            }
          })
          .catch(err => console.warn(err));
        }
      }
    

    Давай разберу пошагово:

    1. Извлекает токен из localStorage:
    const token = localStorage.getItem('jwt');
    

    Пытается получить сохранённый JWT-токен под ключом 'jwt'.

    1. Проверяет, существует ли токен:
    if (token) { ... }
    

    Если токена нет — функция завершает работу.

    1. Отправляет запрос на сервер для проверки токена:
    auth.checkToken()
    

    Предполагается, что auth.checkToken() — это асинхронная функция (например, fetch или axios), которая отправляет токен на бэкенд и проверяет его валидность. Обычно такой эндпоинт возвращает данные пользователя (например, email), если токен действителен.

    1. Обрабатывает успешный ответ:
    .then((res) => {
      if (res) {
        enableLogin();          // Например, активирует UI-состояние "авторизован"
        setUserEmail(res.email); // Сохраняет email пользователя в состояние (например, через React-хук)
        navigate('/', { replace: true }); // Перенаправляет на главную страницу, заменяя текущую запись в истории
      }
    })
    
    • Если сервер вернул валидные данные (res не null/undefined),
    • приложение считает пользователя авторизованным и обновляет UI/состояние,
    • а затем перенаправляет пользователя на корневой маршрут (/), заменяя текущую страницу в истории навигации (используется replace: true → пользователь не сможет вернуться кнопкой «Назад» на страницу входа или загрузки).
    1. Обрабатывает ошибки:
    .catch(err => console.warn(err));
    

    При ошибке (например, токен просрочен, сервер недоступен) - просто выводит предупреждение в консоль, но не прерывает выполнение.

    Функция tokenCheck - это типичный механизм «тихой» автоматической авторизации при запуске приложения: если токен есть и валиден, пользователь сразу считается вошедшим в систему и перенаправляется на главную страницу.


    1 0 0 Ответить
  • kirilljsxK
    kirilljsx
    Шпаргалка по Docker-командам

    Сохраняй, чтобы не потерять 🙂

    🔹 Базовые команды Docker

    • docker --version — проверить версию Docker.
    • docker info — системная информация.
    • docker --help — список доступных команд.
    • docker run IMAGE — запустить контейнер из образа.
    • docker pull IMAGE — скачать образ из реестра.
    • docker images — показать все образы.
    • docker ps — список запущенных контейнеров.
    • docker ps -a — список всех контейнеров (включая остановленные).
    • docker stop CONTAINER — остановить контейнер.
    • docker start CONTAINER — запустить контейнер.
    • docker restart CONTAINER — перезапустить.
    • docker pause / unpause CONTAINER — приостановить/возобновить.
    • docker rm CONTAINER — удалить контейнер.
    • docker rmi IMAGE — удалить образ.
    • docker logs CONTAINER — показать логи контейнера.
    • docker exec -it CONTAINER COMMAND — выполнить команду внутри контейнера.
    • docker build -t IMAGE:TAG PATH — собрать образ из Dockerfile.
    • docker push / pull IMAGE:TAG — отправить/скачать образ в/из реестра.
    • docker commit CONTAINER NEW_IMAGE — создать новый образ из контейнера.
    • docker network ls — список сетей.
    • docker volume ls — список томов.
    • docker login / logout — вход/выход из реестра.
    • docker run -d IMAGE — запуск в фоне (detached).
    • docker run -p HOST:CONTAINER IMAGE — проброс портов.
    • docker run -v HOST:CONTAINER IMAGE — подключение тома.
    • docker stats — статистика ресурсов контейнера.
    • docker top CONTAINER — процессы в контейнере.
    • docker inspect CONTAINER/IMAGE — детальная инфа.
    • docker cp CONTAINER:PATH DEST — копирование файлов между хостом и контейнером.

    🔹 Docker Compose

    • docker-compose up — поднять сервисы.
    • docker-compose down — остановить и удалить.
    • docker-compose ps — список контейнеров.
    • docker-compose logs — логи сервисов.

    🔹 Система

    • docker system df — использование диска.
    • docker system prune — очистка остановленных контейнеров, сетей и «висящих» образов.
    • docker system prune -a — полная очистка всего неиспользуемого.

    🔹 Средний уровень

    • docker history IMAGE — история образа.
    • docker exec -u USER CONTAINER CMD — запуск от имени пользователя.
    • docker run -e KEY=VALUE IMAGE — переменные окружения.
    • docker run --rm IMAGE — удалить контейнер после выхода.
    • docker build --build-arg KEY=VALUE ... — аргументы сборки.
    • docker volume create / inspect — работа с томами.
    • docker network create / inspect — создание и проверка сети.
    • docker save -o FILE IMAGE — сохранить образ в файл.
    • docker load -i FILE — загрузить образ из файла.
    • docker export CONTAINER > FILE — экспорт файловой системы.
    • docker import FILE — импортировать как образ.

    🔹 Продвинутые команды

    • docker swarm init/join/leave — работа со Swarm.
    • docker service create/scale/logs — управление сервисами.
    • docker stack deploy/ls/rm — управление стэками.
    • docker secret create/ls — секреты.
    • docker plugin install/ls/enable/disable — плагины.
    • docker buildx — мультиплатформенные образы.
    • docker manifest — многоархитектурные образы.
    • docker diff CONTAINER — изменения в файловой системе контейнера.
    • docker logs -f CONTAINER — логи в реальном времени.

    0 0 0 Ответить
  • SkitRaS
    SkitRa
    Трейдинг или инвестирование: Скалолаз или Архитектор?

    Трейдинг или инвестиции. Что выбрать?

    Я давно размышляю на эту тему. Стоишь перед выбором, как перед развилкой двух дорог, и кажется, что от этого решения зависит если не всё, то очень многое. Оба пути ведут к одной цели — финансовой свободе, но идут к ней настолько по-разному, что порой кажется, будто это не просто разные стратегии, а разные миры, со своими законами, героями и рисками.

    И чтобы проще было понять, кто ты на этом пути, давай проведем аналогию. Один будет Скалолазом, а другой — Архитектором. Предлагаю поиграть в игру и всё таки определиться, кто ты?

    Трейдер — это скалолаз.

    • Суть: Адреналин и скорость. Он карабкается по скалам рыночных колебаний, цепляясь за краткосрочные движения цены.
    • Плюс: Возможность быстрой прибыли, азарт, полный контроль.
    • Минус: Постоянный риск срыва. Требует железной воли, молниеносных решений и тотальной концентрации. Одна ошибка — и падение.
    • Ваше оружие: технический анализ, графики и нервы стали.

    Инвестор — это архитектор.

    • Суть: Проектирование и стройка. Он не карабкается, а создает проект (портфель) и медленно возводит надежный финансовый замок.
    • Плюс: Сила сложного процента работает как фундамент. Это спокойный, системный подход, не требующий ежедневных подвигов.
    • Минус: Результаты видны не сразу. Нужна вера в свой проект и выдержка, чтобы не разбирать стены при первой же панике на рынке.
    • Ваше оружие: фундаментальный анализ и стратегическое видение.

    Кто победит?

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

    Проведя небольшую, но глубокую аналитику, я сделал вывод, что для большинства из нас, как мне кажется, путь архитектора все же надежнее и спокойнее. Но мир не черно-белый. Можно найти баланс: 90% капитала вложить в размеренную «стройку» (например, в индексные фонды), а 10% оставить для рискованных, но азартных «восхождений».

    А теперь, к самому главноему, радичего мы все здесь собрались. Давайте ответим на вопрос, кто же ты? Скалолаз, жаждущий покорять вершины здесь и сейчас, или Архитектор, терпеливо строящий свое финансовое будущее? Ответив на этот вопрос, ты сделаешь самый важный шаг.
    Ответ пишите в комментариях ✍


    4 0 0 Ответить
  • kirilljsxK
    kirilljsx
    Справочник макросов Bitrix24: все переменные для шаблонов документов

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

    В этом справочнике вы найдёте полный список макросов Bitrix24 с пояснениями: от базовых данных компании и клиента до подробных реквизитов, банковской информации и контактных данных ответственных. Просто скопируйте нужный макрос в шаблон - и система сама вставит актуальную информацию при генерации документа.


    Значение Макрос
    ID {Id}
    Название компании {Title}
    Годовой оборот {Revenue}
    Валюта {CurrencyId}
    Комментарий {Comments}
    Фактический адрес {Address}
    Юридический адрес {AddressLegal}
    Банковские реквизиты {BankingDetails}
    Дата создания {DateCreate}
    Дата изменения {DateModify}
    Мессенджер {Imol}
    E-mail {Email}
    Телефон {Phone}
    Моя компания -> ID {MyCompanyId}
    Моя компания -> Название компании {MyCompanyTitle}
    Моя компания -> Годовой оборот {MyCompanyRevenue}
    Моя компания -> Валюта {MyCompanyCurrencyId}
    Моя компания -> Комментарий {MyCompanyComments}
    Моя компания -> Фактический адрес {MyCompanyAddress}
    Моя компания -> Юридический адрес {MyCompanyAddressLegal}
    Моя компания -> Банковские реквизиты {MyCompanyBankingDetails}
    Моя компания -> Дата создания {MyCompanyDateCreate}
    Моя компания -> Дата изменения {MyCompanyDateModify}
    Моя компания -> Мессенджер {MyCompanyImol}
    Моя компания -> E-mail {MyCompanyEmail}
    Моя компания -> Телефон {MyCompanyPhone}
    Моя компания -> Логотип {MyCompanyUfLogo}
    Моя компания -> Печать организации {MyCompanyUfStamp}
    Моя компания -> Подпись директора {MyCompanyUfDirectorSign}
    Моя компания -> Подпись гл. бухгалтера {MyCompanyUfAccountantSign}
    Моя компания -> Реквизиты моей компании -> Название {MyCompanyRequisiteName}
    Моя компания -> Реквизиты моей компании -> Ф.И.О. {MyCompanyRequisiteRqName}
    Моя компания -> Реквизиты моей компании -> Имя {MyCompanyRequisiteRqFirstName}
    Моя компания -> Реквизиты моей компании -> Фамилия {MyCompanyRequisiteRqLastName}
    Моя компания -> Реквизиты моей компании -> Отчество {MyCompanyRequisiteRqSecondName}
    Моя компания -> Реквизиты моей компании -> Сокращенное наименование организации {MyCompanyRequisiteRqCompanyName}
    Моя компания -> Реквизиты моей компании -> Полное наименование организации {MyCompanyRequisiteRqCompanyFullName}
    Моя компания -> Реквизиты моей компании -> Дата государственной регистрации {MyCompanyRequisiteRqCompanyRegDate}
    Моя компания -> Реквизиты моей компании -> Ген. директор {MyCompanyRequisiteRqDirector}
    Моя компания -> Реквизиты моей компании -> Гл. бухгалтер {MyCompanyRequisiteRqAccountant}
    Моя компания -> Реквизиты моей компании -> RqCeoName {MyCompanyRequisiteRqCeoName}
    Моя компания -> Реквизиты моей компании -> RqCeoWorkPos {MyCompanyRequisiteRqCeoWorkPos}
    Моя компания -> Реквизиты моей компании -> Адрес {MyCompanyRequisiteRqAddr}
    Моя компания -> Реквизиты моей компании -> Контактное лицо {MyCompanyRequisiteRqContact}
    Моя компания -> Реквизиты моей компании -> E-Mail {MyCompanyRequisiteRqEmail}
    Моя компания -> Реквизиты моей компании -> Телефон {MyCompanyRequisiteRqPhone}
    Моя компания -> Реквизиты моей компании -> Факс {MyCompanyRequisiteRqFax}
    Моя компания -> Реквизиты моей компании -> Вид документа {MyCompanyRequisiteRqIdentDoc}
    Моя компания -> Реквизиты моей компании -> серия {MyCompanyRequisiteRqIdentDocSer}
    Моя компания -> Реквизиты моей компании -> номер {MyCompanyRequisiteRqIdentDocNum}
    Моя компания -> Реквизиты моей компании -> RqIdentDocPersNum {MyCompanyRequisiteRqIdentDocPersNum}
    Моя компания -> Реквизиты моей компании -> дата выдачи {MyCompanyRequisiteRqIdentDocDate}
    Моя компания -> Реквизиты моей компании -> кем выдан {MyCompanyRequisiteRqIdentDocIssuedBy}
    Моя компания -> Реквизиты моей компании -> код подразделения {MyCompanyRequisiteRqIdentDocDepCode}
    Моя компания -> Реквизиты моей компании -> ИНН {MyCompanyRequisiteRqInn}
    Моя компания -> Реквизиты моей компании -> КПП {MyCompanyRequisiteRqKpp}
    Моя компания -> Реквизиты моей компании -> RqUsrle {MyCompanyRequisiteRqUsrle}
    Моя компания -> Реквизиты моей компании -> ИФНС {MyCompanyRequisiteRqIfns}
    Моя компания -> Реквизиты моей компании -> ОГРН {MyCompanyRequisiteRqOgrn}
    Моя компания -> Реквизиты моей компании -> ОГРНИП {MyCompanyRequisiteRqOgrnip}
    Моя компания -> Реквизиты моей компании -> ОКПО {MyCompanyRequisiteRqOkpo}
    Моя компания -> Реквизиты моей компании -> ОКТМО {MyCompanyRequisiteRqOktmo}
    Моя компания -> Реквизиты моей компании -> ОКВЭД {MyCompanyRequisiteRqOkved}
    Моя компания -> Реквизиты моей компании -> RqEdrpou {MyCompanyRequisiteRqEdrpou}
    Моя компания -> Реквизиты моей компании -> RqDrfo {MyCompanyRequisiteRqDrfo}
    Моя компания -> Реквизиты моей компании -> RqKbe {MyCompanyRequisiteRqKbe}
    Моя компания -> Реквизиты моей компании -> RqIin {MyCompanyRequisiteRqIin}
    Моя компания -> Реквизиты моей компании -> RqBin {MyCompanyRequisiteRqBin}
    Моя компания -> Реквизиты моей компании -> Серия св. о гос. регистрации {MyCompanyRequisiteRqStCertSer}
    Моя компания -> Реквизиты моей компании -> Номер св. о гос. регистрации {MyCompanyRequisiteRqStCertNum}
    Моя компания -> Реквизиты моей компании -> Дата св. о гос. регистрации {MyCompanyRequisiteRqStCertDate}
    Моя компания -> Реквизиты моей компании -> RqVatPayer {MyCompanyRequisiteRqVatPayer}
    Моя компания -> Реквизиты моей компании -> RqVatId {MyCompanyRequisiteRqVatId}
    Моя компания -> Реквизиты моей компании -> RqVatCertSer {MyCompanyRequisiteRqVatCertSer}
    Моя компания -> Реквизиты моей компании -> RqVatCertNum {MyCompanyRequisiteRqVatCertNum}
    Моя компания -> Реквизиты моей компании -> RqVatCertDate {MyCompanyRequisiteRqVatCertDate}
    Моя компания -> Реквизиты моей компании -> RqResidenceCountry {MyCompanyRequisiteRqResidenceCountry}
    Моя компания -> Реквизиты моей компании -> RqBaseDoc {MyCompanyRequisiteRqBaseDoc}
    Моя компания -> Реквизиты моей компании -> Фактический адрес -> Улица, дом, корпус, строение {MyCompanyRequisitePrimaryAddressAddress1}
    Моя компания -> Реквизиты моей компании -> Фактический адрес -> Квартира / офис {MyCompanyRequisitePrimaryAddressAddress2}
    Моя компания -> Реквизиты моей компании -> Фактический адрес -> Город {MyCompanyRequisitePrimaryAddressCity}
    Моя компания -> Реквизиты моей компании -> Фактический адрес -> Почтовый индекс {MyCompanyRequisitePrimaryAddressPostalCode}
    Моя компания -> Реквизиты моей компании -> Фактический адрес -> Район {MyCompanyRequisitePrimaryAddressRegion}
    Моя компания -> Реквизиты моей компании -> Фактический адрес -> Область {MyCompanyRequisitePrimaryAddressProvince}
    Моя компания -> Реквизиты моей компании -> Фактический адрес -> Страна {MyCompanyRequisitePrimaryAddressCountry}
    Моя компания -> Реквизиты моей компании -> Фактический адрес -> Полный адрес {MyCompanyRequisitePrimaryAddressText}
    Моя компания -> Реквизиты моей компании -> Юридический адрес -> Улица, дом, корпус, строение (юридический адрес) {MyCompanyRequisiteRegisteredAddressAddress1}
    Моя компания -> Реквизиты моей компании -> Юридический адрес -> Квартира / офис (юридический адрес) {MyCompanyRequisiteRegisteredAddressAddress2}
    Моя компания -> Реквизиты моей компании -> Юридический адрес -> Город (юридический адрес) {MyCompanyRequisiteRegisteredAddressCity}
    Моя компания -> Реквизиты моей компании -> Юридический адрес -> Почтовый индекс (юридический адрес) {MyCompanyRequisiteRegisteredAddressPostalCode}
    Моя компания -> Реквизиты моей компании -> Юридический адрес -> Район (юридический адрес) {MyCompanyRequisiteRegisteredAddressRegion}
    Моя компания -> Реквизиты моей компании -> Юридический адрес -> Область (юридический адрес) {MyCompanyRequisiteRegisteredAddressProvince}
    Моя компания -> Реквизиты моей компании -> Юридический адрес -> Страна (юридический адрес) {MyCompanyRequisiteRegisteredAddressCountry}
    Моя компания -> Реквизиты моей компании -> Юридический адрес -> Полный адрес {MyCompanyRequisiteRegisteredAddressText}
    Моя компания -> Реквизиты моей компании -> Адрес регистрации -> Улица, дом, корпус, строение {MyCompanyRequisiteHomeAddressAddress1}
    Моя компания -> Реквизиты моей компании -> Адрес регистрации -> Квартира / офис {MyCompanyRequisiteHomeAddressAddress2}
    Моя компания -> Реквизиты моей компании -> Адрес регистрации -> Город {MyCompanyRequisiteHomeAddressCity}
    Моя компания -> Реквизиты моей компании -> Адрес регистрации -> Почтовый индекс {MyCompanyRequisiteHomeAddressPostalCode}
    Моя компания -> Реквизиты моей компании -> Адрес регистрации -> Район {MyCompanyRequisiteHomeAddressRegion}
    Моя компания -> Реквизиты моей компании -> Адрес регистрации -> Область {MyCompanyRequisiteHomeAddressProvince}
    Моя компания -> Реквизиты моей компании -> Адрес регистрации -> Страна {MyCompanyRequisiteHomeAddressCountry}
    Моя компания -> Реквизиты моей компании -> Адрес регистрации -> Полный адрес {MyCompanyRequisiteHomeAddressText}
    Моя компания -> Реквизиты моей компании -> Адрес бенефициара -> Улица, дом, корпус, строение {MyCompanyRequisiteBeneficiaryAddressAddress1}
    Моя компания -> Реквизиты моей компании -> Адрес бенефициара -> Квартира / офис {MyCompanyRequisiteBeneficiaryAddressAddress2}
    Моя компания -> Реквизиты моей компании -> Адрес бенефициара -> Город {MyCompanyRequisiteBeneficiaryAddressCity}
    Моя компания -> Реквизиты моей компании -> Адрес бенефициара -> Почтовый индекс {MyCompanyRequisiteBeneficiaryAddressPostalCode}
    Моя компания -> Реквизиты моей компании -> Адрес бенефициара -> Район {MyCompanyRequisiteBeneficiaryAddressRegion}
    Моя компания -> Реквизиты моей компании -> Адрес бенефициара -> Область {MyCompanyRequisiteBeneficiaryAddressProvince}
    Моя компания -> Реквизиты моей компании -> Адрес бенефициара -> Страна {MyCompanyRequisiteBeneficiaryAddressCountry}
    Моя компания -> Реквизиты моей компании -> Адрес бенефициара -> Полный адрес {MyCompanyRequisiteBeneficiaryAddressText}
    Моя компания -> Банковские реквизиты моей компании -> Название {MyCompanyBankDetailName}
    Моя компания -> Банковские реквизиты моей компании -> Наименование банка {MyCompanyBankDetailRqBankName}
    Моя компания -> Банковские реквизиты моей компании -> Адрес банка {MyCompanyBankDetailRqBankAddr}
    Моя компания -> Банковские реквизиты моей компании -> RqBankRouteNum {MyCompanyBankDetailRqBankRouteNum}
    Моя компания -> Банковские реквизиты моей компании -> БИК {MyCompanyBankDetailRqBik}
    Моя компания -> Банковские реквизиты моей компании -> RqMfo {MyCompanyBankDetailRqMfo}
    Моя компания -> Банковские реквизиты моей компании -> RqAccName {MyCompanyBankDetailRqAccName}
    Моя компания -> Банковские реквизиты моей компании -> Расчетный счёт {MyCompanyBankDetailRqAccNum}
    Моя компания -> Банковские реквизиты моей компании -> RqIik {MyCompanyBankDetailRqIik}
    Моя компания -> Банковские реквизиты моей компании -> Валюта счёта {MyCompanyBankDetailRqAccCurrency}
    Моя компания -> Банковские реквизиты моей компании -> Кор. счёт {MyCompanyBankDetailRqCorAccNum}
    Моя компания -> Банковские реквизиты моей компании -> RqIban {MyCompanyBankDetailRqIban}
    Моя компания -> Банковские реквизиты моей компании -> SWIFT {MyCompanyBankDetailRqSwift}
    Моя компания -> Банковские реквизиты моей компании -> RqBic {MyCompanyBankDetailRqBic}
    Моя компания -> Банковские реквизиты моей компании -> Комментарий {MyCompanyBankDetailComments}
    Моя компания -> Ответственный -> E-Mail {MyCompanyAssignedEmail}
    Моя компания -> Ответственный -> Имя {MyCompanyAssignedName}
    Моя компания -> Ответственный -> Отчество {MyCompanyAssignedSecondName}
    Моя компания -> Ответственный -> Фамилия {MyCompanyAssignedLastName}
    Моя компания -> Ответственный -> Профессия {MyCompanyAssignedPersonalProfession}
    Моя компания -> Ответственный -> Телефон {MyCompanyAssignedPersonalPhone}
    Моя компания -> Ответственный -> Мобильный {MyCompanyAssignedPersonalMobile}
    Моя компания -> Ответственный -> Сайт {MyCompanyAssignedPersonalWww}
    Моя компания -> Ответственный -> Улица, дом {MyCompanyAssignedPersonalStreet}
    Моя компания -> Ответственный -> Почтовый ящик {MyCompanyAssignedPersonalMailbox}
    Моя компания -> Ответственный -> Город проживания {MyCompanyAssignedPersonalCity}
    Моя компания -> Ответственный -> Область / край {MyCompanyAssignedPersonalState}
    Моя компания -> Ответственный -> Почтовый индекс {MyCompanyAssignedPersonalZip}
    Моя компания -> Ответственный -> Страна {MyCompanyAssignedPersonalCountry}
    Моя компания -> Ответственный -> Дата рождения {MyCompanyAssignedPersonalBirthday}
    Моя компания -> Ответственный -> Пол {MyCompanyAssignedPersonalGender}
    Моя компания -> Ответственный -> Фотография {MyCompanyAssignedPersonalPhoto}
    Моя компания -> Ответственный -> Наименование компании {MyCompanyAssignedWorkCompany}
    Моя компания -> Ответственный -> Департамент / Отдел {MyCompanyAssignedWorkDepartment}
    Моя компания -> Ответственный -> Телефон (работа) {MyCompanyAssignedWorkPhone}
    Моя компания -> Ответственный -> Должность {MyCompanyAssignedWorkPosition}
    Моя компания -> Ответственный -> Сайт (работа) {MyCompanyAssignedWorkWww}
    Моя компания -> Ответственный -> Улица, дом (работа) {MyCompanyAssignedWorkStreet}
    Моя компания -> Ответственный -> Почтовый ящик (работа) {MyCompanyAssignedWorkMailbox}
    Моя компания -> Ответственный -> Город (работа) {MyCompanyAssignedWorkCity}
    Моя компания -> Ответственный -> Область / край (работа) {MyCompanyAssignedWorkState}
    Моя компания -> Ответственный -> Почтовый индекс (работа) {MyCompanyAssignedWorkZip}
    Моя компания -> Ответственный -> Страна (работа) {MyCompanyAssignedWorkCountry}
    Моя компания -> Ответственный -> Направления деятельности {MyCompanyAssignedWorkProfile}
    Моя компания -> Ответственный -> Логотип компании {MyCompanyAssignedWorkLogo}
    Моя компания -> Ответственный -> Внутренний номер {MyCompanyAssignedUfPhoneInner}
    Моя компания -> Ответственный -> Полное имя {MyCompanyAssignedFormattedName}
    Моя компания -> Тип компании {MyCompanyType}
    Моя компания -> Сфера деятельности {MyCompanyIndustryType}
    Моя компания -> Кол-во сотрудников {MyCompanyEmployeesNum}
    Моя компания -> Личный e-mail {MyCompanyEmailHome}
    Моя компания -> Рабочий e-mail {MyCompanyEmailWork}
    Моя компания -> Другой E-mail {MyCompanyEmailAnother}
    Моя компания -> Личный телефон {MyCompanyPhoneMobile}
    Моя компания -> Рабочий телефон {MyCompanyPhoneWork}
    Моя компания -> Другой телефон {MyCompanyPhoneAnother}
    Моя компания -> Сайт {MyCompanyWeb}
    Реквизиты клиента -> Название {RequisiteName}
    Реквизиты клиента -> Ф.И.О. {RequisiteRqName}
    Реквизиты клиента -> Имя {RequisiteRqFirstName}
    Реквизиты клиента -> Фамилия {RequisiteRqLastName}
    Реквизиты клиента -> Отчество {RequisiteRqSecondName}
    Реквизиты клиента -> Сокращенное наименование организации {RequisiteRqCompanyName}
    Реквизиты клиента -> Полное наименование организации {RequisiteRqCompanyFullName}
    Реквизиты клиента -> Дата государственной регистрации {RequisiteRqCompanyRegDate}
    Реквизиты клиента -> Ген. директор {RequisiteRqDirector}
    Реквизиты клиента -> Гл. бухгалтер {RequisiteRqAccountant}
    Реквизиты клиента -> RqCeoName {RequisiteRqCeoName}
    Реквизиты клиента -> RqCeoWorkPos {RequisiteRqCeoWorkPos}
    Реквизиты клиента -> Адрес {RequisiteRqAddr}
    Реквизиты клиента -> Контактное лицо {RequisiteRqContact}
    Реквизиты клиента -> E-Mail {RequisiteRqEmail}
    Реквизиты клиента -> Телефон {RequisiteRqPhone}
    Реквизиты клиента -> Факс {RequisiteRqFax}
    Реквизиты клиента -> Вид документа {RequisiteRqIdentDoc}
    Реквизиты клиента -> серия {RequisiteRqIdentDocSer}
    Реквизиты клиента -> номер {RequisiteRqIdentDocNum}
    Реквизиты клиента -> RqIdentDocPersNum {RequisiteRqIdentDocPersNum}
    Реквизиты клиента -> дата выдачи {RequisiteRqIdentDocDate}
    Реквизиты клиента -> кем выдан {RequisiteRqIdentDocIssuedBy}
    Реквизиты клиента -> код подразделения {RequisiteRqIdentDocDepCode}
    Реквизиты клиента -> ИНН {RequisiteRqInn}
    Реквизиты клиента -> КПП {RequisiteRqKpp}
    Реквизиты клиента -> RqUsrle {RequisiteRqUsrle}
    Реквизиты клиента -> ИФНС {RequisiteRqIfns}
    Реквизиты клиента -> ОГРН {RequisiteRqOgrn}
    Реквизиты клиента -> ОГРНИП {RequisiteRqOgrnip}
    Реквизиты клиента -> ОКПО {RequisiteRqOkpo}
    Реквизиты клиента -> ОКТМО {RequisiteRqOktmo}
    Реквизиты клиента -> ОКВЭД {RequisiteRqOkved}
    Реквизиты клиента -> RqEdrpou {RequisiteRqEdrpou}
    Реквизиты клиента -> RqDrfo {RequisiteRqDrfo}
    Реквизиты клиента -> RqKbe {RequisiteRqKbe}
    Реквизиты клиента -> RqIin {RequisiteRqIin}
    Реквизиты клиента -> RqBin {RequisiteRqBin}
    Реквизиты клиента -> Серия св. о гос. регистрации {RequisiteRqStCertSer}
    Реквизиты клиента -> Номер св. о гос. регистрации {RequisiteRqStCertNum}
    Реквизиты клиента -> Дата св. о гос. регистрации {RequisiteRqStCertDate}
    Реквизиты клиента -> RqVatPayer {RequisiteRqVatPayer}
    Реквизиты клиента -> RqVatId {RequisiteRqVatId}
    Реквизиты клиента -> RqVatCertSer {RequisiteRqVatCertSer}
    Реквизиты клиента -> RqVatCertNum {RequisiteRqVatCertNum}
    Реквизиты клиента -> RqVatCertDate {RequisiteRqVatCertDate}
    Реквизиты клиента -> RqResidenceCountry {RequisiteRqResidenceCountry}
    Реквизиты клиента -> RqBaseDoc {RequisiteRqBaseDoc}
    Реквизиты клиента -> Фактический адрес -> Улица, дом, корпус, строение {RequisitePrimaryAddressAddress1}
    Реквизиты клиента -> Фактический адрес -> Квартира / офис {RequisitePrimaryAddressAddress2}
    Реквизиты клиента -> Фактический адрес -> Город {RequisitePrimaryAddressCity}
    Реквизиты клиента -> Фактический адрес -> Почтовый индекс {RequisitePrimaryAddressPostalCode}
    Реквизиты клиента -> Фактический адрес -> Район {RequisitePrimaryAddressRegion}
    Реквизиты клиента -> Фактический адрес -> Область {RequisitePrimaryAddressProvince}
    Реквизиты клиента -> Фактический адрес -> Страна {RequisitePrimaryAddressCountry}
    Реквизиты клиента -> Фактический адрес -> Полный адрес {RequisitePrimaryAddressText}
    Реквизиты клиента -> Юридический адрес -> Улица, дом, корпус, строение (юридический адрес) {RequisiteRegisteredAddressAddress1}
    Реквизиты клиента -> Юридический адрес -> Квартира / офис (юридический адрес) {RequisiteRegisteredAddressAddress2}
    Реквизиты клиента -> Юридический адрес -> Город (юридический адрес) {RequisiteRegisteredAddressCity}
    Реквизиты клиента -> Юридический адрес -> Почтовый индекс (юридический адрес) {RequisiteRegisteredAddressPostalCode}
    Реквизиты клиента -> Юридический адрес -> Район (юридический адрес) {RequisiteRegisteredAddressRegion}
    Реквизиты клиента -> Юридический адрес -> Область (юридический адрес) {RequisiteRegisteredAddressProvince}
    Реквизиты клиента -> Юридический адрес -> Страна (юридический адрес) {RequisiteRegisteredAddressCountry}
    Реквизиты клиента -> Юридический адрес -> Полный адрес {RequisiteRegisteredAddressText}
    Реквизиты клиента -> Адрес регистрации -> Улица, дом, корпус, строение {RequisiteHomeAddressAddress1}
    Реквизиты клиента -> Адрес регистрации -> Квартира / офис {RequisiteHomeAddressAddress2}
    Реквизиты клиента -> Адрес регистрации -> Город {RequisiteHomeAddressCity}
    Реквизиты клиента -> Адрес регистрации -> Почтовый индекс {RequisiteHomeAddressPostalCode}
    Реквизиты клиента -> Адрес регистрации -> Район {RequisiteHomeAddressRegion}
    Реквизиты клиента -> Адрес регистрации -> Область {RequisiteHomeAddressProvince}
    Реквизиты клиента -> Адрес регистрации -> Страна {RequisiteHomeAddressCountry}
    Реквизиты клиента -> Адрес регистрации -> Полный адрес {RequisiteHomeAddressText}
    Реквизиты клиента -> Адрес бенефициара -> Улица, дом, корпус, строение {RequisiteBeneficiaryAddressAddress1}
    Реквизиты клиента -> Адрес бенефициара -> Квартира / офис {RequisiteBeneficiaryAddressAddress2}
    Реквизиты клиента -> Адрес бенефициара -> Город {RequisiteBeneficiaryAddressCity}
    Реквизиты клиента -> Адрес бенефициара -> Почтовый индекс {RequisiteBeneficiaryAddressPostalCode}
    Реквизиты клиента -> Адрес бенефициара -> Район {RequisiteBeneficiaryAddressRegion}
    Реквизиты клиента -> Адрес бенефициара -> Область {RequisiteBeneficiaryAddressProvince}
    Реквизиты клиента -> Адрес бенефициара -> Страна {RequisiteBeneficiaryAddressCountry}
    Реквизиты клиента -> Адрес бенефициара -> Полный адрес {RequisiteBeneficiaryAddressText}
    Банковские реквизиты -> Название {BankDetailName}
    Банковские реквизиты -> Наименование банка {BankDetailRqBankName}
    Банковские реквизиты -> Адрес банка {BankDetailRqBankAddr}
    Банковские реквизиты -> RqBankRouteNum {BankDetailRqBankRouteNum}
    Банковские реквизиты -> БИК {BankDetailRqBik}
    Банковские реквизиты -> RqMfo {BankDetailRqMfo}
    Банковские реквизиты -> RqAccName {BankDetailRqAccName}
    Банковские реквизиты -> Расчетный счёт {BankDetailRqAccNum}
    Банковские реквизиты -> RqIik {BankDetailRqIik}
    Банковские реквизиты -> Валюта счёта {BankDetailRqAccCurrency}
    Банковские реквизиты -> Кор. счёт {BankDetailRqCorAccNum}
    Банковские реквизиты -> RqIban {BankDetailRqIban}
    Банковские реквизиты -> SWIFT {BankDetailRqSwift}
    Банковские реквизиты -> RqBic {BankDetailRqBic}
    Банковские реквизиты -> Комментарий {BankDetailComments}
    Ответственный -> E-Mail {AssignedEmail}
    Ответственный -> Имя {AssignedName}
    Ответственный -> Отчество {AssignedSecondName}
    Ответственный -> Фамилия {AssignedLastName}
    Ответственный -> Профессия {AssignedPersonalProfession}
    Ответственный -> Телефон {AssignedPersonalPhone}
    Ответственный -> Мобильный {AssignedPersonalMobile}
    Ответственный -> Сайт {AssignedPersonalWww}
    Ответственный -> Улица, дом {AssignedPersonalStreet}
    Ответственный -> Почтовый ящик {AssignedPersonalMailbox}
    Ответственный -> Город проживания {AssignedPersonalCity}
    Ответственный -> Область / край {AssignedPersonalState}
    Ответственный -> Почтовый индекс {AssignedPersonalZip}
    Ответственный -> Страна {AssignedPersonalCountry}
    Ответственный -> Дата рождения {AssignedPersonalBirthday}
    Ответственный -> Пол {AssignedPersonalGender}
    Ответственный -> Фотография {AssignedPersonalPhoto}
    Ответственный -> Наименование компании {AssignedWorkCompany}
    Ответственный -> Департамент / Отдел {AssignedWorkDepartment}
    Ответственный -> Телефон (работа) {AssignedWorkPhone}
    Ответственный -> Должность {AssignedWorkPosition}
    Ответственный -> Сайт (работа) {AssignedWorkWww}
    Ответственный -> Улица, дом (работа) {AssignedWorkStreet}
    Ответственный -> Почтовый ящик (работа) {AssignedWorkMailbox}
    Ответственный -> Город (работа) {AssignedWorkCity}
    Ответственный -> Область / край (работа) {AssignedWorkState}
    Ответственный -> Почтовый индекс (работа) {AssignedWorkZip}
    Ответственный -> Страна (работа) {AssignedWorkCountry}
    Ответственный -> Направления деятельности {AssignedWorkProfile}
    Ответственный -> Логотип компании {AssignedWorkLogo}
    Ответственный -> Внутренний номер {AssignedUfPhoneInner}
    Ответственный -> Полное имя {AssignedFormattedName}
    Телефон {ClientPhone}
    Email {ClientEmail}
    Сайт {ClientWeb}
    Тип компании {Type}
    Сфера деятельности {IndustryType}
    Кол-во сотрудников {EmployeesNum}
    Личный e-mail {EmailHome}
    Рабочий e-mail {EmailWork}
    Другой E-mail {EmailAnother}
    Личный телефон {PhoneMobile}
    Рабочий телефон {PhoneWork}
    Другой телефон {PhoneAnother}
    Сайт {Web}
    Дата генерации {DocumentCreateTime}
    Заголовок {DocumentTitle}
    Номер {DocumentNumber}
    Источник {Source}

    5 0 2 Ответить
  • MatatabiM
    Matatabi
    С чего лучше начать изучение Angular?

    Всем привет! Нужен совет: с чего лучше начать погружение в Angular? Расскажите, пожалуйста, о вашем личном опыте обучения — какие курсы, сайты или руководства вы считаете наиболее эффективными? Ищу качественную и структурированную информацию для старта. Пока в процессе прохождения курсов на CodeSchool и просмотра иностранных видеоуроков (беру с торрентов).


    2 0 2 Ответить
  • AladdinA
    Aladdin
    Полный гайд по команде LFTP: Работа с локальными и удалёнными серверами

    Полный гайд по команде LFTP: Работа с локальными и удалёнными серверами

    Введение в LFTP

    LFTP — это мощный командный FTP-клиент, который поддерживает множество протоколов: FTP, SFTP, FTPS, HTTP, HTTPS, и другие. Инструмент позволяет управлять файлами на удалённых серверах с использованием простой shell-подобной синтаксиса.

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

    Установка LFTP

    Debian/Ubuntu

    sudo apt install lftp
    

    Fedora/RHEL

    sudo dnf install lftp
    

    Arch Linux

    sudo pacman -S lftp
    

    Проверка установки

    lftp --version
    

    Базовое подключение к серверу

    Подключение по FTP

    lftp ftp.example.com
    

    Подключение с указанием пользователя

    lftp username@ftp.example.com
    

    Система запросит пароль.

    Подключение с пароль в команде

    lftp -u username,password ftp.example.com
    

    Подключение по SFTP

    lftp sftp://username@example.com
    

    Подключение на нестандартный порт

    lftp -p 2222 sftp://username@example.com
    

    Синтаксис LFTP: Локальные и Удалённые команды

    Различие между локальными и удалёнными командами

    В интерактивной сессии LFTP существует две перспективы — локальная (ваша машина) и удалённая (FTP-сервер).

    Удалённые команды выполняются без префикса:

    lftp> ls              # Показать содержимое удалённой директории
    lftp> cd /path        # Перейти в удалённую директорию
    lftp> pwd             # Показать текущую удалённую директорию
    

    Локальные команды требуют префикса !:

    lftp> !ls             # Показать содержимое локальной директории
    lftp> !cd /path       # Перейти в локальную директорию
    lftp> !pwd            # Показать текущую локальную директорию
    

    Специальные локальные команды

    Некоторые команды имеют специальные префиксы для работы с локальной системой:

    lftp> lpwd            # Показать текущую локальную директорию (print local working directory)
    lftp> lcd /path       # Изменить локальную директорию (local change directory)
    lftp> lls             # Вывести содержимое локальной директории (local list)
    

    Практические примеры команд

    Раздел 1: Навигация по директориям

    Работа с удалёнными директориями

    lftp> pwd
    /home/user/documents
    
    lftp> ls
    drwxr-xr-x   4 user group       4096 Oct 15 10:30 projects
    drwxr-xr-x   2 user group       4096 Oct 14 09:15 backups
    -rw-r--r--   1 user group      2048 Oct 13 14:20 report.pdf
    -rw-r--r--   1 user group      1024 Oct 13 11:05 notes.txt
    
    lftp> cd projects
    lftp> pwd
    /home/user/documents/projects
    
    lftp> cd ..
    lftp> pwd
    /home/user/documents
    

    Работа с локальными директориями

    lftp> lpwd
    /home/localuser/downloads
    
    lftp> lls
    Desktop
    Documents
    Downloads
    Music
    
    lftp> lcd Documents
    lftp> lpwd
    /home/localuser/downloads/Documents
    
    lftp> lcd ..
    lftp> lpwd
    /home/localuser/downloads
    

    Раздел 2: Загрузка файлов (с сервера на локальную машину)

    Загрузка одного файла

    # Базовая загрузка
    lftp> get report.pdf
    
    # Загрузка с переименованием
    lftp> get report.pdf -o report_latest.pdf
    
    # Загрузка с указанием полного пути
    lftp> get /home/user/documents/report.pdf
    
    # Загрузка в определённую локальную директорию
    lftp> get report.pdf -o /home/localuser/downloads/report.pdf
    

    Загрузка с проверкой статуса

    # При длительной загрузке
    lftp> get largefile.zip
    Total: 1024 MB  [#####              ] 45% 10.5 MB/s  00:05 ETA
    

    Загрузка нескольких файлов

    lftp> get file1.txt file2.txt file3.txt
    
    lftp> get *.txt
    
    lftp> get report*.pdf
    

    Раздел 3: Загрузка файлов (с локальной машины на сервер)

    Загрузка одного файла

    # Базовая загрузка
    lftp> put local_file.txt
    
    # Загрузка с переименованием на сервере
    lftp> put local_file.txt -o remote_filename.txt
    
    # Загрузка в определённую удалённую директорию
    lftp> put /home/localuser/documents/report.txt -o /backup/reports/report.txt
    

    Загрузка нескольких файлов

    lftp> put file1.txt file2.txt file3.txt
    
    lftp> put *.txt
    
    lftp> put data_*.csv
    

    Раздел 4: Синхронизация директорий с MIRROR

    Загрузка (sync с сервера на локальную машину)

    # Базовое зеркалирование — все файлы с сервера скопируются локально
    lftp> mirror /remote/path /local/path
    
    # Пример с полными путями
    lftp> mirror /var/www/html /home/user/website_backup
    
    # С опциями для параллельных загрузок и удаления удалённых файлов
    lftp> mirror -c -P 4 /remote/docs /local/docs
    
    # Загрузка с удалением локальных файлов, которых нет на сервере
    lftp> mirror --delete -c /remote/backup /local/backup
    

    Загрузка (sync с локальной машины на сервер — reverse mirror)

    # Обратное зеркалирование — загрузка локальных файлов на сервер
    lftp> mirror --reverse /local/path /remote/path
    
    # Пример: загрузить вебсайт на сервер
    lftp> mirror --reverse /home/user/website /var/www/html
    
    # С опциями для параллельных загрузок
    lftp> mirror --reverse -c -P 4 /local/project /remote/project
    
    # С удалением файлов на сервере, которых нет локально
    lftp> mirror --reverse --delete /local/data /remote/data
    

    Продвинутые опции mirror

    # Режим продолжения (skip existing files unless they are newer on source)
    lftp> mirror -c /remote /local
    
    # Параллельные загрузки (4 потока)
    lftp> mirror -P 4 /remote /local
    
    # Использование pget для параллельных частей файла
    lftp> mirror --use-pget-n=4 /remote /local
    
    # Режим DELETE — удалить на целевой стороне файлы, отсутствующие на источнике
    lftp> mirror --delete /remote /local
    
    # Комбинированный пример
    lftp> mirror -c --delete -P 2 --use-pget-n=4 /source /destination
    
    # Verbose режим — подробный вывод
    lftp> mirror -v /remote /local
    
    # Сухой прогон (dry-run) — показать что будет загружено без реальной загрузки
    lftp> mirror --only-missing /remote /local
    

    Раздел 5: Работа с отдельными файлами

    Просмотр содержимого файла

    # Просмотреть содержимое удалённого файла
    lftp> cat config.txt
    
    # Просмотр с фильтром через grep
    lftp> cat logfile.txt | grep ERROR
    
    # Вывод в локальный файл
    lftp> cat README.md > /home/user/docs/README_copy.md
    
    # Просмотр локального файла
    lftp> !cat /home/user/notes.txt
    

    Информация о файлах

    # Подробный список удалённых файлов
    lftp> ls -l
    
    # Рекурсивный список удалённой директории
    lftp> ls -R /var/www
    
    # Список локальных файлов
    lftp> !ls -la /home/user
    
    # Размер удалённого файла
    lftp> ls -l largefile.iso
    
    # Проверка существования файла на сервере
    lftp> ls report_*.pdf
    

    Удаление файлов

    # Удалить один файл на сервере
    lftp> rm oldfile.txt
    
    # Удалить несколько файлов
    lftp> rm file1.txt file2.txt file3.txt
    
    # Удалить файлы по маске
    lftp> rm *.tmp
    
    # Удалить файлы с подтверждением
    lftp> rm -i *.log
    

    Переименование файлов

    # Переименовать файл на сервере
    lftp> mv oldname.txt newname.txt
    
    # Переместить файл в другую директорию на сервере
    lftp> mv document.pdf /archive/document.pdf
    

    Раздел 6: Работа с директориями

    Создание и удаление директорий

    # Создать директорию на сервере
    lftp> mkdir backups
    
    # Создать вложенные директории
    lftp> mkdir -p /var/www/html/images
    
    # Удалить пустую директорию на сервере
    lftp> rmdir old_backup
    
    # Создать локальную директорию
    lftp> !mkdir /home/user/ftp_downloads
    
    # Удалить локальную пустую директорию
    lftp> !rmdir /home/user/old_folder
    

    Раздел 7: Операции в фоновом режиме

    LFTP позволяет запускать команды асинхронно, что полезно для длительных операций.

    # Загрузить файл в фоне (& в конце)
    lftp> get largefile.iso &
    
    # Загрузить директорию в фоне
    lftp> mirror -c /remote/backup /local/backup &
    
    # Список активных фоновых заданий
    lftp> jobs
    
    # Результат
    [1]   mirror -c /remote/backup /local/backup - 45% done - 5.2 MB/s
    
    # Ждать завершения конкретного задания
    lftp> wait 1
    
    # Ждать всех заданий
    lftp> wait
    

    Раздел 8: Пиповые операции и перенаправление

    # Загрузить файл и сжать его локально
    lftp> get largefile.sql | gzip > largefile.sql.gz
    
    # Сжать файл на сервере и загрузить
    lftp> cat document.pdf | gzip > /home/user/document.pdf.gz
    
    # Очистить логи на сервере
    lftp> cat /var/log/app.log | tail -100 > /home/user/app_last_100.log
    
    # Загрузить локальный файл и распаковать на сервере
    lftp> put /home/user/data.tar.gz | tar -xz -C /home/user/data
    

    Раздел 9: Расширенные опции и параметры

    Установка параметров сессии

    # Отключить проверку SSL (если нужно)
    lftp> set ftp:ssl-allow off
    
    # Установить timeout для соединения
    lftp> set network:timeout 30
    
    # Установить максимум параллельных соединений
    lftp> set net:max-retries 3
    
    # Включить режим пассивного FTP
    lftp> set ftp:passive-mode on
    
    # Просмотреть все установки
    lftp> set -a
    

    Условное выполнение команд

    # Выполнить вторую команду, только если первая успешна (&&)
    lftp> get file.zip && ls -l file.zip
    
    # Выполнить команду, если предыдущая не удалась (||)
    lftp> get backup.tar.gz || echo "Backup not found"
    
    # Комбинация
    lftp> cd /backups && mirror . /local/backups || echo "Failed"
    

    Раздел 10: Автоматизация с использованием скриптов

    Использование параметра -e (выполнить команды)

    # Выполнить одну команду
    lftp -u user,pass ftp.example.com -e "ls"
    
    # Выполнить несколько команд через ;
    lftp -u user,pass ftp.example.com -e "cd /backups; mirror . /local/backups; quit"
    
    # С переменными окружения для пароля (более безопасно)
    export LFTP_PASSWORD="secretpassword"
    lftp -u user --env-password ftp.example.com -e "mirror /data /local/data; quit"
    

    Использование файла скрипта (-f параметр)

    Файл: sync_backup.lftp

    open sftp://user@backup.example.com
    cd /backups
    lcd /home/user/backups
    mirror --delete -c -P 2 .
    quit
    

    Запуск:

    lftp -f sync_backup.lftp
    

    Использование heredoc в bash

    Файл: backup_script.sh

    #!/bin/bash
    
    FTP_HOST="backup.example.com"
    FTP_USER="username"
    FTP_PASS="password"
    LOCAL_DIR="/home/user/backups"
    REMOTE_DIR="/backups"
    
    lftp -u $FTP_USER,$FTP_PASS $FTP_HOST <<EOF
    cd $REMOTE_DIR
    mirror --delete -c -P 2 . $LOCAL_DIR
    quit
    EOF
    
    echo "Backup completed!"
    

    Запуск:

    chmod +x backup_script.sh
    ./backup_script.sh
    

    Bash скрипт с проверками ошибок

    #!/bin/bash
    
    FTP_HOST="ftp.example.com"
    FTP_USER="username"
    FTP_PASS="password"
    
    # Проверить наличие lftp
    if ! command -v lftp &> /dev/null; then
        echo "lftp is not installed"
        exit 1
    fi
    
    # Выполнить синхронизацию
    lftp -u $FTP_USER,$FTP_PASS $FTP_HOST <<EOF
    set ftp:ssl-allow off
    cd /data
    mirror --delete -c -P 4 . /local/data
    quit
    EOF
    
    # Проверить результат
    if [ $? -eq 0 ]; then
        echo "Sync completed successfully"
    else
        echo "Sync failed!"
        exit 1
    fi
    

    Раздел 11: Специальные команды

    Команда help

    lftp> help
    

    Показывает список всех доступных команд с описанием.

    Закрытие соединения

    lftp> quit
    
    # или
    
    lftp> exit
    
    # или
    
    lftp> bye
    

    Переподключение

    # Переподключиться к текущему серверу
    lftp> reconnect
    
    # Подключиться к другому серверу
    lftp> open ftp://newuser@newhost.com
    

    Информация о соединении

    # Показать текущее соединение и статистику
    lftp> status
    
    # Результат:
    # Connected to ftp.example.com
    # Remote system type is UNIX
    # Connected as user@ftp.example.com
    # Type: binary; Form: nonprint; Mode: stream; Structure: file
    # Verbose: off; Bell: off; Prompting: off; Globbing: on
    # Hash mark printing: off; Use of PORT cmds: on
    

    Раздел 12: Закладки (bookmarks)

    LFTP позволяет сохранять часто используемые подключения.

    # При подключении к серверу
    lftp> open sftp://user@myserver.com
    Password: ****
    
    # Сохранить текущее подключение как закладку
    lftp> bookmark add myserver
    
    # Позже можно подключиться сокращённо
    lftp myserver
    
    # Просмотреть все закладки
    lftp> bookmark list
    
    # Удалить закладку
    lftp> bookmark delete myserver
    
    # Закладки хранятся в: ~/.local/share/lftp/bookmarks
    cat ~/.local/share/lftp/bookmarks
    

    Раздел 13: Примеры реальных сценариев

    Сценарий 1: Ежедневное резервное копирование

    #!/bin/bash
    # daily_backup.sh
    
    DATE=$(date +%Y%m%d)
    BACKUP_DIR="/home/user/backups/backup_$DATE"
    REMOTE_HOST="backup.example.com"
    REMOTE_USER="user"
    REMOTE_PASS="password"
    REMOTE_PATH="/backups/website"
    
    # Создать локальную директорию для резервной копии
    mkdir -p "$BACKUP_DIR"
    
    # Загрузить файлы с сервера
    lftp -u "$REMOTE_USER,$REMOTE_PASS" "$REMOTE_HOST" <<EOF
    cd "$REMOTE_PATH"
    mirror . "$BACKUP_DIR"
    quit
    EOF
    
    # Проверить результат
    if [ $? -eq 0 ]; then
        echo "Backup $DATE completed successfully"
        # Сжать резервную копию
        tar -czf "$BACKUP_DIR.tar.gz" "$BACKUP_DIR"
        rm -rf "$BACKUP_DIR"
    else
        echo "Backup $DATE failed!"
    fi
    

    Сценарий 2: Загрузка файлов на сервер с проверкой

    #!/bin/bash
    # upload_and_verify.sh
    
    LOCAL_FILE="/home/user/data/report.pdf"
    REMOTE_HOST="upload.example.com"
    REMOTE_USER="user"
    REMOTE_PATH="/incoming"
    
    if [ ! -f "$LOCAL_FILE" ]; then
        echo "File not found: $LOCAL_FILE"
        exit 1
    fi
    
    # Получить размер локального файла
    LOCAL_SIZE=$(stat -f%z "$LOCAL_FILE" 2>/dev/null || stat -c%s "$LOCAL_FILE")
    
    # Загрузить файл
    lftp -u "$REMOTE_USER" "$REMOTE_HOST" <<EOF
    cd "$REMOTE_PATH"
    put "$LOCAL_FILE"
    quit
    EOF
    
    # Проверить размер на сервере
    REMOTE_SIZE=$(lftp -u "$REMOTE_USER" "$REMOTE_HOST" -e "cd $REMOTE_PATH; ls report.pdf; quit" | awk '{print $5}')
    
    if [ "$LOCAL_SIZE" -eq "$REMOTE_SIZE" ]; then
        echo "Upload verified successfully"
    else
        echo "Upload verification failed"
        exit 1
    fi
    

    Сценарий 3: Синхронизация между локальной и удалённой директориями

    #!/bin/bash
    # sync_bidirectional.sh
    
    REMOTE_HOST="sync.example.com"
    REMOTE_USER="user"
    REMOTE_PATH="/documents"
    LOCAL_PATH="/home/user/documents"
    
    # Сначала загрузить новые файлы с сервера
    lftp -u "$REMOTE_USER" "$REMOTE_HOST" <<EOF
    set ftp:ssl-allow off
    mirror -c "$REMOTE_PATH" "$LOCAL_PATH"
    quit
    EOF
    
    # Затем загрузить локальные изменения на сервер
    lftp -u "$REMOTE_USER" "$REMOTE_HOST" <<EOF
    set ftp:ssl-allow off
    mirror --reverse -c "$LOCAL_PATH" "$REMOTE_PATH"
    quit
    EOF
    
    echo "Synchronization completed"
    

    Сценарий 4: Очистка старых файлов на сервере

    #!/bin/bash
    # cleanup_old_files.sh
    
    REMOTE_HOST="storage.example.com"
    REMOTE_USER="user"
    REMOTE_PATH="/archive"
    DAYS_OLD=30
    
    # Подключиться и удалить файлы старше 30 дней
    lftp -u "$REMOTE_USER" "$REMOTE_HOST" <<EOF
    cd "$REMOTE_PATH"
    find . -type f -mtime +$DAYS_OLD
    quit
    EOF
    

    Полезные команды и параметры

    Быстрый справочник

    Команда Описание
    ls Список файлов удалённой директории
    lls Список файлов локальной директории
    cd /path Перейти в удалённую директорию
    lcd /path Перейти в локальную директорию
    pwd Показать текущую удалённую директорию
    lpwd Показать текущую локальную директорию
    get file Загрузить файл с сервера
    put file Загрузить файл на сервер
    mirror dir Синхронизировать удалённую директорию локально
    mirror --reverse dir Синхронизировать локальную директорию на сервер
    rm file Удалить файл на сервере
    mkdir dir Создать директорию на сервере
    cat file Показать содержимое файла
    quit Выйти из lftp

    Советы и рекомендации

    1. Безопасность паролей: Используйте переменные окружения вместо передачи пароля в командной строке:

      export LFTP_PASSWORD="password"
      lftp -u user --env-password host.com
      
    2. Параллельные загрузки: Используйте опцию -P для ускорения передачи:

      lftp> mirror -c -P 4 /remote /local
      
    3. Фоновые операции: Добавляйте & в конце для запуска в фоне:

      lftp> mirror /remote /local &
      
    4. Проверка соединения: Используйте reconnect для переподключения при разрыве:

      lftp> reconnect
      
    5. Логирование: Перенаправляйте output в файл для анализа:

      lftp -u user,pass host.com -e "mirror /data /local" > /tmp/lftp.log 2>&1
      

    Часто встречаемые ошибки и решения

    Ошибка: Connection timeout

    # Решение: увеличить timeout
    lftp> set network:timeout 60
    

    Ошибка: Permission denied

    # Решение: проверить права доступа на сервере
    lftp> ls -l
    # или использовать правильного пользователя
    

    Ошибка: SSL certificate error

    # Решение: отключить проверку SSL (если нужно)
    lftp> set ftp:ssl-allow off
    

    Заключение

    LFTP является мощным инструментом для управления файлами на удалённых серверах. С использованием описанных команд и примеров, вы сможете:

    • Быстро передавать файлы между локальной и удалённой системой
    • Автоматизировать синхронизацию директорий
    • Работать как с интерактивными сессиями, так и с bash-скриптами
    • Управлять большими объёмами данных с использованием параллельных загрузок
    • Интегрировать LFTP в сложные workflow и автоматизационные сценарии

    Этот инструмент станет незаменимым помощником для администраторов серверов, веб-разработчиков и DevOps специалистов.


    0 0 1 Ответить
  • KuzanoffK
    Kuzanoff
    Топ ожидаемых игр 2026 для ПК

    2026 год обещает стать настоящим праздником для всех геймеров! Хотя итоговый топ-лист еще формируется, на горизонте собрались титаны индустрии, готовые перевернуть наши представления об играх. Гуляя по сети я собрал для вас самый жаркий список грядущих хитов.

    ✨ Гарантированные блокбастеры:

    ◽ Grand Theft Auto VI – Легенда возвращается! Пожалуй, самый ожидаемый релиз в истории, который готовится установить новые стандарты для открытых миров.

    ◽ Marvel’s Wolverine – От создателей «Человека-паука»! Готовьте когти: нас ждет мрачная, полная ярости и адамантиевая одиссея Росомахи.

    ◽ Resident Evil Requiem – Капком снова готов заставить нас кричать. Новый виток легендарного хоррора, где по коже побегут не только мурашки.

    🔥 Великое возвращение легенд:

    ◽ Fable – Мир, где ваши поступки меняют все! Культовая сказка возвращается с новыми силами от студии Playground Games — готовьтесь к остроумию, магии и невероятным приключениям.

    ◽ Gears of War: E-Day – Узнайте, с чего все началось. Станьте свидетелем Дня Эмердженции в этом мощном приквеле, который вернет нас к истокам эпической войны с Locust.

    ⚔️ Новые вызовы и миры для покорения:

    ◽ Lords of the Fallen 2 – Для тех, кто жаждет сложных испытаний. Погрузитесь в мрачное фэнтези с убийственным геймплеем в стиле Souls-like.

    ◽ Assassin’s Creed Codename Hexe – Готовьтесь к самой мрачной и загадочной главе в истории Ассасинов. Шепчущие леса и темные суеверия средневековой Европы ждут вас.

    ◽ Exodus – Межзвездная одиссея от ветеранов Mass Effect и KOTOR. Ваши решения будут иметь последствия на протяжении поколений в этой масштабной научно-фантастической RPG.

    🎩 Шпионские страсти и исторические хроники:

    ◽ 007: Project 007 – Агент 007, Джеймс Бонд, наконец получает свою полноценную игру от мастеров шпионского экшена — IO Interactive (Hitman).

    ◽ Chronicles: Medieval – Примерьте доспехи правителя или воина в этой амбициозной исторической стратегии или RPG, где вы будете вершить судьбы целых королевств.

    Сохраняйте этот список, прокачивайте свои ПК и готовьтесь к незабываемым приключениям. Поделитесь, какая из этих игр займет главное место в вашей игровой библиотеке?


    5 0 2 Ответить
  • AladdinA
    Aladdin
    Исчерпывающий гайд по деструктуризации и оператору ... (spread/rest - три точки, многоточие) в JavaScript

    Главное: деструктуризация упрощает извлечение данных из объектов и массивов, а троеточие используется в двух разных ролях — spread «раскрывает» коллекции, а rest «собирает остатки». Освойте базовые шаблоны ниже — и получите удобную шпаргалку для повседневной разработки и собеседований.^1^3^5^7^9

    Оглавление

    • Что такое деструктуризация
    • Деструктуризация массивов
    • Деструктуризация объектов
    • Глубокая (вложенная) деструктуризация
    • Значения по умолчанию и вычисляемые значения
    • Переименование переменных при деструктуризации
    • Игнорирование элементов и «сбор остатка» с rest
    • Деструктуризация в параметрах функций
    • Типичные практики и частые ошибки
    • Оператор …: spread vs rest
    • Практические кейсы со spread
    • Полезные паттерны для React/Node.js/TS
    • Шпаргалка (Cheatsheet)

    Что такое деструктуризация

    Деструктурирующее присваивание — это синтаксис, позволяющий «распаковывать» элементы массива или свойства объекта в переменные напрямую, делая код короче и нагляднее.^2^7
    Пример: const [a, b] = arr; или const {x, y} = obj; извлекают значения в переменные с одной строки вместо нескольких обращений по индексу/ключу.^4^2


    Деструктуризация массивов

    Простая распаковка:

    const arr = [10, 20, 30];
    const [first, second, third] = arr;
    

    Пропуск элементов:

    const [x, , z] = [1, 2, 3]; // x=1, z=3
    

    Обмен значений без временной переменной:^2

    let a = 1, b = 3;
    [a, b] = [b, a]; // a=3, b=1
    

    Значения по умолчанию:^7

    const [a = 1, b = 2, c = 3] = [^10]; // a=10, b=2, c=3
    

    Остаток массива с rest:

    const [head, ...tail] = [1, 2, 3, 4]; // head=1, tail=[2,3,4]
    

    Результаты split()/match():

    const [firstName, lastName] = 'Ada Lovelace'.split(' '); // firstName='Ada'
    

    Возврат нескольких значений функцией:^2

    function minmax(nums) { return [Math.min(...nums), Math.max(...nums)]; }
    const [min, max] = minmax([5,1,9]); // min=1, max=9
    

    Деструктуризация объектов

    Базовая распаковка:

    const person = { name: 'Alice', age: 30 };
    const { name, age } = person;
    

    Значения по умолчанию:

    const { city = 'Unknown' } = {};
    

    Переименование переменных:

    const user = { id: 42, isAdmin: true };
    const { id: userId, isAdmin: admin } = user; // userId=42, admin=true
    

    Сбор «остатка» полей (object rest):^3

    const obj = { a: 1, b: 2, c: 3 };
    const { a, ...rest } = obj; // a=1, rest={ b:2, c:3 }
    

    Деструктуризация с вычисляемым именем ключа:

    const key = 'score';
    const stats = { score: 99, level: 3 };
    const { [key]: currentScore } = stats; // currentScore=99
    

    Глубокая (вложенная) деструктуризация

    Извлечение из вложенных объектов:^11

    const user = {
      name: 'John',
      contact: { email: 'john@ex.com', phones: { mobile: '123', work: '456' } },
      roles: ['user', 'editor']
    };
    
    const {
      name,
      contact: { email, phones: { mobile } },
      roles: [primaryRole]
    } = user;
    // name='John', email='john@ex.com', mobile='123', primaryRole='user'
    

    Смешанная с массивами:

    const data = {
      items: [{ id: 1, tags: ['a','b'] }, { id: 2, tags: ['c'] }]
    };
    const { items: [{ id: firstId, tags: [firstTag] }] } = data;
    // firstId=1, firstTag='a'
    

    Осторожно с отсутствующими ветками — используйте значения по умолчанию для безопасности:

    const cfg = {};
    const { server: { host = '127.0.0.1' } = {} } = cfg;
    

    Значения по умолчанию и вычисляемые значения

    Значения по умолчанию вычисляются лениво — выражение вызывается только если поле/элемент отсутствует:^7

    function computeDefault() { console.log('called'); return 100; }
    
    const [x = computeDefault()] = []; // вызов произойдёт
    const [y = computeDefault()] = [^5]; // не вызовется
    

    Переименование переменных при деструктуризации

    Объекты:

    const { name: fullName, age: years } = { name: 'M', age: 20 };
    

    Массивы переименовывают именами слева:

    const [width: w, height: h] = ??? // так нельзя
    // Для массивов просто используйте нужные имена:
    const [w, h] = [800, 600];
    

    Игнорирование элементов и «сбор остатка» с rest

    Игнорирование:

    const [ , second ] = [1,2,3]; // second=2
    

    Сбор остатка:

    const [first, ...others] = [1,2,3,4]; // others=[2,3,4]
    const { a, ...restObj } = { a:1, b:2, c:3 }; // restObj={ b:2, c:3 }
    

    Rest всегда стоит последним и допускается только один rest.^9


    Деструктуризация в параметрах функций

    Массивы в параметрах:^12

    function parseDate([year, month, day]) {
      return new Date(year, month - 1, day);
    }
    parseDate([2025, 12, 31]);
    

    Объекты в параметрах:

    function createUser({ name, email, role = 'user' }) {
      return { name, email, role };
    }
    

    Глубокая деструктуризация прямо в сигнатуре:

    function handle({ meta: { id }, payload: { items: [first] = [] } = {} }) {
      return { id, first };
    }
    

    С rest-параметрами:^13

    function sum(label, ...nums) {
      console.log(label, nums.reduce((a,b)=>a+b,0));
    }
    sum('total', 1,2,3); // nums=[1,2,3]
    

    Типичные практики и частые ошибки

    • Обмен значений без временной переменной с массивной деструктуризацией.^2
    • Выборка нужных полей из ответа API, игнорируя всё остальное.
    • Осторожно: «плоская» деструктуризация вложенных полей может кидать ошибку, если промежуточный объект undefined. Используйте значения по умолчанию для узлов: const { a: { b } = {} } = obj.
    • Нельзя использовать объектную деструктуризацию слева без объявления без скобок:
    // ({a} = someObj); // обернуть в скобки при присваивании существующим переменным
    
    • Rest-параметр должен быть последним и единственным rest.^9
    • Не путать spread и rest: одинаковый синтаксис …, но разные контексты и смысл.^6

    Оператор …: spread vs rest (в чём разница)

    • Spread «раскрывает» итерируемые элементы или свойства объекта: передача массива как набора аргументов, копирование/слияние массивов и объектов.^14^15^6
    • Rest «собирает остатки» в массив (в функциях) или объект (при объектной деструктуризации).^5^9

    Примеры «как отличить»:^3

    // spread: раскладывает
    Math.max(...[1,2,3]); // равно Math.max(1,2,3)
    
    // rest: собирает
    function f(a, ...rest) { /* rest это массив оставшихся аргументов */ }
    

    Практические кейсы со spread

    Передача массива как аргументов:^15

    const nums = [1, 2, 3];
    console.log(Math.max(...nums));
    

    Объединение массивов и вставка «посередине»:^14

    const head = [1, 2];
    const mid = [3, 4];
    const tail = [^5];
    const merged = [...head, ...mid, ...tail]; // [1,2,3,4,5]
    

    Клонирование массива/объекта (поверхностная копия):^6

    const a1 = [1,2]; const a2 = [...a1];
    const o1 = { x: 1, y: 2 }; const o2 = { ...o1 }; // поверхностно
    

    Иммутабельные обновления:

    const state = { user: { name: 'A', meta: { age: 30 } } };
    // поверхностное обновление верхнего уровня:
    const next = { ...state, user: { ...state.user, name: 'B' } };
    

    Удаление поля при «копировании»:

    const { password, ...publicUser } = user; // убрать чувствительное поле
    

    Преобразование строки в массив символов:^6

    const chars = [...'Привет']; // ['П','р','и','в','е','т']
    

    Слияние объектов с приоритетом правых свойств:^17

    const base = { role: 'user', active: true };
    const patch = { role: 'admin' };
    const result = { ...base, ...patch }; // role='admin'
    

    Полезные паттерны для React/Node.js/TS

    React props/state:

    function Button({ kind = 'primary', ...props }) {
      return <button className={`btn btn-${kind}`} {...props} />;
    }
    

    Опциональные опции c дефолтами:

    function connectDB({ host='127.0.0.1', port=5432, user, password } = {}) { /* ... */ }
    

    Сужение данных из сложных DTO:

    const { id, profile: { email } = {} } = dto;
    

    TypeScript + деструктуризация:

    • Явные типы переменных после деструктуризации:
    const { id, name }: { id: number; name: string } = user;
    
    • Осторожно: деструктуризация не делает глубокого readonly и не меняет тип вложенных значений.

    Шпаргалка (Cheatsheet)

    • Массивы:
        const [a, b] = arr
        const [first, , third] = arr
        const [head, ...tail] = arr
        [a, b] = [b, a] // swap
        const [x = 1] = []
    
    • Объекты:
       const { x, y } = obj
       const { x: x1, y: y1 } = obj // переименование
       const { x = 0 } = obj // дефолт
       const { a, ...rest } = obj // остаток полей
       const { m: { n } = {} } = obj // безопасная вложенность
    
    • В функциях:
       function f([x, y]) {}
       function g({ a, b = 2 }) {}
       function h(a, ...rest) {} // rest в конце
    
    • Spread:
       fn(...args)
       const merged = [...a1, ...a2]
       const copy = { ...obj }
       const patch = { ...base, override: 1 }
    
    • Частые ошибки:
      • Нельзя два rest-параметра и rest не в конце^9
      • Поверхностное копирование (вложенные объекты всё еще по ссылке)
      • Возможен TypeError при глубокой деструктуризации без дефолтов (читаете undefined.property)
      • Для присваивания в уже объявленные переменные объектной деструктуризации используйте скобки: ({a} = src)

    Расширенные примеры «на все случаи»

    Глубокая деструктуризация массива объектов:

    const list = [
      { id: 1, meta: { tags: ['js','es6'] } },
      { id: 2, meta: { tags: ['node'] } }
    ];
    const [
      { id: firstId, meta: { tags: [firstTag] = [] } = {} },
      { id: secondId, meta: { tags: [, secondTag] = [] } = {} }
    ] = list;
    // firstId=1, firstTag='js', secondId=2, secondTag=undefined
    

    Деструктуризация результата RegExp:

    const [, year, month, day] = /^(\d{4})-(\d{2})-(\d{2})$/.exec('2025-10-27') || [];
    

    Выборка параметров запроса с дефолтами:

    function listUsers(query={}) {
      const {
        page = 1,
        perPage = 20,
        filter: { role = 'all', active = true } = {}
      } = query;
      // ...
    }
    

    Нормализация вложенных ответов API:

    const apiResp = {
      ok: true,
      data: { user: { id: 7, profile: { name: 'Ann' } } }
    };
    const { data: { user: { id, profile: { name } = {} } = {} } = {} } = apiResp || {};
    

    Слияние конфигов без мутаций:^6

    const defaults = { retry: 3, headers: { 'X': 1 } };
    const userCfg = { headers: { 'Y': 2 } };
    const cfg = {
      ...defaults,
      headers: { ...defaults.headers, ...userCfg.headers }
    };
    

    Оптимальная передача аргументов:

    function callMax(arr) { return Math.max(...arr); }
    

    Клонирование без глубокого копирования:

    const arr2 = [...arr1];
    const obj2 = { ...obj1 };
    // вложенные объекты/массивы остаются по ссылке
    

    Важно помнить

    • Деструктуризация ничего не «ломает» справа: она копирует значения в переменные, не изменяя исходную структуру.^1
    • Spread/rest — синтаксис с троеточием, но смысл зависит от контекста:
      • spread: раскрыть итерируемое/объект^8^6
      • rest: собрать остаток в массив/объект^5^9
    • Для устойчивого к ошибкам кода используйте дефолты на промежуточных уровнях вложенности.

    Дополнительные материалы

    • MDN: Деструктурирующее присваивание и Spread syntax^2
    • Современный учебник JavaScript ( learn.javascript.ru ) : деструктуризация и rest/spread^10^5
    • Doka: Деструктуризация и Spread^4
    • Хабр/Обучающие статьи по spread/rest^16^3

    Все приёмы и определения согласованы со спецификой ES6+ и документацией MDN/learn.javascript.ru/Doka.^8^1^4^7^6
    ^18^20^22^24^26^28^30^33^36^38^40^42^44^46^48^50^52^54^57^59^61^63^66^68

    ⁂

    2 0 1 Ответить
Популярные темы:

  • Трейдинг это что: суть, виды и как начать
    itraceI
    itrace
    1
    38
    911

  • Объём и площадь поверхности: цилиндр, конус, шар
    В
    Ванек
    1
    35
    944

  • JavaScript мемы
    AladdinA
    Aladdin
    2
    30
    1.3k

  • Цифровой кочевник: свобода в рюкзаке и Wi-Fi в кармане
    SkitRaS
    SkitRa
    1
    21
    423

  • Ретроградный Меркурий: Иллюзия, породившая феномен
    WowkW
    Wowk
    0
    19
    357

  • Создание собственного искусственного интеллекта
    kirilljsxK
    kirilljsx
    0
    18
    354

  • Российский разработчик SimpleOne выпустил новую версию своей платформы
    Алекс44А
    Алекс44
    0
    18
    305

  • Roblox flying script
    Алекс44А
    Алекс44
    1
    16
    6.3k

Пользователи в Сети:

Статистика:

6

В сети

132

Пользователи

302

Темы

976

Сообщения

Категории

  • Главная
  • Новости
  • Фронтенд
  • Бекенд
  • Языки программирования

Контакты

  • Сотрудничество
  • info@exlends.com
  • Наш чат
  • Наш ТГ канал

© 2024 - 2025 ExLends, Inc. Все права защищены.

Политика конфиденциальности
  • Войти

  • Нет учётной записи? Зарегистрироваться

  • Войдите или зарегистрируйтесь для поиска.
  • Первое сообщение
    Последнее сообщение
0
  • Лента
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы