Имя: Пароль:
1C
1С v8
Начало и конец области в коде
0 vsg-work
 
11.03.21
09:09
Здравствуйте, уважаемые коллеги.

Хочу узнать ваше профессиональное мнение по поводу размещения областей на 8.3.

Насколько правильно будет, если размещать области внутри процедуры или функции? Или это некорректно, и области нужно создавать только для группировки функций и процедур?
У меня следующий код, и правильно ли это?


&НаСервере
Процедура ВыгрузитьДанныеВЛюбимыйДомНаСервере()
// Справочники
ДокПриемник.Организация = Открытие.Справочники.Организации.FindByCode("00-000001");
ДокПриемник.СостояниеЗаказа = Открытие.Справочники.СостоянияЗаказовПокупателей.FindByDescription("Завершен");
ДокПриемник.СтруктурнаяЕдиницаПродажи = Открытие.Справочники.СтруктурныеЕдиницы.FindByDescription("Подразделение");
ДокПриемник.СтруктурнаяЕдиницаРезерв = Открытие.Справочники.СтруктурныеЕдиницы.FindByDescription("Основной - Русский Лес");
ДокПриемник.Источник = Открытие.Справочники.ИсточникРекламы.FindByDescription("Русский Лес");
        
        
#Область СозданиеКонтрагента
// Контрагент
Контрагент = Открытие.Справочники.Контрагенты.FindByCode(Объект.Контрагент.Код);
Если Контрагент.Пустая() Тогда
КонтрагентПриемник = Открытие.Справочники.Контрагенты.CreateItem();
Иначе
КонтрагентПриемник = Контрагент.GetObject();
КонецЕсли;
#КонецОбласти
КонецПроцедуры
1 Волшебник
 
11.03.21
09:11
области есть, лесенки нет
2 mikecool
 
11.03.21
09:11
код должен соответствовать политике разработки
все остальное от лукавого
3 Kassern
 
11.03.21
09:18
(0) А можно объяснить why писать code то русскими letters, то английскими (Справочники.Организации.FindByCode("00-000001"))? Какой в этом сакральный смысл?
4 vsg-work
 
11.03.21
09:21
(3) Работаю с COMConnector, не поддерживает функции на кириллице
5 Hans
 
11.03.21
09:30
Создание областей внутри процедуры я не приветствую. Только для группировки процедур и функций.
6 Галахад
 
гуру
11.03.21
09:31
(0) Есть мнение, что процедуры/функции желательно делать не очень крупными. Значит и области там не особо нужны.
7 Hans
 
11.03.21
09:33
>> #Область СозданиеКонтрагента

Ты это должен вывнести в отдельную функцию "НайтиСоздатьКонтрагента".
8 Dmitrii
 
гуру
11.03.21
09:39
(0) Редкостный *авнокод.
ИМХО, гораздо важнее содержание и смысл кода, чем то как именно он структурирован.
Потому что, если код грамотно написан, то его правильная структура приходит сама собой.

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

Аргументы из (4) звучат как-то не очень убедительно.
И вообще что касается работы через COM, то, ИМХО, использовать его можно только в двух случаях. Когда другого выхода нет (от безысходности) или когда надо написать какую-то одноразовую(!) простую обработку с подключением к другой базе и заморачиваться с нормальными механизмами нет времени и необходимости (потому что одноразовая история). Но для одноразовых разработок никто не заморачивается с оформлением и структурированием кода.

Про *авнометоды типа "НайтиПоКоду" и "НайтиПоНаименованию" я вообще молчу. За это публично расстреливать надо.
9 Kassern
 
11.03.21
09:47
(4) Попробуй использовать вебсервисы для обмена данными, создай структуру для заполнения данными отдельной функцией и заполняй ее из какой нить таблицы, которую пользователь заполнил. Сегодня тебе нужна организация с кодом 00-000001 а завтра совсем другая, будешь каждый раз код перелопачивать? Лучше дать людям инструмент настройки чем каждый раз самому править. В таком написании как в (0) я бы еще понял, если на 1 раз обработка, но тогда и области не нужны, согласен с (8)
10 VladZ
 
11.03.21
09:54
(0) На "Область" всем наср*ть.
А вот за Организации.FindByCode("00-000001") могут и морду набить.
11 Волшебник
 
11.03.21
09:56
(10) По коду ещё можно, а вот за FindByDescription("Основной - Русский Лес") могут и морду набить
12 Hans
 
11.03.21
09:57
>> ИМХО, гораздо важнее содержание и смысл кода, чем то как именно он структурирован.

Хороший код как раз таки хорошо структурирован. Смысл кода может быть один и тот же, но в одном случае все будет в одной процедуре, в другом случае будет все разнесено по смыслу в разные процедуры.
13 vsg-work
 
11.03.21
10:12
(8) (12) (11) (10) (9) (7)
Всем спасибо за ответы.

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

Вопрос был задан по интересу и правильности. Можно ли так использовать или нет. И то что можно код вынести в отдельную процедуру, по-моему каждый начинающий прогер знает.
14 fisher
 
11.03.21
10:13
Как по мне, полезность областей весьма относительна.
Но если уж их юзать - то в соответствии c системой стандартов 1С. Т.е. никак не для группировки внутри функций.
Да и вообще при хорошем структурировании кода необходимость даже в комментариях возникает редко.
15 Кир Пластелинин
 
11.03.21
10:13
кажется попадалось в стандартах разработки от 1с, что использование #Областей правильно только в рамках самого модуля, но не в рамках процедур/функций. но это не точно)
16 Вафель
 
11.03.21
10:15
лучше отдельные процедуры
17 Волшебник
 
11.03.21
10:15
(14) Согласен. Названия функций и переменных сами по себе являются комментариями
18 ManyakRus
 
11.03.21
10:16
Надо делать отдельную функцию создание контрагента а не область
19 vsg-work
 
11.03.21
10:16
(9) Спасибо за совет Вам. НА досуге попробую)
20 fisher
 
11.03.21
10:22
Цитата из системы стандартов 1С: "объемные разделы модулей рекомендуется разбивать на подразделы по функциональному признаку. Разделы и подразделы оформляются в виде областей"
Плюс ряд разделов и даже их порядок тоже стандартизирован. Ну, в любой современной типовой это легко наблюдать.
21 Тихий омут
 
11.03.21
10:47
(8) типовая буха, глобальный поиск НайтиПоКоду(" - 60 вхождений :)))
22 ДенисЧ
 
11.03.21
10:50
(21) А что там ищут по коду - ты не смотрел?
23 Aleksey
 
11.03.21
10:51
(22) обычно валюту
24 ДенисЧ
 
11.03.21
10:51
В основном - классификаторы всякие. Со строгими кодами.
25 Kesim
 
11.03.21
11:57
недавно разгребал найтиПоНаименованию/коду более 180 точек в самописной конфе. 4-5 элементов поменяли наименование и не отрабатывали. помимо этого уход от этих методов ускорил открытие некоторых форм на 0,15 секунд.
так что согласен с тем что на области можно не обращать внимание, если есть найтиПоНаименованию/коду
26 vsg-work
 
11.03.21
19:27
(25) А чем заменяете "НайтиПоНаименованию" или "НайтиПоКоду"? Запросом?
27 Волшебник
 
11.03.21
19:41
(26) Предопределённые элементы справочника, константы, таблицы настройки, параметры обработки, ключи
28 fisher
 
12.03.21
11:10
С тех пор как связку предопределенных с пользовательскими сделали нестрогой, вообще красота стала.
Теперь в самописке, как только возникает необходимость в НайтиПоКоду - сразу создаю предопределенный элемент и навешиваю его на нужный элемент справочника. Ну, это если нельзя решить более гибко - через ввод дополнительных признаков.
29 Kassern
 
22.04.21
12:15
(0) По поводу областей внутри функций/процедур. В некоторых процедурах даже вложенные области используют)
Процедура ПриСозданииФормыПодбораНаСервере(Форма) Экспорт
    
    Параметры = Форма.Параметры;
    Элементы = Форма.Элементы;
    ЭтоФормаПодбораВДокументыПродажи = ПодборТоваровКлиентСервер.ЭтоФормаПодбораВДокументыПродажи(Форма);
    ЭтоФормаПодбораВДокументыЗакупки = ПодборТоваровКлиентСервер.ЭтоФормаПодбораВДокументыЗакупки(Форма);
    АвторизованВнешнийПользователь = ОбщегоНазначенияУТКлиентСервер.АвторизованВнешнийПользователь();
    
#Область ПолучитьЗначенияФункциональныхОпций
    
    Форма.ИспользоватьУпаковкиНоменклатуры = ПолучитьФункциональнуюОпцию("ИспользоватьУпаковкиНоменклатуры");
    Форма.ИспользоватьХарактеристикиНоменклатуры = ПолучитьФункциональнуюОпцию("ИспользоватьХарактеристикиНоменклатуры");
    Форма.ИспользоватьСтандартныйПоискПриПодбореТоваров = Константы.ИспользоватьСтандартныйПоискПриПодбореТоваров.Получить();
        
    Если ЭтоФормаПодбораВДокументыПродажи Тогда
        Форма.ИспользоватьРучныеСкидкиВПродажах = ПолучитьФункциональнуюОпцию("ИспользоватьРучныеСкидкиВПродажах")
                                                  И НЕ АвторизованВнешнийПользователь;
        Форма.ИспользоватьНоменклатуруПродаваемуюСовместно = ПолучитьФункциональнуюОпцию("ИспользоватьНоменклатуруПродаваемуюСовместно");
        Если Не Форма.РежимПодбораБезСоглашенийСКлиентами    Тогда    
            Форма.ИспользоватьСоглашенияСКлиентами = ПолучитьФункциональнуюОпцию("ИспользоватьСоглашенияСКлиентами");
        КонецЕсли;
        Форма.ИспользоватьРасширеннуюФормуПодбораКоличестваИВариантовОбеспечения = ПолучитьФункциональнуюОпцию("ИспользоватьРасширеннуюФормуПодбораКоличестваИВариантовОбеспечения");
    ИначеЕсли ЭтоФормаПодбораВДокументыЗакупки Тогда
        Форма.ИспользоватьРучныеСкидкиВЗакупках = ПолучитьФункциональнуюОпцию("ИспользоватьРучныеСкидкиВЗакупках");
        Форма.ИспользоватьНоменклатуруПоставщиков = ПолучитьФункциональнуюОпцию("ИспользоватьНоменклатуруПоставщиков");
    КонецЕсли;
#КонецОбласти

    
#Область УстановитьСвойстваФормыПоПараметрам
    
    #Область УстановитьСкладскиеНастройкиПоПараметрам
    
    ЭтоГруппаСкладов = Справочники.Склады.ЭтоГруппа(Параметры.Склад);
30 Kassern
 
22.04.21
12:16
(29) типовая конфа ут11
31 Hans
 
22.04.21
12:19
Исползовать области в процедурах и функциях это не правильно.
32 Kassern
 
22.04.21
12:20
(31) тогда почему сами разрабы 1с это делают?
33 Hans
 
22.04.21
12:24
(32) Похоже что быдлокодеры. Хотя не уверен.
34 Kassern
 
22.04.21
12:33
(33) вместо длинной портянки на несколько листов, получается более менее читаемая процедура, где все в одном месте. Видимо в некоторых случаях лучше использовать одну процедуру с областями, чем дробить ее на множество функций/процедур
https://ibb.co/K5X0PPg
35 acht
 
22.04.21
12:34
33) https://its.1c.ru/db/v8std/content/456/hdoc пункт 8
Не, ты конечно можешь продолжать считать как тебе угодно, да.
36 acht
 
22.04.21
12:35
(34) Да. Например текст запроса и значения устанавливаемых параметров.
37 hhhh
 
22.04.21
12:41
(30) + и в БП3 тоже есть, подтверждаю.
38 Hans
 
22.04.21
12:43
(34) Дробить как раз таки и надо, а не использовать области.
39 Hans
 
22.04.21
12:44
(36) Можно сворачивать тексты запроса. Это норм. Но сам код нельзя.
40 Griffin
 
22.04.21
12:45
#Область Скорее_всего_тут_что_-_то_есть
    
#КонецОбласти

При сворачивании области будет так:

Скорее всего тут что - то есть

Немного приятнее для глаза:)
41 acht
 
22.04.21
12:47
(38) Чувак. У вендора есть гайд по кодестайлу. Он использует его сам и рекомендует другим.
При таком подходе твое мнение о том что можно и что нельзя - это всего лишь твое частное мнение.

И вот уже началась подгонка этого мнения. То безапелляционое "неправильно" в (31) и (33). Теперь уже "Можно сворачивать тексты запроса". Ты уж определись?
42 Hans
 
22.04.21
12:49
Отладкой по таким свернутым текстам проходить пробывали? Что будет?
43 Hans
 
22.04.21
12:49
Текст запроса можно свернуть, не критично. Но я в таком случае вынесу текст запроса в отдельную функцию и все.
44 Kassern
 
22.04.21
12:50
(42) а что с отладкой не так? Она спокойно по областям ходит
45 Kassern
 
22.04.21
12:51
(44) и можно развернуть нужную область и отлаживать уже ее.
46 Hans
 
22.04.21
12:51
Процедуры и фунции должны быть размером в один два экрана. А на такие размеры не нужны никакие области. Такая процедура может в голове уместиться и ее легко отлаживать.
47 acht
 
22.04.21
12:53
(46) Чистный и незамутненный теоретик =)

Ты БСП когда нибудь внедрял, например? Когда она свои обработчики в формы там записывает...
48 Волшебник
 
22.04.21
12:54
(46) Предлагаю 2-3 экрана с книжной ориентацией.
49 Hans
 
22.04.21
12:55
(44) Области мешают отладке. При хождении по шагам - заходит в области если они свернутые.
50 Hans
 
22.04.21
12:56
(47) А что там с обработчиками?
51 Hans
 
22.04.21
12:59
(47) Я не гуру, не экперт. Но мне почти всегда удается писать код с процедурами край в два экрана максимум.
52 Hans
 
22.04.21
13:03
Особо радуют те кто пишет:

Если
5 экранов кода
иначеЕсли
5 экранов кода
иначе

КонецЕсли;
53 ildary
 
22.04.21
13:06
(49) Как области мешают отладке? Если при хождении по шагам конфигуратор сам развернет область.
54 Hans
 
22.04.21
13:09
(53) а в процедуру хочешь заходи, не хочешь - не заходи.
55 banco
 
22.04.21
13:12
(14) В стандарте разрешается. В типовых тоже встречал области внутри процедуры.

https://its.1c.ru/db/v8std#content:456:hdoc
Тексты больших процедур и функций можно разбивать на отдельные сворачиваемые области.
56 acht
 
22.04.21
13:23
(50) Они автоматически вставляют туда или обновляют вызовы групп своих методов.
Хотя я сейчас заглянул, они похоже на области еще не перешли, все еще используют маркеры типа

// СтандартныеПодсистемы.ВерсионированиеОбъектов
...
// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов


(51) Великолепно! Осталось только осознать, что бест практикс, к которым относятся правила использования областей, они составлены организацией, у которой немного побольше опыта применения в конкретных боевых условия. Ты, конечно, умничка, только пока маленькая и локальная.
57 fisher
 
22.04.21
13:26
(55) Да, действительно...
Спасибо за замечание, буду знать.
Но все равно мне это не кажется оправданным. Мне удобнее, когда внутри функции ничего не сворачивается. В идеале функции вообще не должны быть большими, а этапы которые не кажется оправданным выносить в отдельные процедуры привычнее комментариями выделять.
58 skpoo
 
22.04.21
13:31
(7) И гонять туда сюда процедуры/функции через стек?
59 fisher
 
22.04.21
13:34
(58) Да. Сэкономленные микросекунды ты бережно пронесешь до ближайшего обращения к БД.
60 Kassern
 
22.04.21
13:41
(57) я, если честно, сам пока не могу понять логику использования областей, где-то обернут в область стек процедур, где-то запихнут в отдельную процедуру с параметром формы.
К примеру, все тот же модуль из ут11:
Параметры = Форма.Параметры;
    Элементы = Форма.Элементы;
    ЭтоФормаПодбораВДокументыПродажи = ПодборТоваровКлиентСервер.ЭтоФормаПодбораВДокументыПродажи(Форма);
    ЭтоФормаПодбораВДокументыЗакупки = ПодборТоваровКлиентСервер.ЭтоФормаПодбораВДокументыЗакупки(Форма);
    АвторизованВнешнийПользователь = ОбщегоНазначенияУТКлиентСервер.АвторизованВнешнийПользователь();
    
#Область ПолучитьЗначенияФункциональныхОпций
    
    Форма.ИспользоватьУпаковкиНоменклатуры = ПолучитьФункциональнуюОпцию("ИспользоватьУпаковкиНоменклатуры");
    Форма.ИспользоватьХарактеристикиНоменклатуры = ПолучитьФункциональнуюОпцию("ИспользоватьХарактеристикиНоменклатуры");
    Форма.ИспользоватьСтандартныйПоискПриПодбореТоваров = Константы.ИспользоватьСтандартныйПоискПриПодбореТоваров.Получить();
        
    Если ЭтоФормаПодбораВДокументыПродажи Тогда
        Форма.ИспользоватьРучныеСкидкиВПродажах = ПолучитьФункциональнуюОпцию("ИспользоватьРучныеСкидкиВПродажах")
                                                  И НЕ АвторизованВнешнийПользователь;
        Форма.ИспользоватьНоменклатуруПродаваемуюСовместно = ПолучитьФункциональнуюОпцию("ИспользоватьНоменклатуруПродаваемуюСовместно");
        Если Не Форма.РежимПодбораБезСоглашенийСКлиентами    Тогда    
            Форма.ИспользоватьСоглашенияСКлиентами = ПолучитьФункциональнуюОпцию("ИспользоватьСоглашенияСКлиентами");
        КонецЕсли;
        Форма.ИспользоватьРасширеннуюФормуПодбораКоличестваИВариантовОбеспечения = ПолучитьФункциональнуюОпцию("ИспользоватьРасширеннуюФормуПодбораКоличестваИВариантовОбеспечения");
    ИначеЕсли ЭтоФормаПодбораВДокументыЗакупки Тогда
        Форма.ИспользоватьРучныеСкидкиВЗакупках = ПолучитьФункциональнуюОпцию("ИспользоватьРучныеСкидкиВЗакупках");
        Форма.ИспользоватьНоменклатуруПартнеров = ПолучитьФункциональнуюОпцию("ИспользоватьНоменклатуруПартнеров");
    КонецЕсли;
#КонецОбласти

Вот тут могли же создать процедуру ПолучитьЗначенияФункциональныхОпций(Форма) и в нее это пихнуть.
В этой же процедуре где области, есть следующая строчка:
УстановитьЗначенияПоНастройкамФормы(Форма);
С тем же успехом они могли создать область #УстановитьЗначенияПоНастройкамФормы и запихнуть все туда...
61 Kassern
 
22.04.21
13:44
(60) и да, они еще накосячили, назвали 2 области одинаково в этой процедуре, видимо копипастили, внутрянку заменили, а область не переименовали)
#Область УстановитьОтборОсобенностьУчета
    Если Параметры.Свойство("ОсобенностьУчета") Тогда
        ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
        Форма.СписокНоменклатура, "Ссылка.ОсобенностьУчета", Параметры.ОсобенностьУчета,
            ВидСравненияКомпоновкиДанных.Равно, "ОтборОсобенностьУчета",ЗначениеЗаполнено(Параметры.ОсобенностьУчета));
    КонецЕсли;

#КонецОбласти

#Область УстановитьОтборОсобенностьУчета

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

#КонецОбласти
62 Hans
 
22.04.21
14:00
(56) Даже если они будут туда вставлять области, то это не для того что бы код был свернут. Они в формы вставляют небольшие куски кода.
63 Hans
 
22.04.21
14:20
Я так называемый гугл программист и то такое понимаю.
64 fisher
 
22.04.21
14:41
(60) Ну так декомпозиция кода - это вопрос во многом религиозный. Поэтому как карта легла, так и есть. А нужный аспект нужно выделить в любом случае. Неважно, декомпозировался он в отдельную функцию или нет.
65 fisher
 
22.04.21
14:49
(64) + Но лично я бы конечно предпочел такие вещи по возможности в отдельные функции выносить.
66 Hans
 
22.04.21
15:08
(65) Спец литературу по декомпозиции не знаешь случаем?
67 Hans
 
22.04.21
15:34
Функция ЗначениеВФайл(<ИмяФайла>, <Значение>) пример быдлокодинга разработчиков платформы?
68 Волшебник
 
22.04.21
15:35
(67) Deprecated - устарело, осуждаемо

Депрекация — в программировании некоторое указание нежелательности применения какой-либо части программы, процедуры или языка программирования.
69 Hans
 
22.04.21
15:41
(68) Активно используем.
70 fisher
 
22.04.21
17:55
(66) Прям вот отдельно по процедурному программированию не подскажу. В литературе по ООП много про декомпозицию. Многое ведь упирается в особенности более богатых языков - там не грех и подсмотреть best practices когда уже есть некоторое понимание. Ну там строгая типизация, классы, интерфейсы, функции высшего порядка, инъекция зависимостей и прочие факторы. А в 1С же фактически процедурное программирование. Если регулярно приходится рефакторить собственный код, то все большей частью интуитивно приходит и упирается в банальные вещи, к которым просто надо прийти своей шкурой. Через "лень - двигатель прогресса".
Фактически все сводится к ясным наименованиям сущностей и вынесению максимума функциональности в простые однозадачные чистые функции без сайдэффектов.
Я часто больше умственных усилий трачу на придумывание хорошего имени, чем на собственно кодинг. Это повышает ясность мышления. В процессе очень многое автоматически проясняется. Не зря ведь "как вы яхту назовете, так она и поплывет". Когда думаешь, насколько хорошо данное название отражает сущность - часто понимаешь что не только назвать нужно иначе, но и реализовывать тоже. Часто при этом приходит в голову, как можно дешево повысить универсальность кода.
Когда пытаешься писать самодокументируемый код, то грамотная декомпозиция проявляется автоматически, как сайдэффект :)
71 Мимохожий Однако
 
22.04.21
18:08
Если функция будет использоваться только один раз в коде, то её можно и не создавать. В этом случае включение в область самое то.))
72 Cthulhu
 
22.04.21
18:12
выше много кто прав.
если внутри процедуры/функции выделена область - значит это временное решение, "костыль" и напоминание о том, что содержимое области необходимо вынести в отдельную процедуру (реже - функцию).
точка.
73 Волшебник
 
22.04.21
18:19
(69) В 1С скоро добавят атрибуты. Истину вам говорю!
74 acht
 
22.04.21
21:46
(73) &Причиндал РежимСовместимости("Авто")
75 Mort
 
22.04.21
21:56
Запрос.Текст =
[Область текст запроса]

гораздо удобнее чем:

Запрос.Текст = ПростоВернутьОченьДлинныйЛитерал();


Хотя если текст запроса собирается по кускам, то выносить стоит.
76 acht
 
22.04.21
22:04
(72) Еще за кулисами есть сценарий
#Область Изменил_Иванов_Иван_Иванович_1_апреля_45_размер_ноги
#КонецОбласти

Но на нашей сцене все пишут чистейший код и срут бабочками
77 Kassern
 
23.04.21
09:02
(76) а это нормальная практика свои вставки кода через область выделять?
78 Kassern
 
23.04.21
09:03
(77) или это все от лукавого?)
79 acht
 
23.04.21
09:09
(77) Что есть "нормальность"?
80 fisher
 
23.04.21
09:18
(77) Почему нет. Сразу бросается в глаза на фоне обычных комментариев. Другое дело, что в идеале это вообще не нужно (если конфигурация сопровождается через удобную VCS). Но...
Если это типовая с единичными правками, сопровождаемая от случая к случаю самыми разными подрядчиками - то вариантов нет.
81 Hans
 
23.04.21
09:21
(78) От лукавого.  В сравнении объединении области отдельно показывают.