Присвоить значение реквизиту составного типа

Ключевые слова: составной, тип, реквизита, значения

Понятие «тип реквизита» отличается от понятия «тип значения»

Конкретное значение не может быть составного типа. Одно конкретное значение может быть только одного типа данных.

Реквизит может быть как одного типа, так и составного типа. В последнем случае его тип описывается объектом «ОписаниеТипов», т.е. список возможных типов, значения которых могут храниться в этой колонке. Например, СправочникСсылка.М1, СправочникСсылка.М2, Строка, Число, ДокументСсылка.Д1.

В каждой строке (элементе, записи) содержится какое-то свое значение, но каждое из них — одного типа. Например, «СправочникСсылка.М1». Если же в ячейке колонки, имеющей составной тип, даже не выбран (не назначен) тип значения, то оно содержит значение «Неопределено» (это значение и одновременно тип). Если же тип выбран (кнопкой Т или установлен программно), то ячейка содержит пустое значение этого типа, например, пустую ссылку на элемент справочника (см. v8: Пустые ссылки), пустую строку «» или 0.

Чтобы реквизиту составного типа установить конкретный тип, достаточно присвоить ему пустое значение этого типа.

Более подробное описание работы со составными типами

Взято с itland.ru

http://itland.ru/forum//index.php?showtopic=2577

Вопрос:

Какие существуют особенности работы с составными типами данных.

Ответ

Этот вопрос имеет два стороны:

1) Сторона элемента формы.

Для элемента формы мы можем установить только ограничение на типы которые можно выбрать.

Т.е. с помощью кода:

 МассивТипов=Новый Массив();
 МассивТипов.Добавить(Тип("СправочникСсылка.Контрагенты"));
 ЭлементыФормы.ПолеВвода1.ОграничениеТипа=Новый ОписаниеТипов(МассивТипов);

Мы ограничиваем возможный типы только одним «СправочникСсылка.Контрагенты».

НО это не действует на значение которое хранится в источнике данных.

Поэтому если реквизит который связан с «ПолеВвода1» имеет «составной» тип, например Любая ссылка,

он будет неопределенного типа даже после «ЭлементыФормы.ПолеВвода1.ОграничениеТипа=Новый ОписаниеТипов(МассивТипов);»

2) Сторона источника данных.

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

Но если у реквизита установлен «составной» тип значение реквизита будет неопределенно до тех пор, пока ему не будет присвоено значение конкретного типа.

Присвоить конкретное значение можно либо из языка, либо выбрав это значение в форме.

Из выше описанного можно сделать вывод:

Если у реквизита установлен «Составной» тип данных, то даже при ограничении возможных типов у элемента формы до одного возможного, у пользователя будет запрошен тип который нужно будет присвоить реквизиту.

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

Сделать это можно следующим образом:

//"Значение1" это реквизит связанный с "ПолеВвода1".
Значение1 = ЭлементыФормы.ПолеВвода1.ОграничениеТипа.ПривестиЗначение(Значение1);

Добавление от ezh (особенности при работе с элементами в табличном поле):

1.

Вместо этого:

ЭлементыФормы.ПолеВвода1.ОграничениеТипа=Новый ОписаниеТипов(МассивТипов);

Пишем это:

ЭлементыФормы.ИмяТабличнойЧасти.Колонки.ИмяКолонки.ЭлементУправления.ОграничениеТипа = Новый ОписаниеТипов(МассивТипов);

2.

Вместо этого:

Значение1 = ЭлементыФормы.ПолеВвода1.ОграничениеТипа.ПривестиЗначение(Значение1);

Пишем это:

ЭлементыФормы.ИмяТабличнойЧасти.ТекущаяСтрока.ИмяКолонки = ПривестиЗначение(ЭлементыФормы.ИмяТабличнойЧасти.ТекущаяСтрока.ИмяКолонки);

// можно так, а можно как в примере ниже...

Вот работающий пример:

 МассивТипов = Новый Массив();
 МассивТипов.Добавить(Тип("ПеречислениеСсылка."+Элемент.Значение));
 ОписаниеТипов = Новый ОписаниеТипов(МассивТипов);
 
 ЭлементыФормы.ТабличнаяЧасть1.Колонки.ЗначениеПеречисления.ЭлементУправления.ОграничениеТипа = ОписаниеТипов;
 // ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.ЗначениеПеречисления = ОписаниеТипов.ПривестиЗначение(ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.ЗначениеПеречисления);
 ЭлементыФормы.ТабличнаяЧасть1.Колонки.ЗначениеПеречисления.ЭлементУправления.Значение = ОписаниеТипов.ПривестиЗначение(ЭлементыФормы.ТабличнаяЧасть1.Колонки.ЗначениеПеречисления.ЭлементУправления.Значение);

Для этого можно присвоить реквизиту формы значение пустой ссылки нужного типа. Одного из тех типов, которые входят в составной тип.

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

Объект.ОтветЛицо = ПредопределенноеЗначение("Справочник.ФизическиеЛица.ПустаяСсылка");

Если запретить выбор типа в поле ввода (свойство ВыбиратьТип), то реквизиту ОтветЛицо будет назначен тип ссылки на справочник ФизическиеЛица, и для выбора будут предлагаться значения только этого справочника.

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

Массив = Новый Массив();
Массив.Добавить(Тип("СправочникСсылка.ФизическиеЛица"));
НашеОписание = Новый ОписаниеТипов(Массив);
Элементы.ОтветЛицо.ОграничениеТипа = НашеОписание;
Объект.ОтветЛицо = НашеОписание.ПривестиЗначение(Объект.ОтветЛицо);

Как программно установить тип реквизита

Автор Алексей_1985_06, 24 мая 2022, 20:08

0 Пользователей и 1 гость просматривают эту тему.

Уважаемые товарищи, подскажите вот с таким вопросом:

1.   Создан реквизит «Комплекс» с составным типом данных (СправочникСсылка.ТехническиеКомплексы, СправочникСсылка.СтартовыеКомплексы)
2.   Созданы два реквизита формы ТК (булево) и СК (булево)
3.   Необходимо что бы при ТК = Истина,  реквизит «Комплекс» — имел тип СправочникСсылка.ТехническиеКомплексы, а при СК = Истина реквизит «Комплекс» — имел тип СправочникСсылка.СтартовыеКомплексы.

 :befhbt: Или кто подскажет может по другому как-то реализуется процесс определения типа данных реквизита в зависимости от значения другого реквизита (типа Булево)


Непонятно, зачем переустанавливать типы? У вас они уже назначены составным типом. При записи элементов справочника в этот реквизит, тип сам будет устанавливаться в нужный.
Я бы действовал в обратную сторону. При записи в реквизит «Комплекс» элемент из СправочникСсылка.ТехническиеКомплексы, присваивать ТК = Истина. А при записи СправочникСсылка.СтартовыеКомплексы — СК = Истина.


Алексей_1985_06, сильно зависит от того какие формы, управляемые или обычные, действительно, когда у реквизита составной тип
(и не два как у вас а десяток) до задалбывает каждый раз для перевыбора элемента того-же типа, сначала выбирать этот-же тип а затем и сам элемент
для избежания этого, использую такой код

&НаКлиенте
Процедура ТаблицаОбработкиДубльНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

лкТекушаяСтрока = Элементы.СсылкиДублей.ТекущиеДанные;
Если лкТекушаяСтрока <> Неопределено Тогда
Элемент.ВыбиратьТип = Не ЗначениеЗаполнено(лкТекушаяСтрока.Значение);
КонецЕсли;

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

  • 3 пользователя сказали спасибо!

если помогло нажмите: Спасибо!


LexaK, Большое Вам спасибо за помощь!!!!


Содержание:

1.       Что такое составной тип данных

2.       Недостатки составного типа данных

3.       Использование составного типа данных

1.     Что такое составной тип данных

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

  • выбрано более одного типа данных

Выбор более одного типа объекта метаданных

  • выбраны ссылки на объекты базы данных типов разного вида. Такие как: ДокументСсылка, ПеречислениеСсылка, ПланВидовХарактеристикСсылка, ПланСчетовСсылка, ПланВидовРасчетаСсылка, БизнесПроцессСсылка, ТочкаМаршрутаБизнесПроцессаСсылка, ЗадачаСсылка, ПланОбменаСсылка, ЛюбаяСсылка.

Выбор ссылки на объекты базы данных типов разного вида

Как же создаются составные типы данных? Для этого нужно в конфигураторе открыть свойства объекта, тип данных которого вы хотите задать и установить флажок — «Составной тип данных»

Создание составного типа данных в 1С   

2.     Недостатки составного типа данных

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

К сожалению все далеко не так просто… Составной тип данных – он как айсберг. Помимо того, что он огромен, а видна только верхушка (реальное представление составного типа нужно искать в глубинах СУБД), так еще и может не затопить, но уж точно сильно затормозить ваш корабль (базу), если обращаться с ним неосторожно.

Самым очевидным недостатком составного типа, конечно же, является размер. Для каждого простого типа данных, выбранного в составном, база выделяет отдельное поле. Так что составной тип в 1С может занимать в два, три и так далее больше раз места, чем простой.

Также составные типы данных отрицательно сказываются на производительности (в особенности, когда дело касается запросов). Самый простой пример –запрос к составному типу данных (без метода «ВЫРАЗИТЬ») вернет все простые типы, входящие в составной.

ВЫБРАТЬ
ОбъектКонфигурации.СоставнойТип КАК СоставнойТип
ИЗ
ОбъектКонфигурации КАК ОбъектКонфигурации

это тоже самое, что и

 
ВЫБРАТЬ
    ОбъектКонфигурации.СоставнойТип.Тип КАК СоставнойТипТип,
    ОбъектКонфигурации.СоставнойТип.Булево КАК СоставнойТипБулево, 
    ОбъектКонфигурации.СоставнойТип.Число КАК СоставнойТипЧисло,
    ОбъектКонфигурации.СоставнойТип.Дата КАК СоставнойТипДата,
    ОбъектКонфигурации.СоставнойТип.Строка КАК СоставнойТипСтрока,
    ОбъектКонфигурации.СоставнойТип.ВидСсылки КАК СоставнойТипСсылки,
    ОбъектКонфигурации.СоставнойТип.Ссылка КАК СоставнойТипСсылка
ИЗ
    ОбъектКонфигурации КАК ОбъектКонфигурации

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

Составной тип данных совсем не сложен. Он полезен и весьма удобен при разработке, но таит в себе множество опасностей. И чем объемнее и сложнее база, с которой вы работаете, тем больше (в том числе и достаточно серьезных) проблем принесет необдуманное использование составного типа данных.

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

3.     Использование составного типа данных

Но как же тогда работать с составными типами данных в 1С?

Самый простой и очевидный способ – не работать вовсе. Если задача требует использования составных типов, это повод проанализировать ее еще раз – может, есть другой способ?

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

Объект метаданных Определяемый тип

Вместо того, чтобы прописывать состав типов для кучи элементов, можно будет использовать один универсальный Определяемый тип, что упростит как разработку, так и читаемость системы.

Так же стоит помнить, что не все составные типы одинаковы вредны . Так Составной тип, состоящий исключительно из ссылок не требует от СУБД так же много ресурсов, как Составной тип данных, в котором присутствуют основные типы и форматы данных (строка, число, дата и т.д.). С последним стоит быть особенно осторожным, т.к. он особенно сильно влияет на эффективность конфигурации.

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

Теперь перейдем к Запросам – части 1С, которая больше всего страдает от Составных типов данных. Здесь тоже есть несколько методов, которые позволяют избежать просадок эффективности.

Во-первых, в Реквизиты Составных типов, участвующие в соединениях, отборах и упорядочивании, должны входить только Ссылочные типы данных. Использование любых других типов приведет к потере производительности. Причина этого кроется в особенностях их хранения в СУБД.

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

Кроме того, при всех отборах и соединениях Составных типов обязательно следует использовать метод ВЫРАЗИТЬ(). Если этого не сделать, реквизит соединится с Составным типом данных по всем таблицам, из которых этот тип состоит, после чего уже отсекаются ненужные. ВЫРАЗИТЬ() отсекает ненужные таблицы заранее, сильно влияя на эффективность Запроса.

Таким образом, даже с Составными типами данных в 1С можно работать. Только делать это нужно внимательно и осторожно.

Специалист компании «Кодерлайн»

Кирилл Пак

Составной тип — коварный тип!

Список значений в составном типе. Задание типа значения списка.

1) Проверка заполнения реквизита.

    Если реквизит составного типа, то проверка реквизита на заполненность значением выполняем только с помощью функции ЗначениеЗаполнено().
    Ответ таков: когда у составного реквизита тип не выбран, то он имеет значение Неопределено, поэтому проверки типа ПустаяСтрока(Реквизит) Или Реквизит.Пустая() могут сгенерировать исключительную ошибку.

2) Построение запроса

    Если в запросе реквизит составного типа участвует в отборах или в соединениях, то следует использовать функцию ВЫРАЗИТЬ(), что уменьшит время выполнения запроса.
    Ответ таков: в таких условия система производит левое соединение реквизита с таблицами, которые указаны в его типе, а потом уже отсекает лишние записи. Добавив функцию ВЫРАЗИТЬ в запрос, мы явно указываем с какой таблицей выполнять левое соединение. Умно выражаясь, данная функция выполняет приведение значения к определенному типу.

Синтаксис функции: ВЫРАЗИТЬ ( <Выражение> КАК <Тип значения> ).

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


Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВЫРАЗИТЬ(ТочкиКартыМаршрутаБизнесПроцесса.ВладелецТочки КАК Справочник.ШаблоныБизнесПроцесса).Наименование КАК ШаблонБизнесПроцесса,
| ТочкиКартыМаршрутаБизнесПроцесса.Наименование КАК НаименованиеТочкиМаршрута,
| ТочкиКартыМаршрутаБизнесПроцесса.ВидТочки КАК ВидТочкиМаршрута
|ИЗ
| Справочник.ТочкиКартыМаршрутаБизнесПроцесса КАК ТочкиКартыМаршрутаБизнесПроцесса
|ГДЕ
| ВЫРАЗИТЬ(ТочкиКартыМаршрутаБизнесПроцесса.ВладелецТочки КАК Справочник.ШаблоныБизнесПроцесса) ЕСТЬ НЕ NULL
| И НЕ ТочкиКартыМаршрутаБизнесПроцесса.ПометкаУдаления";

Результат = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = Результат.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Вставить обработку выборки ВыборкаДетальныеЗаписи
КонецЦикла;

3) Проявление отрицательной стороны

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

Вот такой вот коварный составной тип!

  1. Всем здравствуйте! Есть справочник «ИгрокиЛотереи» с реквизитом составного типа данных «СпособОплатыЛотерей» (в составе, например: СправочникСсылка.КартаМир, СправочникСсылка.КартаМастерКард и т.д.). Важно! состав типов должен быть определён. Если для решения темы нужно будет выбрать тип значения реквизита «СпособОплатыЛотерей» в «неопределено», то мне это не подойдёт.
    Далее я имею открытую форму справочника «КартаМир», где ИгрокЛотереи — это ссылка на элемент справочника «ИгрокиЛотереи».
    Нужно программно установить тип значения поля ввода, соответствующее реквизиту «СпособОплатыЛотерей» как «СправочникСсылка.КартаМир» и присвоить данному полю ввода значение ссылки на объект открытой формы типа «СправочникСсылка.КартаМир». В модуле элемента формы справочника «КартаМир» пишу код:

    Элемент=ИгрокЛотереи.ПолучитьФорму("ФормаЭлемента").ЭлементыФормы.Найти("СпособОплатыЛотерей");
        ТипСтр="СправочникСсылка.КартаМир";
        Элемент.ОграничениеТипа=Новый ОписаниеТипов(ТипСтр);
        Значение=Элемент.Значение;
        Элемент.Значение=Элемент.ОграничениеТипа.ПривестиЗначение(Значение);
        Элемент.ВыбиратьТип=Ложь;
        Элемент.Значение=ЭтотОбъект.Ссылка;

    Вылезает ошибка:
    {Справочник.КартаМир.Форма.ФормаЭлемента.Форма(23)}: Поле объекта не обнаружено (ОграничениеТипа)
    Элемент.ОграничениеТипа=Новый ОписаниеТипов(ТипСтр);

    Прошу — помогите, пожалуйста, кто чем может.


  2. 1cUserAndrew

    Offline

    1cUserAndrew
    Профессионал в 1С
    Команда форума
    Заблокирован

    Регистрация:
    27 май 2010
    Сообщения:
    5.082
    Симпатии:
    207
    Баллы:
    104

    Немного запутанно у вас все реализовано.
    Но если по теме, то посмотрите в отладке, какое значение принимает переменная «Элемент» (возможно, там Неопределено или что-то другое).
    Плюс проверьте, в какой процедуре написан этот код, и нет ли у этой процедуры параметра «Элемент» (такой параметр встречается в процедурах-обработчиках событий). В этом случае не стоит так называть переменную.

  3. Этот код написан в процедуре ПриЗаписи() элемента справочника КартаМир. Табло отладчика показывает пустую строку, а ВычислитьВыражение выдаёт ошибку в выражении:
    Элем=ИгрокЛотереи.ПолучитьФорму(«ФормаЭлемента»).ЭлементыФормы.Найти(«СпособОплатыЛотерей»);

    Я переименовал на всякий случай переменную Элемент в Элем. Метод Сообщить(Элем) в данной строчке кода возвращает ПолеВвода. Должен же быть способ присвоить нужному элементу справочника данное значение..


  4. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С
    Заблокирован

    Регистрация:
    20 окт 2008
    Сообщения:
    9.541
    Симпатии:
    1.003
    Баллы:
    204

    Забудьте вы про форму, работайте с объектом напрямую.

  5. Так я вот и пытался сначала на объектном уровне писать. И вот ошибки:

    {Справочник.КартаМир.Форма.ФормаЭлемента.Форма(29)}: Поле объекта недоступно для записи (СпособОплатыЛотерей)
    ИгрокЛотереи.СпособОплатыЛотерей=ЭтотОбъект.Ссылка;

    {Справочник.КартаМир.Форма.ФормаЭлемента.Форма(29)}: Значение не является значением объектного типа (Значение)
    ИгрокЛотереи.СпособОплатыЛотерей.Значение=ЭтотОбъект.Ссылка;


  6. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С
    Заблокирован

    Регистрация:
    20 окт 2008
    Сообщения:
    9.541
    Симпатии:
    1.003
    Баллы:
    204

    Я лично вообще пока не понимаю, к чему весь этот изврат с открытыми формами, какими-то значениями в этих формах…..
    Форма — это всего лишь удобное для пользователя отображение данных БД, она хранит значения до своего закрытия.

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

    Получайте объект по ссылке ИгрокЛотереи и присваивайте значение в его реквизит:

    ТекОбъект = ИгрокЛотереи.ПолучитьОбъект();
    ТекОбъект.СпособОплаты = Ссылка;
    ТекОбъект.Записать();
    
    Последнее редактирование: 22 окт 2018
  7. Спасибо всем большое. Последние три строчки кода помогли! Я просто забыл записать изменённый объект.

Похожие темы

  1. kogor
    Ответов:
    3
    Просмотров:
    7.498


1C-pro.ru - форум по 1С:Предприятию 7.7, 8.0, 8.1, 8.2, 8.3

Задача.
Например, есть табличная часть с двумя колонками «ВидПоступленияДС» и «Аналитика». Поле «Аналитика» может содержать значения составного типа. Необходимо, в зависимости от введенного значения в поле «ВидПоступленияДС», установить нужный тип для поля «Аналитика».
Решение.
В событии «ПриИзменении» поля ввода «ВидПоступленияДС» пропишем следующий код:

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

Понравилась статья? Поделить с друзьями:
  • Присоединение компании налоговые последствия
  • Пристав перечислил деньги не на те реквизиты
  • Приходный кассовый ордер реквизиты документа
  • Пункт выдачи озон в александрове часы работы
  • Пункт выдачи озон голубинская 16 часы работы