Условный оператор 1с: Условный оператор ? вопрос — 1С 8.3 для разработчиков

Переводим синтаксис 1С на английский язык / Хабр

Когда программисты первый раз видят прикладной язык 1С, многие впадают в ступор. Несмотря на то, что родной русский язык в любом случае ближе и понятнее, читать код на русском языке и понимать, что происходит в нем (когда это в новинку) не так-то просто.

Опытный программист сразу увидит определенные знакомые конструкции (условия, циклы, вызовы функций), но многие моменты в коде все равно будут непонятными и непривычными. А уж если код был написан программистом с даром красивого именования переменных и функций, то процесс первого знакомства с 1С обещает быть еще более ярким. Впрочем, последнее справедливо не только для 1С.

Пример кода от любителя красивого синтаксиса

Сейчас процесс перевода 1С на английский язык идет полным ходом. К существующим ранее решениям (таким как 1C:Drive) недавно добавился 1С:ERP World Edition, а разработка на английском языке (более привычном и понятном для многих начинающих или не связанных с 1С программистов) стала еще более актуальной.

Как же человеку, уже прикипевшему к русскому языку в коде и / или со знаниями английского на уровне «London is the capital of Great Britain… Microsoft…Coca-Cola…Ok» быстро перестроиться на кодирование на английском языке?

Есть несколько способов:

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

Вот пример кода, как не нужно делать:

2.     Второй способ – открыть любую типовую конфигурацию и искать название на английском нужной конструкции с помощью синтаксис-помощника. Как правило, там это название будет приведено подобным образом:

Пример типовой конфигурации

3.     Ну и третий способ – воспользоваться материалом данной статьи, где я приведу примеры наиболее популярных конструкций в стандартном виде и их аналогов на английском языке.

Поехали!

Условный оператор:

Если … Тогда

ИначеЕсли … Тогда

Иначе

КонецЕсли;

If … Then

ElsIf … Then

Else

EndIf;

 

Циклы:

Для Счетчик = 1 По 10 Цикл

КонецЦикла;

For Counter = 1 To 10 Do

EndDo;

Для Каждого … Из … Цикл

КонецЦикла;

For Each … In … Do

EndDo;

Пока … Цикл

КонецЦикла;

While … Do

EndDo;

 

Инструкции препроцессора и директивы компиляции:

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

#Region
#EndRegion

Клиент

Client

Сервер

Server

МобильноеПриложениеКлиент

MobileAppClient

МобильноеПриложениеСервер

MobileAppServer

ТолстыйКлиентОбычноеПриложение

ThickClientOrdinaryApplication

ТолстыйКлиентУправляемоеПриложение

ThickClientManagedApplication

ВнешнееСоединение

ExternalConnection

ТонкийКлиент

ThinClient

ВебКлиент

WebClient

&НаКлиенте

&НаСервере

&НаСервереБезКонтекста

&НаКлиентеНаСервереБезКонтекста

&AtClient

&AtServer

&AtServerNoContext

&AtClientAtServerNoContext

Логические и вспомогательные операторы:

И

Или

Не

And

Or

Not

Продолжить

Continue

Прервать

Break

Возврат

Return

Экспорт

Export

Знач

Val

Новый

New

Перем

Var

ВызватьИсключение

Raise

 

Попытка / исключение:

Попытка

Исключение

КонецПопытки;

Try

Except

EndTry;

  

Работа с транзакциями:

НачатьТранзакцию

BeginTransaction

ОтменитьТранзакцию

RollbackTransaction

ЗафиксироватьТранзакцию

CommitTransaction

ТранзакцияАктивна

TransactionActive

 

Функции / процедуры:

Функция

КонецФункции

Function

EndFunction

Процедура

КонецПроцедуры

Procedure

EndProcedure

 

Популярные конструкторы:

Массив

Array

Структура

Structure

Соответствие

Map

СписокЗначений

ValueList

ТаблицаЗначений

ValueTable

ДеревоЗначений (Строки, Колонки)

ValueTree (Rows, Columns)

Запрос

Query

МенеджерВременныхТаблиц

TempTablesManager

ТабличныйДокумент

SpreadsheetDocument

ТекстовыйДокумент

TextDocument

FTPСоединение

HTTPСоединение

FTPConnection

HTTPConnection

COMОбъект

COMObject

WSПрокси

WSProxy

БлокировкаДанных

DataLock

Граница

Boundary

ДвоичныеДанные

BinaryData

Диаграмма

Chart

ДиаграммаГанта

GanttChart

ДиалогВыбораФайла

FileDialog

ДокументDOM

ДокументHTML

DOMDocument

HTMLDocument

ЗаписьDOM, ЗаписьJSON, …

DOMWriter, JSONWriter, …

ЧтениеHTML, ЧтениеJSON, …

HTMLReader, JSONReader, …

ИнтернетПочтовоеСообщение

InternetMailMessage

Картинка

Picture

КвалификаторыДаты, КвалификаторыЧисла, …

DateQualifiers, NumberQualifiers, …

КоллекцияДвижений

RegisterRecordsCollection

КомпоновщикМакетаКомпоновкиДанных

DataCompositionTemplateComposer

КомпоновщикНастроекКомпоновкиДанных

DataCompositionSettingsComposer

МакетКомпоновкиДанных

DataCompositionTemplate

МоментВремени

PointInTime

ОписаниеОповещения

NotifyDescription

ОписаниеТипов

TypeDescription

ОтборКомпоновкиДанных

DataCompositionFilter

ПараметрКомпоновкиДанных

DataCompositionParameter

ПолеКомпоновкиДанных

DataCompositionField

ПараметрыЗаписиJSON

JSONWriterSettings

ПараметрыЗаписиXML

ПараметрыЧтенияXML

XMLWriterSettings

XMLReaderSettings

ПочтовоеСообщение

MailMessage

ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений

DataCompositionResultValueCollectionOutputProcessor

ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент

DataCompositionResultSpreadsheetDocumentOutputProcessor

ПроцессорКомпоновкиДанных

DataCompositionProcessor

РеквизитФормы

FormAttribute

СериализаторXDTO

XDTOSerializer

ФабрикаXDTO

XDTOFactory

СообщениеПользователю

UserMessage

СхемаКомпоновкиДанных

DataCompositionSchema

Файл

File

ХранилищеЗначения

ValueStorage

Цвет

Color

Шрифт

Font

УникальныйИдентификатор

UUID

 

Популярные методы объектов:

Выполнить

Execute

ВыполнитьПакет

ExecuteBatch

УстановитьПараметр

SetParameter

Выбрать

Select

СоздатьНаборЗаписей

CreateRecordSet

Прочитать

Read

Вставить

Insert

Выгрузить

Unload

Загрузить

Load

Добавить

Add

Записать

Write

Заполнить

Fill

Итог

Total

Количество

Count

Метаданные

MetaData

Очистить

Clear

Получить

Get

ПроверитьЗаполнение

CheckFilling

Удалить

Delete

Переместить

Move

Найти

Find

НайтиСтроки

FindRows

Сортировать

Sort

Скопировать

Copy

ПолучитьМакет

GetTemplate

ПолучитьОбласть

GetArea

СрезПервых, СрезПоследних

SliceFirst, SliceLast

НайтиПоНаименованию

FindByDescription

НайтиПоКоду

FindByCode

НайтиПоРеквизиту

FindByAttribute

 

Популярные функции и процедуры глобального контекста:

НачалоДня, НачалоМесяца, …

BegOfDay, BegOfMonth, …

КонецДня, КонецМесяца, …

EndOfDay, EndOfMonth, …

ОписаниеОшибки

ErrorDescription

ФоновыеЗадания

BackgroundJobs

ПолучитьИзВременногоХранилища

GetFromTempStorage

ТекущаяДата

CurrentDate

ТекущаяДатаСеанса

CurrentSessionDate

Дата

Date

ПоказатьВводДаты, ПоказатьВводСтроки, …

ShowInputDate, ShowInputString, …

ПоказатьВопрос

ShowQueryBox

ПоказатьЗначение

ShowValue

ТипЗнч

TypeOf

Тип

Type

Вычислить

Eval

Формат

Format

ЗаполнитьЗначенияСвойств

FillPropertyValues

ПолучитьОбщуюФорму

GetCommonForm

ПолучитьОбщийМакет

GetCommonTemplate

ПолучитьФорму

GetForm

ОткрытьФорму

OpenForm

РольДоступна

IsInRole

ПустаяСтрока

IsBlankString

Лев, Прав, Сред

Left, Right, Mid

Мин, Макс

Min, Max

Оповестить, ОповеститьОВыборе

Notify, NotifyChanged

ПредопределенноеЗначение

PredefinedValue

УстановитьПривилегированныйРежим

SetPrivilegedMode

ПрочитатьJSON, ПрочитатьXML

ReadJSON, ReadXML

Окр

Round

СтрДлина, СтрЗаменить, СтрНайти, …

StrLen, StrReplace, StrFind, …

ВРег, НРег

Upper, Lower

ЗначениеЗаполнено

ValueIsFilled

 

Популярные системные перечисления:

ВариантЗаписиДатыJSON

JSONDateWritingVariant

ВариантСтандартногоПериода

StandardPeriodVariant

ВидГраницы

BoundaryType

ВидГруппыФормы

FormGroupType

ВидДвиженияБухгалтерии

AccountingRecordType

ВидДвиженияНакопления

AccumulationRecordType

ВидКнопкиФормы

FormButtonType

ВидПоляФормы

FormFieldType

ВидСравнения

ComparisonType

ВидСравненияКомпоновкиДанных

DataCompositionComparisonType

ДопустимаяДлина

AllowedLength

ДопустимыйЗнак

AllowedSign

ДоступКФайлу

FileAccess

КодВозвратаДиалога

DialogReturnCode

КодировкаИменФайловВZipФайле

FileNamesEncodingInZipFile

КодировкаТекста

TextEncoding

МетодСжатияZIP

ZIPCompressionMethod

МетодШифрованияZIP

ZIPEncryptionMethod

ОбходРезультатаЗапроса

QueryResultIteration

ПротоколИнтернетПочты

InternetMailProtocol

РежимБлокировкиДанных

DataLockMode

РежимДиалогаВопрос

QuestionDialogMode

РежимДиалогаВыбораФайла

FileDialogMode

РежимЗаписиДокумента

DocumentWriteMode

РежимПроведенияДокумента

DocumentPostingMode

РежимОкругления

RoundMode

РежимСохраненияПутейZIP

ZIPStorePathMode

РежимУправленияБлокировкойДанных

DataLockControlMode

Символы

Chars

СостояниеФоновогоЗадания

BackgroundJobState

СпособSMTPАутентификации

SMTPAuthenticationMode

СпособPOP3Аутентификации

POP3AuthenticationMode

ТипВнешнейКомпоненты

AddInType

ТипГруппыЭлементовОтбораКомпоновкиДанных

DataCompositionFilterItemsGroupType

ТипЗначенияJSON

JSONValueType

ТипТекстаПочтовогоСообщения

InternetMailTextType

ТипУзлаDOM

DOMNodeType

ТипУзлаXML

XMLNodeType

ТипФайлаТабличногоДокумента

SpreadsheetDocumentFileType

ТипФайлаФорматированногоДокумента

FormattedDocumentFileType

УровеньЖурналаРегистрации

EventLogLevel

ЧастиДаты

DateFractions

Популярные объекты метаданных, упоминаемые в коде:

Справочники

Catalogs

Документы

Documents

РегистрыСведений

InformationRegisters

РегистрыНакопления

AccumulationRegisters

РегистрыБухралтерии

AccountingRegisters

РегистрыРасчета

CalculationRegisters

ПланыВидовХарактеристик

ChartsOfCharacteristicTypes

ПланыСчетов

ChartsOfAccounts

ПланыВидовРасчета

ChartsOfCalculationTypes

Перечисления

Enums

Константы

Constants

(Внешние) Обработки

(External) DataProcessors

(Внешние) Отчеты

(External) Reports

РегламентныеЗадания

ScheduledJobs

ПланыОбмена

ExchangePlans

ПараметрыСеанса

SessionParameters

ВнешниеИсточникиДанных

ExternalDataSources

Популярные функции в языке запросов:

ДОБАВИТЬКДАТЕ

DATEADD

РАЗНОСТЬДАТ

DATEDIFF

НАЧАЛОПЕРИОДА, КОНЕЦПЕРИОДА

BEGINOFPERIOD, ENDOFPERIOD

КОЛИЧЕСТВО(РАЗЛИЧНЫЕ)

COUNT(DISTINC)

ЗНАЧЕНИЕ

VALUE

ТИП

TYPE

ЕСТЬNULL

ISNULL

ПРЕДСТАВЛЕНИЕ

PRESENTATION

ПРЕДСТАВЛЕНИЕССЫЛКИ

REFPRESENTATION

ТИПЗНАЧЕНИЯ

VALUETYPE

В (ИЕРАРХИИ)

IN (HIERARCHY)

ДАТАВРЕМЯ

DATETIME

ПОДОБНО

LIKE

МЕЖДУ … И …

BETWEEN … AND …

ВЫРАЗИТЬ

CAST

ВЫБОР

            КОГДА

                        ТОГДА

            ИНАЧЕ

КОНЕЦ

CASE

            WHEN

                        THEN

            ELSE

END

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

Тема+5.+Переменные+и+операторы — презентация онлайн

Похожие презентации:

Конфигурирование в системе 1С :Предприятие 8.3 (комплексный курс). Учебная литература

Основные конструкции языка программирования в 1С: Предприятие

1С:Предприятие 8

Синтаксис языка 1С

Азы программирования

Обзор системы 1С Предприятие

Встроенный язык

Язык программирования и возможности среды разработки 1С

Введение в конфигурирование в системе «1С:Предприятие 8.2» Основные объекты

Процедурное программирование на языке C++

1
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ПРОГРАММА
ПРОФЕССИОНАЛЬНОЙ ПЕРЕПОДГОТОВКИ
«1С ПРОГРАММИСТ»
Модуль 1. Азы конфигурирования и программирования в
системе «1С:Предприятие 8.3». Основы программирования
Преподаватель: Шматов Вячеслав Михайлович
Модуль 1. Азы конфигурирования и программирования в

системе «1С:Предприятие 8.3»
Тема 5. Переменные и операторы
План модуля:
Типы переменных и их использование
встроенные операторы и их применение
2
3
1С объявление переменных
Переменные — это именованное значение данных для хранения и последующего доступа.
Могут быть произвольного допустимого в рамках 1С и контекста типа.
Явное объявление переменных в 1с, в общем случае, не обязательно и может производится непосредственно перед
использованием.
Для явного используется служебное имя «Перем«, которое регистронезависимое (допустимо использование,
например»ПеРЕМ«).
Примеры явного объявления переменной:
// обычная переменная
Перем МояПеременная1;
// экспортная переменная
Перем МояВидимаяПеременная2 Экспорт;
4
1С объявление переменных
Пример объявления в функции:
Функция НекаяФункция(ПараметрФункции)
Перем ПеременнаяФункции1;
//Далее код
КонецФункции
Платформа инициализирует переменные значением «Неопределено» по умолчанию
В момент объявления переменные явно присвоить значение возможно только, если это параметр функции
Функция НекаяФункция(ПараметрФункцииИнициализируемый=»123″)
Перем ПеременнаяФункции2;
ПеременнаяФункции2 = 321;
ПеременнаяФункции3 = «321Пуск»;
КонецФункции
5
1С объявление переменных
Булевы операции
В операторах сравнения очень часто используется булевская логика, которая возвращает значение Истина или
Ложь.
Например, в условном операторе можно сравнивать:
Если Событие = Продажа Тогда алгоритм пойдет по одной ветке (т.е. при значении Истина), по условию Ложь
выполняется другая ветка алгоритма.
Условия могут быть достаточно сложными, они могут комбинироваться, при этом применяются следующие
операторы: И, ИЛИ, и НЕ.
Так, для оператора
И:Истина И Истина = Истина;
Истина И Ложь = Ложь;
Ложь И Истина = Ложь;
Ложь И Ложь = Ложь.
6
1С объявление переменных
Оператор присваивания
Не следует путать оператор присваивания с равенством, не смотря на то, что у них одинаковое написание.
ВременнаяПеременная = Переменная1;
Переменная1 = Переменная2;
Переменная2 = ВременнаяПеременная;
7
1С объявление переменных
Условный оператор
Если Переменная = Истина Тогда
//код
КонецЕсли
И
Если Переменная = Ложь Тогда
//код
КонецЕсли
8
1С объявление переменных
Циклические операторы
Цикл по счетчику – цикл с фиксированным количеством повторений. Условием выхода из цикла является
превышение граничного значения.
А = 5;
ПеремСчет = 1;
Для Счетчик = 1 По А Цикл
ПеремСчет = ПеремСчет * Счетчик;
КонецЦикла;
9
1С объявление переменных
Цикл по условию – выполняется пока истинно условие данного цикла.
ОстатокСуммы = 1000;
ЦенаДополнительногоТовара = 243;
Количество = 0;
Пока ОстатокСуммы>0 Цикл
Количество = Количество+1;
ОстатокСуммы = ОстатокСуммы – Количество*ЦенаДополнительногоТовара;
ЦенаДополнительногоТовара = ЦенаДополнительногоТовара * 0.8;
КонецЦикла
Количество = Количество-1;
10
Вопросы
11
Домашнее задание
Изучить дополнительный материал по СРС
Познакомится с разделами встроенного помощника
Ознакомится с разделами ИТС из комплекта поставки Глава 4, 5

English     Русский Правила

Условный оператор: ?: | Microsoft Узнайте

Обратная связь Редактировать

Твиттер LinkedIn Фейсбук Эл. адрес

  • Статья
  • 2 минуты на чтение

Синтаксис

 выражение ? выражение : выражение
 

Условный оператор ( ? : ) является тернарным оператором (требует трех операндов). Условный оператор работает следующим образом:

  • Первый операнд неявно преобразуется в bool . Он оценивается, и все побочные эффекты устраняются перед продолжением.

  • Если первый операнд оценивается как true (1), оценивается второй операнд.

  • Если первый операнд оценивается как false (0), оценивается третий операнд.

Результатом условного оператора является результат вычисляемого операнда — второго или третьего.

В условном выражении оценивается только один из двух последних операндов.

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

  • Если оба операнда одного типа, результат будет того же типа.

  • Если оба операнда относятся к арифметическим или перечисляемым типам, для их преобразования в общий тип выполняются обычные арифметические преобразования (описанные в разделе Стандартные преобразования).

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

  • Если оба операнда относятся к ссылочным типам, выполняется преобразование ссылок для их преобразования в общий тип.

  • Если оба операнда имеют тип void, общим типом будет тип void.

  • Если оба операнда относятся к одному и тому же определяемому пользователем типу, общим типом является этот тип.

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

Любые комбинации второго и третьего операндов, не указанные в предыдущем списке, недопустимы. Тип результата — общий тип, и это l-значение, если второй и третий операнды одного типа и оба являются l-значениями.

Предупреждение

Если типы второго и третьего операндов не идентичны, то вызываются правила преобразования сложных типов, как указано в стандарте C++. Эти преобразования могут привести к неожиданному поведению, включая создание и уничтожение временных объектов. По этой причине мы настоятельно рекомендуем вам либо (1) избегать использования пользовательских типов в качестве операндов с условным оператором, либо (2) если вы используете пользовательские типы, то явно приводить каждый операнд к общему типу.

Пример

 // expre_Expressions_with_the_Conditional_Operator.cpp
// компилируем с: /EHsc
// Демонстрация условного оператора
#include <иопоток>
использование пространства имен std;
интервал основной () {
   интервал i = 1, j = 2;
   cout << ( i > j ? i : j ) << "больше." << конец;
}
 

См. также

Встроенные операторы C++, приоритет и ассоциативность
Оператор условного выражения

Обратная связь

Отправить и просмотреть отзыв для

Этот продукт Эта страница

Просмотреть все отзывы о странице

Условные операторы в C (?:) — синтаксис и примеры

 В этой статье мы узнаем больше об условных операторах.

  • Условный оператор — это тернарный оператор в C, используемый для условного вычисления. В предыдущей статье были рассмотрены операторы в C и их типы.
  • Символ оператора ?:  
  • Это тернарный оператор, потому что он оперирует тремя операндами.

 

Синтаксис условного оператора:

Рис. 1. Синтаксис условного оператора

  • Условный оператор представляет собой набор из трех операндов .
  • выражение1 — это первый операнд, который может быть значением или выражением, или это может быть любой оператор C, например вызов функции или что-то в этом роде.
  • Итак, за первым операндом следует вопросительный знак ( ? ), а за вторым операндом следует двоеточие ( : ), а после этого идет третий операнд.
  • Здесь, если выражение1 истинно, то выполняется выражение2 ; если выражение1 ложно, тогда выполняется выражение3 .

 

Теперь давайте разберемся с вычислением условного оператора на примере. На рис. 2 показан пример.

Рисунок 2. Вычисление условного операнда на примере

Здесь есть переменная a и (5+4)? (9-4):99 — условное выражение операции. (5+4) — операнд1, (9-4) — операнд2, 99 — операнд3.

В этом случае сначала вычисляется или выполняется выражение1. При выполнении 5+4, если этот операнд истинен, то будет выполнено выражение 9-4, а результат этого выражения будет сохранен в переменной a .

Если вычисление выражения 5+4 ложно, то будет выполнено или оценено 99, а результат будет сохранен в переменной a. В этом случае a = 5, потому что верно 5+4. Очень простой.

Если выражение1 истинно, то выполняется выражение2; если выражение1 ложно, то выполняется выражение3.

 

Рисунок 3. Сводка условного операнда

Сводка условного оператора, как показано на рисунке 3. Сначала выполняется операнд выражение1, и если результат истинен, то выражение2 будет окончательным результатом. Таким образом, если оценка выражения 1 ложна, то окончательным результатом будет выражение 3.

 

Используйте условный оператор для замены операторов if-else

Например, рассмотрим приведенный ниже фрагмент кода.

Рисунок 4. Фрагмент кода

Здесь вы сравниваете переменную age со значением 18, а затем принимаете решение.

Весь код можно записать в одну строку с использованием условного оператора.

Рисунок 5. Использование условного оператора

Здесь оценивается первый (возраст <18). Если оно верно, то будет выполнено выражение printf("вы не имеете права голоса\n"). В данном случае выражение представляет собой вызов функции, то есть printf. Обратите внимание, что в конце printf нет точки с запятой. Поскольку это законченное утверждение, которое заканчивается в конце, не ставьте промежуточную точку с запятой.

Теперь, если оценка (возраст<18) ложна, то будет выполнено printf("Поздравляем!!! Вы можете голосовать\n").

Итак, иногда вы можете использовать условный оператор вместо if-else.

 

Возьмем другой пример.

Рисунок 6. Пример

Здесь int32_t a = 5. Каков результат a, после выполнения a=0?(a<9): a++; утверждение?

Сначала проверьте первый операнд a=0, который ложен, так как 5 не равно 0. Если первый операнд ложен, то будет выполнен третий операнд и присвоено значение переменной и . Здесь третий операнд — это а++. Эквивалентный код становится a = a++; (это постинкремент). Итак, результат a равен 5.

Некоторые из вас могут удивиться или возразить, что a = 6, но это не так. Итак, позвольте мне объяснить, как это выполняется.

В данном случае это а = а++. Начальное значение а равно 5. Когда мы обсуждали постинкремент и преинкремент, что я сказал? Сначала значение переменной а присваивается левой переменной, а затем значение а увеличивается.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *