Имя: Пароль:
1C
1С v8
Обмен между 1с 7 и 1с 8 Инициатор обмена 1с 8 Протокол ОЛЕ
0 ugorchina
 
20.04.18
16:27
Всем привет!

посмотрите кому не лень я сделал обмен но не знаю насколько он верный

можно ли как то прорастить данный обмен или ускорить?

ну или может кому пригодится )

//Процедура используется для ночало обмена между 1с 7 и 1с 8
Процедура НачатьОбменИзмененнымиОбъектамиНажатие() Экспорт
    Попытка
        ОбъектV77 = Новый COMОбъект("v77.Application");
    Исключение        
        Возврат;
    КонецПопытки;
    
    СтрокаПодключения    = "/D"""+СокрЛП("D:\1С\BASE 1C\7\BumST\")+""" /N"""+СокрЛП("Администратор")+""" /P"""+СокрЛП("")+"""";
    РезультатПодключения = ОбъектV77.Initialize(ОбъектV77.RMTrade,СтрокаПодключения,"NO_SPLASH_SHOW");
    
    Если РезультатПодключения Тогда
    Иначе
        ОбщегоНазначения.СообщитьОбОшибке("Базу данных открыть не удалось!" + Символы.ПС +
        "- Проверьте параметры подключения." + Символы.ПС +  
        "- Проверьте открывается ли база 1С 7.7 (возможно требуется восстановление индексных файлов, либо она уже открыта монопольно).");
        ОбъектV77 = Неопределено;
        Возврат;
    КонецЕсли;
    
    Если ОбъектV77 <> Неопределено Тогда//если неудалось подключится тогда не будем ничего делать!
        //Зафиксируем признак обмена в сторонней программе
        ИзмененныеОбъектыОЛЕ = ОбъектV77.CreateObject("Справочник.ИзмененныеОбъекты");
        ИзмененныеОбъектыОЛЕ.ВыбратьЭлементы();
        Пока ИзмененныеОбъектыОЛЕ.ПолучитьЭлемент() = 1 Цикл
            ИзмененныеОбъектыОЛЕ.НачатОбмен = 1;
            ИзмененныеОбъектыОЛЕ.Записать();
        КонецЦикла;
        //Служебные таблицы
        ОписаниеТипКоличественногоЧисла = Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(19,4));
        ОписаниеТипЦеновогоЧисла        = Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(15,2));
        ОписаниеТипСтрок                = Новый ОписаниеТипов("Строка",Новый КвалификаторыСтроки(30));
        
        ТЗОстаткиТоваров = Новый ТаблицаЗначений;
        ТЗОстаткиТоваров.Колонки.Добавить("Артикул");
        ТЗОстаткиТоваров.Колонки.Добавить("Направление");
        ТЗОстаткиТоваров.Колонки.Добавить("Остаток", ОписаниеТипКоличественногоЧисла);
        
        ТЗЦеныТоваров = Новый ТаблицаЗначений;
        ТЗЦеныТоваров.Колонки.Добавить("Артикул",ОписаниеТипСтрок);
        ТЗЦеныТоваров.Колонки.Добавить("Цена", ОписаниеТипЦеновогоЧисла);
        
        ИзмененныеОбъекты = ОбъектV77.CreateObject("Справочник.ИзмененныеОбъекты");
        ИзмененныеОбъекты.ВыбратьЭлементы();
        Пока ИзмененныеОбъекты.ПолучитьЭлемент() = 1 Цикл
            Если ИзмененныеОбъекты.НачатОбмен = 1 Тогда
                Если СокрЛП(ИзмененныеОбъекты.ТипОбъекта) = "Справочник" Тогда
                    Если СокрЛП(ИзмененныеОбъекты.ВидОбъекта) = "Номенклатура" Тогда
                        ЕстьИзменения = ОбработатьСправочникВременныхТоваров(ИзмененныеОбъекты.ОбъектЗначение,ОбъектV77);    
                    КонецЕсли;
                ИначеЕсли  СокрЛП(ИзмененныеОбъекты.ТипОбъекта) = "Документ" Тогда
                    Если СокрЛП(ИзмененныеОбъекты.ВидОбъекта) = "Счет" Тогда
                        //ДобавитьОбработчик изменяющий статус у заказов ну либ оменяющий что либо в документе    
                    Иначе//все остальные документы
                        ЕстьИзменения = ОбработатьСправочникВременныхТоваров(ИзмененныеОбъекты.ОбъектЗначение,ОбъектV77);    
                    КонецЕсли;
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
        
        //Удалим Данные из ИзмененныхОбъектов
        ИзмененныеОбъектыОЛЕ.ВыбратьЭлементы();
        Пока ИзмененныеОбъектыОЛЕ.ПолучитьЭлемент() = 1 Цикл
            Если ИзмененныеОбъектыОЛЕ.НачатОбмен = 1 Тогда
                ИзмененныеОбъектыОЛЕ.Удалить(1);    
            КонецЕсли;
        КонецЦикла;
        
        ОбъектV77 = Неопределено;
        Если ЕстьИзменения = Истина Тогда
            //1. этап необходимо перебрать справочник Временные товары все с флагом НОВЫЙ
            // и заполнить новыми элементами основной справочник Номенклатура
            //Затем установить Флаг Новый в значение Ложь
            ВременныеТоварыНовые = ЗапросВременныхНовых();
            Пока ВременныеТоварыНовые.Следующий() Цикл
                ВременныеТоварыНовыеВыборкаОбъект = ВременныеТоварыНовые.Ссылка.ПолучитьОбъект();
                Номенклатура = Справочники.Номенклатура;
                НайденнаяСсылка = Номенклатура.НайтиПоРеквизиту("Артикул",СокрЛП(ВременныеТоварыНовыеВыборкаОбъект.Артикул));
                Если НайденнаяСсылка = Номенклатура.ПустаяСсылка() Тогда
                    //создать новый элемент НО необходимо сюда передает еще данные такие как ед изм и т д    
                КонецЕсли;
                ВременныеТоварыНовыеВыборкаОбъект.ЭтоНовыйОбъект = Ложь;
                ВременныеТоварыНовыеВыборкаОбъект.Записать();
            КонецЦикла;
            //2. этап Необходимо перебрать справочник Временные товары все с флагом ИЗМЕНЕННЫЙ
            // затем путем пазиционирования на  конкретном элементе собрать все одинаковые объеткы по мате АРТИКУЛ
            // затем заполнить временные табилцы этими данными и установить пометку ИЗМЕНЕННЫЙ НА значение Ложь
            ВременныеТоварыИзмененные = ЗапросВременныхИзмененных();
            Пока ВременныеТоварыИзмененные.Следующий() Цикл
                
                ВременныеТоварыИзмененныеВыборкаОбъект = ВременныеТоварыИзмененные.Ссылка.ПолучитьОбъект();
                
                Если ВременныеТоварыИзмененныеВыборкаОбъект.СтарыйОстаток <> ВременныеТоварыИзмененныеВыборкаОбъект.Остаток Тогда
                    СтрОстатки             = ТЗОстаткиТоваров.Добавить();
                    СтрОстатки.Артикул     = СокрЛП(ВременныеТоварыИзмененныеВыборкаОбъект.Артикул);
                    СтрОстатки.Направление = СокрЛП(ВременныеТоварыИзмененныеВыборкаОбъект.НаправлениеДвиженияОстатков);
                    СтрОстатки.Остаток     = ВременныеТоварыИзмененныеВыборкаОбъект.РазницаВОстатках;
                КонецЕсли;
                Если ВременныеТоварыИзмененныеВыборкаОбъект.ЦенаЗакупки > 0 Тогда
                    Если ВременныеТоварыИзмененныеВыборкаОбъект.СтараяЦенаЗакупки <> ВременныеТоварыИзмененныеВыборкаОбъект.ЦенаЗакупки Тогда
                        ЗВТПОАВыборкаДетальныеЗаписи = ЗапроситьВсеТоварыПООдинаковымАртикулам(СокрЛП(ВременныеТоварыИзмененныеВыборкаОбъект.Артикул));
                        Пока ЗВТПОАВыборкаДетальныеЗаписи.Следующий() Цикл
                            СтрЦены = ТЗЦеныТоваров.Добавить();
                            СтрЦены.Артикул = СокрЛП(ЗВТПОАВыборкаДетальныеЗаписи.Артикул);
                            СтрЦены.Цена    = ЗВТПОАВыборкаДетальныеЗаписи.ЦенаЗакупки;
                        КонецЦикла;
                    КонецЕсли;
                КонецЕсли;
                ВременныеТоварыИзмененныеВыборкаОбъект.Измененный = Ложь;
                ВременныеТоварыИзмененныеВыборкаОбъект.Записать();
            КонецЦикла;    
            
            Если ТЗОстаткиТоваров.Количество() > 0 Тогда
                ТЗОстаткиТоваров.Свернуть("Артикул,Направление","Остаток");
                УстановитьНовыйОстаток(ТЗОстаткиТоваров);
            КонецЕсли;
            
            Если ТЗЦеныТоваров.Количество() > 0 Тогда
                УстановитьНовуюЦену(ТЗЦеныТоваров);
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Функция ПолучитьИД(Объект)
    БезКавычекФигурных = СтрЗаменить(Объект,"{","");    
    БезКавычекФигурных = СтрЗаменить(БезКавычекФигурных,"}","");
    БезПробелов        = СокрЛП(БезКавычекФигурных);
    КоличествоЗнаков   = СтрНайти(БезПробелов,",",НаправлениеПоиска.СКонца)+3;
    Возврат СокрЛП(Сред(Лев(БезПробелов,СтрДлина(БезПробелов)-1),КоличествоЗнаков,СтрДлина(БезПробелов)));
КОнецФункции

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

//Используется для создания Новой номенклатуры и или изменения имеющиеся
//Либо для обмновления цены или остатка товаров
Функция ОбработатьСправочникВременныхТоваров(НоменклатураОЛЕ,ОбъектV77)
    ЕстьИзменения =Ложь;
    Объект = ОбъектV77.ЗначениеВстрокуВнутр(НоменклатураОЛЕ.ТекущийЭлемент());
    ИдентификаторОбъекта = ПолучитьИД(СокрЛП(Объект));
    //Поищем Такую Запись
    Товары = Справочники.ВремнныеТоварыИзСтороннейПрограммы;
    НайденнаяСсылка = Товары.НайтиПоРеквизиту("УИД",ИдентификаторОбъекта);
    Если НайденнаяСсылка = Товары.ПустаяСсылка() Тогда
        //Сообщить("Товары """ + ИдентификаторОбъекта + """ еще нет.");//убрать это так для проверки
        Если НоменклатураОЛЕ.ЭтоГруппа() = 1 Тогда
            Нов = Справочники.ВремнныеТоварыИзСтороннейПрограммы.СоздатьГруппу();
            Нов.Код = НоменклатураОЛЕ.Код;
            Нов.Наименование = НоменклатураОЛЕ.Наименование;
            Нов.УИД = ИдентификаторОбъекта;
            Нов.ЭтоНовыйОбъект = Истина;
            Если НоменклатураОЛЕ.Родитель.Наименование <> "" Тогда
                Нов.Родитель     = НайтиРодителя(НоменклатураОЛЕ.Родитель.Код,НоменклатураОЛЕ.Родитель);
            КонецЕсли;
            Нов.Записать();
        Иначе
            Нов = Справочники.ВремнныеТоварыИзСтороннейПрограммы.СоздатьЭлемент();
            Нов.Код = НоменклатураОЛЕ.Код;
            Нов.Наименование = НоменклатураОЛЕ.Наименование;
            Нов.УИД = ИдентификаторОбъекта;
            Нов.Артикул = НоменклатураОЛЕ.Артикул;
            Нов.ЭтоНовыйОбъект = Истина;
            Нов.Измененный = Истина;
            ПроцентНДС = Неопределено;
            Если СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "БезНДС" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;    
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "Без налога (НДС)" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;        
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "0%" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.НДС0;
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "10%" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.НДС10;    
                ПроцентНДС = 10;
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "18%" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.НДС18;
                ПроцентНДС = 18;
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "20%" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
                ПроцентНДС = 20;
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "24%" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.НДС24;
                ПроцентНДС = 24;
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "25%" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.НДС25;
                ПроцентНДС = 25;
            КонецЕсли;                
            
            Если НоменклатураОЛЕ.Родитель.Наименование <> "" Тогда
                Нов.Родитель = НайтиРодителя(НоменклатураОЛЕ.Родитель.Код,НоменклатураОЛЕ.Родитель);
            КонецЕсли;
            Субк1 = ОбъектV77.EvalExpr("ВидыСубконто.Номенклатура");
            Субк2 = ОбъектV77.EvalExpr("ВидыСубконто.МестаХранения");
            Субк3 = ОбъектV77.EvalExpr("ВидыСубконто.Партии");
            БИ = ОбъектV77.CreateObject("БухгалтерскиеИтоги");
            БИ.ИспользоватьСубконто(Субк1,НоменклатураОЛЕ.ТекущийЭлемент(),1,0);
            БИ.ИспользоватьСубконто(Субк2,Неопределено,1,0);
            БИ.ИспользоватьСубконто(Субк3,Неопределено,1,0);
            БИ.ВыполнитьЗапрос(ТекущаяДата(),ТекущаяДата(),"41.1",Неопределено,Неопределено,1,Неопределено,Неопределено);                                         
            БИ.ВыбратьСубконто(1);
            Пока БИ.ПолучитьСубконто(1) = 1 Цикл
                ЕстьИзменения =Истина;
                Нов.СтарыйОстаток = Нов.Остаток;
                Нов.Остаток = БИ.СКД("К");
                Нов.НаправлениеДвиженияОстатков = "Приход";
                Нов.РазницаВОстатках = БИ.СКД("К");
                БИ.ВыбратьСубконто(2);
                Пока БИ.ПолучитьСубконто(2) = 1 Цикл
                    БИ.ВыбратьСубконто(3);
                    Пока БИ.ПолучитьСубконто(3) = 1 Цикл
                        ЕстьИзменения =Истина;
                        Нов.СтараяЦенаЗакупки = Нов.ЦенаЗакупки;
                        Нов.ЦенаЗакупки = БИ.Субконто(3).Цена;
                        Если ПроцентНДС <> Неопределено Тогда
                            Нов.ЦенаЗакупкиСНДС = (БИ.Субконто(3).Цена*ПроцентНДС/100)+БИ.Субконто(3).Цена;
                        Иначе
                            Нов.ЦенаЗакупкиСНДС = БИ.Субконто(3).Цена;
                        КонецЕсли;
                    КонецЦикла;
                КонецЦикла;
            КонецЦикла;    
            Нов.Записать();    
        КонецЕсли;    
    Иначе
        //такая запись есть запишем изменения
        Нов = НайденнаяСсылка.ПолучитьОбъект();
        Если НоменклатураОЛЕ.ЭтоГруппа() = 1 Тогда
            Если СокрЛП(Нов.Код) <> СокрЛП(НоменклатураОЛЕ.Код) Тогда    
                Нов.Код = НоменклатураОЛЕ.Код;
            КонецЕсли;
            Если СокрЛП(Нов.Наименование) <> СокрЛП(НоменклатураОЛЕ.Наименование) Тогда
                Нов.Наименование = НоменклатураОЛЕ.Наименование;
            КонецЕсли;
            
            Если СокрЛП(НоменклатураОЛЕ.Родитель.Наименование) <> "" Тогда
                Нов.Родитель     = НайтиРодителя(НоменклатураОЛЕ.Родитель.Код,НоменклатураОЛЕ.Родитель);
            КонецЕсли;
            Нов.Записать();
        Иначе
            Если СокрЛП(Нов.Код) <> СокрЛП(НоменклатураОЛЕ.Код) Тогда
                Нов.Код = НоменклатураОЛЕ.Код;
            КонецЕсли;
            Если СокрЛП(Нов.Наименование) <> СокрЛП(НоменклатураОЛЕ.Наименование) Тогда
                Нов.Наименование = НоменклатураОЛЕ.Наименование;
            КонецЕсли;
            Если СокрЛП(Нов.Артикул) <> СокрЛП(НоменклатураОЛЕ.Артикул) Тогда    
                Нов.Артикул = НоменклатураОЛЕ.Артикул;
            КонецЕсли;
            
            ПроцентНДС = Неопределено;
            Если СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "БезНДС" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
                Нов.ЭтоНовыйОбъект = Ложь;
                Нов.Измененный = Истина;
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "Без налога (НДС)" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;    
                Нов.ЭтоНовыйОбъект = Ложь;
                Нов.Измененный = Истина;
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "0%" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.НДС0;
                Нов.ЭтоНовыйОбъект = Ложь;
                Нов.Измененный = Истина;
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "10%" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.НДС10;    
                ПроцентНДС = 10;
                Нов.ЭтоНовыйОбъект = Ложь;
                Нов.Измененный = Истина;
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "18%" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.НДС18;
                ПроцентНДС = 18;
                Нов.ЭтоНовыйОбъект = Ложь;
                Нов.Измененный = Истина;
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "20%" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
                ПроцентНДС = 20;
                Нов.ЭтоНовыйОбъект = Ложь;
                Нов.Измененный = Истина;
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "24%" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.НДС24;
                ПроцентНДС = 24;
                Нов.ЭтоНовыйОбъект = Ложь;
                Нов.Измененный = Истина;
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "25%" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.НДС25;
                ПроцентНДС = 25;
                Нов.ЭтоНовыйОбъект = Ложь;
                Нов.Измененный = Истина;
            КонецЕсли;                
            
            Направление = "";
            Было = 0;
            Если СокрЛП(НоменклатураОЛЕ.Родитель.Наименование) <> "" Тогда
                Нов.Родитель     = НайтиРодителя(НоменклатураОЛЕ.Родитель.Код,НоменклатураОЛЕ.Родитель);
            КонецЕсли;
            Субк1 = ОбъектV77.EvalExpr("ВидыСубконто.Номенклатура");
            Субк2 = ОбъектV77.EvalExpr("ВидыСубконто.МестаХранения");
            Субк3 = ОбъектV77.EvalExpr("ВидыСубконто.Партии");
            БИ = ОбъектV77.CreateObject("БухгалтерскиеИтоги");
            БИ.ИспользоватьСубконто(Субк1,НоменклатураОЛЕ.ТекущийЭлемент(),1,0);
            БИ.ИспользоватьСубконто(Субк2,Неопределено,1,0);
            БИ.ИспользоватьСубконто(Субк3,Неопределено,1,0);
            БИ.ВыполнитьЗапрос(ТекущаяДата(),ТекущаяДата(),"41.1",Неопределено,Неопределено,1,Неопределено,Неопределено);                                         
            БИ.ВыбратьСубконто(1);
            Пока БИ.ПолучитьСубконто(1) = 1 Цикл
                Если Нов.Остаток <> БИ.СКД("К") Тогда
                    Было = Нов.Остаток;
                    Если Нов.Остаток > БИ.СКД("К") Тогда
                        Направление = "Расход";    
                    ИначеЕсли Нов.Остаток < БИ.СКД("К") Тогда
                        Направление = "Приход";    
                    КонецЕсли;
                    Если Направление <> "" Тогда
                        ЕстьИзменения =Истина;
                        Нов.СтарыйОстаток = Нов.Остаток;
                        Нов.Остаток = БИ.СКД("К");
                        Нов.НаправлениеДвиженияОстатков = Направление;
                        Если БИ.СКД("К")-Было<0 тогда
                            Нов.РазницаВОстатках =  (БИ.СКД("К")-Было)*-1;
                        Иначе
                            Нов.РазницаВОстатках =  БИ.СКД("К")-Было;
                        КонецЕсли;
                        Нов.ЭтоНовыйОбъект = Ложь;
                        Нов.Измененный = Истина;
                    КонецЕсли;
                КонецЕсли;
                БИ.ВыбратьСубконто(2);
                Пока БИ.ПолучитьСубконто(2) = 1 Цикл
                    БИ.ВыбратьСубконто(3);
                    Пока БИ.ПолучитьСубконто(3) = 1 Цикл
                        Если Нов.ЦенаЗакупки <> БИ.Субконто(3).Цена Тогда
                            ЕстьИзменения =Истина;
                            Нов.СтараяЦенаЗакупки = Нов.ЦенаЗакупки;
                            Нов.ЦенаЗакупки = БИ.Субконто(3).Цена;
                            Нов.ЭтоНовыйОбъект = Ложь;
                            Нов.Измененный = Истина;
                        КонецЕсли;
                        Если ПроцентНДС <> Неопределено Тогда
                            ЕстьИзменения =Истина;
                            Нов.ЦенаЗакупкиСНДС = (БИ.Субконто(3).Цена*ПроцентНДС/100)+БИ.Субконто(3).Цена;
                            Нов.ЭтоНовыйОбъект = Ложь;
                            Нов.Измененный = Истина;
                        Иначе
                            ЕстьИзменения =Истина;
                            Нов.ЦенаЗакупкиСНДС = БИ.Субконто(3).Цена;
                            Нов.ЭтоНовыйОбъект = Ложь;
                            Нов.Измененный = Истина;
                        КонецЕсли;
                    КонецЦикла;
                КонецЦикла;
            КонецЦикла;    
            Нов.Записать();
        КонецЕсли;
    КонецЕсли;
    Возврат ЕстьИзменения;
КонецФункции

Процедура УстановитьНовуюЦену(ТЗЦеныТоваров)    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ТЗЦеныТоваров.Артикул КАК Артикул,
    |    ТЗЦеныТоваров.Цена КАК Цена
    |ПОМЕСТИТЬ ТЗ
    |ИЗ
    |    &ТЗЦеныТоваров КАК ТЗЦеныТоваров;
    |
    |ВЫБРАТЬ
    |    ТЗ.Артикул КАК Артикул,
    |    МАКСИМУМ(ТЗ.Цена) КАК Цена
    |ИЗ
    |    ТЗ
    |СГРУППИРОВАТЬ ПО
    |    ТЗ.Артикул";
    
    Запрос.УстановитьПараметр("ТЗЦеныТоваров",ТЗЦеныТоваров);
    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    ДокОст = Документы.КорректировкаЗаписейРегистров.СоздатьДокумент();
    
    ДокОст.Дата = ТекущаяДата();
    ДокОст.Комментарий = "Установка Цен сформирован при обмене с 1с 7" ;
    ДокОст.Ответственный =  ПараметрыСеанса.ТекущийПользователь;
    
    НовСтр = ДокОст.ТаблицаРегистровСведений.Добавить();
    
    НовСтр.Имя = "ЦеныНоменклатуры";
    НовСтр.Представление = "Цены номенклатуры";
    
    ДокОст.Записать();
    
    НовыеДанные = ДокОст.Ссылка;
    НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(НовыеДанные);
    Записывать = Ложь;
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Записывать = Истина;
        НоменклНовЦена = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул",СокрЛП(ВыборкаДетальныеЗаписи.Артикул)).Ссылка;
        Если НоменклНовЦена <> Справочники.Номенклатура.ПустаяСсылка() Тогда
            НоваяЗапись                  = НаборЗаписей.Добавить();
            НоваяЗапись.Период           = НовыеДанные.Дата;
            НоваяЗапись.Активность       = Истина;
            НоваяЗапись.ТипЦен           = Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("000000001").Ссылка;
            НоваяЗапись.Номенклатура     = НоменклНовЦена;
            Новаязапись.Валюта           = Справочники.Валюты.НайтиПоКоду("974").Ссылка;
            НоваяЗапись.Цена             = ВыборкаДетальныеЗаписи.Цена;
            Новаязапись.ЕдиницаИзмерения = НоменклНовЦена.ЕдиницаХраненияОстатков.Ссылка;
        КонецЕсли;
    КонецЦикла;
    Если Записывать = Истина Тогда
        НаборЗаписей.Записать();
    КонецЕсли;
КонецПроцедуры

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

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

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

Функция ЗапроситьВсеТоварыПООдинаковымАртикулам(Артикул)
    //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ВремнныеТоварыИзСтороннейПрограммы.Ссылка КАК Ссылка,
    |    ВремнныеТоварыИзСтороннейПрограммы.ВерсияДанных КАК ВерсияДанных,
    |    ВремнныеТоварыИзСтороннейПрограммы.ПометкаУдаления КАК ПометкаУдаления,
    |    ВремнныеТоварыИзСтороннейПрограммы.Родитель КАК Родитель,
    |    ВремнныеТоварыИзСтороннейПрограммы.ЭтоГруппа КАК ЭтоГруппа,
    |    ВремнныеТоварыИзСтороннейПрограммы.Код КАК Код,
    |    ВремнныеТоварыИзСтороннейПрограммы.Наименование КАК Наименование,
    |    ВремнныеТоварыИзСтороннейПрограммы.Артикул КАК Артикул,
    |    ВремнныеТоварыИзСтороннейПрограммы.УИД КАК УИД,
    |    ВремнныеТоварыИзСтороннейПрограммы.СтарыйОстаток КАК СтарыйОстаток,
    |    ВремнныеТоварыИзСтороннейПрограммы.Остаток КАК Остаток,
    |    ВремнныеТоварыИзСтороннейПрограммы.СтараяЦенаЗакупки КАК СтараяЦенаЗакупки,
    |    ВремнныеТоварыИзСтороннейПрограммы.ЦенаЗакупки КАК ЦенаЗакупки,
    |    ВремнныеТоварыИзСтороннейПрограммы.СтавкаНДС КАК СтавкаНДС,
    |    ВремнныеТоварыИзСтороннейПрограммы.ЦенаЗакупкиСНДС КАК ЦенаЗакупкиСНДС,
    |    ВремнныеТоварыИзСтороннейПрограммы.Измененный КАК Измененный,
    |    ВремнныеТоварыИзСтороннейПрограммы.ЭтоНовыйОбъект КАК ЭтоНовыйОбъект,
    |    ВремнныеТоварыИзСтороннейПрограммы.НаправлениеДвиженияОстатков КАК НаправлениеДвиженияОстатков,
    |    ВремнныеТоварыИзСтороннейПрограммы.РазницаВОстатках КАК РазницаВОстатках,
    |    ВремнныеТоварыИзСтороннейПрограммы.Предопределенный КАК Предопределенный,
    |    ВремнныеТоварыИзСтороннейПрограммы.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
    |ИЗ
    |    Справочник.ВремнныеТоварыИзСтороннейПрограммы КАК ВремнныеТоварыИзСтороннейПрограммы
    |ГДЕ
    |    ВремнныеТоварыИзСтороннейПрограммы.Артикул = &Артикул";
    
    Запрос.УстановитьПараметр("Артикул", Артикул);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Возврат ВыборкаДетальныеЗаписи;    
    //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    
КонецФункции
1 ugorchina
 
20.04.18
16:38
+(0) простите
можно ли как то упростить данный обмен или ускорить?
2 hhhh
 
20.04.18
16:45
(1) ну, тут 200 строчек всего. а в типовом обмене 20000. Поэтму тут вряд ли чего упростишь.
3 ugorchina
 
20.04.18
17:00
(2) а по существу? Все ли верно? В принципе обмен работает все переносится но  он занимает около 6 секунд это нормально? Либо можно ускорить как то? Может есть предложения по оптимизации запросов?
4 X Leshiy
 
20.04.18
17:03
(3) Замер производительности сделай.

Подозреваю, 5.9 из 6 секунд это подключение к 77.
5 ugorchina
 
20.04.18
17:12
(4) в запрашиваемому справочнике в семёрке 200 элементов! Подключение производится менее секунды
6 X Leshiy
 
20.04.18
17:17
(5) Скрин замера.

COMОбъект("v77.Application") это примерно как запустить базу.

Меньше секунды, сказки)
7 X Leshiy
 
20.04.18
17:18
(6) + Если скорость чего-то не устраивает, первым делом замер производительности и втыкать в него.

Бывают чУдные открытия)))
8 HawkEye
 
20.04.18
17:26
(0) зачем ты сначала в цикле все элементам проставляешь флаг:

ИзмененныеОбъектыОЛЕ = ОбъектV77.CreateObject("Справочник.ИзмененныеОбъекты");
        ИзмененныеОбъектыОЛЕ.ВыбратьЭлементы();
        Пока ИзмененныеОбъектыОЛЕ.ПолучитьЭлемент() = 1 Цикл
            ИзмененныеОбъектыОЛЕ.НачатОбмен = 1;
            ИзмененныеОбъектыОЛЕ.Записать();
        КонецЦикла;

потом запускаешь снова цикл с условием:

ИзмененныеОбъекты = ОбъектV77.CreateObject("Справочник.ИзмененныеОбъекты");
        ИзмененныеОбъекты.ВыбратьЭлементы();
        Пока ИзмененныеОбъекты.ПолучитьЭлемент() = 1 Цикл
           Если ИзмененныеОбъекты.НачатОбмен = 1 Тогда


??
9 ugorchina
 
20.04.18
17:50
(8) Если в семёрке не установлен этот флаг то изменения не дублируются
10 ugorchina
 
20.04.18
17:52
(8) хотя Вы правы! Можно и установить флаг и запросить данные одновременно спасибо за подсказку
11 ugorchina
 
20.04.18
17:56
(8) нет сам уже путаюсь в том что я сделал в запрашиваемому справочнике нет элементов дулей но они могут быть только когда мы установили флаг если при обмене мы затратам много времени то в какой либо момент юзер может проводить документ и тут в данный спроси могут писаться новые данные потому я сперва пробегают по данному спр и помечаются его что бы семёрка знала что он уже участвует в обмене а затем я выбираю только помеченные объекты ну потом удаляю их
12 ugorchina
 
20.04.18
21:28
Со всем остальным кодом все ок?
13 ugorchina
 
21.04.18
02:20
+(4) произвел замер производительности Да Вы правы подключение заняло 4,5 секунды все остальные занимают меньше секунды ( подключение к 7-ке составляет 99,88%
14 Chameleon1980
 
21.04.18
04:10
где у вас идет запись в справочник измененные объекты?
там складывайте куда-нить
и оттуда забирайте 8кой.
я к тому, что, может, не нужно вам ком-соединение.
15 ugorchina
 
21.04.18
21:55
(14) а чем ОЛЕ плох 5 секундами на подключение? Как Вы считаете что будет если подключится к 7-ке и не отключаться?
16 Chameleon1980
 
21.04.18
21:58
(15) да ничем. Кто из нас скорость просит?
17 Chameleon1980
 
21.04.18
22:00
да ниче не будет, ИМХО.
Так и будет висеть коннект пока ченить не произойдет или не оборвешь сам. А произойти может что угодно
18 ugorchina
 
21.04.18
22:32
А что может произойти то?
19 Chameleon1980
 
21.04.18
22:45
еще раз - хоть что
20 Chameleon1980
 
21.04.18
22:45
(18) руки в руки и пробовать
21 ugorchina
 
21.04.18
23:39
(20) спасибо буду пробовать
22 kalashns
 
22.04.18
15:17
Возьму на заметку. Хороший пример.
23 ugorchina
 
22.04.18
19:18
(22) Вы серьезно?
24 ugorchina
 
22.04.18
19:20
(23) я к тому что с 1с я работаю не больше трёх недель :-)
25 ugorchina
 
22.04.18
19:22
(22) но спасибо мне приятно что моя работа камуто пригодится ( ну не совсем моя весь этот код собран из примеров которые я насобирал в нетерпением + из советов которые мне довели на этом форуме
26 ugorchina
 
23.04.18
05:56
(20) и все таки Вы предлагаете сдать клиенту продукт который будет заведомо для тестирования? )))

Вами было заявлено что будут глюки и т д

но рассказать о том что может быть Вы не пишите (

если бы у меня было бы время на етсты я бы тестировал (хотя так и сделаю но у себя а не у клиента)

если я верно понимаю то при активном соединении с 7-кой затраты по времени снизятся так как соединяться уже не нужно будет с базой

но что будет если в 7-ку кто то захочет войти монопольно?

пустит ли она юзера когда по ОЛЕ активное соединение висит?


потом этот код лежит в общем модуле и выполняется он по регламентному заданию можно ли как то установить активное подключение вроде нет же?
27 ugorchina
 
23.04.18
05:58
что касаемо (0) спасибо за ответы но что касаемо подключения это понятно что оно будет занимать какое то время и я уже от этого не избавлюсь я просил в (0) посмотреть на код вероятно там что либо может криво написано или что то можно упростить или ускорить посредством оптимизации
28 ugorchina
 
23.04.18
06:36
Можно ли использовать такого рода функцию

МассивСоединений = ПолучитьСоединенияИнформационнойБазы();
ЕстьКтотоКромеМеня = Ложь;
Для каждого Соединение Из МассивСоединений Цикл
    Если Соединение.Пользователь <> ТекущийПользователь() Тогда
ЕстьКтотоКромеМеня = Истина;
продолжить;
КонецЕсли;
КонецЦикла;

если ЕстьКтотоКромеМеня = Ложь Тогда
Выполняем регламентные операции от этого юзера
КонецЕсли;

чем это будет чревато?

есть ли какие то подводные камни

(этот вариант я хочу использовать для того что бы не было важно от кого вошли в систему что бы регламентные операции запускались от одного юзера но от того кто первый вошел в всистему
29 ugorchina
 
23.04.18
06:50
и еще как из модуля  который отрабатывает от регламентного задания выдать сообщени е пользователю?

Сообщение  = Новый СообщениеПользователю;
    Сообщение.Текст = "Начат обмен с 1с 7";
    Сообщение.Сообщить();
как здесь назначить пользователя? или пользователей?
я о тех кто активен
30 ugorchina
 
23.04.18
09:43
(29) уже решил спасибо (28) ответьте если не лень )
31 ugorchina
 
10.05.18
10:20
Итак доделал я наконец обмен

код положил в обработку
Вот код

//Процедура используется для ночало обмена между 1с 7 и 1с 8
Процедура НачатьОбменИзмененнымиОбъектамиНажатие() Экспорт
    ЕстьОшибки = Ложь;
    УзелыОбмена = ПолучитьУзлыОбена();
    Пока УзелыОбмена.Следующий() Цикл
        Комментарий = "";
        Комментарий = Комментарий+ " "+"<h1>"+"Дата и время"+"</h1>"+"<h1>"+ТекущаяДата()+"</h1>"+"<br>";
        Комментарий =  Комментарий+"<Br>"+  "Подключение к сторонней программе";
        
        ОбъектV77 = Новый COMОбъект("v77.Application");
        СтрокаПодключения    = "/D"""+СокрЛП(УзелыОбмена.КаталогСтороннейПрограммы)+""" /N"""+СокрЛП(УзелыОбмена.ОбменИмяПользователя)+""" /P"""+СокрЛП(УзелыОбмена.ОбменПароль)+"""";
        РезультатПодключения = ОбъектV77.Initialize(ОбъектV77.RMTrade,СтрокаПодключения,"NO_SPLASH_SHOW");
        
        Комментарий = Комментарий+ " "+"<h1>"+"Дата и время"+"</h1>"+"<h1>"+ТекущаяДата()+"</h1>"+"<br>";
        Комментарий =  Комментарий+"<Br>"+  "Окончание попытки Подключения к сторонней программе";        
        Если РезультатПодключения Тогда
            //Загрузим в стороннюю программу НОВЫЕ заказы
            
            Комментарий = Комментарий+ " "+"<h1>"+"Дата и время"+"</h1>"+"<h1>"+ТекущаяДата()+"</h1>"+"<br>";
            Комментарий =  Комментарий+"<Br>"+  "Удачное Подключения к сторонней программе";
            НовыеЗаказыЕсть = Ложь;
            МассивЗаказов = ПолучитьНовыеЗаказы();
            Пока МассивЗаказов.Следующий() Цикл
                НовыеЗаказыЕсть = Истина;
                ДатаЗаказа    = МассивЗаказов.Дата;
                НомерЗаказа   = МассивЗаказов.Номер;
                Контрагент    = МассивЗаказов.Контрагент;
                Договор       = МассивЗаказов.ДоговорКонтрагента;
                КонтрагентОЛЕ = Неопределено;
                ДоговорОЛЕ    = Неопределено;
                
                НайтиИлиСоздатьКонтрагента(Контрагент,Договор,ОбъектV77,КонтрагентОЛЕ,ДоговорОЛЕ);
                
                //НашлиТакойСчет = Ложь;
                //СчетОбъектыОЛЕ = ОбъектV77.CreateObject("Документ.Счет");
                //СчетОбъектыОЛЕ.ВыбратьДокументы(ДатаЗаказа,ДатаЗаказа);
                //Пока СчетОбъектыОЛЕ.ВыбратьДокументы() = 1 Цикл
                //    Если СокрЛП(НомерЗаказа) = СчетОбъектыОЛЕ.НомерДок Тогда
                //        НашлиТакойСчет = Истина;
                //        Продолжить;
                //    КонецЕсли;
                //КонецЦикла;
                //Если НашлиТакойСчет = Ложь Тогда
                СчетНовыйОЛЕ = ОбъектV77.CreateObject("Документ.Счет");
                СчетНовыйОЛЕ.Новый();
                //Заполнить шапку документа
                СчетНовыйОЛЕ.ДатаДок          = ДатаЗаказа;
                //СчетНовыйОЛЕ.НомерДок         = НомерЗаказа; //номер в сторонней может быть числовой
                Если КонтрагентОЛЕ <> Неопределено Тогда
                    СчетНовыйОЛЕ.Контрагент       = КонтрагентОЛЕ;
                КонецЕсли;
                Если ДоговорОЛЕ <> Неопределено Тогда
                    СчетНовыйОЛЕ.Договор          = ДоговорОЛЕ;
                КонецЕсли;
                //СчетНовыйОЛЕ.Плательщик       = ПолучитьПлательщикаПоОЛЕ();
                //СчетНовыйОЛЕ.РасчетныйСчет    = ПолучитьРасчетныйСчетПоОЛЕ(КонтрагентОЛЕ);
                //СчетНовыйОЛЕ.ЦельПриобретения = ПолучитьЦельПриобретенияПоОЛЕ();
                //СчетНовыйОЛЕ.ТипЦен           = ПолучитьТипЦенПоОЛЕ();
                //СчетНовыйОЛЕ.МестоХранения    = ПолучитьМестоХранениеПоОЛЕ();    
                
                Комментарий = Комментарий+ " "+"<h1>"+"Дата и время"+"</h1>"+"<h1>"+ТекущаяДата()+"</h1>"+"<br>";
                СчетНовыйОЛЕ.Комментарий     = "Документ загружен с сайта № заказа = "+НомерЗаказа;//запишем номер заказа в комментарий
                //Далее работаем с табличной Частью
                Для Каждого ТекущаяСтрока Из МассивЗаказов.Ссылка.Товары Цикл
                    НайденыйТоварВСтроку =  ПолучитьТоварПоОЛЕ(СокрЛП(ТекущаяСтрока.Номенклатура.Артикул),ОбъектV77);
                    //СписокДанных = НайтиПартию(НайденыйТоварВСтроку,ОбъектV77,"Партию");
                    //Партия =  НайтиПартию(НайденыйТоварВСтроку,ОбъектV77,"Партию");
                    //Остаток =  НайтиПартию(НайденыйТоварВСтроку,ОбъектV77,"Остаток");
                    
                    //Остаток = СписокДанных.Получить(0);
                    //Если  СокрЛП(Остаток)  =  "<Пустое значение>" Тогда
                    //    Остаток = 0;
                    //КонецЕсли;
                    //Склад   = СписокДанных.Получить(1);
                    //Партия  = СписокДанных.Получить(2);
                    
                    Если НайденыйТоварВСтроку <> Неопределено Тогда
                        СчетНовыйОЛЕ.НоваяСтрока();
                        СчетНовыйОЛЕ.Товар = НайденыйТоварВСтроку;
                        //Если СокрЛП(Партия)  <>  "<Пустое значение>" Тогда
                        //СчетНовыйОЛЕ.Партия = Партия;
                        //КонецЕсли;
                        СчетНовыйОЛЕ.Количество = ТекущаяСтрока.Количество;
                        СчетНовыйОЛЕ.Цена       = ТекущаяСтрока.Цена;
                        СчетНовыйОЛЕ.Сумма      = ТекущаяСтрока.Сумма;
                        СчетНовыйОЛЕ.Всего      = ТекущаяСтрока.Сумма+ТекущаяСтрока.СуммаНДС;
                        //Если Остаток <> 0 Тогда
                        //СчетНовыйОЛЕ.Остатки    = Остаток;
                        //КонецЕсли;
                        СчетНовыйОЛЕ.НДС        = НайденыйТоварВСтроку.СтавкаНДС.Получить(текущаяДата()).ТекущийЭлемент();
                    КонецЕсли;
                КонецЦикла;
                //Если СокрЛП(Склад)  <>  "<Пустое значение>" Тогда
                //СчетНовыйОЛЕ.МестоХранения    = Склад;
                //КонецЕсли;
                //*********************************
                СчетНовыйОЛЕ.Записать();
                ПоменятьКоммент = МассивЗаказов.Ссылка.ПолучитьОбъект();
                ПоменятьКоммент.ВыгруженВСП = Истина;
                ПоменятьКоммент.Записать();
                //КонецЕсли;
                
                Комментарий = Комментарий+ " "+"<h1>"+"Дата и время"+"</h1>"+"<h1>"+ТекущаяДата()+"</h1>"+"<br>";
                Комментарий =  Комментарий+"<Br>"+  "Передача заказов в стороннюю программу - Заказ № "+НомерЗаказа;
            КонецЦикла;
            Если НовыеЗаказыЕсть = Ложь Тогда
                
                Комментарий = Комментарий+ " "+"<h1>"+"Дата и время"+"</h1>"+"<h1>"+ТекущаяДата()+"</h1>"+"<br>";
                Комментарий =  Комментарий+"<Br>"+  "Новых заказов нет в стороннюю программу заказы выгружены небыли";
            КонецЕсли;
            //*******************************************
            //Зафиксируем признак обмена в сторонней программе
            
            ИзмененныеОбъектыОЛЕ = ОбъектV77.CreateObject("Справочник.ИзмененныеОбъекты");
            ИзмененныеОбъектыОЛЕ.ВыбратьЭлементы();
            Сч1 = 0;
            Пока ИзмененныеОбъектыОЛЕ.ПолучитьЭлемент() = 1 Цикл
                Сч1 = Сч1 + 1;
                ИзмененныеОбъектыОЛЕ.НачатОбмен = 1;
                ИзмененныеОбъектыОЛЕ.Записать();
            КонецЦикла;
            
            Комментарий = Комментарий+ " "+"<h1>"+"Дата и время"+"</h1>"+"<h1>"+ТекущаяДата()+"</h1>"+"<br>";
            Комментарий =  Комментарий+"<Br>"+  "Пометка данных к обмену в сторонней программе -  количество записей = "+Сч1;
            
            //Служебные таблицы
            ОписаниеТипКоличественногоЧисла = Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(19,4));
            ОписаниеТипЦеновогоЧисла        = Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(15,2));
            ОписаниеТипСтрок                = Новый ОписаниеТипов("Строка",Новый КвалификаторыСтроки(30));
            
            ТЗОстаткиТоваров = Новый ТаблицаЗначений;
            ТЗОстаткиТоваров.Колонки.Добавить("Артикул");
            ТЗОстаткиТоваров.Колонки.Добавить("Направление");
            ТЗОстаткиТоваров.Колонки.Добавить("Остаток", ОписаниеТипКоличественногоЧисла);
            
            ТЗЦеныТоваров = Новый ТаблицаЗначений;
            ТЗЦеныТоваров.Колонки.Добавить("Артикул",ОписаниеТипСтрок);
            ТЗЦеныТоваров.Колонки.Добавить("Цена", ОписаниеТипЦеновогоЧисла);
            ЕстьИзменения = Ложь;
            
            
            ИзмененныеОбъекты = ОбъектV77.CreateObject("Справочник.ИзмененныеОбъекты");
            ИзмененныеОбъекты.ВыбратьЭлементы();
            Пока ИзмененныеОбъекты.ПолучитьЭлемент() = 1 Цикл
                Если ИзмененныеОбъекты.НачатОбмен = 1 Тогда
                    
                    Комментарий = Комментарий+ " "+"<h1>"+"Дата и время"+"</h1>"+"<h1>"+ТекущаяДата()+"</h1>"+"<br>";
                    Комментарий =  Комментарий+"<Br>"+  "Запрашиваем данные для обмена Объект - "+СокрЛП(ИзмененныеОбъекты.ВидОбъекта)+" Значение - "+ИзмененныеОбъекты.ОбъектЗначение;
                    Если СокрЛП(ИзмененныеОбъекты.ТипОбъекта) = "Справочник" Тогда
                        Если СокрЛП(ИзмененныеОбъекты.ВидОбъекта) = "Номенклатура" Тогда
                            ЕстьИзменения = ОбработатьСправочникВременныхТоваров(ИзмененныеОбъекты.ОбъектЗначение,ОбъектV77);    
                        КонецЕсли;
                    ИначеЕсли  СокрЛП(ИзмененныеОбъекты.ТипОбъекта) = "Документ" Тогда
                        Если СокрЛП(ИзмененныеОбъекты.ВидОбъекта) = "Счет" Тогда
                            //ДобавитьОбработчик изменяющий статус у заказов ну либ оменяющий что либо в документе
                            //************************************************************************************
                            //************************************************************************************
                            //************************************************************************************
                            //************************************************************************************
                        Иначе//все остальные документы
                            ЕстьИзменения = ОбработатьСправочникВременныхТоваров(ИзмененныеОбъекты.ОбъектЗначение,ОбъектV77);    
                        КонецЕсли;
                    КонецЕсли;
                КонецЕсли;
                ЕстьИзменения = Истина;
            КонецЦикла;
            Если ЕстьИзменения = Ложь Тогда
                
                Комментарий = Комментарий+ " "+"<h1>"+"Дата и время"+"</h1>"+"<h1>"+ТекущаяДата()+"</h1>"+"<br>";
                Комментарий =  Комментарий+"<Br>"+  "Новых данных нет в промежуточную программу остатки и цены либо новые товары выгружены небыли";
            КонецЕсли;
            
            //Удалим Данные из ИзмененныхОбъектов
            ИзмененныеОбъектыОЛЕ.ВыбратьЭлементы();
            Сч2 = 0;
            Пока ИзмененныеОбъектыОЛЕ.ПолучитьЭлемент() = 1 Цикл
                Если ИзмененныеОбъектыОЛЕ.НачатОбмен = 1 Тогда
                    Сч2 = Сч2+1;
                    ИзмененныеОбъектыОЛЕ.Удалить(1);
                КонецЕсли;
            КонецЦикла;
            
            Комментарий = Комментарий+ " "+"<h1>"+"Дата и время"+"</h1>"+"<h1>"+ТекущаяДата()+"</h1>"+"<br>";
            Комментарий =  Комментарий+"<Br>"+ "Удаление временных данных в сторонней программе - количество - "+Сч2;
            
            ОбъектV77 = Неопределено;
            
            Комментарий = Комментарий+ " "+"<h1>"+"Дата и время"+"</h1>"+"<h1>"+ТекущаяДата()+"</h1>"+"<br>";
            Комментарий =  Комментарий+"<Br>"+  "Отключение от сторонней программы";
            
            ВременныеТоварыИзмененные = ЗапросВременныхИзмененных();
            Сч3 = 0;
            Пока ВременныеТоварыИзмененные.Следующий() Цикл
                Сч3 = Сч3+1;
                
                ВременныеТоварыИзмененныеВыборкаОбъект = ВременныеТоварыИзмененные.Ссылка.ПолучитьОбъект();
                
                Если ВременныеТоварыИзмененныеВыборкаОбъект.СтарыйОстаток <> ВременныеТоварыИзмененныеВыборкаОбъект.Остаток Тогда
                    Если ВременныеТоварыИзмененныеВыборкаОбъект.РазницаВОстатках > 0 Тогда
                        Если ВременныеТоварыИзмененныеВыборкаОбъект.ИзмененОстаток = Истина Тогда
                            СтрОстатки             = ТЗОстаткиТоваров.Добавить();
                            СтрОстатки.Артикул     = СокрЛП(ВременныеТоварыИзмененныеВыборкаОбъект.Артикул);
                            СтрОстатки.Направление = СокрЛП(ВременныеТоварыИзмененныеВыборкаОбъект.НаправлениеДвиженияОстатков);
                            СтрОстатки.Остаток     = ВременныеТоварыИзмененныеВыборкаОбъект.РазницаВОстатках;
                        КонецЕсли;
                    КонецЕсли;
                КонецЕсли;
                Если ВременныеТоварыИзмененныеВыборкаОбъект.ЦенаЗакупки > 0 Тогда
                    Если ВременныеТоварыИзмененныеВыборкаОбъект.ИзмененаЦена = Истина Тогда
                        Если ВременныеТоварыИзмененныеВыборкаОбъект.СтараяЦенаЗакупки <> ВременныеТоварыИзмененныеВыборкаОбъект.ЦенаЗакупки Тогда
                            ЗВТПОАВыборкаДетальныеЗаписи = ЗапроситьВсеТоварыПООдинаковымАртикулам(СокрЛП(ВременныеТоварыИзмененныеВыборкаОбъект.Артикул));
                            Пока ЗВТПОАВыборкаДетальныеЗаписи.Следующий() Цикл
                                СтрЦены = ТЗЦеныТоваров.Добавить();
                                СтрЦены.Артикул = СокрЛП(ЗВТПОАВыборкаДетальныеЗаписи.Артикул);
                                СтрЦены.Цена    = ЗВТПОАВыборкаДетальныеЗаписи.ЦенаЗакупки;
                            КонецЦикла;
                        КонецЕсли;
                    КонецЕсли;
                КонецЕсли;
                ВременныеТоварыИзмененныеВыборкаОбъект.Измененный = Ложь;
                ВременныеТоварыИзмененныеВыборкаОбъект.ИзмененОстаток = Ложь;
                ВременныеТоварыИзмененныеВыборкаОбъект.ИзмененаЦена = Ложь;
                ВременныеТоварыИзмененныеВыборкаОбъект.Записать();
            КонецЦикла;    
            
            Комментарий = Комментарий+ " "+"<h1>"+"Дата и время"+"</h1>"+"<h1>"+ТекущаяДата()+"</h1>"+"<br>";
            Комментарий = Комментарий+"<Br>"+  "Подготовка данных временных таблиц - количество записей = "+Сч3;
            
            Если ТЗОстаткиТоваров.Количество() > 0 Тогда
                ТЗОстаткиТоваров.Свернуть("Артикул,Направление","Остаток");
                УстановитьНовыйОстаток(ТЗОстаткиТоваров,УзелыОбмена);
            КонецЕсли;
            
            Комментарий = Комментарий+ " "+"<h1>"+"Дата и время"+"</h1>"+"<h1>"+ТекущаяДата()+"</h1>"+"<br>";
            Комментарий = Комментарий+"<Br>"+  "Обработка остатков - количество записей в ТЗ = "+ТЗОстаткиТоваров.Количество();
            
            Если ТЗЦеныТоваров.Количество() > 0 Тогда
                УстановитьНовуюЦену(ТЗЦеныТоваров,УзелыОбмена);
            КонецЕсли;
            
            Комментарий = Комментарий+ " "+"<h1>"+"Дата и время"+"</h1>"+"<h1>"+ТекущаяДата()+"</h1>"+"<br>";
            Комментарий = Комментарий+"<Br>"+ "Обработка цен - количество записей ТЗ = "+ТЗЦеныТоваров.Количество();            
        Иначе
            ОбъектV77 = Неопределено;
            ЕстьОшибки = Истина;
            Комментарий = Комментарий+ " "+"<h1>"+"Дата и время"+"</h1>"+"<h1>"+ТекущаяДата()+"</h1>"+"<br>";
            Комментарий = ""+"Неудалось подключится к базе данных"+"<Br>"+"вероятно необходимо войти монопольно "+"";
            Комментарий = Комментарий +"<Br>"+ " После того как Вы вошли монопольно"+"<Br>"+" необходимо Выйти из монопольного режима и войти не монопольно " +"";
            Комментарий = Комментарий +"<Br>"+ " Если после данных действий подключение не удалось"+"<Br>"+" обращайтесь в техническую поддержку "+"<Br>"+" Ваш адрес  либо по номеру +375 25 000 00 00 " +"";
            //Возврат;
        КонецЕсли;
        Если ЕстьОшибки = Истина Тогда
            ОтправитьСообщение("Отчет О ходе выполнения кода промежуточной программы ",Комментарий);
        КонецЕсли;
    КонецЦикла;    
КонецПроцедуры

Функция ПолучитьИД(Объект)
    БезКавычекФигурных = СтрЗаменить(Объект,"{","");    
    БезКавычекФигурных = СтрЗаменить(БезКавычекФигурных,"}","");
    БезПробелов        = СокрЛП(БезКавычекФигурных);
    КоличествоЗнаков   = СтрНайти(БезПробелов,",",НаправлениеПоиска.СКонца)+3;
    Возврат СокрЛП(Сред(Лев(БезПробелов,СтрДлина(БезПробелов)-1),КоличествоЗнаков,СтрДлина(БезПробелов)));
КОнецФункции

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

//Используется для создания Новой номенклатуры и или изменения имеющиеся
//Либо для обмновления цены или остатка товаров
Функция ОбработатьСправочникВременныхТоваров(НоменклатураОЛЕ,ОбъектV77)    
    ЕстьИзменения =Ложь;
    Объект = ОбъектV77.ЗначениеВстрокуВнутр(НоменклатураОЛЕ.ТекущийЭлемент());
    ИдентификаторОбъекта = ПолучитьИД(СокрЛП(Объект));
    //Поищем Такую Запись
    Товары = Справочники.ВремнныеТоварыИзСтороннейПрограммы;
    НайденнаяСсылка = Товары.НайтиПоРеквизиту("УИД",ИдентификаторОбъекта);
    Если НайденнаяСсылка = Товары.ПустаяСсылка() Тогда
        //Сообщить("Товары """ + ИдентификаторОбъекта + """ еще нет.");//убрать это так для проверки
        Если НоменклатураОЛЕ.ЭтоГруппа() = 1 Тогда
            Нов = Справочники.ВремнныеТоварыИзСтороннейПрограммы.СоздатьГруппу();
            Нов.Код = НоменклатураОЛЕ.Код;
            Нов.Наименование = НоменклатураОЛЕ.Наименование;
            Нов.УИД = ИдентификаторОбъекта;
            Нов.ЭтоНовыйОбъект = Истина;
            Если НоменклатураОЛЕ.Родитель.Наименование <> "" Тогда
                Нов.Родитель     = НайтиРодителя(НоменклатураОЛЕ.Родитель.Код,НоменклатураОЛЕ.Родитель);
            КонецЕсли;
            Нов.Записать();
        Иначе
            Нов = Справочники.ВремнныеТоварыИзСтороннейПрограммы.СоздатьЭлемент();
            Нов.Код = НоменклатураОЛЕ.Код;
            Нов.Наименование = НоменклатураОЛЕ.Наименование;
            Нов.УИД = ИдентификаторОбъекта;
            Нов.Артикул = НоменклатураОЛЕ.Артикул;
            Нов.ЭтоНовыйОбъект = Истина;
            Нов.Измененный = Истина;
            ПроцентНДС = Неопределено;
            Если СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "БезНДС" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;    
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "Без налога (НДС)" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;        
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "0%" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.НДС0;
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "10%" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.НДС10;    
                ПроцентНДС = 10;
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "18%" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.НДС18;
                ПроцентНДС = 18;
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "20%" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
                ПроцентНДС = 20;
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "24%" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.НДС24;
                ПроцентНДС = 24;
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "25%" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.НДС25;
                ПроцентНДС = 25;
            КонецЕсли;                
            
            Если НоменклатураОЛЕ.Родитель.Наименование <> "" Тогда
                Нов.Родитель = НайтиРодителя(НоменклатураОЛЕ.Родитель.Код,НоменклатураОЛЕ.Родитель);
            КонецЕсли;
            Субк1 = ОбъектV77.EvalExpr("ВидыСубконто.Номенклатура");
            Субк2 = ОбъектV77.EvalExpr("ВидыСубконто.МестаХранения");
            Субк3 = ОбъектV77.EvalExpr("ВидыСубконто.Партии");
            БИ = ОбъектV77.CreateObject("БухгалтерскиеИтоги");
            БИ.ИспользоватьСубконто(Субк1,НоменклатураОЛЕ.ТекущийЭлемент(),1,0);
            БИ.ИспользоватьСубконто(Субк2,Неопределено,1,0);
            БИ.ИспользоватьСубконто(Субк3,Неопределено,1,0);
            БИ.ВыполнитьЗапрос(ТекущаяДата(),ТекущаяДата(),"41.1",Неопределено,Неопределено,1,Неопределено,Неопределено);                                         
            БИ.ВыбратьСубконто(1);
            Пока БИ.ПолучитьСубконто(1) = 1 Цикл
                ЕстьИзменения =Истина;
                Нов.СтарыйОстаток = Нов.Остаток;
                Нов.ИзмененОстаток = Истина;
                Нов.Остаток = БИ.СКД("К");
                Нов.НаправлениеДвиженияОстатков = "Приход";
                Нов.РазницаВОстатках = БИ.СКД("К");
                БИ.ВыбратьСубконто(2);
                Пока БИ.ПолучитьСубконто(2) = 1 Цикл
                    БИ.ВыбратьСубконто(3);
                    Пока БИ.ПолучитьСубконто(3) = 1 Цикл
                        ЕстьИзменения =Истина;
                        Нов.СтараяЦенаЗакупки = Нов.ЦенаЗакупки;
                        Нов.ЦенаЗакупки = БИ.Субконто(3).Цена;
                        Нов.ИзмененаЦена = Истина;
                        Если ПроцентНДС <> Неопределено Тогда
                            Нов.ЦенаЗакупкиСНДС = (БИ.Субконто(3).Цена*ПроцентНДС/100)+БИ.Субконто(3).Цена;
                        Иначе
                            Нов.ЦенаЗакупкиСНДС = БИ.Субконто(3).Цена;
                        КонецЕсли;
                    КонецЦикла;
                КонецЦикла;
            КонецЦикла;    
            Нов.Записать();    
        КонецЕсли;    
    Иначе
        //такая запись есть запишем изменения
        Нов = НайденнаяСсылка.ПолучитьОбъект();
        Если НоменклатураОЛЕ.ЭтоГруппа() = 1 Тогда
            Если СокрЛП(Нов.Код) <> СокрЛП(НоменклатураОЛЕ.Код) Тогда    
                Нов.Код = НоменклатураОЛЕ.Код;
            КонецЕсли;
            Если СокрЛП(Нов.Наименование) <> СокрЛП(НоменклатураОЛЕ.Наименование) Тогда
                Нов.Наименование = НоменклатураОЛЕ.Наименование;
            КонецЕсли;
            
            Если СокрЛП(НоменклатураОЛЕ.Родитель.Наименование) <> "" Тогда
                Нов.Родитель     = НайтиРодителя(НоменклатураОЛЕ.Родитель.Код,НоменклатураОЛЕ.Родитель);
            КонецЕсли;
            Нов.Записать();
        Иначе
            Если СокрЛП(Нов.Код) <> СокрЛП(НоменклатураОЛЕ.Код) Тогда
                Нов.Код = НоменклатураОЛЕ.Код;
            КонецЕсли;
            Если СокрЛП(Нов.Наименование) <> СокрЛП(НоменклатураОЛЕ.Наименование) Тогда
                Нов.Наименование = НоменклатураОЛЕ.Наименование;
            КонецЕсли;
            Если СокрЛП(Нов.Артикул) <> СокрЛП(НоменклатураОЛЕ.Артикул) Тогда    
                Нов.Артикул = НоменклатураОЛЕ.Артикул;
            КонецЕсли;
            
            ПроцентНДС = Неопределено;
            Если СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "БезНДС" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
                Нов.ЭтоНовыйОбъект = Ложь;
                Нов.Измененный = Истина;
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "Без налога (НДС)" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;    
                Нов.ЭтоНовыйОбъект = Ложь;
                Нов.Измененный = Истина;
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "0%" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.НДС0;
                Нов.ЭтоНовыйОбъект = Ложь;
                Нов.Измененный = Истина;
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "10%" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.НДС10;    
                ПроцентНДС = 10;
                Нов.ЭтоНовыйОбъект = Ложь;
                Нов.Измененный = Истина;
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "18%" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.НДС18;
                ПроцентНДС = 18;
                Нов.ЭтоНовыйОбъект = Ложь;
                Нов.Измененный = Истина;
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "20%" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
                ПроцентНДС = 20;
                Нов.ЭтоНовыйОбъект = Ложь;
                Нов.Измененный = Истина;
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "24%" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.НДС24;
                ПроцентНДС = 24;
                Нов.ЭтоНовыйОбъект = Ложь;
                Нов.Измененный = Истина;
            ИначеЕсли СокрЛП(НоменклатураОЛЕ.СтавкаНДС.Получить(текущаяДата()).Наименование) = "25%" Тогда
                Нов.СтавкаНДС = Перечисления.СтавкиНДС.НДС25;
                ПроцентНДС = 25;
                Нов.ЭтоНовыйОбъект = Ложь;
                Нов.Измененный = Истина;
            КонецЕсли;                
            
            Направление = "";
            Было = 0;
            Если СокрЛП(НоменклатураОЛЕ.Родитель.Наименование) <> "" Тогда
                Нов.Родитель     = НайтиРодителя(НоменклатураОЛЕ.Родитель.Код,НоменклатураОЛЕ.Родитель);
            КонецЕсли;
            Субк1 = ОбъектV77.EvalExpr("ВидыСубконто.Номенклатура");
            Субк2 = ОбъектV77.EvalExpr("ВидыСубконто.МестаХранения");
            Субк3 = ОбъектV77.EvalExpr("ВидыСубконто.Партии");
            БИ = ОбъектV77.CreateObject("БухгалтерскиеИтоги");
            БИ.ИспользоватьСубконто(Субк1,НоменклатураОЛЕ.ТекущийЭлемент(),1,0);
            БИ.ИспользоватьСубконто(Субк2,Неопределено,1,0);
            БИ.ИспользоватьСубконто(Субк3,Неопределено,1,0);
            БИ.ВыполнитьЗапрос(ТекущаяДата(),ТекущаяДата(),"41.1",Неопределено,Неопределено,1,Неопределено,Неопределено);     
            
            БылПРоходПоЦиклам = Ложь;
            Нов.СтараяЦенаЗакупки  = Нов.ЦенаЗакупки;
            НоваяЦена  = 0;
            БИ.ВыбратьСубконто(1);
            Пока БИ.ПолучитьСубконто(1) = 1 Цикл
                Если Нов.Остаток <> БИ.СКД("К") Тогда
                    БылПРоходПоЦиклам = Истина;
                    Было = Нов.Остаток;
                    Если Нов.Остаток > БИ.СКД("К") Тогда
                        Направление = "Расход";    
                    ИначеЕсли Нов.Остаток < БИ.СКД("К") Тогда
                        Направление = "Приход";    
                    КонецЕсли;
                    Нов.ИзмененОстаток = Истина;
                    Если Направление <> "" Тогда
                        ЕстьИзменения =Истина;
                        Нов.СтарыйОстаток = Нов.Остаток;
                        Нов.Остаток = БИ.СКД("К");
                        Нов.НаправлениеДвиженияОстатков = Направление;
                        Если БИ.СКД("К")-Было<0 тогда
                            Нов.РазницаВОстатках =  (БИ.СКД("К")-Было)*-1;
                        Иначе
                            Нов.РазницаВОстатках =  БИ.СКД("К")-Было;
                        КонецЕсли;
                        Нов.ЭтоНовыйОбъект = Ложь;
                        Нов.Измененный = Истина;
                    КонецЕсли;                    
                КонецЕсли;
                БИ.ВыбратьСубконто(2);
                Пока БИ.ПолучитьСубконто(2) = 1 Цикл
                    БИ.ВыбратьСубконто(3);
                    Пока БИ.ПолучитьСубконто(3) = 1 Цикл
                        Если Нов.ЦенаЗакупки <> БИ.Субконто(3).Цена Тогда
                            ЕстьИзменения =Истина;
                            Нов.ЦенаЗакупки = БИ.Субконто(3).Цена;
                            Нов.ЭтоНовыйОбъект = Ложь;
                            Нов.Измененный = Истина;
                            Нов.ИзмененаЦена = Истина;
                        КонецЕсли;
                        Если ПроцентНДС <> Неопределено Тогда
                            ЕстьИзменения =Истина;
                            Нов.ЦенаЗакупкиСНДС = (БИ.Субконто(3).Цена*ПроцентНДС/100)+БИ.Субконто(3).Цена;
                            Нов.ЭтоНовыйОбъект = Ложь;
                            Нов.Измененный = Истина;
                        Иначе
                            ЕстьИзменения =Истина;
                            Нов.ЦенаЗакупкиСНДС = БИ.Субконто(3).Цена;
                            Нов.ЭтоНовыйОбъект = Ложь;
                            Нов.Измененный = Истина;
                        КонецЕсли;
                    КонецЦикла;
                КонецЦикла;
            КонецЦикла;
            Если БылПРоходПоЦиклам = Ложь Тогда
                Если Нов.Остаток <> 0 Тогда
                    Было = Нов.Остаток;
                    Если Нов.Остаток > 0 Тогда
                        Направление = "Расход";    
                    ИначеЕсли Нов.Остаток < 0 Тогда
                        Направление = "Приход";    
                    КонецЕсли;
                    Нов.ИзмененОстаток = Истина;
                    Если Направление <> "" Тогда
                        ЕстьИзменения =Истина;
                        Нов.СтарыйОстаток = Нов.Остаток;
                        Нов.Остаток = 0;
                        Нов.НаправлениеДвиженияОстатков = Направление;
                        Если 0-Было<0 тогда
                            Нов.РазницаВОстатках =  (0-Было)*-1;
                        Иначе
                            Нов.РазницаВОстатках =  0-Было;
                        КонецЕсли;
                        Нов.ЭтоНовыйОбъект = Ложь;
                        Нов.Измененный = Истина;
                    КонецЕсли;                    
                КонецЕсли;
            КонецЕсли;
            Нов.Записать();
        КонецЕсли;
    КонецЕсли;
    Возврат ЕстьИзменения;
КонецФункции

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

//установимНовые
Процедура УстановитьНовыйОстаток(Остатки,ДопДанные)    
    ДокОст = Документы.КорректировкаЗаписейРегистров.СоздатьДокумент();
    
    ДокОст.Дата = ТекущаяДата();//Запишем документ в следующий день, за днем свертки
    ДокОст.Комментарий = "Корректировка остатков Сформирован при обмене с 1с 7" ;
    ДокОст.Ответственный =  ПараметрыСеанса.ТекущийПользователь;
    
    НовСтр = ДокОст.ТаблицаРегистровНакопления.Добавить();
    
    НовСтр.Имя = "ТоварыНаСкладах";
    НовСтр.Представление = "Товары на складах";
    
    НовСтр = ДокОст.ТаблицаРегистровНакопления.Добавить();
    
    НовСтр.Имя = "ТоварыОрганизаций";
    НовСтр.Представление = "Товары организаций";
    
    
    ДокОст.Записать();
    
    НовыеДанные = ДокОст.Ссылка;
    НаборЗаписей = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(НовыеДанные);
    Дас = Ложь;
    остат = 0;
    Для Каждого Стр Из Остатки Цикл
        Если Стр.Остаток<0 тогда
            остат = Стр.Остаток*-1;
        Иначе
            остат = Стр.Остаток;
        КонецЕсли;
        Дас = Истина;
        НоменклНовОстаток = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул",СокрЛП(Стр.Артикул)).Ссылка;
        Если НоменклНовОстаток <> Справочники.Номенклатура.ПустаяСсылка() Тогда
            НоваяЗапись = НаборЗаписей.Добавить();
            НоваяЗапись.Период = НовыеДанные.Дата;
            НоваяЗапись.Активность = Истина;
            Если СокрЛП(Стр.Направление) = "Приход" Тогда
                НоваяЗапись.ВидДвижения = ВидДвиженияНакопления.Приход;
            ИначеЕсли СокрЛП(Стр.Направление) = "Расход" Тогда
                НоваяЗапись.ВидДвижения = ВидДвиженияНакопления.Расход;
            КонецЕсли;
            НоваяЗапись.Количество = остат;
            НоваяЗапись.Склад = ДопДанные.ОсновнойСклад.Ссылка;
            Новаязапись.Качество = ДопДанные.Качество.Ссылка;
            НоваяЗапись.Номенклатура = НоменклНовОстаток;
            НоваяЗапись.Регистратор = НовыеДанные;    
        КонецЕсли;
    КонецЦикла;
    Если Дас = Истина Тогда
        НаборЗаписей.Записать();
    КонецЕсли;
    
    НаборЗаписей = РегистрыНакопления.ТоварыОрганизаций.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(НовыеДанные);
    Записывать = Ложь;
    остат = 0;
    Для Каждого Стр Из Остатки Цикл
        Если Стр.Остаток < 0 тогда
            остат = Стр.Остаток*-1;
        Иначе
            остат = Стр.Остаток;
        КонецЕсли;
        Записывать = Истина;
        НоменклНовОстаток = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул",СокрЛП(Стр.Артикул)).Ссылка;
        Если НоменклНовОстаток <> Справочники.Номенклатура.ПустаяСсылка() Тогда
            НоваяЗапись = НаборЗаписей.Добавить();
            НоваяЗапись.Период = НовыеДанные.Дата;
            НоваяЗапись.Активность = Истина;
            Если
32 ugorchina
 
10.05.18
10:22
что то код не влез (

вот ссыль на обработку

http://files.apdate.by/file/1525936755_Obmen1C8to1c7
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.