Имя: Пароль:
1C
1С v8
1С Больница Загрузка цен номенклатуры
0 mataranga
 
10.01.14
08:26
Доброго времени суток,

В Медицине.Больница 1.1.1.1 есть в установке цен выгрузка и загрузка из excel ...

Выгрузка выглядит так : http://hkar.ru/obej

Если делать загрузку из такого же листа excel то он не хочет.
Я не понимаю структуру требуемого документа для загрузки.

Код :


&НаКлиенте
Функция ЗагрузитьИзExcelНаКлиенте(ИмяВременногоФайла)
    
    Попытка
        COMОбъект = Новый COMОбъект("Excel.Application");
    Исключение
        СообщениеОбОшибке = НСтр("ru = 'Не удалось загрузить цены из файла Excel. Убедитесь, что на сервере установлена программа Microsoft Excel. Подробности: '")
                            + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
        ВызватьИсключение СообщениеОбОшибке;
    КонецПопытки;
    
    Попытка
        Workbook      = COMОбъект.Workbooks.Open(ИмяВременногоФайла);
        SettingsSheet = Workbook.Worksheets(1);
        Sheet         = Workbook.Worksheets(2);
    Исключение
        COMОбъект.Quit();
        COMОбъект = 0;
        СообщениеОбОшибке = НСтр("ru = 'Не удалось прочитать данные из файла. Подробности: '")
                            + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
        ВызватьИсключение СообщениеОбОшибке;
    КонецПопытки;
    
    // Массивы структур
    МассивСтруктурВидыЦен = Новый Массив;
    МассивСтруктурТовары  = Новый Массив;
    
    ЕстьДополнительнаяКолонка = Ложь;
    
    // Загрузка данных
    Попытка
        
        // Загрузка служебной таблицы
        НомерСтроки = 2;
        Пока ЗначениеЗаполнено(SettingsSheet.Cells(НомерСтроки, 1).Value) Цикл
            
            НоваяСтрока = Новый Структура("ИдентификаторВидЦены, НомерКолонкиЦена");
            НоваяСтрока.ИдентификаторВидЦены = SettingsSheet.Cells(НомерСтроки, 1).Value;
            НоваяСтрока.НомерКолонкиЦена     = SettingsSheet.Cells(НомерСтроки, 5).Value;
            МассивСтруктурВидыЦен.Добавить(НоваяСтрока);
            
            НомерСтроки = НомерСтроки + 1;
        КонецЦикла;
        
        Если МассивСтруктурВидыЦен.Количество() > 0 Тогда
            
            // Загрузка цен номенклатуры
            НомерСтроки = 3;
            ЕстьДополнительнаяКолонка = (СтрДлина(Sheet.Cells(НомерСтроки, 2).Value) <> 36);
            Пока ЗначениеЗаполнено(Sheet.Cells(НомерСтроки, 2 + ?(ЕстьДополнительнаяКолонка,1,0)).Value) Цикл
                
                Для Каждого СтрокаТЧ Из МассивСтруктурВидыЦен Цикл
                    
                    НоваяСтрока = Новый Структура("ИдентификаторНоменклатура, ИдентификаторВидЦены, Цена");
                    НоваяСтрока.ИдентификаторНоменклатура   = Sheet.Cells(НомерСтроки, 2 + ?(ЕстьДополнительнаяКолонка,1,0)).Value;
                    НоваяСтрока.ИдентификаторВидЦены        = СтрокаТЧ.ИдентификаторВидЦены;
                    НоваяСтрока.Цена                        = Sheet.Cells(НомерСтроки, СтрокаТЧ.НомерКолонкиЦена).Value;
                    МассивСтруктурТовары.Добавить(НоваяСтрока);
                    
                КонецЦикла;
                
                НомерСтроки = НомерСтроки + 1;
                
            КонецЦикла;
            
        КонецЕсли;
        
        Workbook.Close();
        
    Исключение
        COMОбъект.Quit();
        COMОбъект = 0;
        СообщениеОбОшибке = НСтр("ru = 'Не удалось прочитать данные из файла. Подробности: '")
                            + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
        ВызватьИсключение СообщениеОбОшибке;
    КонецПопытки;
    
    COMОбъект.Quit();
    COMОбъект = 0;
    
    ЗагрузитьИзExcelНаСервере(МассивСтруктурВидыЦен, МассивСтруктурТовары);
    
КонецФункции

&НаСервере
Функция ЗагрузитьИзExcelНаСервере(МассивСтруктурВидыЦен, МассивСтруктурТовары)
    
    // Определение видов цен
    ВидыЦен = Новый ТаблицаЗначений;
    ВидыЦен.Колонки.Добавить("ВидЦены");
    ВидыЦен.Колонки.Добавить("ИдентификаторВидЦены");
    ВидыЦен.Колонки.Добавить("ИмяКолонки");
    ВидыЦен.Колонки.Добавить("НомерКолонкиЦена");
    
    Для Каждого СтруктураВидЦены Из МассивСтруктурВидыЦен Цикл
        
        ВидЦены = Справочники.ВидыЦен.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураВидЦены.ИдентификаторВидЦены));
        ВидЦеныОбъект = ВидЦены.ПолучитьОбъект(); // ВидЦены всегда формирует ссылку и всегда заполнен
        Если ВидЦеныОбъект = Неопределено Тогда
            Продолжить;
        КонецЕсли;
        
        СтрокаВидЦены = НайтиСтрокуВидаЦен(ВидЦены);
        Если СтрокаВидЦены.Выбрана Тогда
            
            НоваяСтрока = ВидыЦен.Добавить();
            НоваяСтрока.ВидЦены              = ВидЦены;
            НоваяСтрока.ИдентификаторВидЦены = СтруктураВидЦены.ИдентификаторВидЦены;
            НоваяСтрока.НомерКолонкиЦена     = СтруктураВидЦены.НомерКолонкиЦена;
            НоваяСтрока.ИмяКолонки           = СтрокаВидЦены.ИмяКолонки;
            
        КонецЕсли;
        
    КонецЦикла;
    ВидыЦен.Индексы.Добавить("ИдентификаторВидЦены");
    
    Если ВидыЦен.Количество() = 0 Тогда
        Возврат Ложь;
    КонецЕсли;
    
    
    // Загрузка цен в ДеревоЦен
    Для Каждого СтруктураТовар Из МассивСтруктурТовары Цикл
        
        СтрокаВидЦены = ВидыЦен.Найти(СтруктураТовар.ИдентификаторВидЦены);
        Если СтрокаВидЦены = Неопределено Тогда
            Продолжить;
        КонецЕсли;
        
        Номенклатура   = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураТовар.ИдентификаторНоменклатура));
        
        Если Не ЗначениеЗаполнено(Номенклатура) Тогда
            Продолжить;
        КонецЕсли;
        
        СтрокаДереваЦен = НайтиСтрокуДереваЦен(Новый Структура("Номенклатура", Номенклатура));
        Если СтрокаДереваЦен = Неопределено Тогда
            
            СтрокаДереваЦен = НайтиСтрокуДереваЦен(Новый Структура("Номенклатура", Номенклатура));
            Если СтрокаДереваЦен = Неопределено Тогда
                
                СтрокаДереваЦен = ДеревоЦен.ПолучитьЭлементы().Добавить();
                СтрокаДереваЦен.Артикул = Номенклатура.Артикул;
                СтрокаДереваЦен.Номенклатура = Номенклатура;
                
                НоваяСтрока = ТЗ.Добавить();
                НоваяСтрока.Номенклатура = Номенклатура;
                НоваяСтрока.СтрокаДереваЦен = СтрокаДереваЦен;
                
            КонецЕсли;
            
        КонецЕсли;
        
        СтрокаДереваЦен[СтрокаВидЦены.ИмяКолонки]                   = СтруктураТовар.Цена;
        СтрокаДереваЦен["ИзмененаВручную"+СтрокаВидЦены.ИмяКолонки] = Истина;
        
    КонецЦикла;
    
    
    // Загрузка старых цен и процента изменения
    ТаблицаЗначений = ПолучитьПустуюТаблицуТовары();
    Для Каждого СтрокаВидЦены Из ВыбранныеЦены Цикл
        
        Если СтрокаВидЦены.Выбрана ИЛИ СтрокаВидЦены.Влияет Тогда
            
            ИмяКолонки = СтрокаВидЦены.ИмяКолонки;
            
            Для Каждого СтрокаТЗ Из ТЗ Цикл
                
                СтрокаДереваЦен = СтрокаТЗ.СтрокаДереваЦен;
                
                НоваяСтрока = ТаблицаЗначений.Добавить();
                НоваяСтрока.Номенклатура   = СтрокаДереваЦен.Номенклатура;
                НоваяСтрока.ВидЦены        = СтрокаВидЦены.Ссылка;
                НоваяСтрока.Цена           = СтрокаДереваЦен[ИмяКолонки];
            КонецЦикла;
            
        КонецЕсли;
        
    КонецЦикла;
    
    ЗагрузитьСтарыеЦеныНоменклатуры(ТаблицаЗначений);
    
    
    // Список видов цен, которые, которые зависят от изменяемых
    ЗависимыеЦены = Новый Массив;
    Для Каждого СтрокаТЧ Из ВидыЦен Цикл
        МассивСтрокЗависимыхЦен = ПолучитьЗависимыеОтВидаЦеныВидыЦен(НайтиСтрокуВидаЦен(СтрокаТЧ.ВидЦены));
        Для Каждого СтрокаВидЦены Из МассивСтрокЗависимыхЦен Цикл
            Если ЗависимыеЦены.Найти(СтрокаВидЦены) = Неопределено
                И ВидыЦен.Найти(СтрокаВидЦены.Ссылка) = Неопределено Тогда
                ЗависимыеЦены.Добавить(СтрокаВидЦены);
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
    
    // Автоматически рассчитывать нужно только те цены, по которым процент изменения которых
    // не изменяется и которые зависят от изменяемых
    ВидыЦенДляРасчета = Новый Массив;
    ВыбранныеСтрокиВидовЦен = ПолучитьВыбранныеСтрокиТаблицыВидовЦен();
    Для Каждого ВидЦены Из ВыбранныеСтрокиВидовЦен Цикл
        Если ЗависимыеЦены.Найти(ВидЦены) <> Неопределено Тогда
            ВидыЦенДляРасчета.Добавить(ВидЦены);
        КонецЕсли;
    КонецЦикла;
    
    Если РассчитыватьАвтоматически Тогда
        РассчитатьВычисляемыеЦены(ТЗ, ВидыЦенДляРасчета, Ложь);
    Иначе
        УстановитьПризнакРучногоИзмененияДляВидовЦен(ТЗ, ВидыЦенДляРасчета);
    КонецЕсли;
    
КонецФункции
1 Wobland
 
10.01.14
08:31
ты же правда не хочешь от нас толкования этой портянки?
2 mataranga
 
10.01.14
08:32
правда :) разобрался, всем спасибо всем счастливой пятницы..