|
Планы обмена посоветуйте описание работы с ними | ☑ | ||
---|---|---|---|---|
0
apdate by
28.06.21
✎
15:45
|
Ребят подскажите где почитать (для особо тупых) о планах обмена интересует как реализовать механизм собственной регистрации объектов к обмену и обменом по стуи только в одну сторону
из 1С в нужную мне программу по сути к регистрации буду т идти только товары механизм по сути подготовки данных к регистрации я реализовал теперь нужно их зарегить в плане обмена и я не понимаю как 1. зарегить их 2. как получать измененные объекты, 3. как получать номера сообщений что бы в случае ошибки при обмене записать это уведомление 4. как удалять только необходимые записи из плана обмена |
|||
1
Ёпрст
28.06.21
✎
15:46
|
На итс жешь
|
|||
2
apdate by
28.06.21
✎
15:47
|
ИТС не для особо тупых ))))
|
|||
3
apdate by
28.06.21
✎
15:47
|
(1) но пойду читать мож пойму )
|
|||
4
Ёпрст
28.06.21
✎
15:48
|
1. зависит от галки авторегистрация в плане обмена у объекта. Если стоит, то оно само регится, если не стоит, то кодом
2. запросом жешь к табличке изменений объекта, или через менеджер 3. см п 2. 4. просто удаляешь регистрацию изменений |
|||
5
Ёпрст
28.06.21
✎
15:49
|
4* или всю целиком, или конкретные объекты.
ЗЫ: там не так и много методов |
|||
6
apdate by
28.06.21
✎
15:55
|
(4) + (5) спасибо буду пробовать )
просто ка кто делал да что то не получалось помню тогда плюнул и реализовал на регистре )) теперь хочу переписать на план обмена ) |
|||
7
apdate by
28.06.21
✎
15:58
|
а как узнать что текущий выбранный узел не узел этой базы?
|
|||
8
apdate by
28.06.21
✎
16:02
|
номера ссобщения увеличиваются на каждую регитсрацию? или можно как то подлавить предыдущий номер и дополнить?
|
|||
9
Ёпрст
28.06.21
✎
16:03
|
(7) ГлавныйУзел() ?
или что ? |
|||
10
Ёпрст
28.06.21
✎
16:05
|
https://its.1c.ru/db/intgr83#content:117:hdoc
вот, читай, там всё есть https://its.1c.ru/db/metod8dev/content/2275/hdoc |
|||
11
apdate by
28.06.21
✎
16:06
|
(9) да наверное я имею в виду что бы ненароком не туда не записать объект (но я уже понял ка кэто сделать)
(8) в силе :-) |
|||
12
Ёпрст
28.06.21
✎
16:07
|
(8) нет.
|
|||
13
Ёпрст
28.06.21
✎
16:07
|
они увеличиваются, после подтверждения
|
|||
14
apdate by
28.06.21
✎
16:08
|
понятно спасибо! буду зубрить матчасть ) ну и чувока в шляпе )
|
|||
15
apdate by
28.06.21
✎
22:05
|
Подскажите здесь
https://www.koderline.ru/upload/iblock/979/6.png это вообще верный способ выборки измененных элементов? я не очень понимаю зачем после того как в запросе мы получили измененные объекты по новой что то опрашивать в плане обмена? и по номеру сообщения все же он задается в ручную выходит так? |
|||
16
ДенисЧ
28.06.21
✎
22:17
|
(15) Это тебя надо спросить, зачем ты туда два раза лезешь ))
|
|||
17
apdate by
29.06.21
✎
09:46
|
(16) это - ж не мой код
это пример нашел я себе вот и спрашиваю верный ли он? |
|||
18
apdate by
29.06.21
✎
09:47
|
(16) судя по Вашему ответу можно считать что все что ниже цикла в этом коде (что на картинке) можно не писать верно?
|
|||
19
ДенисЧ
29.06.21
✎
09:48
|
(18) нет
|
|||
20
apdate by
29.06.21
✎
09:50
|
Ребята подскажите еще один ньюанс
создал в форме узла диномический список и указал запрос вот такой ВЫБРАТЬ НоменклатураИзменения.Узел, НоменклатураИзменения.НомерСообщения, НоменклатураИзменения.Ссылка ИЗ Справочник.Номенклатура.Изменения КАК НоменклатураИзменения ГДЕ НоменклатураИзменения.Узел = &Узел установил при создании на сервере ТоварыКОбмену.Параметры.УстановитьЗначениеПараметра("Узел",Объект.Ссылка); оставил ссылку (товар) и номер сообщения и вижу товары зарегенные а вот номер сообщения пустой это нормлаьно? |
|||
21
apdate by
29.06.21
✎
09:52
|
(19) ок. После запроса мы помещаем в массив измененные объекты
для чего далее Мы делаем ПланыОбмена.ВыбратьИзменения()? |
|||
22
apdate by
29.06.21
✎
10:01
|
+(21) этот вопрос закрыт
Формирует выборку измененные данные для передачи их в тот или иной узел плана обмена. При этом в процессе выборки изменений в записи регистрации изменений проставляется номер сообщения обмена данными, в котором должны передаваться изменения. Номер сообщения в записи регистрации проставляется для того, чтобы при подтверждении приема сообщения, в котором передавались изменения соответствующие записи регистрации изменений были удалены и в дальнейшем изменения больше не передавались. :-) |
|||
23
apdate by
29.06.21
✎
10:39
|
я делаю обмен с андроидом и с сайтом
при обмене при обходе изменений каждый товар будет улетать в другое ПО Будет ли верным следующее Например делаю я выборку изменений и на каждую интерацию отправляю в другое ПО данные далее то ПО отвечает или не отвечает короче если все ок если товар ушел и другое ПО его удачно съело то оно вернет ответ следовательно я удаляю запись именно по этому товару но если например другое ПО не ответило в нужный момент или по каким то причинам вернуло ошибку то правильно ли будет остовлять такие изменения к следующим попыткам обмена? я просто не могу понять если опираться на (22) то при ПланыОбмена.ВыбратьИзменения()? мои сообщения помечаются каким то флагом и как их потом выбирать? |
|||
24
apdate by
29.06.21
✎
10:42
|
(23) они помечаются флагом типа готов к обмену но после если я не удалил их они остаются в изменениях и ожидают пока я не обменяюсь удачно
подтверждением удачного обмена является именно удаление этих сообщений? |
|||
25
ДенисЧ
29.06.21
✎
10:42
|
Когда ты делаешь ВыбратьИзменения - твоим ещё неотправленным записям присваивается номер. Это и есть "флаг".
А выбирать - да хоть запросом, ГДЕ Номер<не помню точно> = &твойНомер |
|||
26
ДенисЧ
29.06.21
✎
10:43
|
(24) Пока записи есть в таблице изменений - они считаются неотправленными (по идеологии 1с).
|
|||
27
apdate by
29.06.21
✎
10:58
|
Верно ли будет такого рода работа с планом обмена?
Функция ВыполнитьОбменССайтом() УзелОбмена = ПолучитьУзелОбмена();// потом можно будет переделать на несколько узлов следовательно здесь может быть цикл но в нашем случе не нужно этого делать Если УзелОбмена <> Неопределено Тогда ТоварыКОбмену = ПолучитьИПОложитьВМассивИзмененныеОбъекты(УзелОбмена); //"ТоварыКОбмену" => Массив Если ТоварыКОбмену.Количество() > 0 Тогда //Здесь сперва всегда выливаем группы товаров (все), //А так - же выливаем вс ехарактеристики твоаров Для Каждого Товар из ТоварыКОбмену Цикл //Здесь Формируем XML пакет с данными о товаре, его цены, фото и т д //Далее пакуем в зип и скармливаем Сайту //Далее Сайт вернет ответ при положительном ответе выполняем //ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена,Товар); // что подтвердить факт удачного обмена //Иначе пишу ошибку в журнал! КонецЦикла; КонецЕсли; КонецЕсли; КонецФункции Функция ПолучитьИПОложитьВМассивИзмененныеОбъекты(УзелОбмена) МассивИзменений = Новый Массив; //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НоменклатураИзменения.Ссылка |ИЗ | Справочник.Номенклатура.Изменения КАК НоменклатураИзменения |ГДЕ | НоменклатураИзменения.Узел = &Узел"; Запрос.УстановитьПараметр("Узел", УзелОбмена); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл МассивИзменений.Добавить(ВыборкаДетальныеЗаписи.Ссылка); КонецЦикла; Если МассивИзменений.Количество() > 0 Тогда ПланыОбмена.ВыбратьИзменения(УзелОбмена,УзелОбмена.НомерОтправленного,МассивИзменений); УзелОбъект = УзелОбмена.ПолучитьОбъект(); УзелОбъект.НомерОтправленного = УзелОбъект.НомерОтправленного+1; УзелОбъект.Записать(); Возврат МассивИзменений; Иначе Возврат МассивИзменений; КонецЕсли; //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА КонецФункции |
|||
28
apdate by
29.06.21
✎
11:00
|
//При всем при этом все-равно не понимаю зачем выполнять этот кусок кода
УзелОбъект = УзелОбмена.ПолучитьОбъект(); УзелОбъект.НомерОтправленного = УзелОбъект.НомерОтправленного+1; УзелОбъект.Записать(); когда в (22) указано что он сам нумеруется автоматом ( |
|||
29
ДенисЧ
29.06.21
✎
11:00
|
(28) Чтобы получить номер сообщения, разумеется. Он нумеруется сам, но тебе, лысому, этого номера просто так не говорит.
|
|||
30
apdate by
29.06.21
✎
11:03
|
(29) все равно не понимаю нужно выполнять эту часть кода? (28) я имею в виду
зачем увеличивать номер если он сам это делает? я из примера это брал ( вот и не понимаю зачем это. |
|||
31
ДенисЧ
29.06.21
✎
11:04
|
Он (автор кода) так захотел. По мне - так достаточное условие.
|
|||
32
apdate by
29.06.21
✎
11:17
|
заремил этот кусок кода
УзелОбъект = УзелОбмена.ПолучитьОбъект(); УзелОбъект.НомерОтправленного = УзелОбъект.НомерОтправленного+1; УзелОбъект.Записать(); выполнил метод получил все равно пустые номера сообщений затем вернул и добавил удаление записей но не всех теперь все отлично работает спасибо за помощь! я теперь умею регистрировать изменения, читать их и удалять |
|||
33
rozer76
29.06.21
✎
11:56
|
обмен с андроидом - почитай на ИТС пример как создавать МП и простейший обмен
Номер сообщения нужно делать через НачатьЗапись(<ЗаписьXML>, <Узел>) тогда он автоматом инкрементируется и фиксируется в узле в момент ЗакончитьЗапись() Про это почитай в СП и "профразработке". Вот пример если хочешь не все данные в плане отправить но только те которые в МассивИзменений: ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелОбмена); ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, ЗаписьСообщения.НомерСообщения, МассивИзменений); Пока ВыборкаИзменений.Следующий() Цикл Данные = ВыборкаИзменений.Получить(); ЗаписатьДанные(ЗаписьXML, Данные, УзелОбмена); КонецЦикла; ЗаписьСообщения.ЗакончитьЗапись(); СтрXML=ЗаписьXML.Закрыть(); |
|||
34
apdate by
29.06.21
✎
12:21
|
(33) а если мне необходимо своя структура XML?
(33) я рассматривал этот пример но от того что мне нужна моя структура XML не стал его использовать. (33) подскажите есть ли возможность использовать Ваш пример но при этом свою структуру XML? |
|||
35
apdate by
29.06.21
✎
12:23
|
а пока для таких же как я :-) (как меня тут Лысым обозвали? )
вот то что я сделал и оно в принципе работает //Процедура выполняется подпиской на событие //ПриЗаписи здесь источником являются ка кдокументы так и справочники Процедура НоменклатураПриЗаписиОбъектаПриЗаписи(Источник, Отказ) Экспорт УзелОбмена = ПолучитьУзелОбмена(); Если УзелОбмена <> Неопределено Тогда //Проверяем тип источника и если это Номенклатура тогда созаем одну запись иначе это документ! тогда из таблицы Товаров ТипОбъектаЗаписи = Неопределено; Если ТипЗнч(Источник) = Тип("ДокументОбъект.РеализацияТоваровУслуг") Тогда ТипОбъектаЗаписи = "Документ"; ИначеЕсли ТипЗнч(Источник) = Тип("ДокументОбъект.ПеремещениеТоваров") Тогда ТипОбъектаЗаписи = "Документ"; ИначеЕсли ТипЗнч(Источник) = Тип("ДокументОбъект.ПоступлениеТоваровУслуг") Тогда ТипОбъектаЗаписи = "Документ"; ИначеЕсли ТипЗнч(Источник) = Тип("ДокументОбъект.УстановкаЦенНоменклатуры") Тогда ТипОбъектаЗаписи = "Документ"; ИначеЕсли ТипЗнч(Источник) = Тип("ДокументОбъект.ОприходованиеИзлишковТоваров") Тогда ТипОбъектаЗаписи = "Документ"; ИначеЕсли ТипЗнч(Источник) = Тип("ДокументОбъект.СписаниеНедостачТоваров") Тогда ТипОбъектаЗаписи = "Документ"; ИначеЕсли ТипЗнч(Источник) = Тип("СправочникОбъект.Номенклатура") Тогда ТипОбъектаЗаписи = "Справочник"; КонецЕсли; Если ТипОбъектаЗаписи = Неопределено Тогда ЗаписатьОшибкиПредупреждения("Неопределенный тип объекта записи", ТекущаяДата(), "Ошибка", "НоменклатураПриЗаписиОбъектаПриЗаписи"); ИначеЕсли ТипОбъектаЗаписи = "Справочник" Тогда ОтвечаетТребованиям = ОтвечаетТребованиям(УзелОбмена, Источник.Ссылка); Если ОтвечаетТребованиям = Истина Тогда ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена,Источник.Ссылка); КонецЕсли; ИначеЕсли ТипОбъектаЗаписи = "Документ" Тогда Если Источник.Товары.Количество() > 0 Тогда Для Каждого СтрТовар ИЗ Источник.Товары Цикл ОтвечаетТребованиям = ОтвечаетТребованиям(УзелОбмена, СтрТовар.Номенклатура.Ссылка); Если ОтвечаетТребованиям = Истина Тогда ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена,СтрТовар.Номенклатура.Ссылка); КОнецЕсли; КонецЦикла; Иначе ЗаписатьОшибкиПредупреждения("Объект "+ТипЗнч(Источник)+" не имеет товаров Немер объекта"+Источник.Номер, ТекущаяДата(), "Ошибка", "НоменклатураПриЗаписиОбъектаПриЗаписи"); КонецЕсли; КонецЕсли; КонецЕсли; КонецПроцедуры //Перед тем как поместить товар в измененные //Проверим его на вхождение необходимых групп //и на то что у него все необходимые данные заполнены Функция ОтвечаетТребованиям(УзелОбмена, Товар) Отвечает = Ложь; //Проверим не состоит ли товар в ненужных нам группах Если УзелОбмена.ГруппыИсключения.Количество() > 0 Тогда МассивГруппИсключений = УзелОбмена.ГруппыИсключения.ВыгрузитьКолонку("ГруппаИсключения"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Ссылка |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Ссылка В ИЕРАРХИИ(&ГруппаИсключение) | И Номенклатура.Ссылка = &ВыбТовар"; Запрос.УстановитьПараметр("ВыбТовар", Товар); Запрос.УстановитьПараметр("ГруппаИсключение", МассивГруппИсключений); РезультатЗапроса = Запрос.Выполнить(); Если НЕ РезультатЗапроса.Пустой() Тогда ЗаписатьОшибкиПредупреждения("Товар "+Товар+" не попал в обмен так как указанная группа не ссответвует отбору!", ТекущаяДата(), "Предупреждение", "ОтвечаетТребованиям"); Возврат Ложь; КонецЕсли; КонецЕсли; //Проверим все ли заполнено у товара Запрос_ = Новый Запрос; Запрос_.Текст = "ВЫБРАТЬ | Номенклатура.Ссылка |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.ФайлКартинки <> ЗНАЧЕНИЕ(Справочник.НоменклатураПрисоединенныеФайлы.ПустаяСсылка) | И Номенклатура.Родитель <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) | И Номенклатура.ФайлКартинки.ПометкаУдаления = &ПометкаУдаления | И Номенклатура.Ссылка = &ВыбТовар"; Запрос_.УстановитьПараметр("ПометкаУдаления", Ложь); Запрос_.УстановитьПараметр("ВыбТовар", Товар); РезультатЗапроса_ = Запрос_.Выполнить(); Если НЕ РезультатЗапроса_.Пустой() Тогда Возврат Истина; КонецЕсли; ЗаписатьОшибкиПредупреждения("Товар "+Товар+" не попал в обмен так как (Либо) незаполнена картинка, картинка помечена на удаление или у товара не указана группа!", ТекущаяДата(), "Предупреждение", "ОтвечаетТребованиям"); Возврат Отвечает; КонецФункции //ПОлучить узел обмена //Здесь я реализовал получение только одного узла так как у данного клиента должен быть только один Функция ПолучитьУзелОбмена() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОбменССайтомНовый.Ссылка |ИЗ | ПланОбмена.ОбменССайтомНовый КАК ОбменССайтомНовый |ГДЕ | ОбменССайтомНовый.ОбменТоварами = &ВыполнятьОбменТоварами"; Запрос.УстановитьПараметр("ВыполнятьОбменТоварами", Истина); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Возврат ВыборкаДетальныеЗаписи.Ссылка; КонецЦикла; Возврат Неопределено; КонецФункции //Просто пишем ошибки в журнал Процедура ЗаписатьОшибкиПредупреждения(ОписаниеОшибки, ДатаОшибки, ТипСообщения,ДействиеИсточник) Если ТипСообщения = "Ошибка" Тогда МенеджерЗаписи = РегистрыСведений.ЖурналОбменаССайтом.СоздатьМенеджерЗаписи(); МенеджерЗаписи.Период = ТекущаяДата(); МенеджерЗаписи.ОписаниеСообщения = ОписаниеОшибки; МенеджерЗаписи.ДействиеИсточник = ДействиеИсточник; МенеджерЗаписи.ТипСообщения = ТипСообщения; МенеджерЗаписи.Записать(); ИначеЕсли ТипСообщения = "Предупреждение" Тогда МенеджерЗаписи = РегистрыСведений.ЖурналОбменаССайтом.СоздатьМенеджерЗаписи(); МенеджерЗаписи.Период = ТекущаяДата(); МенеджерЗаписи.ОписаниеСообщения = ОписаниеОшибки; МенеджерЗаписи.ДействиеИсточник = ДействиеИсточник; МенеджерЗаписи.ТипСообщения = ТипСообщения; МенеджерЗаписи.Записать(); Иначе // Забыл описать тип сообщения МенеджерЗаписи = РегистрыСведений.ЖурналОбменаССайтом.СоздатьМенеджерЗаписи(); МенеджерЗаписи.Период = ТекущаяДата(); МенеджерЗаписи.ОписаниеСообщения = ОписаниеОшибки; МенеджерЗаписи.ДействиеИсточник = ДействиеИсточник; МенеджерЗаписи.ТипСообщения = "Неопознаный тип сообщения"; МенеджерЗаписи.Записать(); КонецЕсли; КонецПроцедуры //Подготовительная функция //Здесь мы готовим данные к обмену Функция ВыполнитьОбменССайтом() Экспорт УзелОбмена = ПолучитьУзелОбмена();// потом можно будет переделать на несколько узлов следовательно здесь может быть цикл но в нашем случе не нужно этого делать Если УзелОбмена <> Неопределено Тогда ТоварыКОбмену = ПолучитьИПОложитьВМассивИзмененныеОбъекты(УзелОбмена); //"ТоварыКОбмену" => Массив Если ТоварыКОбмену.Количество() > 0 Тогда //Выгружаем всегда сперва Склады затем Виды цен Для Каждого Товар из ТоварыКОбмену Цикл //Получаем на товар его группы в которых он состоит и пихаем их в шапку XML //Получаем характеристики товара и то же в шапку их //******************************************************************************** //******************************************************************************** //Здесь Формируем XML пакет с данными о товаре, его цены и остатки, фото и т д //Далее пакуем в зип и скармливаем Сайту ДанныеУспешноОтправлены = Ложь; //Отправляем данные на сайт //******************************************************************************** //******************************************************************************** ДанныеУспешноОтправлены = ОтправитьДанныеНаСайт(ДанныеУспешноОтправлены); Если ДанныеУспешноОтправлены = Истина Тогда ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена,Товар); Иначе //Пишем в журнал ожибку о том что не выполнено КонецЕсли; КонецЦикла; КонецЕсли; КонецЕсли; КонецФункции //Соединяемся с сайтом и отправляем ему данные //При ошибке возвращаем ее описание и флаг Успех = Ложь Функция ОтправитьДанныеНаСайт(Успех) Успех = Истина; Если Успех = Ложь Тогда //Пишем в журнал ошибку с указанием на товар КонецЕсли; Возврат Успех КонецФункции //Выбираем измененные объекты Ложим их в массив и устонавливаем флаг о том что мы готовы к обмену! Функция ПолучитьИПОложитьВМассивИзмененныеОбъекты(УзелОбмена) МассивИзменений = Новый Массив; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НоменклатураИзменения.Ссылка |ИЗ | Справочник.Номенклатура.Изменения КАК НоменклатураИзменения |ГДЕ | НоменклатураИзменения.Узел = &Узел"; Запрос.УстановитьПараметр("Узел", УзелОбмена); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл МассивИзменений.Добавить(ВыборкаДетальныеЗаписи.Ссылка); КонецЦикла; Если МассивИзменений.Количество() > 0 Тогда ПланыОбмена.ВыбратьИзменения(УзелОбмена,УзелОбмена.НомерОтправленного,МассивИзменений); УзелОбъект = УзелОбмена.ПолучитьОбъект(); УзелОбъект.НомерОтправленного = УзелОбъект.НомерОтправленного+1; УзелОбъект.Записать(); Возврат МассивИзменений; Иначе Возврат МассивИзменений; КонецЕсли; КонецФункции |
|||
36
rozer76
29.06.21
✎
13:45
|
(34) ну, да, пилишь свой xdto пакет, заполняешь его и пишешь в ЗаписьXML
|
|||
37
apdate by
29.06.21
✎
13:57
|
(36) спасибо за подсказку буду читать я с XDTO не работал ни разу (
|
|||
38
rozer76
29.06.21
✎
16:55
|
(37) да пиши хоть руками XML хоть черед DOM - XDTO проще и типизация гвоздями прибита ) Вон Хрусталева без XDTO обходиться https://its.1c.ru/db/pubintromobile/content/131/hdoc
|
|||
39
fisher
29.06.21
✎
17:03
|
(0) Что касается платформенных механизмов, то в "Проф-разработке" хорошо расписано.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |