Имя: Пароль:
1C
1С v8
Не получается загрузить таблицу значений во временную таблицу и выполнить запрос
,
0 ultrannge89
 
23.03.14
19:05
Задача следующая: Загрузить лицевые счета из xls файла, при этом проверять есть ли такой сотрудник, работает ли он и есть ли у него уже такой лицевой счет.

    ВременнаяТаблица = Новый ТаблицаЗначений;
    ВременнаяТаблица.Колонки.Добавить("ФИО", Новый ОписаниеТипов("Строка"));
    ВременнаяТаблица.Колонки.Добавить("НомерПаспорта", Новый ОписаниеТипов("Строка"));
    ВременнаяТаблица.Колонки.Добавить("НомерСчета", Новый ОписаниеТипов("Строка"));
    ВременнаяТаблица.Колонки.Добавить("Сотрудник", Новый ОписаниеТипов("СправочникСсылка.СотрудникиОрганизаций"));
    ВременнаяТаблица.Колонки.Добавить("НомерСчетаПоДаннымИБ", Новый ОписаниеТипов("Строка"));
    ВременнаяТаблица.Колонки.Добавить("Уволен", Новый ОписаниеТипов("Булево"));
    ВременнаяТаблица.Колонки.Добавить("Банк", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
    ВременнаяТаблица.Колонки.Добавить("Подразделение", Новый ОписаниеТипов("СправочникСсылка.ПодразделенияОрганизаций"));
    ВременнаяТаблица.Колонки.Добавить("Организация", Новый ОписаниеТипов("СправочникСсылка.Организации"));
    ВременнаяТаблица.Колонки.Добавить("Сообщение", Новый ОписаниеТипов("Строка"));
    
    ВременнаяТаблица.Очистить();
    
    Если ИмяЛиста <> "" Тогда
        Попытка
            Лист = Книга.WorkSheets(ИмяЛиста);
            
            КолонкаФИО = 0; КолонкаПаспорт = 0; КолонкаСчет = 0;
            СтрокаЗаголовка = 0;
            
            ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
            ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;      
            
            Для Строка = 1 По ВсегоСтрок Цикл  
                Для Колонка = 1 По ВсегоКолонок Цикл
                    Значение = СокрЛП(Лист.Cells(Строка,Колонка).Value);
                    Если (Найти(Значение,"Фамилия, имя, отчество") > 0) Тогда
                        КолонкаФИО = Колонка;
                        СтрокаЗаголовка = Макс(СтрокаЗаголовка,Строка);
                    ИначеЕсли Найти(Значение,"№ Паспорта") > 0 Тогда
                        КолонкаПаспорт = Колонка;
                        СтрокаЗаголовка = Макс(СтрокаЗаголовка,Строка);
                    ИначеЕсли Найти(Значение,"№ открытого счета") > 0 Тогда
                        КолонкаСчет = Колонка;
                        СтрокаЗаголовка = Макс(СтрокаЗаголовка,Строка);
                    КонецЕсли;
                КонецЦикла;      
            КонецЦикла;
            
            Если КолонкаФИО * КолонкаПаспорт * КолонкаСчет = 0 Тогда
                Возврат;
            КонецЕсли;
            
            Для Строка = СтрокаЗаголовка + 1 По ВсегоСтрок Цикл
                Если СокрЛП(Лист.Cells(Строка,КолонкаФИО).Value) <> "" И
                    СокрЛП(Лист.Cells(Строка,КолонкаПаспорт).Value) <> "" И
                    СокрЛП(Лист.Cells(Строка,КолонкаСчет).Value) <> ""
                    Тогда
                    ВременнаяСтрока = ВременнаяТаблица.Добавить();
                    ВременнаяСтрока.ФИО           = СокрЛП(Лист.Cells(Строка,КолонкаФИО).Value);
                    ВременнаяСтрока.НомерПаспорта = СокрЛП(Лист.Cells(Строка,КолонкаПаспорт).Value);
                    ВременнаяСтрока.НомерСчета    = СокрЛП(Лист.Cells(Строка,КолонкаСчет).Value);
                КонецЕсли;
            КонецЦикла;
            
        Исключение
        КонецПопытки;
        
        Попытка
            Эксель.Application.Quit();
        Исключение
        КонецПопытки;
        Запрос = Новый Запрос;
        Запрос.Текст = "ВЫБРАТЬ
                       |    ПОДСТРОКА(Врем.ФИО, 0, 152) КАК ФИО,
                       |    ПОДСТРОКА(Врем.НомерПаспорта, 0, 29) КАК НомерПаспорта,
                       |    ПОДСТРОКА(Врем.НомерСчета, 0, 23) КАК НомерЛицевогоСчета
                       |ПОМЕСТИТЬ ВременнаяТаблица
                       |ИЗ
                       |    &ВТ КАК Врем
                       |;
                       |
                       |////////////////////////////////////////////////////////////////////////////////
                       |ВЫБРАТЬ
                       |    ВременнаяТаблица.НомерЛицевогоСчета,
                       |    ВЫБОР
                       |        КОГДА ВременнаяТаблица.НомерПаспорта = ПаспортныеДанныеФизЛицСрезПоследних.ДокументСерия + "" "" + ПаспортныеДанныеФизЛицСрезПоследних.ДокументНомер
                       |            ТОГДА ЕСТЬNULL(ПаспортныеДанныеФизЛицСрезПоследних.ФизЛицо, ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка))
                       |        ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)
                       |    КОНЕЦ КАК ФизЛицо
                       |ПОМЕСТИТЬ ФизЛицоСПасп
                       |ИЗ
                       |    ВременнаяТаблица КАК ВременнаяТаблица
                       |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизЛиц.СрезПоследних КАК ФИОФизЛицСрезПоследних
                       |            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПаспортныеДанныеФизЛиц.СрезПоследних(, ) КАК ПаспортныеДанныеФизЛицСрезПоследних
                       |            ПО ФИОФизЛицСрезПоследних.ФизЛицо = ПаспортныеДанныеФизЛицСрезПоследних.ФизЛицо
                       |        ПО (ВременнаяТаблица.ФИО = ФИОФизЛицСрезПоследних.Фамилия + "" "" + ФИОФизЛицСрезПоследних.Имя + "" "" + ФИОФизЛицСрезПоследних.Отчество)
                       |;
                       |
                       |////////////////////////////////////////////////////////////////////////////////
                       |ВЫБРАТЬ ПЕРВЫЕ 1
                       |    ЕСТЬNULL(РаботникиОрганизацийСрезПоследних.Сотрудник, ЗНАЧЕНИЕ(Справочник.СотрудникиОрганизаций.ПустаяСсылка)) КАК Сотрудник,
                       |    ВЫБОР
                       |        КОГДА РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
                       |                И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <= &ТекДата
                       |            ТОГДА РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизацииЗавершения
                       |        ИНАЧЕ РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации
                       |    КОНЕЦ КАК Подразделение,
                       |    ЕСТЬNULL(РаботникиОрганизацийСрезПоследних.Сотрудник.ДатаПриемаНаРаботу, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаПриемаНаРаботу,
                       |    ФизЛицоСПасп.НомерЛицевогоСчета
                       |ПОМЕСТИТЬ ПоследнийСотрудник
                       |ИЗ
                       |    ФизЛицоСПасп КАК ФизЛицоСПасп
                       |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций.СрезПоследних(
                       |                ,
                       |                Сотрудник.ДатаУвольнения = ДАТАВРЕМЯ(1, 1, 1)
                       |                    И Сотрудник.Физлицо <> ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)) КАК РаботникиОрганизацийСрезПоследних
                       |        ПО ФизЛицоСПасп.ФизЛицо = РаботникиОрганизацийСрезПоследних.Сотрудник.Физлицо
                       |
                       |УПОРЯДОЧИТЬ ПО
                       |    ДатаПриемаНаРаботу УБЫВ
                       |;
                       |
                       |////////////////////////////////////////////////////////////////////////////////
                       |ВЫБРАТЬ
                       |    ЛицевыеСчетаРаботниковОрганизации.ФизЛицо КАК ФизЛицо,
                       |    ЛицевыеСчетаРаботниковОрганизации.НомерЛицевогоСчета КАК НомерЛицевогоСчета,
                       |    ПоследнийСотрудник.Подразделение,
                       |    ЛицевыеСчетаРаботниковОрганизации.Организация,
                       |    ЛицевыеСчетаРаботниковОрганизации.Банк
                       |ПОМЕСТИТЬ ОбщииеСчета
                       |ИЗ
                       |    ПоследнийСотрудник КАК ПоследнийСотрудник
                       |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЛицевыеСчетаРаботниковОрганизации КАК ЛицевыеСчетаРаботниковОрганизации
                       |        ПО (ВЫБОР
                       |                КОГДА ПоследнийСотрудник.Сотрудник.Физлицо = ЛицевыеСчетаРаботниковОрганизации.ФизЛицо
                       |                        И ПоследнийСотрудник.НомерЛицевогоСчета = ЛицевыеСчетаРаботниковОрганизации.НомерЛицевогоСчета
                       |                    ТОГДА ИСТИНА
                       |                ИНАЧЕ ЛОЖЬ
                       |            КОНЕЦ)
                       |;
                       |
                       |////////////////////////////////////////////////////////////////////////////////
                       |ВЫБРАТЬ
                       |    ит_ВыпущенныеЗарплатныеКарты.ФизЛицо,
                       |    ит_ВыпущенныеЗарплатныеКарты.НомерЛицевогоСчета,
                       |    ОбщииеСчета.Подразделение,
                       |    ит_ВыпущенныеЗарплатныеКарты.Организация,
                       |    ит_ВыпущенныеЗарплатныеКарты.Банк
                       |ПОМЕСТИТЬ СвинокомплексСчета
                       |ИЗ
                       |    ОбщииеСчета КАК ОбщииеСчета
                       |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ит_ВыпущенныеЗарплатныеКарты КАК ит_ВыпущенныеЗарплатныеКарты
                       |        ПО (ВЫБОР
                       |                КОГДА ОбщииеСчета.Подразделение = &ПодразделениеСвинокомплекс
                       |                        И ОбщииеСчета.ФизЛицо = ит_ВыпущенныеЗарплатныеКарты.ФизЛицо
                       |                        И ОбщииеСчета.НомерЛицевогоСчета = ит_ВыпущенныеЗарплатныеКарты.НомерЛицевогоСчета
                       |                    ТОГДА ИСТИНА
                       |                ИНАЧЕ ЛОЖЬ
                       |            КОНЕЦ)
                       |;
                       |
                       |////////////////////////////////////////////////////////////////////////////////
                       |ВЫБРАТЬ
                       |    ОбщииеСчета.ФизЛицо,
                       |    ОбщииеСчета.НомерЛицевогоСчета,
                       |    ОбщииеСчета.Подразделение,
                       |    ОбщииеСчета.Организация,
                       |    ОбщииеСчета.Банк
                       |ИЗ
                       |    ОбщииеСчета КАК ОбщииеСчета
                       |
                       |ОБЪЕДИНИТЬ ВСЕ
                       |
                       |ВЫБРАТЬ
                       |    СвинокомплексСчета.ФизЛицо,
                       |    СвинокомплексСчета.НомерЛицевогоСчета,
                       |    СвинокомплексСчета.Подразделение,
                       |    СвинокомплексСчета.Организация,
                       |    СвинокомплексСчета.Банк
                       |ИЗ
                       |    СвинокомплексСчета КАК СвинокомплексСчета";
        Запрос.УстановитьПараметр("ВТ", ВременнаяТаблица);
        Запрос.УстановитьПараметр("ПодразделениеСвинокомплекс", Справочники.ПодразделенияОрганизаций.НайтиПоНаименованию(Справочники.ит_Константы.ПодразделениеСвинокомплекс));
        Запрос.УстановитьПараметр("ТекДата", ТекущаяДата());
        МассивРезультатов = Запрос.ВыполнитьПакет();
        Результат = Запрос.Выполнить().Выгрузить();
1 ultrannge89
 
23.03.14
19:07
В принципе лучше посоветуйте какую-нибудь обработку, в которой можно посмотреть код, желательно из ЗУПа или УПП.
2 shuhard
 
23.03.14
19:09
(0)[ Справочники.ПодразделенияОрганизаций.НайтиПоНаименованию(Справочники.ит_Константы.ПодразделениеСвинокомплекс)]

финиш
полный
3 Zmich
 
23.03.14
19:10
(0). Эту строчку надо добавить:
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
4 France
 
23.03.14
19:24
(1) да и без принципа достаточно использовать универсальную обработку загрузки из табличного документа..
5 ultrannge89
 
23.03.14
19:28
(2) Самое смешное что это финиш не я придумал, по тз вся ссылочная информация должна иметь возможность редактироваться из пользовательского интерфейса без изменения конфигураций. А то мало ли вдруг решат переименовать подразделение.
6 ultrannge89
 
23.03.14
19:30
Когда я гружу из табличного документа данные, они типизированы как строка неограниченной длины?
7 AlexITGround
 
23.03.14
19:32
(6) тебе в 3 уже подсказали, создаешь менеджер ВТ, параметром в запрос и работаешь
8 ultrannge89
 
23.03.14
19:34
Ладно спасибо. Буду пытать.
9 France
 
23.03.14
19:35
(6) можно расшифровать, а то чо т не врубился..
10 shuhard
 
23.03.14
19:36
(5)[Справочники.ит_Константы.ПодразделениеСвинокомплекс]
вот ЭТО ни когда ни чего не вернёт
11 KarpovDeniska
 
23.03.14
20:47
+ непонятно зачем здесь менеджер временных таблиц, без него все неплохо работает
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан