СКД. Использование Менеджера временных таблиц в системе компоновки

03.11.21

Разработка - СКД

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

 

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

Напомню, раньше при попытке подцепить временную таблицу, не описанную в запросе, СКД выдавала ошибку.

И для использования внешних источников данных приходилось использовать Набор данных объект.

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

 

С выходом платформы 8.3.17 ситуация в корне поменялась.

 

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

 
 Примерный состав регистров по кадровым данным

Либо воспользоваться механизмом представлений, который тоже имеет свои ограничения и нюансы. И да, временные таблицы в запросе все равно пришлось бы описывать.

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

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

 
 Пишем простенький запрос в наборе данных СКД

Как можно заметить, таблица ВТКадровыеДанныеСотрудников в запросе появляется сразу в соединении с основной таблицей, без ее предварительного объявления. Для того, чтобы компоновщик настроек мог понять, с каким типами данных из временной таблицы он имеет дело, желательно прописать это в тексте запроса, используя выражения языка запросов ВЫРАЗИТЬ(ВТ.ЗначениеПоля КАК <Описание типа>) или ЕСТЬNULL(ВТ.ЗначениеПоля, <Пустое значение такого же типа>). Для составных типов можно будет использовать выражение ВЫБОР КОГДА с последовательным описанием типов.

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

 
  Текст процедуры ПриКомпоновкеРезультата

Само получение данных и помещение их в менеджер временных таблиц занимает ровно две строки

КадровыеДанные = КадровыйУчет.КадровыеДанныеСотрудников(Истина,, "Подразделение, Должность, ГрафикРаботы, ВидЗанятости", МесяцНачисления);
ЗарплатаКадры.СоздатьВТПоТаблицеЗначений(МенеджерВременныхТаблиц, КадровыеДанные, "ВТКадровыеДанныеСотрудников", Истина);

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

Данный механизм работает в том числе и в режиме совместимости (я проверял на 8.3.14).

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

За рамками статьи остались некоторые вопросы вроде производительности и нагрузки на сервер. 

Всем удачного кодинга!

P.S. Кратко не получилось )

СКД МенеджерВременныхТаблиц

См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    122174    670    389    

714

Генератор схемы компоновки данных (СКД), написание кода схемы программно

Инструментарий разработчика СКД Платформа 1С v8.3 Конфигурации 1cv8 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

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

3 стартмани

05.02.2024    4041    25    obmailok    17    

63

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2000    2    Yashazz    0    

29

СКД на JavaScript в 1С

СКД WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Долгое время поддерживаю web-портал, в котором появилась необходимость создавать отчеты. Просмотрев различные фреймворки на js, я решил сделать свое решение, которое позволяло бы быстро разрабатывать и добавлять новые отчеты на web-портал.

2 стартмани

11.12.2023    8161    20    John_d    25    

123

Использование менеджера временных таблиц в СКД

СКД Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

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

05.12.2023    4656    PROSTO-1C    13    

61

Модель СКД

Инструментарий разработчика СКД Платформа 1С v8.3 Система компоновки данных Абонемент ($m)

DSL для работы с СКД.

1 стартмани

15.11.2023    5807    15    kalyaka    5    

86

Пользовательские настройки отчетов 1С. Часть 1. Простые и расширенные настройки

СКД Инструкции пользователю Платформа 1С v8.3 Конфигурации 1cv8 1С:Бухгалтерия 3.0 Россия Бесплатно (free)

Простые приемы работы с отчетами на СКД. Что нужно знать пользователю про настройку отчетов, чтобы использовать их на полную катушку.

18.09.2023    6703    accounting_cons    5    

29

Разрыв страницы в СКД. Легко!

СКД Платформа 1С v8.3 Система компоновки данных Бесплатно (free)

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

01.09.2023    4520    KVIKS    15    

80
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. tormozit 7136 29.04.20 08:19 Сейчас в теме
Довольно важный вопрос не освещен - типы доступных полей из внешних временных таблиц компоновщику настроек будут непонятны и потому будет много ограничений при работе в с ними в настройках компоновки. Чтобы их обозначить, следует использовать функцию по-прежнему ВЫРАЗИТЬ(), но для полей составных типов все опять же будет сложно.
ВЫБРАТЬ
	Хозрасчетный.Код КАК Код, 
	ВЫРАЗИТЬ(вт.пппп КАК Справочник.Валюты) КАК пппп 
ИЗ
	ПланСчетов.Хозрасчетный КАК Хозрасчетный
	левое соединение вт по истина
mrChOP93; ubnkfl; mark_oilbass; JohnyDeath; TerveRus; Yashazz; +6 Ответить
2. ixijixi 1775 29.04.20 09:08 Сейчас в теме
(1) Согласен, важное замечание, дополню статью.
7. kiruha 388 30.04.20 16:55 Сейчас в теме
(1)
ВЫБРАТЬ
ПОДСТРОКА(Хозрасчетный.Код,20) КАК Код, 
ВЫБОР КОГДА вт.пппп ССылка Справочник.Валюты Тогда ВЫРАЗИТЬ(вт.пппп КАК Справочник.Валюты)
              КОГДА вт.пппп ССылка Справочник.моиВалюты Тогда ВЫРАЗИТЬ(вт.пппп КАК Справочник.моиВалюты)
              КОНЕЦ КАК ппп
ИЗ
    ПланСчетов.Хозрасчетный КАК Хозрасчетный
    левое соединение вт по истина
Показать

(1)
TerveRus; +1 Ответить
8. tormozit 7136 30.04.20 17:10 Сейчас в теме
(7)
1. В первой строке ты ошибся =) Функция Подстрока требует 3 параметра.
2. Очень замороченный способ для полей составного типа. Можно проще и короче
ВЫБРАТЬ
ПОДСТРОКА(Хозрасчетный.Код, 1, 20) КАК Код, 
ВЫБОР КОГДА Ложь Тогда ЗНАЧЕНИЕ(Справочник.Валюты.ПустаяСсылка)
	КОГДА Ложь ТОГДА ЗНАЧЕНИЕ(Справочник.МестаХранения.ПустаяСсылка)
ИНАЧЕ вт.пп
КОНЕЦ КАК ппп
ИЗ
    ПланСчетов.Хозрасчетный КАК Хозрасчетный
    левое соединение вт по истина
Показать
triera2000; i132; begemot; mrChOP93; o.nikolaev; ubnkfl; Lapitskiy; JohnyDeath; Krio2; ixijixi; +10 Ответить
9. zaxarovsky 111 02.05.20 11:04 Сейчас в теме
(8)
ВЫБОР КОГДА Ложь Тогда ЗНАЧЕНИЕ(Справочник.Валюты.ПустаяСсылка)
КОГДА Ложь ТОГДА ЗНАЧЕНИЕ(Справочник.МестаХранения.ПустаяСсылка)
ИНАЧЕ вт.пп
КОНЕЦ КАК ппп


Вопрос: это есть такой синтаксис для ВЫБОР? Не встречал такого.
10. ixijixi 1775 02.05.20 11:07 Сейчас в теме
(9) Ну, синтаксис формально не нарушает правила, поэтому это будет работать. В контексте публикации он служит для того, чтобы описать все возможные типы поля временной таблицы
13. zaxarovsky 111 02.05.20 11:21 Сейчас в теме
(10) Снача не понял эту конструкцию.
Теперь прояснилось, спасибо!
11. tormozit 7136 02.05.20 11:09 Сейчас в теме
(9) Лучшее убеждение в верности какого то утверждения - самостоятельная его проверка.
12. zaxarovsky 111 02.05.20 11:17 Сейчас в теме
(11) Проверил. Работает! :)
Полезная же штука!
40. _Alexei_ 20.08.21 14:03 Сейчас в теме
постоянно использую
аналогичен ИначеЕсли
26. tormozit 7136 05.05.20 18:25 Сейчас в теме
(8) В конструкторе запроса ИР 5.30 добавил кнопку для генерации таких конструкций
Прикрепленные файлы:
madway; JohnyDeath; Totoro; user1301636; ubnkfl; begemot; mrChOP93; Andreeei; artir; ixijixi; +10 Ответить
3. German_Tagil 42 29.04.20 12:40 Сейчас в теме
Руками бы пощупать
Буквально на прошлой неделе была проблема
с запросом Объектом так хотелось его проанализировать.
Тогда сразу же вопрос а объект можно каким то образом описать через данный механизм?
4. ixijixi 1775 29.04.20 14:22 Сейчас в теме
(3) Источником набора данных объект могут быть
-наборы записей регистров,
-таблицы значений,
-табличная часть,
-результат запроса,
-область ячеек табличного документа,
-прикладной объект

Про менеджер ВТ ничего не сказано. Хотя логика подталкивает к такому его применению.

Надо будет на досуге попробовать.
5. German_Tagil 42 30.04.20 08:07 Сейчас в теме
можно вопрос?

СтруктураПараметров = Новый Структура;
	СтруктураПараметров.Вставить("Период", НастройкиОтчета.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Период")));
	СтруктураПараметров.Вставить("Организация", НастройкиОтчета.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Организация")));
	ДанныеОтражения = ЗаполнитьДанныеОтражения(СтруктураПараметров);
	
	СтандартнаяОбработка = Ложь;
	
	ДокументРезультат.Очистить();
	
	ВнешниеНаборыДанных = Новый Структура;
	ВнешниеНаборыДанных.Вставить("ДанныеОтражения", ДанныеОтражения);
Показать



это передача Объекта

а с менеджером временных таблиц правильно как написать?
6. ixijixi 1775 30.04.20 09:00 Сейчас в теме
(5) МВТ подключается к схеме компоновки в момент инициализации процессора компоновки последним параметром.
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных,, ДанныеРасшифровки, Истина,, МенеджерВременныхТаблиц);
14. Yashazz 4709 04.05.20 10:57 Сейчас в теме
Не нашёл в публикации раскрытия содержимого функции "КадровыеДанныеСотрудников". Автор, а ничо, что не у всех есть ЗУП под рукой?
15. ixijixi 1775 04.05.20 11:10 Сейчас в теме
(14) Уважаемый Yashazz, вы же прекрасно понимаете, что суть публикации не в этом? )
mrChOP93; echo77; user1276813; +3 Ответить
16. Yashazz 4709 04.05.20 11:16 Сейчас в теме
(15) ну если уж делать обзор новинки платформы, то делать универсально, а не вот так вот...
17. Yashazz 4709 04.05.20 11:26 Сейчас в теме
Да и вообще не вижу особенного смысла страстно кидаться разбирать анонсированные и новые функционалы. Нам в зазеркалье много чего обещали, и все мы это читали и знаем. А вот до нормальной работоспособной механики все подобные новшества доходят релиза через 3-5 после появления, попутно мутировав, иногда весьма сильно. Так что ценность публикации сомнительна... Анонс мы и так знаем, а конкретику ещё допилят и перепилят...
18. tormozit 7136 04.05.20 11:37 Сейчас в теме
19. Yashazz 4709 04.05.20 11:47 Сейчас в теме
(18) Релиза)) Через 3-5 релизов. Вспомним УФ как таковые, настройки динамических списков, асинхроны немодальные... Ну а уж про бредовое позорище под названием "расширения" вообще молчу)
22. acanta 04.05.20 12:17 Сейчас в теме
(19) Насколько я помню, "расширения" это визуализация динамического обновления конфигурации. В качестве временной меры они однозначно лучше оного. Но если во фреше это не только постоянный, но и единственно возможный вариант...
20. ixijixi 1775 04.05.20 11:57 Сейчас в теме
(17) Я в публикации упомянул, что уже реализовал этот механизм в рабочем решении. Функционал работает на 100% и допиливать его я не вижу нужды.
user1276813; +1 Ответить
21. Yashazz 4709 04.05.20 12:06 Сейчас в теме
(20) Да не вопрос) Работает, конечно) До следующего релиза)))
...вот же есть любители устраивать грабли в продакшене... ну ничего, пару раз нарвётесь - станете осторожнее)
23. ixijixi 1775 04.05.20 14:37 Сейчас в теме
(21) Можно пару примеров таких граблей из Вашего личного опыта?
24. Yashazz 4709 05.05.20 08:26 Сейчас в теме
(23) Разное бывало, но самое "триумфальное" - расширения с возможностью "перегружать" типовые процедуры и функции. Релиз вроде 8.3.7 или 8.3.8, уже не вспомню, сделали, вроде работало, а потом механика подключения и указания этой перегрузки изменилась. Был большой скандал, потеряли крупного клиента. А так вообще надо бы вспомнить, да сделать публикацию, спасибо за мысль.
morin; ixijixi; +2 Ответить
25. triviumfan 92 05.05.20 15:39 Сейчас в теме
А почему "по-православному" пакетным запросом в одном наборе (без МВТ) это не сделать?!
Похоже, пример актуален лишь для ЗУП, только там такие извращения уместны.
27. ixijixi 1775 06.05.20 21:27 Сейчас в теме
(25) Не всё и не всегда можно посчитать запросом. Я выбрал самый выпуклый, так сказать, пример.
28. alest 21.06.20 23:09 Сейчас в теме
(25) Надо попробовать использовать в отчетах, где на каком-то из шагов в пакетных запросах двух наборов нужна одна и та же ВТ. Хотя может платформа и так оптимизирует это, кто-нибудь смотрел в скуле, дважды ли запрос исполняется в таких случаях?
29. Vodoley 1 12.11.20 14:37 Сейчас в теме
а после отработки метода
ПроцессорКомпоновкиДанных.Инициализировать( МакетКомпоновки, ,,,, МВТ);
в МВТ должны остаться временные таблицы ) ?
иногда может возникнуть ситуация, когда хотелось бы продолжить работу с ними... хотя это неочевидный видимо вариант, но темне менее.
у меня там пусто (
33. yvldmr 05.02.21 18:37 Сейчас в теме
(29)

Удалось разобраться у меня тоже пусто и ситуация необходимая?
34. Vodoley 1 08.02.21 11:05 Сейчас в теме
(33) нет - пока забил. Тут говорят читка кеша помогает )
36. yvldmr 09.02.21 00:02 Сейчас в теме
(34) тоже не разобрался. В итоге создал специальную группировку отчета в схеме и выгрузил в ТЗ (ПриКомпановкеРезультата). Задача решилась, но с МВТ было бы интересней. Группировку вкл/выкл программно.
30. zhkonst 25.01.21 12:06 Сейчас в теме
Столкнулся с такою бедою. В отчёте на СКД собираю данные из двух баз. Так вот, получаю данные из другой базы, загоняю их во временную таблицу, передаю в СКД. В двух отчётах всё ОК, данные из ВТ читаются на ура, а в третьем - не видит временную таблицу. "Таблица имярек не найдена" - и хоть в лоб стреляй. Тексты модуля уже выверил до буковки, имя временной таблицы перепроверил сто раз, в самой ВТ в менеджере данные посмотрел - всё ОК, данные есть. База одна и та же, т.е. версии платформы, режимы совместимости и т.п. одинаковые. Сижу вот, матерюсь... Уже нервы сдают. Пойти кэш почистить, чтоли...
31. zhkonst 25.01.21 12:14 Сейчас в теме
(30) Будете смеяться, но помогло. Чистка кэша, в смысле.
32. ixijixi 1775 25.01.21 15:00 Сейчас в теме
(31) Не буду)) Взял себе за правило: столкнулся с непонятной фигнёй - чисти кэш.
35. Vodoley 1 08.02.21 11:08 Сейчас в теме
(30)
Пойти кэш почистить, чтоли...

вы имеете в виду кеш сервера? (который чтоб почистить - стопорнуть сервер и грохнуть папочку одну в каталоге кластера?)
37. zhkonst 11.02.21 12:47 Сейчас в теме
(35) не-не, обычный локальный кэш. Почистил - и всё завертелось.
38. artir 22.02.21 19:20 Сейчас в теме
Не вижу внутри ПриКомпоновкеРезультата
СтандартнаяОбработка = Ложь
это так надо или не добавили ?
superkuzja; +1 Ответить
39. superkuzja 3 09.06.21 08:24 Сейчас в теме
(38) Код в статье без этой команды не приведет к желаемому результату... Автору стоит добавить эту строку в листинг.
41. leosoft 165 23.09.21 12:44 Сейчас в теме
Я не понял - в запросе схемы вручную прописываем поля временной таблицы?
42. ixijixi 1775 23.09.21 12:56 Сейчас в теме
(41) Вручную или конструктором.
43. leosoft 165 23.09.21 14:04 Сейчас в теме
(42) А как конструктор "увидит" ВТ?
Если вместо объекта для ТЗ использовать МВТ - все равно вручную надо будет прописывать!
44. ixijixi 1775 23.09.21 14:37 Сейчас в теме
(43) В конструкторе запроса есть конструктор временных таблиц)) Но да, имена колонок тоже вручную.
Прикрепленные файлы:
45. echo77 1868 03.11.21 05:53 Сейчас в теме
Спасибо за обзор как это работает!
В примере процедуры ПриКомпоновкеРезультата я бы еще добавил:
СтандартнаяОбработка = Ложь;

- периодически про это забываю и вместо одного скомпанованного отчета получаю два :-)
46. SizovE 262 26.11.21 14:21 Сейчас в теме
Жаль, что не работает эта штука в КомпоновщикНастроекКомпоновкиДанных, и Новый КомпоновщикМакетаКомпоновкиДанных такое тоже не поддерживает.

КомпоновщикНастроек =  Новый КомпоновщикНастроекКомпоновкиДанных;
	КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
47. ixijixi 1775 26.11.21 14:29 Сейчас в теме
(46) По идее КомпоновщикНастроек с данными не работает, так что ему это и не нужно
48. SizovE 262 26.11.21 19:42 Сейчас в теме
(47) У меня работает )
СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
	
		НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
		НаборДанных.ИсточникДанных = "ИсточникДанных";	
		НаборДанных.Имя 	= "НаборДанных";
		НаборДанных.Запрос	= ТекстЗапроса;
	
КомпоновщикНастроек =  Новый КомпоновщикНастроекКомпоновкиДанных;
	КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
Показать
49. user1209971 74 08.05.23 23:10 Сейчас в теме
Спасибо за статью, не раз возвращался к ней
Добавлю что для полей составного типа не обязательно использовать конструкцию
Выбрать когда .. выразить, можно в настройках поля указать Тип, установив галку составной, см. вложения
Да в таком варианте нельзя настроить отбор или поля методом нащёлкать мышкой, но можно установить программно.
В моё конкретном случае, этого хватило чтоб настроить отборы и структуру программно по полям менеджера таблиц
Прикрепленные файлы:
Дмитрий74Чел; ixijixi; +2 Ответить
50. ixijixi 1775 09.05.23 00:11 Сейчас в теме
51. lvictor58 135 08.12.23 18:13 Сейчас в теме
Что-то у меня не получилось данные из МВТ напрямую вывести в отчет. Или Для этого надо для СКД на закладке "Настройки" программно прописывать выбранные поля?
52. lvictor58 135 08.12.23 18:54 Сейчас в теме
Спасибо. разобрался. Надо было просто внимательно прочитать статью. Повторил текст запроса, создания МВТ в текст запроса СКД. По ним сформировались поля где осталось только указать тип значения Но все же это проще чем создавать таблицу объекта!
53. AneJIbcuH 37 21.02.24 21:17 Сейчас в теме
Вот ещё интересный вопрос. Всё работает, а при расшифровке пишет не найдена ВТ...
54. ixijixi 1775 22.02.24 08:51 Сейчас в теме
(53) Возможно, расшифровка формируется нестандартно. Надо отладчиком пройтись и в месте расшифровки сформировать ВТ.
55. AneJIbcuH 37 01.03.24 12:52 Сейчас в теме
(54) Разобрался. Дело в том, что отчет формировался программно по своей кнопке. Если запускам расшифровку, то срабатывает типовая процедура в модуле отчета "ПриКомпоновкеРезультата", а тут уже как в статье действовать
Оставьте свое сообщение