Обработка написана на Бухгалтерия для Кыргызстана, редакция 3 (3.4.2.3) для работы на операционной системе Linux
Предназначение обработки - загрузка основных средств из excel в 1C и заполнения документов Поступление ОС и Принятие к учету ОС
Функция СведенияОВнешнейОбработке() Экспорт
ВерсияВО = "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;
ПринятиеКУчетуОС.ВидОперации = Перечисления.ВидыОперацийПринятияКУчетуОсновныхСредств.ОсновныеСредства;
ПринятиеКУчетуОС.Организация = Объект.Организация;
ПринятиеКУчетуОС.ДокументОснование = ПоступлениеОС.Ссылка;
Для Каждого Строка Из Объект.ОсновныеСредства Цикл
ОС = ПринятиеКУчетуОС.ОС.Добавить();
ЗаполнитьЗначенияСвойств(ОС, Строка);
ОС.ПервоначальнаяСтоимость = Строка.Сумма;
ОС.СпособНачисленияАмортизации = Строка.СпособАмортизации;
ОС.СпособОтраженияРасходовПоАмортизации = Строка.ОтражениеРасходов;
КонецЦикла;
Попытка
ПринятиеКУчетуОС.Записать();
Исключение
ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;
Попытка
ПринятиеКУчетуОС.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
Исключение
Сообщить("Не удалось провести документ ""Принятие к учету ОС"". Он был записан");
КонецПопытки;
Объект.ПринятиеКУчетуОС = ПринятиеКУчетуОС.Ссылка;
КонецПроцедуры
&НаКлиенте
Процедура СоздатьДокументы(Команда)
СоздатьДокументыНаСервере();
КонецПроцедуры
// Обработчик ПриИзменении флага ПерезаписыватьДокументы.
// Изменяет досутпность поля ПоступлениеОС и меняет надпись на кнопке СоздатьДокументы
&НаКлиенте
Процедура ПерезаписыватьДокументыПриИзменении(Элемент)
Объект.ПоступлениеОС = Неопределено;
Объект.ПринятиеКУчетуОС = Неопределено;
Если Объект.ПерезаписыватьДокументы = Ложь Тогда
Элементы.ПоступлениеОС.ТолькоПросмотр = Истина;
Элементы.ФормаСоздатьДокументы.Заголовок = "Создать документы";
Иначе
Элементы.ПоступлениеОС.ТолькоПросмотр = Ложь;
Элементы.ФормаСоздатьДокументы.Заголовок = "Перезаписать документы";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПоступлениеОСОбработкаВыбора(Элемент, ВыбранноеЗначение, ДополнительныеДанные, СтандартнаяОбработка)
ПоступлениеОСОбработкаВыбораСервер(ВыбранноеЗначение);
КонецПроцедуры
// Обработка выбора поля ПоступлениеОС.
// Ищет, соответствующий выбранному, документ ПринятиеКУчетуОС
&НаСервере
Процедура ПоступлениеОСОбработкаВыбораСервер(ПоступлениеОС)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПринятиеКУчетуОС.Ссылка КАК Ссылка
|ИЗ
| Документ.ПринятиеКУчетуОС КАК ПринятиеКУчетуОС
|ГДЕ
| ПринятиеКУчетуОС.ДокументОснование = &ДокументОснование";
Запрос.УстановитьПараметр("ДокументОснование", ПоступлениеОС);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Следующий() Тогда
Объект.ПринятиеКУчетуОС = Выборка.Ссылка;
Иначе
Сообщить("Для данного документа не создано ""Принятие к учету ОС"", оно будет создано при перезаписи");
КонецЕсли;
КонецПроцедуры
Процедура ОбработатьИзменениеДоговора(ДокОбъект, СтруктураДанные)
// Не мой код
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьДанныеДоговорПриИзменении(Период, Контрагент, ДоговорКонтрагента, ВидОперации)
// Не мой код
КонецФункции
#КонецОбласти