Эволюция расширения конфигурации

Публикация № 1190788

Разработка - Конфигурирование 1С - Расширения

Расширение конфигурации история эволюция

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

 

Введение

Думаю, многие слышали, а некоторые уже активно пользуются новым механизмов работы в 1С!?

Начиная с версии 1С:Предприятие 8.3.6.1977 (29.04.2015) в платформе введен новый механизм – расширение конфигурации.

Давайте попробуем ответить на вопросы: Что такое расширение конфигурации и для чего оно нужно?

Как фирма 1С позиционирует расширение конфигурации, можно узнать на официальном сайте.

Что такое расширение конфигурации?

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

Для чего нужно расширение конфигурации?

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

Снятие с полной поддержки влечет за собой ряд неудобств:

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

Использование расширения исключает все эти неудобства с поправкой на релиз платформы. В начале на платформе 8.3.6 было доступно мало возможностей по сравнению с тем, что можно сделать на платформе 8.3.17. Давайте пройдется по истории развития расширения конфигурации, чтобы начать использовать все возможности, которые нам предоставили разработчики платформы!

Эволюция

Таблица сравнения функционала расширений по версиям платформы

 
 Версия 8.3.18
 
 Версия 8.3.17
 
 Версия 8.3.16
 
 Версия 8.3.15
 
 Версия 8.3.14
 
 Версия 8.3.13
 
 Версия 8.3.12
 
 Версия 8.3.11
 
 Версия 8.3.10
 
 Версия 8.3.9
 
 Версия 8.3.8
 
 Версия 8.3.7
 
 Версия 8.3.6

Материал таблицы подготовлен по данным официальных обновлений.

А теперь давайте сделаем выжимку из таблицы сравнения и составим дерево эволюции только доступных объектов для расширения:

 
Версия 8.3.18 

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

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

P.S. Если материал вам помог, поблагодарите автора, поставив плюс!

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. VKislitsin 06.02.20 20:17 Сейчас в теме
Максим, спасибо за сборку в одном месте!

От себя добавлю одну "недодокументированность", связанную с расширениями.
Пакетный режим запуска Конфигуратора также обзавелся ключом -Extension <ИмяРасширения> для многих операций, которые можно применить к расширениям, например, обновление из Хранилища, загрузка, выгрузка, обновление конфигурации БД и другие.
Однако при попытке обновления конфигурации БД с указанием -Extension <ИмяРасширения> Платформа упорно выдавала мне ошибку "Ошибка в параметрах командной строки". Экспериментально удалось установить что с этим ключом конфликтует ключ "-Server". Вероятно, к расширениям он неприменим.
2. Xershi 1020 06.02.20 21:00 Сейчас в теме
(1)
Реализован параметр командной строки -Extension для ключей командной строки СonfigurationRepositoryAddUser, ConfigurationRepositoryBindCfg, ConfigurationRepositoryDumpCfg, ConfigurationRepositoryClearCache, ConfigurationRepositoryClearGlobalCache, ConfigurationRepositoryClearLocalCache, ConfigurationRepositoryCommit, ConfigurationRepositoryCopyUsers, ConfigurationRepositoryCreate, ConfigurationRepositoryLock, ConfigurationRepositoryOptimizeData, ConfigurationRepositoryReport, ConfigurationRepositorySetLabel, ConfigurationRepositoryUpdateCfg, ConfigurationRepositoryUnbindCfg, ConfigurationRepositoryUnlock.
в 8.3.12 про этот параметр идет речь. На платформе ранее мог использоваться?
11. VKislitsin 07.02.20 11:23 Сейчас в теме
(2) Параметр документирован. Речь о том, что он может конфликтовать с другими параметрами, о чем в документации не сказано.
12. Xershi 1020 07.02.20 11:25 Сейчас в теме
(11) да такое бывает. Иногда нужно почитать про смежные параметры, чтобы понять что они не совместимы и явно в справке про это не написано. Иногда такие репорты пишу разработчикам и возможно в будущих релизах они это дополнят.
3. PhoenixAOD 59 07.02.20 03:25 Сейчас в теме
Отличная статья, все в одном месте, жаль, что еще регламентные задания нельзя добавлять свои в расширение.
6. pm74 179 07.02.20 07:48 Сейчас в теме
(3) в метаданные нет , но можно
7. PhoenixAOD 59 07.02.20 07:55 Сейчас в теме
(6)ну я только знаю про внешнюю обработку по расписанию
starik-2005; +1 Ответить
20. Darklight 22 07.02.20 15:49 Сейчас в теме
(7)Ну всё Вы знаете - а я вам ответ написал в (19) - эх....
Тогда чем не устраивает?
19. Darklight 22 07.02.20 15:48 Сейчас в теме
(3)
жаль, что еще регламентные задания нельзя добавлять свои в расширение.

На типовых конфигурациях (думаю на всех на БСП 3.х как минимум, а то и более ранних версий) можно обойти через внешние обработки - там уже давно реализован встроенный в конфигурацию механизм запуска внешних обработок (из справочника доп. обработок) по расписанию - для этого в конфигурации выделено отдельное регл. задание. Так что это не критично - достаточно легко обходится - обработка только внешней должна быть (увы - что-то привязки к доп. обработка обработок из конфигурации не сделали - хотя намёк там на это есть, ну или я просто с этим не разобрался). А у внешних обработок есть один важный КОСЯК архитектуры - у них нет модуля менеджера (вот такие вот 1С-горе архитекторы)!
Светлый ум; +1 Ответить
4. o.nikolaev 201 07.02.20 03:28 Сейчас в теме
5. MikhailDr 07.02.20 07:19 Сейчас в теме
Реализованы директивы препроцессора Удалить и Вставить.


К сожалению пока что еще не работают, хотя добавлены.
8. MVK80 07.02.20 08:04 Сейчас в теме
(5)
К сожалению пока что еще не работают, хотя добавлены.

Касательно аннотации ИзменениеИКонтроль. Работает, но не на 100%. Есть баги, о которых писал и должны появится в ближайшее время на bugboard.
Навскидку:
1. Не расширяются клиентские методы общих модулей у которых есть галочка Клиент.
2. Когда в типовой параметры процедуры или функции идут не в строку а в несколько строк, то тоже не работает расширение. Пока "выход" - "выпрямлять" типовые функции, хотя это уже изменение основной конфигурации и теряется смысл расширения.
3. Некорректно расширяются обработчики событий формы. Рекомендация расширять их как обычные процедуры и функции, а не как обработчики.

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

А в целом используем их ИзменениеИКонтроль. Рекомендую на последней платформе это делать 8.3.16.1148 там багов меньше по этому направлению, чем в предыдущих платформах.
9. MikhailDr 07.02.20 08:11 Сейчас в теме
(8) Да вот как раз неделю назад пробовал ставить расширение на общий модуль зарплаты "ОтражениеЗарплатыВБухучетеРасширенный" и конфигурация просто падала после запуска, пока не отключил.

Я думаю надо еще парочку релизов подождать. Судя по описанию механизм "ИзменениеИКонтроль" просто супер, давно этого не хватало.
21. Darklight 22 07.02.20 15:50 Сейчас в теме
(9)Не хватало.... но всё-равно он реализован через жо....
13. Xershi 1020 07.02.20 11:26 Сейчас в теме
(5) возможно конфигурация должна быть 8.3.15+. У нас пока 8.3.10 и 8.3.12=))
14. MikhailDr 07.02.20 11:40 Сейчас в теме
23. Xershi 1020 11.02.20 12:01 Сейчас в теме
(14) проверил
&ИзменениеИКонтроль("СообщитьТест")
Процедура Расш1_СообщитьТест()

	Тест = 1 + 4;
	#Вставка
	Тест = 1 + 2;
	#КонецВставки

	Сообщить(Тест);

КонецПроцедуры
Показать

Работает, если модуль серверный. Как выше писали на клиентских не работает. Возможно связано с тем что для ОФ они не реализовали, а я не обрамлял контекст.
Проверил добавление констант. Если режим совместимости расширения ниже 8.3.16, то даже не даст сохранить. Поэтому еще не скоро с константами в типовых получится играться.
28. Xershi 1020 15.04.20 11:21 Сейчас в теме
(14) проверяйте последние релизы. 1С в патчнотах объявила, что все поправила. На днях сверял с версией, которая стоит на сервере со свежими релизами.
29. MikhailDr 16.04.20 08:38 Сейчас в теме
(28) Проверил. Не работает, выходит ошибка применения расширения конфигурации. Или я делаю что-то не то. При запуске выходит сообщение

Текст модуля для метода "ДанныеДляЗаполненияТаблицДокумента" изменился

Это происходит именно в конструкции ИзмененияИКонтроль, в конструкции Вместо все работает штатно.

&ИзменениеИКонтроль("ДанныеДляЗаполненияТаблицДокумента")
Функция ОЗвУУ_ДанныеДляЗаполненияТаблицДокумента(ПараметрыДляЗаполнения)

	Организация 	 	= ПараметрыДляЗаполнения.Организация;
	ПериодРегистрации 	= ПараметрыДляЗаполнения.ПериодРегистрации;
	ДокументСсылка 		= ПараметрыДляЗаполнения.ДокументСсылка;

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

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

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

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

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

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

	Возврат РезультатЗаполнения;

КонецФункции
Показать


Код в общем модуле ОтражениеЗарплатыВБухучетеРасширенный ЗУП 3.1
30. Xershi 1020 16.04.20 08:41 Сейчас в теме
(29) на последнем 8.3.16 и 8.3.17 проверяли?
Текст функции сравнивали посимвольно?
31. MikhailDr 16.04.20 08:46 Сейчас в теме
(30) 8.3.16.1063 у нас стоит, а 8.3.17 еще на юзерс не выложили.

Текст функции скопирован из базы, там нечего сравнивать.

Попробую после обновления платформы еще раз, может поможет.
32. Xershi 1020 16.04.20 08:49 Сейчас в теме
(31) так у вас же не последний релиз. Сравнивайте патчноты. Уже есть 8.3.16.1296 31.03.20, 8.3.17.1306 26.03.20.
33. MikhailDr 16.04.20 09:02 Сейчас в теме
(32)
8.3.17.1306


Попробую чуть позже, может и правда уже работает
10. wowik 812 07.02.20 08:55 Сейчас в теме
15. samadurov 107 07.02.20 15:01 Сейчас в теме
16. Darklight 22 07.02.20 15:27 Сейчас в теме
Можно я немного пофлудю...

В релизе 8.3.17 «Реализована возможность заимствования подписок на события и создания собственных подписок в расширении.»
Действительно – долгожданное нововведение! И даже работает! Но?
В расширении нельзя изменить обработчик события! Хотя это ладана – не странно – видимо подразумевается – что для изменения обработчика в расширение нужно тянуть процедуру обработчика из расширяемой конфигурации!
А вот, за то, что в расширении можно расширить (только дополнить) состав источников события – вот это СПАСИБО!
Понятно, что чтобы туда добавить источник он должен быть либо в самом расширении, либо импортирован туда! Добавить из другого расширения нельзя – нужно расширять там!
Хотя! Нет! Сделали ещё тоже очень важную вещь! Подписки на события в конфигурации можно вешать на обобщённые типы (как я из называю, уж не знаю как правильно официально) как «СправочникОбъект», «ДокументОбъект», которые автоматически наследуют все вложенные в них типы! Вот только на определяемый тип нельзя подписаться (вернее его выбрать можно, но нельзя выбрать событие – даже если в опр. типе указан всего один тип-источник). Но ранее такие подписки из основной конфигурации не подписывали на себя объекты из расширений – ТЕПЕРЬ ПОДПИСЫВАЮТ! Причём в расширении так же можно расширить подписку на такой ОБОЩЁННЫЙ ТИП! И такая подписка будет срабатывать на ВСЕ вложенные типы – из конфигурации, из текущего расширения и других расширений! ЭТО ПРОСТО ВЕЛИКОЛЕПНО! ТО, ЧТО НАДО!
И ДАЖЕ ЕЩЁ КРУЧЕ! Ранее некоторые события нельзя было смешивать для разных объектов в одной пописке на событие. Например, событие «ПередЗаписью» нельзя было выбрать для «СправочникОбъект» и «ДокументОбъект» и назначить им один обработчик. Ну это было «почти понятно почему» – т.к. эти события имели разный формат сигнатуры обработчика! НО ТЕПЕРЬ ЭТО МОЖНО! Но толкьо через расширение! Если, скажем в конфигурации выбрать источник «ДокументОбъект» (и событие «ПередЗаписью»), а в расширении расширить эту подписку до «СправочникОбъект» - то данный обработчик БУДЕТ СРАБАТЫВАТЬ И ПЕРЕД ЗАПИСЬЮ ОБЪЕКТОВ И ПЕРЕД ЗАПИСЬЮ СПРАВОЧНИКОВ! Для справочников аргументы события «РежимЗаписи», «РежимПроведения» будут просто = «неопределено». Можно и наоборот – подписаться – тогда у обработчика просто не будет данных аргументов.
БОЛЕЕ ТОГО! МОЖНО НЕ ТОЛЬКО взять подписку из конфигурации! НО И ДОБАВИТЬ НОВУЮ ПОДПИСКУ НА СОБЫТИЕ В РАСШИРЕНИЕ!
Тогда можно указать и событие и обработчик – так же как и в основной конфигурации, включая обобщённые типы как «СправочникОбъект» и «ДокументОбъект»! ЭТО ОЧЕНЬ КРУТО!

(СКРЫТЫЙ ТЕКСТ) Жалобы жалобы жалобы (можно не читать)


Всё проверено на версии платформы "8.3.17.1091" - да она пока ещё бета, но вряд ли тут что-то изменится с выходом финальной версии!
Лично я в расширениях полностью разочаровался и больше их почти не использую! Ведь выше описаны далек не все их недостатки - а только самые яркие, непреодолимые проблемы! Модно ещё упомянуть 7. - это то, что в расширения, так до сих пор, не завезли регламентированные задания - хотя на некоторых управляемых типовых конфигурациях уже есть обходные пути - через встроенный в них механизм шедулинга выполнения внешних обработок по расписанию - это вроде фишка из БСП! Так что любой алгоритм всё-таки можно повесить на расписание не меняя основную конфигурацию!

А автору статьи спасибо за экскурс - будет полезно при выборе минимальной версии расширения для нужной функциональности!
17. Xershi 1020 07.02.20 15:33 Сейчас в теме
(16) рекомендую отписать все это в ТП. Они адекватно реагируют на пожелания в реализации новых возможностей. Так нужно понимать, что не все ресурсы бросаются на расширения и скорее всего есть некоторые проблемы совместимости.
Но чем больше таких писем будет у 1С тем быстрее они реализуют, то чего всем нужно!
Да и на заметку, обновил статью первый не бета релиз вышел в 2015 году. Про 6 лет пока перегнули=))
18. Darklight 22 07.02.20 15:37 Сейчас в теме
(17)
Да и на заметку, обновил статью первый не бета релиз вышел в 2015 году. Про 6 лет пока перегнули=))

Я отсчитывал от момента анонса!
22. OPM 230 10.02.20 16:05 Сейчас в теме
Можно добавить в расширение реквизит с типом ДокументСсылка, или СправочникСсылка.
24. AnatolPopov 72 13.02.20 18:25 Сейчас в теме
Замечание не по содержанию, а по форме ;)
Взгляните на версию для печати. Такая же кривая, какую наблюдаю я? ;)
25. Xershi 1020 13.02.20 18:40 Сейчас в теме
(24) этот вопрос адресуйте разработчикам сайта. Мне они пока ничего не ответили!
Суть сводится к работе таблиц в спойлерах. Согласитесь столько инфы так компактно сгруппировать по другому не получилось бы!
А вот как работают спойлеры должны разработчики сайта отладить.
27. Xershi 1020 01.04.20 15:32 Сейчас в теме
(24) поддержка сайта помогла все поправить, проверяйте. Должно быть все читаемо!
26. VAAngelov 73 29.02.20 14:44 Сейчас в теме
Очень полезно. Спасибо за труд. Плюс.
34. Xershi 1020 25.07.20 14:11 Сейчас в теме
Вышла версия для ознакомления 8.3.18.891 от 16.07.20.
35. ITSolncev 25.07.20 17:42 Сейчас в теме
Полезно, когда вся информация в хронологическом порядке в одном месте. +
36. dctvghbdtn 27.08.20 15:00 Сейчас в теме
У меня одного не работает расширение события ТЧ "Выбор"?
37. Xershi 1020 27.08.20 15:45 Сейчас в теме
(36) у меня пока не работает расширение критериев отбора. 1С пока невнятно ответила в чем проблема на 8.3.17 в УТ 11.4.12.
38. dctvghbdtn 27.08.20 18:39 Сейчас в теме
(36) Разобрался. Добавил вызов изменяемого события в расширение через модуль формы. А вот если мне понадобится свою обработку события в расширении сделать, то видимо не смогу, нет возможности его указать через форму документа. :( А раньше такая возможность была.
Оставьте свое сообщение

См. также

Установка расширений в 1С 8.3

Расширения v8 1cv8.cf Россия Бесплатно (free)

Краткая инструкция, как подключить расширение конфигурации в 1С.

27.07.2020    2669    Mouros    11    

Как обойти глюк механизма расширений. Пошаговая инструкция в картинках

Расширения v8 БП3.0 Бесплатно (free)

После очередного обновления Бухгалтерии 3.0 в одной очень известной фирме мне звонит наш программист 1С, который ведет эту фирму, со словами - Шеф. Все пропало. Нам конец. Наше расширение грохнулось.

26.04.2020    6220    alfanika    19    

Конвертация расширения cfe в конфигурацию сf руками

Расширения v8 1cv8.cf Бесплатно (free)

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

18.03.2020    5876    wtlz    30    

Доработки объектов метаданных и форм (только кодом) с помощью расширений на примере типовых конфигураций: 1C:ERP Управление предприятием 2.4 и 1С:Альфа-Авто: Автосалон+Автосервис+Автозапчасти КОРП 6

Практика программирования Расширения v8 1cv8.cf Россия Бесплатно (free)

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

01.02.2020    2209    байт    7    

Обработка расширением на клиенте

Расширения Универсальные функции v8::УФ 1cv8.cf Бесплатно (free)

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

31.10.2019    7063    EvgenURNN    9    

От чего можно отказаться при разработке расширений 1С

Практика программирования БСП (Библиотека стандартных подсистем) Расширения v8 Бесплатно (free)

Разработка расширений 1С и оптимизация через механизм БСП: Дополнительные отчеты и обработки.

23.09.2019    10525    independ    24