Операция по ЮKassa / Модуль объекта

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ОбработчикиСобытий

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

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;

	ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(ЭтотОбъект);
	
	ИсправлениеДокументов.ПередЗаписью(ЭтотОбъект, Отказ, РежимЗаписи, РежимПроведения);

	ПроведениеДокументов.ПередЗаписьюДокумента(ЭтотОбъект, РежимЗаписи, РежимПроведения);
	
	Если Не ЗначениеЗаполнено(Номер) Тогда
		УстановитьНовыйНомер();
	КонецЕсли;
	
	ДополненныеПараметры = ВзаиморасчетыСервер.ДополненныеПараметрыМеханизма(ЭтотОбъект);
	
	Если ЭтотОбъект.ЭтоНовый() Тогда
		СсылкаНового = ЭтотОбъект.ПолучитьСсылкуНового();
		Если Не ЗначениеЗаполнено(СсылкаНового) Тогда
			СсылкаНового = ОбщегоНазначения.МенеджерОбъектаПоСсылке(Ссылка).ПолучитьСсылку();
			ЭтотОбъект.УстановитьСсылкуНового(СсылкаНового);
		КонецЕсли;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ОбъектРасчетов) Тогда
		ОбъектРасчетовПлатеж = ОбъектыРасчетовСервер.ПолучитьОбъектРасчетовПоСсылке(Ссылка);
		Если ЗначениеЗаполнено(ОбъектРасчетовПлатеж) И ОбъектРасчетов <> ОбъектРасчетовПлатеж Тогда
			ОбъектыРасчетовСервер.ПроверитьУдалитьОбъектРасчетов(ОбъектРасчетовПлатеж, Отказ, Истина);
		КонецЕсли;
	Иначе
		
		ПараметрыМеханизма = ДополненныеПараметры.МассивПараметров[0];
		
		Если ЭтотОбъект.ЭтоНовый() Тогда
			ПараметрыМеханизма.Вставить("СсылкаНового", СсылкаНового);
		КонецЕсли;
		
		Если РежимЗаписи = РежимЗаписиДокумента.Проведение
			ИЛИ (РежимЗаписи = РежимЗаписиДокумента.Запись
			И ОбщегоНазначенияУТКлиентСервер.ДанныеПоПути(ЭтотОбъект, "Объект.Проведен")) Тогда
			
			ОбъектРасчетовПлатеж = ОбъектыРасчетовСервер.ПроверитьЗаполнитьОбъектРасчетовПоСтруктуре(ЭтотОбъект, ПараметрыМеханизма,,РежимЗаписи);
			ОбъектРасчетов = ОбъектРасчетовПлатеж;
			
		КонецЕсли;
		
	КонецЕсли;
	
	Если ВестиУчетКомиссииВоВзаиморасчетах Тогда
		Подразделение = Справочники.СтруктураПредприятия.ПустаяСсылка();
		СтатьяРасходов = ПланыВидовХарактеристик.СтатьиРасходов.ПустаяСсылка();
		АналитикаРасходов = Неопределено;
	Иначе
		ОбъектРасчетовКомиссии = Справочники.ОбъектыРасчетов.ПустаяСсылка();
	КонецЕсли;
	
	ОбщегоНазначенияУТ.ЗаполнитьИдентификаторыДокумента(ЭтотОбъект);

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

Процедура ПриЗаписи(Отказ)
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
	
	ПроведениеДокументов.ПриЗаписиДокумента(ЭтотОбъект, Отказ);
	
КонецПроцедуры

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

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

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
	
	// Контроль перед проведением
	ВыполнитьКонтрольЗаполненияПередПроведением(Отказ);
	
	ПроведениеДокументов.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ);
КонецПроцедуры

Процедура ОбработкаУдаленияПроведения(Отказ)
	
	ПроведениеДокументов.ОбработкаУдаленияПроведенияДокумента(ЭтотОбъект, Отказ);
	
КонецПроцедуры

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

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

#Область СлужебныеПроцедурыИФункции

#Область Проверки

Процедура ВыполнитьКонтрольЗаполненияПередПроведением(Отказ)
	
	Если ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ВозвратОплатыКлиенту Тогда 
		
		СуммаОплачено = ОплаченоПоОбъектуРасчета();
		
		// Сумма возврата не больше суммы оплаты
		Если СуммаОплачено < СуммаДокумента Тогда
			
			ТекстСообщения = НСтр("ru = 'Сумма возврата не должна превышать сумму поступившей оплаты'");
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, ЭтотОбъект, ,, Отказ);
			
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

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


#Область ИнициализацияИЗаполнение

Процедура ИнициализироватьДокумент(ДанныеЗаполнения = Неопределено)
	
	Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда
		ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеЗаполнения);
	КонецЕсли;
	
	Если ТипЗнч(ДанныеЗаполнения) <> Тип("Структура") Или НЕ ДанныеЗаполнения.Свойство("Организация") Тогда
		Организация = ЗначениеНастроекПовтИсп.ПолучитьОрганизациюПоУмолчанию(Организация);
	КонецЕсли;
		
	Если ТипЗнч(ДанныеЗаполнения) <> Тип("Структура") Или НЕ ДанныеЗаполнения.Свойство("Валюта") Тогда
		ВалютаРубль = Справочники.Валюты.НайтиПоКоду("643"); // Рубль
		Если ЗначениеЗаполнено(ВалютаРубль) Тогда
			Валюта = ВалютаРубль;
		Иначе
			Валюта = ЗначениеНастроекПовтИсп.ВалютаРегламентированногоУчетаОрганизации(Организация);
		КонецЕсли;
		Если ЗначениеЗаполнено(ВалютаРубль) Тогда
			ВалютаКомиссии = ВалютаРубль;
		Иначе
			ВалютаКомиссии = ЗначениеНастроекПовтИсп.ВалютаРегламентированногоУчетаОрганизации(Организация);
		КонецЕсли;
	КонецЕсли;
	
	Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") И ДанныеЗаполнения.Свойство("ДанныеОперации") Тогда
		Если ДанныеЗаполнения.ДанныеОперации.Свойство("БанковскийСчет") Тогда
			БанковскийСчет = ДанныеЗаполнения.ДанныеОперации.БанковскийСчет;
		КонецЕсли;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(Организация) Тогда
		
		ПараметрыОтбора = Справочники.ДоговорыЭквайринга.ПараметрыОтбораДоговораЭквайринга();
		ПараметрыОтбора.Организация = Организация;
		ПараметрыОтбора.СпособПроведенияПлатежа = Перечисления.СпособыПроведенияПлатежей.ИнтернетЭквайринг;
		ПараметрыОтбора.БанковскийСчет = ?(ЗначениеЗаполнено(БанковскийСчет), БанковскийСчет, ПараметрыОтбора.БанковскийСчет);
		ПараметрыОтбора.Валюта = ?(ЗначениеЗаполнено(Валюта), Валюта, ПараметрыОтбора.Валюта);
		
		ДоговорЭквайринга = Справочники.ДоговорыЭквайринга.ДоговорЭквайрингаПоУмолчанию(ПараметрыОтбора);
		
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ДоговорЭквайринга) Тогда
		
		ПараметрыДоговора = Справочники.ДоговорыЭквайринга.РеквизитыДоговора(ДоговорЭквайринга);
		
		Если ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПоступлениеОплатыОтКлиента Тогда
			ОтражатьКомиссию = ПараметрыДоговора.СпособОтраженияКомиссии = Перечисления.СпособыОтраженияЭквайринговойКомиссии.ВоВремяТранзакции;
		Иначе
			ОтражатьКомиссию = ПараметрыДоговора.СпособОтраженияКомиссии = Перечисления.СпособыОтраженияЭквайринговойКомиссии.ВоВремяТранзакции
				И ПараметрыДоговора.ВзимаетсяКомиссияПриВозврате;
		КонецЕсли;
		
		Если ОтражатьКомиссию
			Или СуммаКомиссии <> 0 Тогда
			
			СтатьяРасходов = ПараметрыДоговора.СтатьяРасходов;
			АналитикаРасходов = ПараметрыДоговора.АналитикаРасходов;
			Подразделение = ПараметрыДоговора.ПодразделениеРасходов;
			ВестиУчетКомиссииВоВзаиморасчетах = ПараметрыДоговора.ВестиУчетКомиссииВоВзаиморасчетах;
			ОбъектРасчетовКомиссии = ПараметрыДоговора.ОбъектРасчетовКомиссии;
			
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

Процедура ЗаполнитьПоДаннымЯндексКассы(ДанныеЗаполнения)
	
	ДанныеОперации		= ДанныеЗаполнения.ДанныеОперации;
	
	ХозяйственнаяОперация = ДанныеЗаполнения.ХозяйственнаяОперация;
	СтатьяДвиженияДенежныхСредств = ДанныеЗаполнения.СтатьяДвиженияДенежныхСредств;
	
	Если ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПоступлениеОплатыОтКлиента Тогда
		
		ДанныеПоУИП = Документы.ОперацияПоЯндексКассе.ОснованиеПлатежаПоУИП(ДанныеЗаполнения.Организация,
			ДанныеОперации.ИдентификаторПлатежа);
		
		Дата = ДанныеОперации.ДатаОплаты;
		
		Если ДанныеПоУИП = Неопределено Тогда 
			ЕстьПроблемы = Истина;
			ИнформацияОПроблеме = СтрШаблон(
				НСтр("ru = 'Не найден документ основание по идентификатору платежа: %1.
					|Для устранения этой проблемы следует указать документ основание платежа вручную.'"),
				ДанныеОперации.ИдентификаторПлатежа);
			КодПроблемы = 5;
		Иначе
			ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеПоУИП, "ОснованиеПлатежа, Контрагент, Партнер, ОбъектРасчетов");
		КонецЕсли;
		
		ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеОперации);
		
		СуммаКомиссии = СуммаДокумента - ДанныеОперации.СуммаКЗачислениюНаСчетОрганизации;
		
		Документы.ОперацияПоЯндексКассе.ПересчитатьНДС(ЭтотОбъект);
		
		ВалютаКомиссии = Валюта;
		
	ИначеЕсли ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ВозвратОплатыКлиенту Тогда
		
		ОплатыПоУИП = Документы.ОперацияПоЯндексКассе.ОплатыПоУИП(ДанныеОперации.ИдентификаторПлатежа);
		
		Дата = ДанныеОперации.ДатаИсполненияЗапросаНаВозврат;
		
		ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеОперации);
		
		Если ОплатыПоУИП = Неопределено Тогда 
			ЕстьПроблемы = Истина;
			ИнформацияОПроблеме = СтрШаблон(
				НСтр("ru = 'Не найден документ оплаты через Яндекс.Кассу по идентификатору платежа: %1.
					|Для устранения этой проблемы следует указать документ основание платежа вручную.'"),
				ДанныеОперации.ИдентификаторПлатежа);
			КодПроблемы = 6;
		Иначе
			ЗаполнитьЗначенияСвойств(ЭтотОбъект, ОплатыПоУИП, "ОснованиеПлатежа, Контрагент, Партнер, ОбъектРасчетов, ВалютаКомиссии");
			
			Если КонецДня(ОплатыПоУИП.Дата) = КонецДня(Дата) Тогда 
				
				ТипОперацииВозврата = Перечисления.ТипыОперацийВозвратаЧерезЯндексКассу.Отмена;
				Документы.ОперацияПоЯндексКассе.ВычислитьСуммуКомиссииПоСуммеВозврата(ЭтотОбъект, ОплатыПоУИП);
				
			Иначе
				ТипОперацииВозврата = Перечисления.ТипыОперацийВозвратаЧерезЯндексКассу.Возврат;
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

Процедура ЗаполнитьПоОперацииПоЯндексКассе(Знач ДокументОснование, ДанныеЗаполнения)

	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	&ТекущаяДата КАК Дата,
		|	ДанныеДокумента.Организация КАК Организация,
		|	ДанныеДокумента.Партнер КАК Партнер,
		|	ДанныеДокумента.Эквайер КАК Эквайер,
		|	ДанныеДокумента.ДоговорЭквайринга КАК ДоговорЭквайринга,
		|	ДанныеДокумента.Валюта КАК ВалютаВзаиморасчетов,
		|	ДанныеДокумента.БанковскийСчет КАК БанковскийСчет,
		|	ДанныеДокумента.БанковскийСчет.ВалютаДенежныхСредств КАК Валюта,
		|	ДанныеДокумента.СуммаДокумента КАК СуммаДокумента,
		|	ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ВозвратОплатыКлиенту) КАК ХозяйственнаяОперация,
		|	&Ссылка КАК ОснованиеПлатежа,
		|	ДанныеДокумента.СтатьяДвиженияДенежныхСредств КАК СтатьяДвиженияДенежныхСредств,
		|	ДанныеДокумента.СтатьяРасходов КАК СтатьяРасходов,
		|	ДанныеДокумента.АналитикаРасходов КАК АналитикаРасходов,
		|	ДанныеДокумента.Подразделение КАК Подразделение,
		|	ДанныеДокумента.Контрагент КАК Контрагент,
		|	ДанныеДокумента.ОбъектРасчетов КАК ОбъектРасчетов,
		|	ВЫБОР
		|		КОГДА КОНЕЦПЕРИОДА(&ТекущаяДата, ДЕНЬ) = КОНЕЦПЕРИОДА(ДанныеДокумента.Дата, ДЕНЬ)
		|			ТОГДА ЗНАЧЕНИЕ(Перечисление.ТипыОперацийВозвратаЧерезЯндексКассу.Отмена)
		|		ИНАЧЕ ЗНАЧЕНИЕ(Перечисление.ТипыОперацийВозвратаЧерезЯндексКассу.Возврат)
		|	КОНЕЦ КАК ТипОперацииВозврата,
		|	ДанныеДокумента.НастройкаЯндексКассы КАК НастройкаЯндексКассы,
		|	ДанныеДокумента.ВалютаКомиссии КАК ВалютаКомиссии,
		|	ДанныеДокумента.СуммаКомиссии КАК СуммаКомиссии,
		|	ДанныеДокумента.СуммаНДСОбщаяСтавка КАК СуммаНДСОбщаяСтавка,
		|	ДанныеДокумента.СуммаНДС10 КАК СуммаНДС10,
		|	ДанныеДокумента.СуммаНДС7 КАК СуммаНДС7,
		|	ДанныеДокумента.СуммаНДС5 КАК СуммаНДС5
		|ИЗ
		|	Документ.ОперацияПоЯндексКассе КАК ДанныеДокумента
		|ГДЕ
		|	ДанныеДокумента.Ссылка = &Ссылка
		|	И ДанныеДокумента.ХозяйственнаяОперация = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ПоступлениеОплатыОтКлиента)";
	
	Запрос.УстановитьПараметр("Ссылка", ДокументОснование);
	Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса());
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ДанныеЗаполнения = Новый Структура;
	Для Каждого Колонка Из РезультатЗапроса.Колонки Цикл
		ДанныеЗаполнения.Вставить(Колонка.Имя);
	КонецЦикла;
	
	Выборка = РезультатЗапроса.Выбрать();
	Выборка.Следующий();
	ЗаполнитьЗначенияСвойств(ДанныеЗаполнения, Выборка,,"СуммаКомиссии");
	
	Если ДанныеЗаполнения.ОснованиеПлатежа = Неопределено Тогда 
		Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Не требуется вводить Операцию по Яндекс.Кассе: Возврат оплаты клиенту на основании документа %1, поскольку ввод доступен только на основании операций Поступления оплаты от клиента'"),
		ДокументОснование);
		ВызватьИсключение Текст;
	КонецЕсли;	
	
	Если ДанныеЗаполнения.ТипОперацииВозврата = Перечисления.ТипыОперацийВозвратаЧерезЯндексКассу.Отмена Тогда 
		Документы.ОперацияПоЯндексКассе.ВычислитьСуммуКомиссииПоСуммеВозврата(ДанныеЗаполнения, Выборка);
	КонецЕсли;				
	
	
КонецПроцедуры

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

Функция ОплаченоПоОбъектуРасчета()

	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	РасчетыСКлиентамиОбороты.СуммаРасход КАК СуммаРасход
		|ИЗ
		|	РегистрНакопления.РасчетыСКлиентами.Обороты(, &НаДату, , ОбъектРасчетов = &ОбъектРасчета) КАК РасчетыСКлиентамиОбороты";
	
	Запрос.УстановитьПараметр("НаДату", Дата);
	Запрос.УстановитьПараметр("ОбъектРасчета", ОбъектРасчетов);
	
	УстановитьПривилегированныйРежим(Истина);
	РезультатЗапроса = Запрос.Выполнить().Выбрать();
	УстановитьПривилегированныйРежим(Ложь);
	
	Если РезультатЗапроса.Следующий() Тогда
		Возврат РезультатЗапроса.СуммаРасход;
	КонецЕсли;
	
	Возврат 0;

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

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

#КонецЕсли

Связанные материалы