Поменяли строчку и упал маркетплейс: способ транзитивного анализ вызовов в платформе 1С:Предприятие

12.10.26

Разработка - Рефакторинг и качество кода

Инженерный анализ влияния (Impact Analysis) при изменении общего метода в 1С:Предприятии: почему штатный поиск ссылок скрывает 99% зависимостей и как обратный обход графа вызовов выявляет 370 скрытых потребителей на глубине 3 уровней. В статье — верификация сквозной цепочки обмена с маркетплейсом; в архиве-компаньоне — автономный BFS-анализатор на Python, слепки графа и план регрессионного тестирования.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Анализ влияния 1С: пересчёт графа и маршруты проверки
.zip 80,30Kb ver:1.0
1 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.
🔬 Статический анализ & Архитектура 1С
🎯 О чём это (в трёх тезисах)
🗸Штатный поиск ссылок скрывает 99% реального графа зависимостей: при изменении общего метода контекстный поиск конфигуратора находит лишь прямых потребителей (в нашем тесте — 2 функции), тогда как на глубине 3 уровней зона влияния разрастается до 370 транзитивно зависимых процедур.
🗸Обратный обход (Incoming Calls) — единственный надёжный способ оценки влияния: для расчёта радиуса изменений требуется инвертировать направления вызовов (direction=in), двигаясь против стрелок вызова с дедупликацией вершин через алгоритм BFS.
🗸Транзитивная достижимость формирует план приёмки, а не фронт тотальных переделок: попадание функции в граф влияния очерчивает границы регрессионного тестирования интеграций и обменов, разделяя критические сквозные цепочки и изолированные вызовы.
🧪 Отчёт о тестировании файла-компаньона
Архивimpact-analysis-1c.zip (1 SM): скрипт обхода графа impact.py, сборщик REST capture_analyzer.py, тестовый набор test_impact.py, слепки графов и верифицированный маршрут BSL
Среда и стенд11.10.2026, Windows 11 Pro, Python 3.12.10 (стандартная библиотека без pip-зависимостей). Исходный граф извлечён из локального Analyzer 1C v2.7.65 для расширения «УправлениеОнлайнТорговлей» 1.7.6.276
Что запускалосьpython impact.py recorded/impact-in-depth3.json --out my-report и python -m unittest -v test_impact.py
РезультатАвтономный пересчёт подтвердил 370 кандидатов с распределением 2 / 52 / 316 по шагам вызова. 6 тестов (зацикливание, дубликаты связей, повреждённые рёбра) пройдены успешно. Цепочка обмена с Wildberries верифицирована до строки 7744
Границы проверкиИнструмент анализирует статическую структуру вызовов BSL; динамическое конструирование методов (Выполнить) и внешние сервисы требуют ручного аудита
🧠 Суть статьи

Инженерная методология анализа влияния (Impact Analysis) при рефакторинге и модернизации общих модулей в 1С:Предприятии. Мы исследуем, как не сломать критические интеграционные механизмы (на реальном примере модуля выгрузки цен в маркетплейс Wildberries) при корректировке метода маскирования авторизационных данных. Показываем, как извлекать транзитивные цепочки вызовов через Analyzer 1C, строить обратный граф зависимостей и преобразовывать сотни потенциальных точек отказа в компактный, управляемый план регрессионного тестирования.

Ключевые идеи
  • Иллюзия локальности: изменение контракта служебной процедуры затрагивает не только прямых вызывающих, но и высокоуровневые бизнес-процессы через цепочки сервисных адаптеров.
  • Инверсия графа: анализ влияния требует движения против направления вызовов (direction=in). Исходящий обход (direction=out) показывает внутреннее устройство метода, но слеп к его потребителям.
  • Слоистая фильтрация: разбиение 370 найденных функций по расстоянию (1 / 2 / 3 шага) позволяет выделить опорные цепочки для приёмочного контроля вместо распыления ресурсов на проверку всей базы.
  • Сверка с кодом: сопоставление выгруженного графа с физическими строками модулей BSL исключает ложные срабатывания и подтверждает реальную достижимость кода.
Главная мысль

Безопасный рефакторинг в 1С опирается на знание полного транзитивного графа вызовов: статический анализ определяет истинный радиус изменений ещё до правки первой строчки кода.

Поменяли строчку — упал маркетплейс: транзитивный анализ вызовов в 1С

Инженерный подход к рефакторингу общих методов в 1С:Предприятии: как с помощью графа вызовов Analyzer 1C выявить 370 скрытых зависимостей и построить точечный план регрессионного тестирования.

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

Оглавление:
  1. Проблема рефакторинга: почему штатный «поиск ссылок» пропускает скрытые зависимости
  2. Семантика графа вызовов: прямые вызовы vs обратный обход (Incoming Calls)
  3. Исследовательский стенд: архитектура системы и исследуемый корень
  4. Экспоненциальный рост зоны влияния: от 2 прямых вызовов к 370 кандидатам
  5. Верификация маршрута в BSL: трассировка цепочки интеграции Wildberries
  6. Алгоритм автономного пересчёта: обход в ширину (BFS) с защитой от циклов
  7. Декомпозиция кандидатов: как превратить граф в план регрессионного тестирования
  8. Как запустить файл-компаньон и воспроизвести результаты
  9. Итог и инженерный чек-лист безопасного изменения общих методов

🚨 Проблема рефакторинга: почему штатный «поиск ссылок» пропускает скрытые зависимости

Когда разработчику 1С требуется изменить сигнатуру, алгоритм или структуру возвращаемых данных в общем методе конфигурации, стандартный рабочий процесс обычно начинается с команды «Поиск ссылок в объекте / Найти ссылки» в конфигураторе или EDT.

Если поиск показывает всего 1–2 точки вызова, возникает иллюзия полной безопасности: «Метод используется всего в паре мест, сейчас поправлю логику, проверю эти две процедуры и отдам в релиз».

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

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

🔄 Семантика графа вызовов: прямые вызовы vs обратный обход (Incoming Calls)

При работе со статическим графом кода принципиально важно зафиксировать строгое направление отношений между сущностями:

Определение ребра графа: Запись A -> B означает, что функция A (caller) вызывает функцию B (callee).

В зависимости от инженерной задачи обход графа выполняется в диаметрально противоположных направлениях:

  • Прямой обход (direction=out): Движение по исходящим стрелкам от корня. Отвечает на вопрос: «Какие вспомогательные функции вызывает выбранный метод?» Этот срез необходим для декомпозиции монолитной функции или аудита её зависимостей, но он абсолютно бесполезен для оценки последствий рефакторинга.
  • Обратный обход (direction=in): Движение строго против направления стрелок. Отвечает на вопрос: «Кто прямо или косвенно зависит от изменения данного метода?» Именно этот алгоритм формирует периметр анализа влияния (Impact Analysis).
Направление обхода Инженерный вопрос Применение в практике 1С
Исходящий (out) Что вызывает этот метод? Оценка внутренней сложности, профилирование производительности
Входящий (in) Кто пострадает при изменении метода? Анализ влияния (Impact Analysis), планирование регрессионного тестирования

Важно различать вызовы функций (Call Graph) и связи по метаданным (Metadata References). Если реквизит документа ссылается на справочник, это не доказывает, что модуль документа вызывает конкретную функцию общего модуля. Смешивание семантики связей без явной типизации рёбер приводит к замусориванию графа ложными зависимостями.

🔬 Исследовательский стенд: архитектура системы и исследуемый корень

Для практического исследования мы взяли боевой интеграционный контур — расширение конфигурации «УправлениеОнлайнТорговлей» (версия 1.7.6.276), содержащее интеграционные адаптеры для маркетплейсов и внешних платформ.

Параметр стенда Фактическое значение
Движок статического анализа Analyzer 1C, версия 2.7.65 (локальный сервис, граф знаний по BSL)
Исследуемая система online-torgovlya (интеграционное расширение 1С)
Исследуемый корень (Target Method) Общий модуль CG_Online_ИнтеграцииССервисамиСервер, экспортная функция СкрытьНастройкиАвторизации
Бизнес-назначение корня Маскирование токенов, API-ключей и паролей в логах перед записью в журнал регистрации
Протокол чтения REST API: эндпоинты /api/functions//callers/table и /api/functions//impact

Сценарий задачи: требуется изменить структуру входных параметров метода СкрытьНастройкиАвторизации (например, добавить поддержку новых форматов авторизационных заголовков Bearer/OAuth2). Инженерный вопрос: какие процедуры в конфигурации окажутся в зоне риска?

📊 Экспоненциальный рост зоны влияния: от 2 прямых вызовов к 370 кандидатам

Через REST API Analyzer 1C мы выполнили запросы анализа влияния с различными параметрами направления и глубины обхода:

Направление и глубина Вершин в графе Рёбер в графе Достижимых функций (без корня) Флаг truncated
direction=in, depth=1 3 2 2 функции false
direction=in, depth=3 371 458 370 функций false
direction=out, depth=3 1 0 0 функций false

Слоистое распределение кандидатов по расстоянию (кратчайший путь в графе):

  • 1 шаг (прямые вызывающие): ровно 2 процедуры. Это сервисные методы логирования ЗаписьВЛог (в общем модуле интеграций) и ДобавитьЗапись (в общем модуле журнала событий);
  • 2 шага (вызывающие прямых потребителей): 52 процедуры. Сюда входят локальные процедуры журналирования конкретных модулей маркетплейсов (Wildberries, Ozon, Яндекс.Маркет);
  • 3 шага (прикладные сценарии обмена): 316 процедур. В этой группе находятся обработчики регламентных заданий, методы выгрузки каталогов, цен и остатков, обработчики веб-хуков и клиентские команды.
Итог замера: Разница между прямым поиском (2 вызова) и транзитивным графом (370 вызовов) составляет 185 раз. Опираться только на прямые вызовы при оценке регрессионного риска — критическая ошибка.

🔍 Верификация маршрута в BSL: трассировка цепочки интеграции Wildberries

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

В качестве контрольного узла выбрана процедура ОтправитьЗапросВыгрузитьЦены из внешней обработки CG_Online_WB_ИнтеграцияСВайлдберриз. Граф зафиксировал следующую сквозную цепочку:

Транзитивная цепочка вызовов (BSL Call Chain)
[Шаг 3] CG_Online_WB_ИнтеграцияСВайлдберриз.ОтправитьЗапросВыгрузитьЦены
    --> вызывает: Локальная ЗаписьВЛог(...) [Строка 7744]
        [Шаг 2] CG_Online_WB_ИнтеграцияСВайлдберриз.ЗаписьВЛог
        --> вызывает: CG_Online_ИнтеграцииССервисамиСервер.ЗаписьВЛог(...) [Строка 10434]
            [Шаг 1] CG_Online_ИнтеграцииССервисамиСервер.ЗаписьВЛог
            --> вызывает: СкрытьНастройкиАвторизации(...) [Строка 19270]
                [Корень] CG_Online_ИнтеграцииССервисамиСервер.СкрытьНастройкиАвторизации

Сверка с физическими исходниками модулей подтвердила 100% совпадение:

Модуль и процедура Номер строки Фактический вызов в коде BSL
CG_Online_WB_ИнтеграцияСВайлдберриз, ОтправитьЗапросВыгрузитьЦены 7744 Локальный вызов ЗаписьВЛог(ТекстСообщения, ...)
CG_Online_WB_ИнтеграцияСВайлдберриз, ЗаписьВЛог 10434 CG_Online_ИнтеграцииССервисамиСервер.ЗаписьВЛог(...)
Общий модуль интеграций, ЗаписьВЛог 19270 СкрытьНастройкиАвторизации(НастройкаАвторизации, Текст)

Обратите внимание: процедуры ЗаписьВЛог имеют идентичное имя, но принадлежат совершенно разным контекстам (локальная процедура обработки Wildberries и экспортная процедура общего модуля). Графовый анализатор разрешает их корректно по полным URI модулей, исключая ложную путаницу по именам.

💻 Алгоритм автономного пересчёта: обход в ширину (BFS) с защитой от циклов

Чтобы сделать анализ независимым от наличия запущенного сервера Analyzer 1C, в файле-компаньоне реализован автономный скрипт impact.py на стандартном Python 3.10+.

Алгоритм реализует поиск в ширину (Breadth-First Search, BFS) с инверсией матрицы смежности и гарантированной защитой от циклов и дубликатов:

Python (Ядро алгоритма impact.py) UTF-8 / collections.deque
1
2
3
4
5
6
7
8
9
10
11
previous = {root: None}
distance = {root: 0}
queue = deque([root])

while queue:
    current = queue.popleft()
    for neighbor in sorted(inverted_adjacency[current]):
        if neighbor not in previous:
            previous[neighbor] = current
            distance[neighbor] = distance[current] + 1
            queue.append(neighbor)

Архитектурные особенности реализации:

  • Очередь O(1): использование collections.deque гарантирует асимптотическую скорость извлечения элементов без накладных расходов срезов списков;
  • Защита от бесконечных циклов: проверка neighbor not in previous гарантирует, что уже посещённая вершина повторно в очередь не встаёт. Рекурсивные вызовы в 1С и циклические зависимости модулей мгновенно гасятся;
  • Минимальное расстояние: BFS гарантирует, что найденный путь от корня к любой вершине является кратчайшим по числу вызовов;
  • Экспорт артефактов: скрипт формирует структурированный JSON с распределением по шагам, CSV-реестр кандидатов и Markdown-отчёт с цепочками вызовов.

🎯 Декомпозиция кандидатов: как превратить граф в план регрессионного тестирования

Получив список из 370 функций, разработчик может впасть в другую крайность: «Мы не можем переписать 370 процедур, это остановит релиз на месяц!»

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

Для построения эффективного плана тестирования применяется трёхшаговая декомпозиция:

Уровень анализа Что проверяется в коде Практическое действие инженера
1. Прямые вызовы (2 шт.) Контракт параметров и возвращаемого значения Точечный рефакторинг: адаптировать передачу параметров Текст и Комментарий
2. Промежуточные адаптеры (52 шт.) Сериализация и распространение исключений Группировка по подсистемам: проверить 1 представителя от Wildberries, 1 от Ozon, 1 от Яндекс
3. Сквозные сценарии (316 шт.) Работоспособность интеграции целиком Сценарный регресс: выполнить контрольный прогон выгрузки цен в тестовой базе на синтетическом ключе

Вместо 370 хаотичных правок инженер получает чёткий чек-лист из 4–5 репрезентативных контрольных точек, гарантирующих целостность всей транзитивной цепочки вызовов.

📦 Как запустить файл-компаньон и воспроизвести результаты

В архиве-компаньоне impact-analysis-1c.zip содержатся готовые инструменты для воспроизведения замеров. Установка Analyzer 1C для базового тестирования не требуется — все первичные ответы уже сохранены в каталоге recorded/:

PowerShell / Bash Автономный запуск анализа
1
2
python impact.py recorded/impact-in-depth3.json --out my-report
python -m unittest -v test_impact.py

Первая команда воспроизводит полный пересчёт графа, выводя распределение 1: 2, 2: 52, 3: 316 и формируя детальный отчёт в папке my-report/. Вторая команда выполняет набор юнит-тестов (проверка зацикливания, валидация отсутствующих узлов, контроль входящего/исходящего направлений).

Если у вас развёрнут собственный сервер Analyzer 1C, скрипт capture_analyzer.py позволяет выполнить прямой сбор графа по REST для любой вашей конфигурации:

PowerShell / Bash Сбор живого графа с Analyzer 1C
1
2
python capture_analyzer.py --system online-torgovlya --out live
python impact.py live/impact-in-depth3.json --out live-report

🏁 Итог и инженерный чек-лист безопасного изменения общих методов

Статический анализ графа вызовов кардинально меняет культуру рефакторинга в 1С:Предприятии. Вместо слепого доверия к поиску ссылок или интуитивных предположений команда получает математически точную карту зависимостей проекта.

📋 Инженерный чек-лист до изменения общего метода 1С:
  1. Не доверять только поиску ссылок в конфигураторе: прямые ссылки показывают только уровень 1; транзитивные цепочки могут увеличивать периметр в сотни раз;
  2. Строить обратный граф зависимостей (direction=in): исходящий обход полезен для профилирования, но не отвечает на вопрос о рисках изменения;
  3. Ограничивать глубину обхода разумным пределом: глубина 3 обычно охватывает все бизнес-сценарии от адаптеров до пользовательских форм;
  4. Разделять кандидатов по слоям (1 / 2 / 3 шага): прямые вызовы адаптируются в коде, дальние группируются по подсистемам;
  5. Формировать точечный план регрессионного тестирования: выбрать по 1 ключевому сценарию от каждой затронутой интеграционной подсистемы;
  6. Верифицировать критические цепочки в исходниках BSL: сопоставить номера строк вызова для исключения динамических коллизий;
  7. Фиксировать граф до и после рефакторинга: сохранять JSON-отчёты в истории задачи трекера для обеспечения сквозной трассируемости изменений.
 
Нинель Адольевна Щербакова
Нинель Адольевна Щербакова (Ninel_S)
Архитектор • SRE & DevOps инженер • HighLoad 1С
Автор технических публикаций на Infostart. Разработчик NOPik, SRE-Suite-for-1C и мультиагентных ассистентов для экосистемы 1С:Предприятие.

Вступайте в нашу телеграмм-группу Инфостарт

1С Analyzer 1C анализ влияния рефакторинг тестирование

См. также

DevOps и автоматизация разработки Linux Разработчик 1С 8.3 Абонемент ($m)

Исследуем, почему COPY и последующий rm оставляют установщик в слоях Docker. На Docker Engine 29.8.0 сравнила три сборки с фиктивным дистрибутивом: bind mount и отдельный завершающий этап исключили его слой. В статье — первичные размеры и границы проверки лицензирования 1С; в архиве — воспроизводитель и анализатор inspect/history.

1 стартмани

12.10.2026    332    Ninel_S    0    

1

Рефакторинг и качество кода Разработчик 1С 8.3 1С:Управление торговлей 11 Россия Бесплатно (free)

8 приёмов за 10 минут: перестаньте прокручивать общий модуль на три тысячи строк как ленту в соцсети. Outline, #Область и фильтр - и вы уже в нужной процедуре, а не на строке «где-то внизу».

25.09.2026    2196    aleksandrboldyusov    9    

18

DevOps и автоматизация разработки Тестирование QA Групповая разработка (Git, хранилище) Разработчик 1С:Предприятие 8 Бесплатно (free)

Четыре года в интеграторе я работал с git и EDT. Git после хранилища полюбил сразу: видно, кто и что менял. С EDT сложнее: тормозит, ошибки при обновлении ERP, автономный сервер внутри него работает только с файловой базой. На новой работе команда захотела перейти на git, я развернул EDT, и оно на второй день разрушило проект при загрузке расширения. Тогда я решил дать команде git с привычным Конфигуратором и инструмент, который за минуту доносит коммит до базы через ibcmd, вместо получасовой загрузки из файлов. На новой работе разрешили ИИ, и я написал это приложение с его помощью: от чтения документации и первого ТЗ до идей в электричке. Впервые за годы снова почувствовал себя творцом, а не закрывателем задач. По дороге приросли выгрузка, объединение и проверка конфигурации по коммитам, YAxUnit и режим MCP-сервера. В статье: схемы, скриншоты, грабли и честный список ограничений. Ссылки пока нет: хочу понять, нужно ли это кому-то, кроме меня.

03.09.2026    12308    KatanaDragon511    30    

40

Инструменты администратора БД Инструментарий разработчика Тестирование QA Системный администратор Разработчик Стажер 1С:Предприятие 8 Бесплатно (free)

В экосистеме 1С давно живут сотни инструментов: от Конфигуратора и Хранилища до систем тестирования, мониторинга, интеграции и CI/CD. Я собрал их в Ландшафт технологий, а теперь добавляю данные о реальном использовании. Рассказываю, как устроена карта, что показал первый опрос и почему в новой волне особенно нужны администраторы, аналитики и тестировщики.

01.09.2026    2843    mrXoxot    6    

25

DevOps и автоматизация разработки Мониторинг Тестирование QA Разработчик 1С:Предприятие 8 Бесплатно (free)

Платформа 1С давно вышла за рамки учетных систем. Сегодня это полноценная среда для создания сложных, высоконагруженных и распределенных приложений. А значит, и стек технологий современного разработчика кардинально изменился. Систематизируем весь инструментарий, который превращает 1С-программиста в инженера: от EDT и Git до автотестов на YAxUnit, контейнеризации приложений в Docker, мониторинга в Prometheus и организации шины данных на Kafka. Разберемся, зачем каждый инструмент нужен, как он вписывается в жизненный цикл разработки и с чего начать его внедрение.

25.08.2026    24661    mrXoxot    55    

88

Рефакторинг и качество кода Обновление 1С Разработчик 1С:Предприятие 8 1С:ERP Управление предприятием 2 Бесплатно (free)

На проекте сложного обновления 1С:ERP 2.4.14.181 до версии 2.5.22.106 нам было нужно уложить обновление в технологическое окно 48 часов (выходные). Исходный замер, с учетом промежуточных релизов 2.5.8.443, 2.5.12.270, 2.5.17.234, 2.5.22.106, показал требуемое время в 659 часов…

07.07.2026    6822    1c-izh    21    

22

Инструментарий разработчика Рефакторинг и качество кода Разработчик 1С:Предприятие 8 Бесплатно (free)

Инструмент для тех, кто устал читать модули по 50 тысяч строк и искать ошибки глазами. MetaVision загружает выгруженные файлы конфигурации и за секунды строит графы функций, находит уязвимости и подсвечивает проблемы производительности. Ключевые возможности: Визуализация логики функций (графы условий, циклов, транзакций и вызовов). Статический аудит безопасности (RCE, SSRF, COM-инъекции, пароли в коде). Поиск проблем производительности (запросы в циклах, вложенные блокировки). Полнотекстовый поиск по всем модулям конфигурации. Статистика по объектам и функциям. Безопасность: Программа работает строго локально. Код вашей конфигурации не отправляется в интернет и не анализируется на сторонних серверах. Попробуйте MetaVision сегодня — узнайте, что скрывает ваш код.

20.04.2026    15490    1483    KHoroshulinAV    64    

95

Нейросети Рефакторинг и качество кода Разработчик Бесплатно (free)

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

17.03.2026    4957    IgorVasilyev    54    

28
Для отправки сообщения требуется регистрация/авторизация