Имя: Пароль:
1C
1С v8
перенос справочников контрагенты и договоры контрагентов
0 alexser94
 
23.08.16
15:54
Коллеги, день добрый.
Конфигурация: БП, 3.0 нетиповая, 8.3 платформа.
Есть задача: переносить элементы справочников Контрагенты и Договоры контрагентов несколько раз в месяц.
База-источник и база-приемник: идентичные, обе БП 3.0 на 8.3
Ранее их перенос осуществлялся через OLE технологию (но база-приемник была 1С 7.7). Переделываю для 1с8 базы.
Список контрагентов и договоров выгружается запросом:

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

    Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
    Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ДатаОкончания));
    Запрос.УстановитьПараметр("ВалютаРубли", Константы.ВалютаРегламентированногоУчета.Получить());
    Запрос.УстановитьПараметр("Склад", Справочники.ибсКонстанты.СкладТМЦ.ЗначениеКонстанты);
    Сп = Новый СписокЗначений;
    Сп.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты);
    Сп.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры);
    Запрос.УстановитьПараметр("СубконтоДт", Сп);
    Запрос.УстановитьПараметр("СубконтоКт", Сп);

    Результат = Запрос.Выполнить();
    ТЗРез = Результат.Выгрузить();
    ТЗРез.Свернуть("КодОУ, Контрагент, Договор, Валюта, Выгружать, КодДебитора, КодКредитора");

    ВыгружаемыеДанные.Загрузить(ТЗРез); //Результат записывается в табличную часть

Подключение и обращение к справочникам:

Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    СохранитьРеквизиты(ЭтотОбъект);
    
    ЭлементыФормы.БазаНеПодключена.Видимость = Истина;
    ЭлементыФормы.БазаПодключена.Видимость   = Ложь;
    
    V83 = Новый COMОбъект("V83.ComConnector");
    Попытка
            СтрокаПодключения = "Srvr=""" + "hq-ib-1c8-prod" + """;Ref=""" + "buh_office" + """;Usr=""" + "Администратор" + """;Pwd=""" + "Zz123456" + """";
            СоединениеДругаяБаза = V83.Connect(СтрокаПодключения);
  
   Состояние("Соединение Установлено !!!");
     Ok = Истина;
     Исключение
   Предупреждение ("Не удалось соединиться с другой базой");
    КонецПопытки;
                
        Если Ok Тогда
            ЭлементыФормы.БазаНеПодключена.Видимость = Ложь;
            ЭлементыФормы.БазаПодключена.Видимость   = Истина;
        
        Иначе
            Сообщить("Сбой открытия базы 1с8 ... Завершаем работу",СтатусСообщения.Важное);
            v83.ExecuteBatch("ЗавершитьРаботуСистемы(0)");
            v83 = Неопределено;
        КонецЕсли;    
    Если ВыгружаемыеДанные.Количество() = 0 Тогда
        Сформировать(Кнопка);
        Если ВыгружаемыеДанные.Количество() = 0 Тогда
            Возврат;
        КонецЕсли;
    КонецЕсли;    

    v83_Контр = СоединениеДругаяБаза.Справочники.Контрагенты;
    v83_Дог = СоединениеДругаяБаза.Справочники.ДоговорыКонтрагентов;

    Вс = ВыгружаемыеДанные.Количество();    
    Тек = 0;
    Для каждого ТекСтр Из ВыгружаемыеДанные Цикл
        ОбработкаПрерыванияПользователя();
        Тек = Тек + 1;    
        Состояние("Обработка записи: " + Тек + " из " + Вс + "...");
        КодОУ =  ТекСтр.КодОУ;
        КодДебитора  = ТекСтр.КодДебитора;
        КодКредитора = ТекСтр.КодКредитора;
        Контр     = ТекСтр.Контрагент;
        НаимКонтр = ТекСтр.Контрагент.Наименование;
        
        
        
    СсылкаЭлемент  = v83_Контр.НайтиПоКоду(ТекСтр.КодОУ);
        Если СсылкаЭлемент = v83_Контр.ПустаяСсылка()
            тогда
            Объект = v83_Контр.СоздатьЭлемент();
            Объект.Код = Текстр.КодОУ;
    Объект.Наименование = ТекСтр.Контрагент.Наименование;
            Объект.ибсКодДебитора = КодДебитора;
            Объект.ибсКодКредитора = КодКредитора;
            Объект.НаименованиеПолное = СокрЛП(Контр.НаименованиеПолное);
            Объект.КодПоОКПО = СокрЛП(Контр.КодПоОКПО);
            Объект.ИНН = СокрЛП(Контр.ИНН);

            Объект.Записать();
        иначе
        Объект  =  СсылкаЭлемент.ПолучитьОбъект();
        Объект.Код = Текстр.КодОУ;
        Объект.Наименование = ТекСтр.Контрагент.Наименование;
        Объект.ибсКодДебитора = КодДебитора;
        Объект.ибсКодКредитора = КодКредитора;
        Объект.НаименованиеПолное = СокрЛП(Контр.НаименованиеПолное);
        Объект.КодПоОКПО = СокрЛП(Контр.КодПоОКПО);
        Объект.ИНН = СокрЛП(Контр.ИНН);
        Объект.Записать();
        Конецесли;

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



Контрагенты записываются без проблем, а подчиненный справочник Договоры не записывается. Выдает ошибку: Произошла исключительная ситуация (1C:Enterprise 8.3.7.1873): Значение поля "Контрагент" не заполнено или заполнено неверно. Хотя поле Владелец (коим является ссылка на контрагента) я заполняю.  

И еще вопрос: почему не работает данная строчка (Произошла исключительная ситуация (1C:Enterprise 8.3.7.1873): Несоответствие типов (параметр номер '4')), в синтакс помощнике для метода НайтиПоНаименованию написано, что в качестве 4 параметра может использоваться Владелец
Дог = v83_Дог.НайтиПоНаименованию(СокрЛП(ТекСтр.Договор),,,Текстр.Контрагент);
1 Cyberhawk
 
23.08.16
15:56
По второму вопросу: параметром должен выступать объект той базы, а не твоей
2 Ёпрст
 
23.08.16
15:57
(0) пользуй кд, нафига эта оля впёрлась ?
3 Ёпрст
 
23.08.16
16:01
И поиск по наименованию - это п..ц какой моветон. Хотя бы по-коду, а лучше по уиду
4 ildary
 
23.08.16
16:14
(2) давно хотел спросить - а как специалисты относятся к работе КД2 с конфигурацией БП3? Раз в последних версиях БП3 все затачивается под КД3.
5 Amra
 
23.08.16
16:21
(4) Прекрасно относятся) Тем более к выгрузкам несколько раз в месяц, а не каждый полчаса)
6 ildary
 
23.08.16
16:25
(5) нет, я понимаю, что технически должно работать, но вдруг так уже не принято либо 1С вежливо не рекомендует (я новичок).