Skip to content

Vrusss/OS1C

Repository files navigation

Внешняя обработка для загрузки основных средств из excel файла в 1C

Обработка написана на Бухгалтерия для Кыргызстана, редакция 3 (3.4.2.3) для работы на операционной системе Linux

Предназначение обработки - загрузка основных средств из excel в 1C и заполнения документов Поступление ОС и Принятие к учету ОС

бит_ЗагрузкаОСв1С

Модуль объекта

Функция СведенияОВнешнейОбработке() Экспорт   

	ВерсияВО = "1.0";
	КраткоВО = "Бит Загрузка ОС в 1С";
	ИнформацияВО     = "Бит Загрузка ОС в 1С";
	ИдентификаторВО = "бит_ЗагрузкаОСВ1С";
	
	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
	ПараметрыРегистрации.Информация = НСтр("ru = '" + ИнформацияВО + "'");
	ПараметрыРегистрации.Версия = ВерсияВО;
	ПараметрыРегистрации.БезопасныйРежим = Ложь;
	
	НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
	НоваяКоманда.Представление = КраткоВО;
	НоваяКоманда.Идентификатор = ИдентификаторВО;
	НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
	НоваяКоманда.ПоказыватьОповещение = Ложь;
	
	Возврат ПараметрыРегистрации;

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

ОсновнаяФорма

#Область ЗагрузитьИзФайла

// Открывает диалог выбора файла, обрабатывает выбранный файл и передает в данные в следующий метод
&НаКлиенте
Асинх Процедура ЗагрузитьИзФайла(Команда)
	ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
	ПараметрыДиалога.Заголовок = "Выберите файл";
	ПараметрыДиалога.Фильтр = "Таблица Excel | *.xls; *.xlsx";
	
	ОписаниеФайла = Ждать ПоместитьФайлНаСерверАсинх(,,,ПараметрыДиалога);
	Если ОписаниеФайла <> Неопределено Тогда
		Объект.ОсновныеСредства.Очистить();
		ПрочитатьExcelВТаблицу(ОписаниеФайла.Адрес, ОписаниеФайла.СсылкаНаФайл.Расширение);
	КонецЕсли;
	 
	ПоказатьОповещениеПользователя("Обработка файла завершена!");
КонецПроцедуры                    

// Из полученных данных создает временный файл, формирует из него табличный документ
// и, после преоборазования через построитель, заполняет построчно табличную часть данными файла
// Параметры:
//	АдресДанных - Строка - адрес файла во временном хранилище, по которому должен быть помещен файл с диска
//	РасширениеФайла - Строка - обозначение расширения файла
&НаСервере
Процедура ПрочитатьExcelВТаблицу(АдресДанных, РасширениеФайла)
	
	ПутьКфайлу = ПолучитьИмяВременногоФайла(РасширениеФайла);         
	
	Данные = ПолучитьИзВременногоХранилища(АдресДанных);
	Данные.Записать(ПутьКфайлу);
	
	ТабДок = Новый ТабличныйДокумент;
	
	Попытка
		// чтение данных из файла в табличный документ
		ТабДок.Прочитать(ПутьКфайлу);
	Исключение
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = "Не удалось прочитать файл, по причине: " + ОписаниеОшибки();
		Сообщение.Сообщить();                                                        
		Возврат;
	КонецПопытки;
	
	// построение запроса к области ячеек табличного документа
	// с помощью объекта встроенного языка ПостроительЗапроса
	Построитель = Новый ПостроительЗапроса;
	Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область());
	Построитель.ЗаполнитьНастройки();
	
	// выполнение запроса (результат записывается в свойство "Результат")
	Построитель.Выполнить();
	
	// выгрузка результата построителя запроса в таблицу значений
	ТаблицаИзExcel = Построитель.Результат.Выгрузить();
	
	Для Каждого СтрокаЭксель Из ТаблицаИзExcel Цикл
		СтрокаТЧ = Объект.ОсновныеСредства.Добавить();	
		СтрокаТЧ.Поставщик = ПолучитьСоздатьСправочник("Контрагенты", СтрокаЭксель.Поставщик);
		СтрокаТЧ.Договор = ПолучитьДоговор(СтрокаТЧ.Поставщик, СтрокаЭксель.Договор);
		СтрокаТЧ.ДатаПоступления = СтрокаВДату(СтрокаЭксель.ДатаПоступления);
		СтрокаТЧ.ДатаПринятияНаУчет = СтрокаВДату(СтрокаЭксель.ДатаПринятияНаУчет);
		СтрокаТЧ.ИнвентарныйНомер = СтрокаЭксель.ИнвентарныйНомер_код_;
		СтрокаТЧ.ОсновноеСредство = ПолучитьСоздатьОС(СтрокаЭксель.Наименование, СтрокаЭксель.ИнвентарныйНомер_код_, СтрокаЭксель.Группа, СтрокаЭксель.ТНВЭД);
		СтрокаТЧ.ГруппаОС = Справочники.ОсновныеСредства.НайтиПоНаименованию(СтрокаЭксель.Группа);	
		СтрокаТЧ.ТНВЭД = Справочники.КлассификаторТНВЭД.НайтиПоКоду(СтрокаЭксель.ТНВЭД);
		СтрокаТЧ.СуммаВал = Число(СтрЗаменить(СтрокаЭксель.СуммаВал, ",", ""));
		СтрокаТЧ.Сумма = Число(СтрЗаменить(СтрокаЭксель.ПервоначальнаяСтоимостьСом, ",", ""));
		СтрокаТЧ.СрокСлужбы = Число(СтрокаЭксель.СрокСлужбыМес);
		СтрокаТЧ.СчетУчета = ПланыСчетов.Хозрасчетный.НайтиПоКоду(СтрокаЭксель.СчетУчета);
		СтрокаТЧ.СчетАмортизации = ПланыСчетов.Хозрасчетный.НайтиПоКоду(СтрокаЭксель.СчетАмортизации);
		Попытка
			СтрокаТЧ.СпособАмортизации = Перечисления.СпособыНачисленияАмортизацииОС[СтрокаЭксель.СпособАмортизации];
		Исключение
		КонецПопытки;
		СтрокаТЧ.ОтражениеРасходов = Справочники.СпособыОтраженияРасходовПоАмортизации.НайтиПоНаименованию(СтрокаЭксель.ОтражениеРасходов);
		СтрокаТЧ.Подразделение = Справочники.ПодразделенияОрганизаций.НайтиПоНаименованию(СтрокаЭксель.Подразделение);
		СтрокаТЧ.МОЛ = Справочники.ФизическиеЛица.НайтиПоНаименованию(СтрокаЭксель.МОЛ);
		СтрокаТЧ.ГруппаНУ = Справочники.ГруппыНалоговогоУчетаОС.НайтиПоКоду(СтрокаЭксель.ГруппаНУ + "гр");
	КонецЦикла;

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

// Ищет или создает в справочнике из параметра элемент по имени из другого параметра
// Параметры:
//	ИмяСправчоника - Строка - наименование справочника
//	Наименование - Строка - наименование элемента справочника
// Возвращаемое значение:
//	Ссылка
Функция ПолучитьСоздатьСправочник(ИмяСправочника, Наименование)
	
	СправочникТемп = Справочники[ИмяСправочника].НайтиПоНаименованию(Наименование);
		
	Если Не ЗначениеЗаполнено(СправочникТемп) Тогда
		СправочникТемп = Справочники[ИмяСправочника].СоздатьЭлемент();
		СправочникТемп.Наименование = Наименование;
		СправочникТемп.Записать();
	КонецЕсли;
	
	Возврат СправочникТемп.Ссылка;
	
КонецФункции

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

// Преобразует строку в дату
// Параметры:
//	Значение - Строка - строка, в формате DD.MM.YYYY 
Функция СтрокаВДату(Знач Значение)
    
    Значение = СокрЛП(СтрЗаменить(Значение, ".", ""));
    Значение = Сред(Значение, 5) + Сред(Значение, 3, 2) + Лев(Значение, 2);    
    ОписаниеТипа = Новый ОписаниеТипов("Дата");
    Результат    = ОписаниеТипа.ПривестиЗначение(Значение);
    
    Возврат Результат;
    
КонецФункции 

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

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

#Область СоздатьДокументы

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

	ПоступлениеОС.Дата = ПерваяСтрока.ДатаПоступления;
	ПоступлениеОС.ВидОперации = Перечисления.ВидыОперацийПоступлениеТоваровУслуг.ОсновныеСредства;
	ПоступлениеОС.Контрагент = ПерваяСтрока.Поставщик;
	ПоступлениеОС.ДоговорКонтрагента = ПерваяСтрока.Договор;
	//
	СтруктураДанные = ПолучитьДанныеДоговорПриИзменении(ПоступлениеОС.Дата, ПоступлениеОС.Контрагент, ПоступлениеОС.ДоговорКонтрагента, ПоступлениеОС.ВидОперации);
	Курс      = ?(СтруктураДанные.ВалютаРасчетовКурсКратность.Курс = 0, 1, СтруктураДанные.ВалютаРасчетовКурсКратность.Курс);
	Кратность = ?(СтруктураДанные.ВалютаРасчетовКурсКратность.Кратность = 0, 1, СтруктураДанные.ВалютаРасчетовКурсКратность.Кратность);
	//
	ПоступлениеОС.СчетРасчетов = ПланыСчетов.Хозрасчетный.НайтиПоКоду("3110");
	ПоступлениеОС.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("417");
	ПоступлениеОС.Организация = Объект.Организация;
	Для Каждого Строка Из Объект.ОсновныеСредства Цикл
		ОС = ПоступлениеОС.ОС.Добавить();
		СуммаОС = ?(Строка.СуммаВал > 0, Строка.СуммаВал, Строка.Сумма);
		ЗаполнитьЗначенияСвойств(ОС, Строка);
		ОС.Сумма = СуммаОС;
		ОС.Всего = СуммаОС;
		Строка.Сумма = СуммаОС * Курс / Кратность;
	КонецЦикла;
	ОбработатьИзменениеДоговора(ПоступлениеОС, СтруктураДанные);

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

&НаКлиенте
Процедура СоздатьДокументы(Команда)
	СоздатьДокументыНаСервере();
КонецПроцедуры

// Обработчик ПриИзменении флага ПерезаписыватьДокументы. 
// Изменяет досутпность поля ПоступлениеОС и меняет надпись на кнопке СоздатьДокументы
&НаКлиенте
Процедура ПерезаписыватьДокументыПриИзменении(Элемент)
	
	Объект.ПоступлениеОС = Неопределено;
	Объект.ПринятиеКУчетуОС = Неопределено;
	
	Если Объект.ПерезаписыватьДокументы = Ложь Тогда
		Элементы.ПоступлениеОС.ТолькоПросмотр = Истина;
		Элементы.ФормаСоздатьДокументы.Заголовок = "Создать документы";
	Иначе
		Элементы.ПоступлениеОС.ТолькоПросмотр = Ложь;
		Элементы.ФормаСоздатьДокументы.Заголовок = "Перезаписать документы";
	КонецЕсли;
	
КонецПроцедуры

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

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

Процедура ОбработатьИзменениеДоговора(ДокОбъект, СтруктураДанные)
	
	// Не мой код	
		
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьДанныеДоговорПриИзменении(Период, Контрагент, ДоговорКонтрагента, ВидОперации)
	
	// Не мой код
	
КонецФункции

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

About

Загрузка ОС из excel в 1С

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published