Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа через OLE
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
Talkman
Доброго времени суток. Зашел в глухой угол. В упор не вижу ошибку.
Итак.
Дано: Две идентичные по конфигурауии базы. Необходимо выполнить синхронизацию цен в элементе справочника ТМЦ. Цены и единицы товара - подчинены справочнику ТМЦ.
Кто = Там.CreateObject("Справочник.Сотрудники");
    Если Кто.НайтиПоНаименованию(АвторДока.Наименование,0) = 0 Тогда
        Сообщить("Извините, нет в той базе сотрудника "+АвторДока.Наименование+" ... Запись автора цены проводится не будет!");
    КонецЕсли;
    
    //Поиск товара, цен и единиц товара в другой базе    
    ТМЦ = Там.CreateObject("Справочник.ТМЦ");
    ТТТ = СоздатьОбъект("Справочник.ТМЦ");
    ТТТ.НайтиЭлемент(ТекущийЭлемент());  
    ТТТ1 = Там.CreateObject("Справочник.ТМЦ");
    Если ТМЦ.НайтиПоКоду(ТекущийЭлемент().Код) = 1 тогда
        Сообщить("Найдено ТМЦ с кодом "+ТМЦ.Код+". Имя ему "+Тмц.Наименование);
        попытка
        //    ТТТ1.НайтиЭлемент(ТМЦ);
            Сообщить("Записи на дату "+ДатаРекв);
            //ТМЦ.ИспользоватьДату(Датарекв);
            Сообщить("Использовали там дату");
            ТМЦ.УстановитьАтрибут("УчетнаяЦена",УчетнаяЦена.Получить(ДатаРекв));
            
            Сообщить("Должна записаться "+ТТТ.УчетнаяЦена.Получить(ДатаРекв)+" в товар "+ТМЦ.наименование);
            ТМЦ.Записать();                
            Сообщить("Записали");
        исключение  
            Сообщить("!!! Ошибка записи учетной цены !!!");
        КонецПопытки;
        КЕТам = Там.CreateObject("Справочник.КлассификаторЕдИзм");
        КЦТам = Там.CreateObject("Справочник.КатегорииЦен");
        
        //Сравниваем единицы у товаров
        ЕТам = Там.CreateObject("Справочник.Единицы");
        ЕТам.ИспользоватьВладельца(Тмц.ТекущийЭлемент());
        
        Е = СоздатьОбъект("Справочник.Единицы");
        Е.ИспользоватьВладельца(ТекущийЭлемент());
        Е.ВыбратьЭлементы();
        Пока Е.ПолучитьЭлемент() = 1 Цикл
            Если Е.ПометкаУдаления() = 1 Тогда
                продолжить;
            КонецЕсли;
            Если КЕТам.НайтиПоНаименованию(Е.Единица.Наименование) = 0 Тогда
                КЕТам.Новый();
                КЕТам.наименование = Е.Единица.Наименование;
                КЕТам.ПолнНаименование = Е.Единица.ПолнНаименование;            //Поиск классификатора единицы измерения как в единице
                КЕТам.Записать();
                Сообщить("В той базе не найден классификатор единиц измерения "+Е.Единица.Наименование+". Создан новый!");
            КонецЕсли;  

            Найдено = 0;
            ЕТам.ВыбратьЭлементы();
            Пока ЕТам.ПолучитьЭлемент() = 1 Цикл
                Если ЕТам.ПометкаУдаления() = 1 Тогда
                    продолжить;
                КонецЕсли;
                Если (Е.Наименование = ЕТам.Наименование) и (Е.Коэффициент = Етам.Коэффициент) и (Е.Единица.Наименование = ЕТам.Единица.Наименование) Тогда
                    Найдено = 1;
                    Прервать;
                КонецЕсли;      
            КонецЦикла;    
            Если Найдено = 0 Тогда
                ЕТам.Новый();
                Етам.Наименование = Е.Наименование;
                Етам.Единица =КЕТам.ТекущийЭлемент();
                Етам.Коэффициент = Е.Коэффициент;
                ЕТам.Вес = Е.Вес;
                Етам.Записать();
                Сообщить("Не найдена единица "+Е.Наименование+" в той базе. Создана новая!");
            КонецЕсли;
        КонецЦикла;
        
        
        
        Цена = Там.CreateObject("Справочник.Цены");
        Цена.ИспользоватьДату(ДатаРекв);
        Цена.ИспользоватьВладельца(ТМЦ.ТекущийЭлемент());
        Ц = СоздатьОбъект("Справочник.Цены");    
        Ц.ИспользоватьВладельца(ТекущийЭлемент());
        Ц.ВыбратьЭлементы();
        Пока Ц.ПолучитьЭлемент() = 1 Цикл
            Если Ц.ПометкаУдаления() = 1 Тогда
                продолжить;
            КонецЕсли;
            ТЦ = СокрЛП((Ц.КатегорияЦены.Наименование));  
            
                        
            Если КЦТам.НайтиПоНаименованию(СокрЛП(Ц.КатегорияЦены.Наименование)) = 0 Тогда
                КЦТам.Новый();
                КЦТам.Наименование = Ц.КатегорияЦены.Наименование;
                КЦТам.Комментарий = Ц.КатегорияЦены.Комментарий;            //Поиск категории цены там
                КЦТам.ТорговаяНаценка = Ц.КатегорияЦены.ТорговаяНаценка;
                КЦТам.БПДВ = Ц.КатегорияЦены.БПДВ;
                КЦТам.РЦ = Ц.КатегорияЦены.РЦ;
                КЦТам.СКТов = Ц.КатегорияЦены.СКтов;
                КЦТам.Записать();
                Сообщить("В той базе не найден тип цены "+Ц.КатегорияЦены.Наименование+". Создан новый!");
            КонецЕсли;
            
            
            Ед = СокрЛП(Ц.Единица.Получить(ДатаРекв).Наименование);
            Цена.ВыбратьЭлементы();
            Пока Цена.ПолучитьЭлемент() = 1 Цикл  
                Найдено = 0;
                Если Цена.ПометкаУдаления() = 1 Тогда
                    продолжить;
                КонецЕсли;
                Если (СокрЛП(Цена.КатегорияЦены.Наименование) = ТЦ) и (СокрЛП(Цена.Единица.Наименование) = Ед) Тогда
                    Найдено = 1;
                    БылоЦ = Цена.Цена;
                    БылоН = Цена.Наценка;
                    Цена.Цена = Ц.Цена.Получить(датаРекв);
                    Цена.Наценка = Ц.Наценка.Получить(датаРекв);
                    Цена.Записать();    
                    Сообщить("Обновление цены "+Цена.КатегорияЦены.Наименование+" для единицы "+Цена.Единица.Наименование+". Изменение цены с "+БылоЦ+" на "+
                                          Цена.Цена+", изменение наценки с "+БылоН+" на "+Ц.Наценка.Получить(ДатаРекв));
                    прервать;
                КонецЕсли;
            КонецЦикла;
            Если Найдено = 0 Тогда
                Цена.ИспользоватьДату(ДатаРекв);
                Цена.Новый();
                Цена.Записать();
                Цена.Наименование = Ц.Наименование;
                Цена.Валюта = Там.Константа.БазоваяВалюта;
                Цена.Цена = Ц.ТекущийЭлемент().Цена.Получить(датаРекв);          
                Цена.Наценка = Ц.ТекущийЭлемент().Наценка.Получить(датаРекв);  
                ЕТам.ВыбратьЭлементы();
                Пока ЕТам.ПолучитьЭлемент() = 1 Цикл
                    Если ЕТам.ПометкаУдаления() = 1 Тогда
                        продолжить;
                    КонецЕсли;
                    Если (Ц.Единица.Получить(датаРекв).Наименование = ЕТам.Наименование) и (Ц.Единица.Получить(датаРекв).Коэффициент = Етам.Коэффициент) и
                                                         (Ц.Единица.Получить(датаРекв).Единица.Наименование = ЕТам.Единица.Наименование) Тогда
                        Найдено = 1;
                        Прервать;
                    КонецЕсли;      
                КонецЦикла;
                Если Найдено = 0 Тогда
                    Сообщить("*Не получилось найти единицу товара для цены "+КЦТам.Наименование+"* Цена не записана!");
                иначе
                    Цена.Единица = ЕТам.ТекущийЭлемент();
                    Цена.КатегорияЦены = КЦТам.ТекущийЭлемент();
                    Цена.АЦ = Ц.АЦ.Получить(ДатаРекв);    
                    Если Кто.НайтиПоНаименованию(Ц.АвторДока.Получить(ДатаРекв).Наименование,0) = 0 Тогда
                        Цена.АвторДока = Кто.ТекущийЭлемент();    
                    КонецЕсли;
                    Цена.Записать();
                    Сообщить("Цена "+Ц.КатегорияЦены+" с единицей "+Ед+" не найдена! Создана новая цена.");    
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;


Выводит:
Найдено ТМЦ с кодом 010100001. Имя ему АПВ-2,5
Записи на дату 24.05.14
Использовали там дату
!!! Ошибка записи учетной цены !!!
Обновление цены Дистрибуция для единицы м.. Изменение цены с 0.525 на 0.525, изменение наценки с 25 на 25
Обновление цены Закуп. без НДС для единицы м.. Изменение цены с 0.347 на 0.347, изменение наценки с -7.05 на -7.05
Обновление цены Закупочная счет для единицы м.. Изменение цены с 0 на 0, изменение наценки с 0 на 0
Обновление цены ЗакупочнаяСНДС для единицы м.. Изменение цены с 0 на 0, изменение наценки с 0 на 0
Обновление цены Монтажная для единицы м.. Изменение цены с 0.4536 на 0.4536, изменение наценки с 8 на 8
Обновление цены Оптовая 1 для единицы м.. Изменение цены с 0.525 на 0.525, изменение наценки с 25 на 25
Обновление цены Оптовая Киев для единицы м.. Изменение цены с 0.483 на 0.483, изменение наценки с 15 на 15
Обновление цены Розничная для единицы м.. Изменение цены с 0.567 на 0.567, изменение наценки с 35 на 35
Обновление цены Специальная для единицы м.. Изменение цены с 0.441 на 0.441, изменение наценки с 5 на 5

В итоге. Все цены обновились, а учетна цена (периодический реквизит ТМЦ) осталась.

Были опробованы варианты с:
        ТМЦ = Там.CreateObject("Справочник.ТМЦ"); 
    ТТТ = СоздатьОбъект("Справочник.ТМЦ");
    ТТТ.НайтиЭлемент(ТекущийЭлемент());  
    ТТТ1 = Там.CreateObject("Справочник.ТМЦ");
    Если ТМЦ.НайтиПоКоду(ТекущийЭлемент().Код) = 1 тогда
        Сообщить("Найдено ТМЦ с кодом "+ТМЦ.Код+". Имя ему "+Тмц.Наименование);
        попытка
            ТМЦ.ИспользоватьДату(Датарекв);
            Сообщить("Использовали там дату ");
            ТМЦ.УчетнаяЦена = ТТТ.УчетнаяЦена.Получить(ДатаРекв);
            Сообщить("Должна записаться "+ТТТ.УчетнаяЦена.Получить(ДатаРекв));
            Сообщить("Установили там дату");
            ТМЦ.Записать();                
            Сообщить("Записали");
        исключение  
            Сообщить("!!! Ошибка записи учетной цены !!!");
        КонецПопытки;
         КонецЕсли;

Итог такой же. Где ошибаюсь? mamba.gif

Поправочка. В нижнем варианте. Пишет, что цена записана, но в базе, где должна быть обновлениа, не обновляется. Код пересмотрел уже раз 20. В упор не вижу где ошибка. Причем обновление справочника Цены, в котором тоже присутствуют периодические реквизиты прошло без проблем.


 ! 

Правила, п.13
 

Релиз 27. Конфигурация - глубоко переделанная ПУБ.
XBrut
Зробіть в базі-приймачі функцію в глобальному модулі


глУстановитьЦену(Код,Цена) Экспорт


Відладьте в звичайному режимі.
А потім викликайте її через ОЛЕ.
і не любіть собі мозг smile.gif
volodya1122
Кажется я слышал что по ОЛЕ не все функции работают корректно.
Попробовать так
ТМЦ.Установить("УчетнаяЦена",ТТТ.УчетнаяЦена.Получить(ДатаРекв));
(и закоментипровать ТМЦ.ИспользоватьДату(Датарекв); )
Talkman
Цитата(volodya1122 @ 23.05.14, 16:40) необходимо зарегистрироваться для просмотра ссылки
Кажется я слышал что по ОЛЕ не все функции работают корректно.
Попробовать так
ТМЦ.Установить("УчетнаяЦена",ТТТ.УчетнаяЦена.Получить(ДатаРекв));
(и закоментипровать ТМЦ.ИспользоватьДату(Датарекв); )

Вы имеете ввиду УстановитьАтрибут()?
Опробовано. Не катит. sad.gif
Также опробовано
Тмц.УчетнаяЦена.Установить(ДатаРекв).
То же не прокатило.



 ! 

Правила, п.13
 

Бесит меня то, что в этом же коде я распрекрасно с ИспользоватьДату() работаю с другим видом справочника и там все классно.
У пользователя подключения - права админа. Тут все чики пики.

Цитата(XBrut @ 23.05.14, 16:33) необходимо зарегистрироваться для просмотра ссылки
Зробіть в базі-приймачі функцію в глобальному модулі


глУстановитьЦену(Код,Цена) Экспорт


Відладьте в звичайному режимі.
А потім викликайте її через ОЛЕ.
і не любіть собі мозг smile.gif


Поделитесь примером вызова процедуры с 4-мя параметрами через Оле. Буду признателен.
volodya1122
Может еще дополнительно попробовать спозиционироватся на текущем объекте:
Если ТМЦ.НайтиПоКоду(ТекущийЭлемент().Код) = 1 тогда
ТМЦ.ТекущийЭлемент()
и дальше по тексту.
Домовик
вот смотрю эту фразу, и ...
" Причем обновление справочника Цены, в котором тоже присутствуют периодические реквизиты прошло без проблем."

вы хотите сказать, что с другими периодическими реквизитами все нормально? присваивается нужное значение?
Talkman
Цитата(Домовик @ 23.05.14, 17:45) необходимо зарегистрироваться для просмотра ссылки
вот смотрю эту фразу, и ...
" Причем обновление справочника Цены, в котором тоже присутствуют периодические реквизиты прошло без проблем."

вы хотите сказать, что с другими периодическими реквизитами все нормально? присваивается нужное значение?

Именно

Цитата(volodya1122 @ 23.05.14, 17:28) необходимо зарегистрироваться для просмотра ссылки
Может еще дополнительно попробовать спозиционироватся на текущем объекте:
Если ТМЦ.НайтиПоКоду(ТекущийЭлемент().Код) = 1 тогда
ТМЦ.ТекущийЭлемент()
и дальше по тексту.

Опробовано. Нифига.
XBrut
Цитата
Поделитесь примером вызова процедуры с 4-мя параметрами через Оле. Буду признателен.

інтуітивно там байдуже скільки параметрів. головне щоб вони мали примітивний тип (строка,число,дата)
через ОЛЕ можна викликати процедуру/функцію (не пам'ятаю що саме) глобального контексту
а ось вам приклад де взагалі зовнішня обробка викликається через ОЛЕ і їй в параметр передається список значень
необходимо зарегистрироваться для просмотра ссылки
Домовик
если "именно", то тут часть ответа. Там вы просто перебираете выборку, здесь конкретно ищете элемент справочника... еще есть отличия.. нужно смотреть..

у вас куча сообщений в коде. и что пишет. где находитесь, когда запускает.
Пробовали ли просто конкретную дату присвоить?
Talkman
Цитата(Домовик @ 23.05.14, 18:04) необходимо зарегистрироваться для просмотра ссылки
если "именно", то тут часть ответа. Там вы просто перебираете выборку, здесь конкретно ищете элемент справочника... еще есть отличия.. нужно смотреть..

у вас куча сообщений в коде. и что пишет. где находитесь, когда запускает.
Пробовали ли просто конкретную дату присвоить?

Завтра попробую через вызов функции по оле. Листинг сообщений при работе кода указан выше. Разницы между перебором по выборке и непосредственно нахождении элемента не вижу, ибо проверено что и там и там присутствует позиционирование на правильном элементе справочника. Проверено, ищет именно то, что надо.
Домовик
у меня под руками Пуб нету,.. но в торговле УчетнаяЦена не периодический реквизит.



Pepe
В ПУБе - периодический.
Домовик
спасибо.

Цитата(Talkman @ 23.05.14, 12:58) необходимо зарегистрироваться для просмотра ссылки
Вы имеете ввиду УстановитьАтрибут()?
Опробовано. Не катит. sad.gif
Также опробовано
Тмц.УчетнаяЦена.Установить(ДатаРекв).
То же не прокатило.


правильнее использование Установить():
ТМЦ.УчетнаяЦена.Установить(НужнаяДата, НужноеЗн);


УстановитьАтрибут() вообще нет для периодических.


еще. А галки в этом реквизите есть? может еще галки посмотреть..

Talkman
Вернемся к нашим "баран".
Принял решение внемлить совету про вызов функции через ОЛЕ.
Листинг таков.
Сообщить("ЗапихнутьРеквизит("+ТМЦ.Код+", ""УчетнаяЦена"" ,"+Зн+","+""""+Строка(ДатаРекв)+""""+")");
ВотЪ =Там.EvalExpr("ЗапихнутьРеквизит("+ТМЦ.Код+", ""УчетнаяЦена"" ,"+Зн+","+""""+Строка(ДатаРекв)+""""+")");
Сообщить("Х "+ВотЪ);


Код функции в той базе:
Функция ЗапихнутьРеквизит(ТКод,Рекв,Зн,ДатаРекв)  Экспорт  
    ДатаРекв = Дата(ДатаРекв);
    Т = СоздатьОбъект("Справочник.ТМЦ");
    Т.НайтиПоКоду(ТКод);
    Если ПустоеЗначение(Датарекв) = 1 Тогда
        Т.УстановитьАтрибут(Рекв,Зн);
        Т.Записать();
        Возврат("Ог");
    иначе
        П = СоздатьОбъект("Периодический");
        П.использоватьОбъект(Рекв,Т);
        П.Датазнач = ДатаРекв;
        П.Значение = Зн;
        П.Записать();
        Возврат("Ог");
    КонецЕсли;
КонецФункции //ЗапихнутьУчетку


Сообщения:
ЗапихнутьРеквизит(010100001, "УчетнаяЦена" ,200,"25.05.14")
Х Ог
Обновление цены Дистрибуция для единицы м.. Изменение цены с 0.525 на 0.525, изменение наценки с 30 на 30
Обновление цены Закуп. без НДС для единицы м.. Изменение цены с 0.347 на 0.347, изменение наценки с -7.05 на -7.05
Обновление цены Закупочная счет для единицы м.. Изменение цены с 0 на 0, изменение наценки с 0 на 0
Обновление цены ЗакупочнаяСНДС для единицы м.. Изменение цены с 0 на 0, изменение наценки с 0 на 0
Обновление цены Монтажная для единицы м.. Изменение цены с 0.4536 на 0.4536, изменение наценки с 10 на 10
Обновление цены Оптовая 1 для единицы м.. Изменение цены с 0.525 на 0.525, изменение наценки с 30 на 30
Обновление цены Оптовая Киев для единицы м.. Изменение цены с 0.483 на 0.483, изменение наценки с 20 на 20
Обновление цены Розничная для единицы м.. Изменение цены с 0.567 на 0.567, изменение наценки с 40 на 40
Обновление цены Специальная для единицы м.. Изменение цены с 0.441 на 0.441, изменение наценки с 10 на 10

Все. Мозг сломан. Никаких сообщений об ошибках. Все проходит олиично, но реквизит НЕ ЗАПИСАН! История реквизита в той базе проверена от и до...


Галки на реквизите "УчернаяЦена": Периодический, неотрицательный, Изменение документом, ручное изменение. Используется для элемента. 47046430.gif

Дополнительная инфо к размышлению.
Локально код работает:
ЗапихнутьРеквизит(010100001,"УчетнаяЦена",300,Рабочаядата());


Логика мне подсказывает, что бок в настройках пользака ОЛЕ сессии, но где он может быть - теряюсь. Права Админа. Все доступно...

Новая инфа. Захожу локально под пользаком ОЛЕ. Запускаю код. МЕНЯЕТ!!! 09000000.gif

Проблема найдена...

ТМЦ.ИспользоватьДату(датаРекв)


стояло без второго параметра после ..

 ТМЦ.НайтиПоКоду()


то бишь использовать на дату включалось на следующую выборку/позиционирование на объекте ОЛЕ ТМЦ...

Как то так.

Спасибо за советы. Мир Вам.
Sanyk
Для синхронізації цін (да і для всіх періодичних реквізитів), я би взагалі використовував би об'єкт "Периодический". При чому не тільки для запису, а й для впевненості, що вся інформація в них для обох баз ідентична.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.