СКД не только для отчетов – реализация универсальных отборов



Для чего может применяться СКД?

Устоявшееся мнение – для отчетов.

На самом деле возможности СКД выходят за рамки построения универсальных отчетов.

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

Для каких задач это будет полезно?

Приведем примеры из типовых конфигураций:

  • Обработка «Выгрузка данных на сайт»
  • Формирование прайс-листа
  • Выгрузка данных в ТСД (терминал сбора данных)
  • Сегментирование товаров, партнеров
  • Формирование заказов (клиентов, поставщикам) по потребностям
  • Планирование ремонтов в 1C:ERP.

То есть инструмент полезен везде, где нужно предоставить пользователю широкие возможности отбора.

Что важно – есть возможность сохранить в ИБ настроенные отборы для дальнейшего использования. Так, например, можно зафиксировать сегменты партнеров.

Создание произвольного отбора в управляемой форме с использованием СКД

В уроке рассмотрена работа с компоновщиком настроек схемы компоновки данных:

  • Вывод отбора на форму
  • Программная связь компоновщика настроек и схемы компоновки
  • Создание отборов по умолчанию в СКД.

1. Создание произвольного отбора в управляемой форме с использованием СКД

Получение данных из базы с фильтрацией по отбору СКД

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

Используется “страшный” объект – ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений.

На самом деле, не все так сложно – за 8 минут мы решаем поставленную задачу.

2. Получение данных из базы с фильтрацией по отбору СКД

Хранение отборов СКД в информационной базе

В уроке рассмотрим сохранение настроек компоновщика СКД с помощью Хранилища значений.

Разбираемся, как решить эту задачу в конфигурации “1С:Управление производственным предприятием 1.3”.

3. Хранение отборов СКД в информационной базе

Приятного просмотра! :)

Вообще, СКД предоставляет массу возможностей.

Вот несколько “фишечек”, которые мы даже не успели описать на странице курса.

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

Можно пытаться составлять один “универсальный” запрос для всех данных (долго), можно в цикле выводить данные нескольких запросов (жесткая, негибкая структура) – а можно просто задействовать СКД и соединение наборов данных вместо одного запроса.

При этом важно получить корректные итоги – в этом есть особенности, если источников несколько

При помощи СКД можно просто получить срез последних на каждую дату в отчете.

Или, для наглядности, – получить цену товара на каждую дату продажи.

С помощью СКД можно организовать вывод в отчет всех дат за период, а не только тех, на которые были данные в отчете (дополнение дат без программирования, только возможностями СКД)

С помощью СКД можно организовать вложенные группировки с дополнением периодов (год/квартал/месяц и т.д.)

Произвольно оформить отчет, например, вывести заголовок колонки вертикально, а данные в этой колонке – горизонтально.

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

Как в отчете соединить несколько условий по ИЛИ? Такой возможности, например, в построителе отчета нет – но есть в СКД

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

Безусловно, здесь есть и нюансы, на которые нужно обращать внимание

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

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

При добавлении в отчет детализации до документа-регистратора система иногда выдает “некорректные” начальные и конечные остатки.

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

Результат отчета может измениться в зависимости от того, где настроен отбор по значению ресурса – на уровне отчета и на уровне отдельной группировки, за этим нужно следить.

Если Вы хотите профессионально освоить СКД и ежедневно применять в своей работе, записывайтесь на курс:

«Профессиональная разработка отчетов в 1С 8.3 на Системе Компоновки Данных (СКД)»

Поддержка – 2 месяца. Объем курса – 34 учебных часа.

Описание курса

Не откладывайте свое обучение!

Комментарии / обсуждение (62):

  1. also11

    Добрый день!
    Можно ли удалить (скрыть) отдельные элементы из “доступныеполяотбора “?
    Спасибо.

    • Василий Ханевич

      Добрый день!
      Можно только настроить ограничение по использованию условий для поля набора данных или его вложенных полей:
      Ограничение поля

      • also11

        С этим сложно. Вопрос касается ЗУП 3.1. Запрос СКД формируется с помощью программного интерфейса. ” ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеИсточникиДанныхОтчета(СтруктураОбъект, СоответствиеПолей);”
        В результате этого в “доступныеполяотбора” попадают элементы, которые пользователь не хочет видеть при нажатии кнопки “Добавить условие” в отборе. Что можете посоветовать?
        Спасибо.

        • Василий Ханевич

          Можно попробовать программно изменить получившийся набор данных – снять в нем ограничения условий для ряда полей, например, переопределить этот метод при помощи расширения.

  2. Александр

    Добрый день. Спасибо за предоставленный материал. Возникла проблема с подбором групп в отбор. Если установть вид отбора “в группе”, то открывается форма справочника с возможностью выбора групы. Если установить вид отбора “в группе из списка”, то открывается форма списка, в который нужно добавить группы. Из формы этого списка открывается форма справочника без возможности выбора групп. Только элементы. Как решить данную проблему? Спасибо.

    • Александр

      Разобрался сам. По логике платформы все правильно. При значении отбора “в группе” нужно открывать форму выбора группы. При значении отбора “в группе из списка” нужно открывать форму списка. Разработчики конфигурации не предусмотрели возможность выбора группы из списка.

  3. ddok

    Здравствуйте, м.б. не в тему, но как мне, например, программно (не нажимая на пиктограмму корня) развернуть/свернуть дерево динамического списка, которое группируется при помощи компоновщика настроек?

    • Василий Ханевич

      Добрый день!
      В БСП в общем модуле СтандартныеПодсистемыКлиент есть готовая процедура РазвернутьУзлыДерева, которая разворачивает узлы дерева на форме.
      В процедуре используется метод Развернуть таблицы формы. По аналогии можно использовать метод Свернуть для сворачивания дерева.

      • ddok

        Василий, благодарю, но не работает…
        Пишу:
        СтандартныеПодсистемыКлиент.РазвернутьУзлыДерева(ЭтаФорма, “Список”, “*” , Истина);

        Ошибка:
        {ОбщийМодуль.СтандартныеПодсистемыКлиент.Модуль(861)}: Метод объекта не обнаружен (ПолучитьЭлементы)
        Узлы = Форма[ИмяЭлементаФормы].ПолучитьЭлементы();

        • Василий Ханевич

          Предполагаю, что дело в типах данных. В комментарии перед процедурой есть комментарий:
          ИмяЭлементаФормы – Строка – имя элемента с таблицей формы (деревом значений) и связанного с ней реквизита формы (должны совпадать).
          А в Вашем случае получается, что Список – это не дерево значений. Поэтому данный метод и не работает.

          Значит, идентификатором строки динамического списка будет ссылка справочника, который является основной таблицей списка.
          Можно попробовать выбрать программно все значения группировок и передать их в метод Развернуть:

          МассивГрупп = ...;//выбираем все группы из справочника
          Для Каждого ТекущаяГруппа Из МассивГрупп Цикл
           Элементы.Список.Развернуть(ТекущаяГруппа, Истина);
          КонецЦикла;

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

          • ddok

            Все не так (жаль, невозможно присоединить снимок), постараюсь описать на словах.

            Есть форма справочника “Файлы”. Справочник – не иерархический.

            На форме есть элемент, он же – реквизит – “Список”. У реквизита “Список”, тип – Динамический список. У элемента “Список”, отображение – Дерево.

            Так же есть реквизит – “Файл”, тип – СправочникСсылка.Файлы.

            В этом динамическом списке – “Список”, отображены UNC-пути к файлам.

            Этот список можно настраивать стандартным интерфейсным механизмом – Настройка списков.

            Список имеет многоуровневую группировку.

            Задача: необходимо кнопкой сворачивать/разворачивать многоуровневую группировку.

            У меня это получается при помощи кода:
            ВершинаДерева = Элементы.Список.ТекущаяСтрока;
            Если Элементы.Список.Развернут(ВершинаДерева) Тогда
            Элементы.Список.Свернуть(ВершинаДерева);
            Иначе
            Элементы.Список.Развернуть(ВершинаДерева, Истина);
            КонецЕсли;

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

            Используемая конфигурация: 1С:PM Управление проектами.

            • Василий Ханевич

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

  4. Алексей

    Не совсем понятно, зачем помещать во временное хранилище схему, в одном и том же серверном вызове ?, вроде как КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СКД)) норм отрабатывает… и второй вопрос получения макета для встроенных объектах, лучше получать через статический метод менеджера объекта: Обработка.МояОбработка.ПолучитьМакет(«СКД») ? чем РеквизитФормыВЗначение, чтобы не трать время на конвертацию и получения объекта.

    • Василий Ханевич

      Добрый день!
      1. Разработчики платформы рекомендуют для управляемых форм применять такой способ – поместить схему во временное хранилище и инициализировать источник доступных настроек полученным адресом:

      &НаСервере
      Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
         
          СКД = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет");
          АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(СКД, УникальныйИдентификатор);
         
          ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресВоВременномХранилище);
          КомпоновщикНастроек.Инициализировать(ИсточникНастроек);
          КомпоновщикНастроек.ЗагрузитьНастройки(СКД.НастройкиПоУмолчанию);
         
      КонецПроцедуры

      В противном случае может возникать непонятное поведение системы, например, в пользовательском режиме список доступных полей отбора окажется пустым.
      Тут дело в том, что в управляемом приложении на клиенте схема компоновки данных отсутствует. Подробнее в статье на сайте ИТС – Редактирование настроек для не основной схемы компоновки данных.

      2. Для объектов из основной конфигурации можно использовать указанный фрагмент кода, чтобы не получать сам объект:

      Обработка.МояОбработка.ПолучитьМакет("СКД")

      В типовых конфигурациях в большинстве случаев так и делается.

      Но если мы создаем внешнюю обработку, то так сделать не получится, поэтому выполняем конвертацию реквизита формы в значение:

      РеквизитФормыВЗначение("Объект").ПолучитьМакет("СКД")
      • Алексей

        В моем пониманию временное хранилище это переменная на сервере доступная по адресу и предназначена для хранения объектов доступных только на сервере или данных которых нет смысла гонять сервера на клиент туда-сюда, чтобы не нагружать канал и используется временное хранилище именно для межсерверных вызовов. В одном серверном вызове мы туда поместили данные, на клиент передали адрес и во втором серверном вызове по адресу используем. А так получается в одном контексте условно – переменная А = 1, мы эту переменную помещаем в хранилище и по адресу получаем значение 1, если это значение и так доступно нам, что и вызывает недоумение. Я извиняюсь за дотошность, но либо я чего-то недопонимаю по работе временного хранилище, либо это просто надо запомнить как аксиому для Компоновщика ?

        • Василий Ханевич

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

          Как этот нюанс объясняют разработчики платформы?
          Лейбович Максим (1С, Москва)
          Источник на основании схемы нельзя использовать в управляемом приложении, т.к. на клиенте схема компоновки данных отсутствует.

          https://partners.v8.1c.ru/forum/t/1245259/m/1246544

          Действительно, работа пользователя с компоновщиком настроек происходит на клиенте (например, настройка структуры отчета, отборов и т.д.). На клиенте схема компоновки данных недоступна. В Синтакс-помощнике смотрим доступность: сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
          Поэтому чтобы на клиенте корректно отображались доступные поля используется именно адрес во временном хранилище.

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

  5. Александр

    Можно ли в одном компоновщике объединить отборы по несвязанным таблицам, без умножения таблиц?
    Раньше работала схема.
    ВЫБРАТЬ
    Контрагенты.Ссылка КАК Контрагент,
    NULL КАК Номенклатура
    ИЗ
    Справочник.Контрагенты КАК Контрагенты

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    NULL,
    Номенклатура.Ссылка
    ИЗ
    Справочник.Номенклатура КАК Номенклатура

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

    • Василий Ханевич

      Добрый день!
      В таком случае нужно в наборе данных – запросе снять галочку Автозаполнение, в тексте запроса при помощи фигурных скобок явно сказать системе, какие выбранные поля будут в запросе, как именно следует обрабатывать отборы:

      ВЫБРАТЬ
          Контрагенты.Ссылка КАК Контрагент,
          NULL КАК Товар
      {ВЫБРАТЬ
          Контрагент.*,
          Товар.*}
      ИЗ
          Справочник.Контрагенты КАК Контрагенты
      {ГДЕ
          Контрагенты.Ссылка.* КАК Контрагент}

      ОБЪЕДИНИТЬ ВСЕ

      ВЫБРАТЬ
          NULL,
          Товары.Ссылка
      ИЗ
          Справочник.Товары КАК Товары
      {ГДЕ
          Товары.Ссылка.* КАК Товар}

      Это значит, что отбор на поле Контрагент будет устанавливаться только в первом запросе объединения, а отбор на поле Товар – только во втором.

  6. geimer90

    Добрый день!
    На форме есть Таблица с типом значения “КомпоновщикНастроек.Настройки.Отбор”.
    Мне в эту таблицу нужны дополнительные колонки с моими данными.
    Возможно ли это реализовать?
    Колонки таблицы создать могу, но мне их надо связать с данными.
    В реквизите КомпоновщикНастроек новых колонок добавить не могу.

    • Василий Ханевич

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

  7. Екатерина

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

  8. Сергей Фирсаев

    2 видео посвящены управляемым формам, в третьем видео рассмотрено сохранение настроек в обычном приложении УПП 1.3. Как провести сохранение настроек в управляемых формах ?

    • Василий Ханевич

      Добрый день!
      Логика будет такая же. В реквизите справочника с типом ХранилищеЗначения можно записать настройки компоновки. При открытии формы обращаться к этому реквизиту, получать сохраненные настройки компоновки, отображать отборы на форме.

      • Power_on

        А что насчёт сохранения параметров внешней обработки? А именно отбора компоновщика вынесенного на форму?

        • Василий Ханевич

          Добрый день!
          В таком случае для реквизита формы (КомпоновщикНастроек.Настройки.Отбор) можно установить галочку сохранения данных в настройках:
          Отборы

  9. psy_sln

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

    • Василий Ханевич

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

      • psy_sln

        Спасибо за ответ! реализовал через тип ОтборКомпоновкиДанных, в этом очень помогло видео с разбором упп

          • psy_sln

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

            • Василий Ханевич

              Добрый день!
              Разработчики платформы рекомендуют для управляемых форм применять именно способ, который показывается в видеоуроках, – поместить схему во временное хранилище и инициализировать источник доступных настроек его адресом. В противном случае может возникать непонятное поведение системы, например, в пользовательском режиме список доступных полей отбора окажется пустой.
              Это связано с тем, что в управляемом приложении на клиенте схема компоновки данных отсутствует.
              Предполагаю, что ваша ситуация связана с этими же особенностями системы.
              Подробности есть в статье на сайте ИТС – Редактирование настроек для не основной схемы компоновки данных.

  10. andreyka

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

    • Василий Ханевич

      Добрый день!
      В общем случае – нет. В зависимости от отборов в настройках компоновки будет изменяться текст запроса. Поэтому только после выполнения запроса, можно будет узнать, есть ли в результате искомый элемент.

  11. vittally

    Жалко, что не показали, как выводить результат отбора при помощи СКД в отдельную таблицу. Все таки пользователи любят, когда они видят результат отбора и могут его редактировать.

    • Василий Ханевич

      Согласен, удобство работы пользователей – это очень важно. В программном коде мы получили таблицу значений, осталось ее визуализировать, здесь потребуется небольшая доработка.

      • Евгений

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

  12. Юлия Толстых

    Добрый день, Владимир!
    Счет на оплату отправлен на Ваш E-mail. Реквизиты стандартно сохраняются в профиле. Возможно, причина в том, что Вы сохраняли реквизиты под другой учетной записью (у Вас их в интернет-магазине три).

  13. Андрей

    По Первому видео.

    Метод Инициализировать()
    Доступность:
    Сервер, толстый клиент, внешнее соединение.

    Как можно использовать данные метод на тонком клиенте?

    На сервере все прекрасно отрабатывает в таком варианте:

    СКД = РеквизитФормыВЗначение(“Объект”).ПолучитьМакет(“Макет”);
    ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СКД);
    КомпановщикНастроек.Инициализировать(ИсточникНастроек);
    КомпановщикНастроек.ЗагрузитьНастройки(СКД.НастройкиПоУмолчанию);

    • Василий Ханевич

      Добрый день!
      В первом видео как раз используем метод Инициализировать() в процедуре ПриСозданииНаСервере(), т.е используется он на сервере.
      По второму вопросы разработчики платформы рекомендуют для управляемых форм применять именно изложенный способ – поместить схему во временное хранилище и инициализировать источник доступных настроек его адресом. В противном случае может возникать непонятное поведение системы, например, в пользовательском режиме список доступных полей отбора окажется пустой.
      Тут дело в том, что в управляемом приложении на клиенте схема компоновки данных отсутствует. Подробнее в статье на сайте ИТС – Редактирование настроек для не основной схемы компоновки данных.

      • Андрей

        Благодарю за ответ. У меня список доступных полей был пустым в обоих случаях, а выбранные поля отбора были помечены как удаленные. В чем может быть проблема?

        • Василий Ханевич

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

    • ZaytsevStepan

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

  14. Андрей Сироткин

    Добрый день!
    Подскажите, пожалуйста, в курсе освещены отличия СКД в управляемом и неуправляемом приложениях?

    • Василий Ханевич

      Добрый день!
      В курсе отмечаем некоторые особенности при работе с пользовательскими настройками, свойствами полей компоновки. Основной акцент делается на управляемое приложение. Остальные вопросы можем рассмотреть в рамках мастер-группы.

  15. Строганов Александр

    Скажите, а где лучше посмотреть информацию о том, как использовать по максимуму на уровне пользователя возможности отчетов, выполненных с помощью СКД?

    • Евгений Гилев (Мастер-тренер)

      Отдельного курса на эту тему не делали.
      Обычно во всех наших курсах по типовым конфигурациям есть уроки по настройке отчетов на СКД.

      А текущем курсе по СКД мы уделили этому вопросу пристальное внимание – этому посвящено отдельное занятие.
      Рассматриваем настройку отчетов на примере типовых – УТ 11, ЗУП 3.0, УНФ 1.6.

  16. rozer76@yandex.ru

    СКД вообще странно ведет себя с ФУ – недавно делал отчет в УТ11.2 где в самодельный макет выводиться “РасчетныйПараметр”=”Что_То”+”Остаток_по_регистру_РасчетыПоЭквайрингу”. Так вот если эквайринг выключен – “РасчетныйПараметр” становиться NULL даже при проверке на NULL при расчете “Остаток_по_регистру_РасчетыПоЭквайрингу”.

  17. alehinsasha

    СКД не дружит с функциональными опциями: Выполнить(Схема, Настройки, ДанныеРасшифровки, МакетОформления, ТипГенератора, ПроверятьДоступностьПолей, ПараметрыФункциональныхОпций) ПараметрыФункциональныхОпций – игнорируется. Ни в одной типовой и БСП не нашел использования этого параметра.

    • Василий Ханевич

      Добрый день!
      Также не встречал в типовых конфигурациях использования этого параметра метода. Предлагаю остановиться на этом вопросе в рамках мастер-группы.

    • Константин

      Хрусталева. Разработка сложных отчетов. Страница 119. Вроде как дружит все-таки.

      • Василий Ханевич

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

Добавить комментарий

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

Вход на сайт

Зарегистрироваться

Подтверждение регистрации будет отправлено на указанный e-mail.

Я подтверждаю, что ознакомлен(а) с Пользовательским соглашением, принимаю его условия и даю свое согласие на обработку моих персональных данных.

Восстановить доступ

E-mail или логин

Ссылка на создание нового пароля будет отправлена на указанный e-mail.