Имя: Пароль:
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С вежливо не рекомендует (я новичок).
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший