Имя: Пароль:
1C
1С v8
Импорт файла Excel в 1С строки формата дата и время
0 Reraru
 
24.01.20
19:39
Здравствуйте, помогите мне пожалуйста. Я понимаю что 1С умеет читать примитивные типы данных. У меня есть данные типа дата и время в экселе, а реквизиты справочника настроены на тип дата и время. После импорта файла Excel в 1С, у меня остались пустые реквизиты у которых тип дата и время.
Как научить 1С читать формат дата и время из файла Excel ?

&НаСервере
Функция ПолучитьОписаниеТипа(ОписаниеТиповРеквизита) Экспорт
    
    ОписаниеТипов = "";
    
    Для каждого Тип Из ОписаниеТиповРеквизита.Типы() Цикл
        МетаданныеТипа = Метаданные.НайтиПоТипу(Тип);
        Если Не МетаданныеТипа = Неопределено Тогда
            ОписаниеТипа = МетаданныеТипа.ПолноеИмя();
        ИначеЕсли Тип = Тип("Строка") Тогда
            
            ОписаниеТипа = "Строка";
            Если ОписаниеТиповРеквизита.КвалификаторыСтроки.Длина Тогда
                ОписаниеТипа = ОписаниеТипа + ", " + ОписаниеТиповРеквизита.КвалификаторыСтроки.Длина;
                Если ОписаниеТиповРеквизита.КвалификаторыСтроки.ДопустимаяДлина = ДопустимаяДлина.Фиксированная Тогда
                    ОписаниеТипа = ОписаниеТипа + ", " + ДопустимаяДлина.Фиксированная;
                КонецЕсли;
                
                
            КонецЕсли;
            
        ИначеЕсли Тип = Тип("Число") Тогда
            ОписаниеТипа = "Число"
            + ", "+ ОписаниеТиповРеквизита.КвалификаторыЧисла.Разрядность
            + ", "+ ОписаниеТиповРеквизита.КвалификаторыЧисла.РазрядностьДробнойЧасти
            + ?(ОписаниеТиповРеквизита.КвалификаторыЧисла.ДопустимыйЗнак = ДопустимыйЗнак.Неотрицательный,", Неотрицательный","");
        ИначеЕсли Тип = Тип("Дата") Тогда
            ОписаниеТипа = "" + ОписаниеТиповРеквизита.КвалификаторыДаты.ЧастиДаты;
        ИначеЕсли Тип = Тип("Булево") Тогда
            ОписаниеТипа = "Булево";
        Иначе
            Продолжить;
        КонецЕсли;
        
        ОписаниеТипов = ?(ПустаяСтрока(ОписаниеТипов),"",ОписаниеТипов +Символы.ПС) + ОписаниеТипа;
        
    КонецЦикла;    
    
    Возврат ОписаниеТипов;

КонецФункции // ПолучитьОписаниеТипа()


&НаСервере
Функция ПолучитьВозможныеЗначения(Колонка, Представление, Примечание, ТекущиеДанные)
    
    
    Примечание = "";
    
    НайденныеЗначения = Новый Массив;
    
    Если ПустаяСтрока(Представление) Тогда
        
        Возврат НайденныеЗначения;
        
    Иначе
        СвязьПоТипу = Неопределено;
        Если Не ПустаяСтрока(Колонка.СвязьПоТипу)  Тогда
            
            Если ТипЗНЧ(Колонка.СвязьПоТипу) = Тип("Строка") Тогда
                ТекущиеДанные.Свойство(Колонка.СвязьПоТипу,СвязьПоТипу);
            Иначе
                СвязьПоТипу = Колонка.СвязьПоТипу;
            КонецЕсли;
            Если Не СвязьПоТипу = Неопределено Тогда
                
                ЭлементСвязиПоТипу = Колонка.ЭлементСвязиПоТипу;
                Если ЭлементСвязиПоТипу = 0 Тогда
                    ЭлементСвязиПоТипу = 1;
                КонецЕсли;
                ВидыСубконто = СвязьПоТипу.ВидыСубконто;
                Если ЭлементСвязиПоТипу > ВидыСубконто.Количество() Тогда
                    Возврат НайденныеЗначения;
                КонецЕсли;
                Тип = СвязьПоТипу.ВидыСубконто[ЭлементСвязиПоТипу-1].ВидСубконто.ТипЗначения;
            Иначе
                Тип = Колонка.ОписаниеТипов;
            КонецЕсли;
            
        Иначе
            Тип = Колонка.ОписаниеТипов;
        КонецЕсли;
    КонецЕсли;
    ПримитивныеТипы = Новый Структура ("Число, Строка, Дата, Булево", Тип("Число"), Тип("Строка"), Тип("Дата"), Тип("Булево"));
    Для каждого ТипРеквизита Из Тип.Типы() Цикл
        
        Если ТипРеквизита = ПримитивныеТипы.Число Или ТипРеквизита = ПримитивныеТипы.Булево Тогда
            НайденныеЗначения.Добавить(мПривестиКЧислу(Представление, Колонка.ОписаниеТипов, Примечание));
        ИначеЕсли ТипРеквизита = ПримитивныеТипы.Строка или ТипРеквизита = ПримитивныеТипы.Дата Тогда
            НайденныеЗначения.Добавить(мПривестиКДате(Представление, Колонка.ОписаниеТипов, Примечание));
            
        Иначе
            
            МетаданныеТипа = Метаданные.НайтиПоТипу(ТипРеквизита);
            
            Если Перечисления.ТипВсеСсылки().СодержитТип(ТипРеквизита) Тогда
                
                //Это Перечисление
                Для каждого Перечисление Из ПолучитьМенеджераПоТипу(ТипРеквизита) Цикл
                    Если Строка(Перечисление) = Представление Тогда
                        НайденныеЗначения.Добавить(Перечисление);
                    КонецЕсли;
                КонецЦикла;
                
            ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(ТипРеквизита) Тогда
                
                //Это документ
                
                Менеджер = ПолучитьМенеджераПоТипу(ТипРеквизита);
                Если Колонка.ИскатьПо = "Номер" Тогда
                    //НайденноеЗначение = Менеджер.НайтиПоКоду(Представление);
                ИначеЕсли Колонка.ИскатьПо = "Дата" Тогда
                    //НайденноеЗначение = Менеджер.Найти
                Иначе
                        
                    ДлиннаСинонима = СтрДлина(""+МетаданныеТипа);
                        
                    Если Лев(Представление, ДлиннаСинонима) = ""+МетаданныеТипа Тогда
                        НомерИДата = СокрЛП(Сред(Представление, ДлиннаСинонима+1));
                        ПозицияОт = Найти(НомерИДата, " от ");
                        Если Не ПозицияОт = 0 Тогда
                            НомерДок = Лев(НомерИДата, ПозицияОт-1);
                            Попытка
                                ДатаДок  = Дата(Сред(НомерИДата, ПозицияОт+4));
                            Исключение
                                ДатаДок = Неопределено;
                            КонецПопытки;
                            Если Не ДатаДок = Неопределено Тогда
                                НайденноеЗначение = Менеджер.НайтиПоНомеру(НомерДок, ДатаДок);
                                Если Не НайденноеЗначение.Пустая() Тогда
                                    НайденныеЗначения.Добавить(НайденноеЗначение);
                                КонецЕсли;
                            КонецЕсли;
                        КонецЕсли;
                    КонецЕсли;
                        
                КонецЕсли;
                    
            ИначеЕсли Не МетаданныеТипа = Неопределено Тогда
                
                ИскатьПо = Колонка.ИскатьПо;
                ЭтоСправочник = Справочники.ТипВсеСсылки().СодержитТип(ТипРеквизита);
                Если ПустаяСтрока(ИскатьПо) Тогда
                    СтрокаОсновногоПредставления = Строка(МетаданныеТипа.ОсновноеПредставление);
                    
                    Если СтрокаОсновногоПредставления = "ВВидеКода" Тогда
                        ИскатьПо = "Код";
                    ИначеЕсли СтрокаОсновногоПредставления = "ВВидеНаименования" Тогда
                        ИскатьПо = "Наименование";
                    ИначеЕсли СтрокаОсновногоПредставления = "ВВидеНомера" Тогда
                        ИскатьПо = "Номер";
                    КонецЕсли;
                КонецЕсли;
                
                    
                Запрос = Новый Запрос;
                Запрос.Текст =
                "ВЫБРАТЬ
                |    _Таблица.Ссылка
                |ИЗ
                |    " + МетаданныеТипа.ПолноеИмя() + " КАК _Таблица
                |ГДЕ";
                
                Запрос.Текст = Запрос.Текст + "
                |    _Таблица." + ИскатьПо + " = &Представление";
                Запрос.УстановитьПараметр("Представление",Представление);
                
                Если ЭтоСправочник и Не ПустаяСтрока(Колонка.СвязьПоВладельцу) и МетаданныеТипа.Владельцы.Количество() Тогда
                    
                    СвязьПоВладельцу = Неопределено;
                    Если ТипЗНЧ(Колонка.СвязьПоВладельцу) = Тип("Строка") Тогда
                        ТекущиеДанные.Свойство(Колонка.СвязьПоВладельцу,СвязьПоВладельцу);
                    Иначе
                        СвязьПоВладельцу = Колонка.СвязьПоВладельцу;
                    КонецЕсли;
                    
                    Если Не СвязьПоВладельцу = Неопределено Тогда
                        Запрос.Текст = Запрос.Текст + "
                        |    И _Таблица.Владелец = &СвязьПоВладельцу";
                        Запрос.УстановитьПараметр("СвязьПоВладельцу",СвязьПоВладельцу);
                    КонецЕсли;
                    
                КонецЕсли;
                
                Выборка =  Запрос.Выполнить().Выбрать();
                    
                Пока Выборка.Следующий() Цикл
                    НайденныеЗначения.Добавить(Выборка.Ссылка);
                КонецЦикла;
            Иначе
                Примечание = "Не описан способ поиска";
                Примечание = "Для Колонки не определен тип значения";
            КонецЕсли;
        КонецЕсли;
        
    КонецЦикла;
    Возврат НайденныеЗначения;
КонецФункции // ()