Бесшовная интеграция через обмен по правилам - миссия выполнима

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

Разработка - Практика программирования

Бесшовная интеграция обмен Документооборот синхронизация

При организации работы с договорами в ERP 2, с помощью бесшовной интеграции с Документооборотом, «типовой» методикой является создание договоров в ЕРП. После создания договора в ЕРП, пользователь «отправляет» договор в ДО по бесшовной интеграции. На практике, весьма часто пользователи хотят видеть обратную схему: вводить договоры в ДО и при этом получать их в ЕРП без «лишних телодвижений». Или даже вводить их независимо в обеих системах – так, чтобы потом «стыковать» по каким-то определенным правилам.

С помощью несложной доработки «штатного» обмена по правилам можно добиться требуемого результата. Данная заметка посвящена одной конкретной задаче, в рамках этого проекта – установке «бесшовной» связи, между синхронизируемыми по правилам КД2 объектами ДО и ЕРП.

Вводная.

Имеем: ЕРП 2.4 + Документооборот КОРП, между которыми:

  1. Настроена бесшовная интеграция.
  2. Настроен  штатный обмен по правилам (КД2).

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

Описание этой достаточно тривиальной доработки не входит в цель данной заметки – будет интерес, в двух словах опишу в комментариях, тут просто приведу фрагмент добавленного в типовые правила нового ПКО:

Объекты сопоставляются по сочетанию реквизитов Номер+Валюта+Контрагент.

Задача.

При синхронизации (по правилам обмена), информация из реквизитов объекта ДО переносится в ЕРП. Но при этом, необходимо также, чтобы в ЕРП, в карточке договора, на вкладке «Документооборот» автоматически устанавливалась связь с объектом документооборота:

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

 

Решение.

Предварительные соображения:

  1. В ЕРП, на вкладке «Документооборот» в карточке объекта (см. скрин выше), можно подсмотреть, каким образом создается связь между объектами ЕРП и ДО. Поковырявшись, приходим к тому, что основное волшебство заключается в такой строке кода:
                ИнтеграцияС1СДокументооборотВызовСервера.ДобавитьСвязь(ID,
                               Тип,
                               Ссылка);

где «ID» - GUID объекта ДО, «Тип» в нашем случае будет строчка "DMInternalDocument", «Ссылка» – ссылка на объект ЕРП.

Примечание:  для добавления связи необходимо, чтобы «канал» бесшовной связи с ДО был активен – как это сделать, подглядел в этой процедуре:

	ИнтеграцияС1СДокументооборотКлиент.ПроверитьПодключение(…);

Отсюда нам надо то, что можем выполнить на сервере.

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

 

  1. При штатной синхронизации (по правилам обмена) в ЕРП, в регистр сведений «СоответствияОбъектовИнформационныхБаз» добавляется запись, сопоставляющая синхронизированные объекты ЕРП и ДО:

Здесь:

  • Измерения:
    • УникальныйИдентификаторПриемникаGUID объекта ДО
    • УникальныйИдентификаторИсточникассылка на объект ЕРП
    • ТипПриемника – в нашем случае это строка «СправочникСсылка.ВнутренниеДокументы»
    • ТипИсточника – в нашем случае это строка «СправочникСсылка.ДоговорыКонтрагентов»
    • УзелИнформационнойБазы – узел плана обмена «ОбменУправлениеПредприятиемДокументооборот20», соответствующий базе ДО (код = «DO»).
  • Ресурсы:
    • УникальныйИдентификаторИсточникаСтрокойGUID объекта ЕРП.

С помощью этого регистра, для загруженного в ЕРП объекта, мы можем узнать GUID соответствующего объекта ДО.

 

Идея решения:

Для каждого загруженного объекта-договора, запустить тот же механизм, который отрабатывает по клику на гиперссылку «создать» на вкладке «Документооборот» в ЕРП  (передав туда сведения из регистра сведений «СоответствияОбъектовИнформационныхБаз»).

Еще одно соображение.

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

В использованной нами процедуре ИнтеграцияС1СДокументооборотВызовСервера.ДобавитьСвязь видно, что факт добавления «бесшовной» связи с объектом ДО, в ЕРП отражается в регистре сведений «ОбъектыИнтегрированныеС1СДокументооборотом»:

РегистрыСведений.ОбъектыИнтегрированныеС1СДокументооборотом.ДобавитьСвязь(ID, Тип, ИнтегрированныйОбъект);

Этот регистр имеет три измерения:

Собственно, по наличию/отсутствию записи в этом регистре и можно определять наличие/отсутствие связи между объектами ДО и ЕРП.

 

Реализация:

  1. Инициируем в обработчике «Перед загрузкой данных» конвертации новый параметр МассивЗагруженныхДоговоров.
Параметры.Вставить("МассивЗагруженныхДоговоров", Новый Массив);
  1. В обработчике «ПослеЗагрузки» ПКО договоров, надо сохранить загруженные объекты в этот массив – для удобства вынесем эту короткую процедуру в отдельный алгоритм, назовем его «ДобавитьОбъектВМассивПриНеобходимости»:
Если ОбъектНайден Тогда
	Параметры.МассивЗагруженныхДоговоров.Добавить(Ссылка);
Иначе     
	Параметры.МассивЗагруженныхДоговоров.Добавить(Объект.ПолучитьСсылкуНового());
КонецЕсли;

 

Не забыли вызвать алгоритм в обработчике «После загрузки» ПКО:

выполнить(Алгоритмы.ДобавитьОбъектВМассивПриНеобходимости);

 

  1. Пишем код (опять же, удобно поместить все в отдельный алгоритм; назовем его «СоздатьСвязиСОбъектамиДО»), который собственно будет все выполнять. В запросе сразу отсекаем объекты, для которых уже установлены связи:

 

	Узел = ПланыОбмена.ОбменУправлениеПредприятиемДокументооборот20.НайтиПоКоду("DO");
	
	Если ЗначениеЗаполнено(Узел) Тогда
		
		// открываем "канал связи"
		ИспользуетсяАутентификацияОС = Ложь;
		ИмяПользователя = "Тот-Кого-нельзя-называть";
		Пароль = "Волан-Де-Морт";
		ТекстСообщенияОбОшибке = "";
		
		Если ИнтеграцияС1СДокументооборотВызовСервера.ПроверитьПодключение(
			, 
			ИмяПользователя,
			Пароль,
			ТекстСообщенияОбОшибке) Тогда
			
			ИнтеграцияС1СДокументооборотВызовСервера.УстановитьНастройкиАвторизацииВПараметрыСеанса(
				ИмяПользователя, Пароль, ИспользуетсяАутентификацияОС);
				
			// Получаем, запросом по ссылкам на загруженные объекты, сведения из регистра сведений «СоответствияОбъектовИнформационныхБаз» 
			ТипОбъектаДокументооборота = "DMInternalDocument";
			Запрос = Новый Запрос;
			Запрос.Текст = 
				"ВЫБРАТЬ
				|	соотв.УникальныйИдентификаторИсточника КАК Ссылка,
				|	соотв.УникальныйИдентификаторИсточникаСтрокой КАК GUID,
				|	соотв.УникальныйИдентификаторПриемника КАК ID
				|ИЗ
				|	РегистрСведений.СоответствияОбъектовИнформационныхБаз КАК соотв
				|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОбъектыИнтегрированныеС1СДокументооборотом КАК УжеИнтегрированные
				|		ПО соотв.УникальныйИдентификаторИсточника = УжеИнтегрированные.Объект
				|		И соотв.УникальныйИдентификаторПриемника = УжеИнтегрированные.ИдентификаторОбъектаДокументооборота
				|		И УжеИнтегрированные.ТипОбъектаДокументооборота = &ТипОбъектаДокументооборота
				|ГДЕ
				|	соотв.УникальныйИдентификаторИсточника В(&МассивСсылок)
				|	И соотв.ТипПриемника = &ТипПриемника
				|	И соотв.ТипИсточника = &ТипИсточника
				|	И соотв.УзелИнформационнойБазы = &УзелИнформационнойБазы
				|	И УжеИнтегрированные.ИдентификаторОбъектаДокументооборота ЕСТЬ NULL";
			
			Запрос.УстановитьПараметр("ТипИсточника", "СправочникСсылка.ДоговорыКонтрагентов");
			Запрос.УстановитьПараметр("ТипПриемника", "СправочникСсылка.ВнутренниеДокументы");
			Запрос.УстановитьПараметр("УзелИнформационнойБазы", Узел);
			Запрос.УстановитьПараметр("МассивСсылок", Параметры.МассивЗагруженныхДоговоров);
			Запрос.УстановитьПараметр("ТипОбъектаДокументооборота", ТипОбъектаДокументооборота);
			
			РезультатЗапроса = Запрос.Выполнить();
			
			Выборка = РезультатЗапроса.Выбрать();
			
			Пока Выборка.Следующий() Цикл
			
				GUID = Строка(Выборка.Ссылка.УникальныйИдентификатор());
				
				Если GUID = Выборка.GUID Тогда
					
					// Передаем исполнение в штатную процедуру создания связи с объектом ДО				
					ИнтеграцияС1СДокументооборотВызовСервера.ДобавитьСвязь(Выборка.ID,
						ТипОбъектаДокументооборота,
						Выборка.Ссылка);
					
				КонецЕсли;
			
			КонецЦикла;
			
		Иначе
				
			// Cообщаем об ошибках в ЖР
			ИмяСобытия = "Загрузка договоров из Документооборот";
			Комментарий = ТекстСообщенияОбОшибке; //"Не удалось найти установить подключение к Документооборот!";
			ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Предупреждение,,,Комментарий);
			
		КонецЕсли;
		
	Иначе
		
		// Cообщаем об ошибках в ЖР
		ИмяСобытия = "Загрузка договоров из Документооборот";
		Комментарий = "Не удалось найти узел Документооборот по коду ""DO""!";
		ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Предупреждение,,,Комментарий);
		
	КонецЕсли; 
	
  1. Добавляем вызов алгоритма в обработчике «После загрузки данных» конвертации:
выполнить(Алгоритмы.СоздатьСвязиСОбъектамиДО);

 

Готово.

Замечание: На стороне ДО, результат создания связи можно увидеть в регистре сведений ДО «СвязиОбъектовИнтегрированныхСистем»:

Здесь, «Идентификатор внешнего объекта» - это GUID объекта ЕРП.

 

P.S. Разумеется, описанный прием не ограничивается только организацией договорной работы между системами ЕРП и ДО.

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

Комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
1. blindcat2006 71 26.01.20 20:13 Сейчас в теме
А где картинки?
Прикрепленные файлы:
2. e-9 16 27.01.20 09:45 Сейчас в теме
(1) очень хороший вопрос. Спасибо, перезалил!
...видимо, тут так бывает - при редактировании после публикации (ну забыл поменять реальные логин/пароль на придуманные) теряются картинки. При этом я их вижу - браузер из кэша берет.
blindcat2006; +1 Ответить
Оставьте свое сообщение

См. также

Программная работа с настройками СКД

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

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

27.01.2020    9756    ids79    26       

Онлайн-интенсив "1C:Предприятие для программистов: Бухгалтерские задачи" с 22 июня по 8 июля 2020 г. Промо

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

4900 рублей

[СКД] Программное создание схемы компоновки данных

Статья Программист Стажер Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

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

15.01.2020    11323    John_d    22       

Последовательности событий. Шпаргалка

Статья Программист Нет файла v8 Россия Бесплатно (free) Практика программирования

Собрал информацию о событиях/подписках/расширениях в одном месте.

30.12.2019    7252    kuzyara    33       

Базовый курс по обмену данными в системе 1С:Предприятие. Онлайн-интенсив с 12 по 28 мая 2020 г. Промо

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

5500 рублей

Екатеринбург.Online: Голосование продолжается Промо

Продолжается голосование за доклады на INFOSTART MEETUP Екатеринбург.Online! Лучшие из них попадут в окончательную программу онлайн-митапа! Присоединяйтесь к голосованию и покупайте билеты - 3 000 рублей за 8 часов продуктивной пятницы!

3000

Агрегатные функции СКД, о которых мало кто знает

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    31433    ids79    50       

1C:Предприятие для программистов: Расчетные задачи (зарплата). Онлайн-интенсив с 01 по 17 июня 2020 г. Промо

Данный онлайн-курс предусматривает изучение механизмов платформы “1С:Предприятие”, которые предназначены для автоматизации периодических расчетов, а именно - для расчета зарплаты. Курс предназначен для тех, кто уже имеет определенные навыки конфигурирования и программирования в системе “1С:Предприятие”, а также для опытных пользователей прикладного решения “1С:Зарплата и управление персоналом” и прочих прикладных решений, в которых реализован функционал расчета зарплаты.

4900 рублей

Обмен данными. Консистентность vs Многопоточность

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Интеграция

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

03.09.2019    8686    m-rv    1       

Три костыля. Сказ про фокусы в коде

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования

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

03.09.2019    19510    YPermitin    80       

Новый раздел на Инфостарте - Electronic Software Distribution Промо

Инфостарт напоминает: на нашем сайте можно купить не только ПО, связанное с 1С. В нашем арсенале – ESD-лицензии на ПО от ведущих вендоров: Microsoft, Kaspersky, ESET, Dr.Web, Аскон и другие.

  • Низкие цены, без скрытых платежей и наценок
  • Оперативная отгрузка
  • Возможность оплаты с личного счета (кешбек, обмен стартмани на рубли и т.п.)
  • Покупки идут в накопления для получения скидочных карт лояльности Silver (5%) и Gold (10%)

Отслеживание выполнения фонового задания

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Универсальные функции Разработка

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    22353    ids79    16       

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

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

08.08.2019    44162    ids79    36       

Базовый курс для начинающих 1С-программистов. Онлайн-интенсив со 2 июня по 2 июля 2020 г. Промо

Данный онлайн-курс является начальной ступенью по изучению базовых принципов программирования в системе “1С:Предприятие” и предназначен для обучения 1С-программированию “с нуля”.

4500-9500 рублей

Фоновое выполнение кода в 1С - это просто

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования

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

02.08.2019    22421    avalakh    21       

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    34544    ids79    11       

DevOps для 1С. Онлайн-курс проходит с 16 апреля по 11 июня 2020 года. Промо

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

12000 рублей

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Инструментарий разработчика Практика программирования

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    24028    ids79    27       

Регистры сведений. За кулисами

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    18376    YPermitin    13       

Программы для исполнения 488-ФЗ: Маркировка товаров Промо

1 января 2019 года вступил в силу ФЗ от 25.12.2018 № 488-ФЗ о единой информационной системе маркировки товаров с использованием контрольных (идентификационных) знаков, который позволяет проследить движение товара от производителя до конечного потребителя. Инфостарт предлагает подборку программ, связанных с применением 488-ФЗ и маркировкой товаров.

"Меньше копипаста!", или как Вася универсальную процедуру писал

Статья Программист Стажер Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования Разработка

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

04.07.2019    14901    SeiOkami    49       

Создание отчетов с помощью СКД - основные понятия и элементы

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Практика программирования Математика и алгоритмы

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    36971    ids79    17       

Лучшие программы за прошедший месяц Промо

Инфостарт подготовил ТОП-25 самых продаваемых и популярных на текущий момент программ. При формировании списка учитывается аналитика продаж и запросы клиентов за последний месяц.

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017

Статья Программист Нет файла v8 v8::Запросы Бесплатно (free) Практика программирования Производительность и оптимизация (HighLoad)

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    19217    dmurk    144       

Регистры накопления. Структура хранения в базе данных

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

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

16.05.2019    31864    YPermitin    30       

Готовые переносы данных из различных конфигураций 1C Промо

Рекомендуем готовые решения для переноса данных из различных конфигураций 1C. C техподдержкой от разработчиков и гарантией от Инфостарт.

Выполнение внешней обработки в фоновом задании

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Подробное описание подхода к созданию длительной операции на основе внешней обработки. Реализация протестирована на 1С 8.3.12.1714 (x64).

11.05.2019    21015    Eret1k    23       

Выгрузка документа по условию

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Разработка

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    12149    m-rv    2       

Подборка решений для взаимодействия со ФГИС «Меркурий» Промо

С 1 июля 2019 года все компании, участвующие в обороте товаров животного происхождения, должны перейти на электронную ветеринарную сертификацию (ЭВС) через ФГИС «Меркурий». Инфостарт предлагает подборку программ, связанных с этим изменением.

Как прикрутить ГУИД к регистру сведений

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Перенос данных из 1C8 в 1C8 Разработка

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

16.04.2019    15532    m-rv    16       

О расширениях замолвите слово...

Статья Программист Стажер Нет файла v8 Бесплатно (free) Практика программирования Разработка

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    26367    ellavs    125       

Подборка программ для взаимодействия с ЕГАИС Промо

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

Git-репозитории для 1С-кода (опыт использования при небольших проектах)

Статья Программист Стажер Нет файла v8 Windows Бесплатно (free) Практика программирования Разработка

Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...

28.03.2019    21174    ellavs    83       

RabbitMQ + Конвертация Данных 3.0

Статья Системный администратор Программист Бизнес-аналитик Руководитель проекта Нет файла v8 КД Бесплатно (free) Внешние источники данных Обмен через XML Интеграция Перенос данных из 1C8 в 1C8

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

21.03.2019    20088    barelpro    82