Имя: Пароль:
1C
1С v8
Расчетные листки по V83.Application
0 Надмозг
 
04.02.19
13:05
Запускаю из ЗУП Корп 3.1 расчетные листки организаций ЗУП 2.5 через V83.Application

Вытащил код процедуры в 2.5

УправлениеОтчетамиПереопределяемый.ВызовРасчетногоЛисткаИзФормыСпискаРР(ЭлементыФормы.РегистрРасчетаСписок.ТекущиеДанные,"ОсновныеНачисленияРаботниковОрганизаций");

Отладил его полностью в ЗУП 2.5 на тестовой обработке. Эта обработка просто создает отчет, заполняет параметры и заполняет результат (таб док)

Далее переношу все это в ЗУП 3.1. Соединяюсь через COMОбъект("V83.Application")

В отладке смотрю, вроде, все работает аналогично. Но тут есть нюанс, не смог перейти в отладке по внешнему соединению в ЗУП 2.5. Это один из вопросов, как запустить отладку? Галку "Клиентские и внешние соединения на сервере" поставил.

В итоге отчет цепляет какие-то сохраненные настройки, с другими параметрами и отборами, хотя проверяю, что там в настройках отчета (отладчиком в ЗУП 3.1) - все ОК.

Сделал то же самое с простенькой внешней обработкой, где есть только сотрудник и выводится сообщение - его ФИО. Все передалось и работает, как задумано. Т.е., это похоже, на какую-то специфику отчета или специфику его работы через внешнее соединение.

Как победить?
1 Надмозг
 
04.02.19
13:09
Код процедур такой. Они выдернуты из типового модуля

&НаКлиенте
Процедура ВызовРасчетногоЛисткаИзФормыСпискаРР(ТекущиеДанные, ИмяФормы, Соединение)
    
    Если ТекущиеДанные <> Неопределено Тогда
        
        Если Найти(ИмяФормы,"Организаций") > 0 Тогда             
            РасчетныйЛисток    = Соединение.Отчеты.РасчетныеЛисткиОрганизаций.Создать();
            РасчетныйЛисток.СохраненнаяНастройка = Соединение.Справочники.СохраненныеНастройки.РасчетныеЛисткиОрганизаций;
            РасчетныйЛисток.ПрименитьНастройку();
            РасчетныйЛистокФорма = РасчетныйЛисток.ПолучитьФорму();
            РасчетныйЛистокФорма.Открыть();
            Если РасчетныйЛисток.ЗначенияНастроекПанелиПользователя = Неопределено тогда
                Если РасчетныйЛисток.ЗначенияНастроекПанелиПользователя.Получить().ДинамическиеОтборы.Количество() = 0 тогда
                    РасчетныйЛисток.ЗначенияНастроекПанелиПользователя = Соединение.NewObject("ХранилищеЗначения", Соединение.ТиповыеОтчеты.ПолучитьЗначенияНастроекПанелиПользователя(РасчетныйЛисток, РасчетныйЛистокФорма));
                КонецЕсли;
            КонецЕСли;
            РасчетныйЛистокФорма.ЭтоОтработкаРасшифровки = истина;
            УстановитьОтбор(РасчетныйЛисток, "Организация", ТекущиеДанные.ОбособленноеПодразделение, Соединение);
        Иначе
            РасчетныйЛисток    = Соединение.Отчеты.РасчетныеЛистки.Создать();    
            РасчетныйЛисток.СохраненнаяНастройка = Соединение.Справочники.СохраненныеНастройки.РасчетныеЛистки;
            РасчетныйЛисток.ПрименитьНастройку();
            РасчетныйЛистокФорма = РасчетныйЛисток.ПолучитьФорму();
            РасчетныйЛистокФорма.Открыть();
            Если РасчетныйЛисток.ЗначенияНастроекПанелиПользователя = Неопределено тогда
                Если РасчетныйЛисток.ЗначенияНастроекПанелиПользователя.Получить().ДинамическиеОтборы.Количество() = 0 тогда
                    РасчетныйЛисток.ЗначенияНастроекПанелиПользователя = Соединение.NewObject("ХранилищеЗначения", Соединение.ТиповыеОтчеты.ПолучитьЗначенияНастроекПанелиПользователя(РасчетныйЛисток, РасчетныйЛистокФорма));
                КонецЕсли;
            КонецЕСли;
            РасчетныйЛистокФорма.ЭтоОтработкаРасшифровки = истина;
            УстановитьОтбор(РасчетныйЛисток, "Подразделение", ТекущиеДанные.Подразделение, Соединение);
            
        КонецЕсли;
        
        ЗначенияНастроекПанелиПользователя = РасчетныйЛисток.ЗначенияНастроекПанелиПользователя.Получить();
        ЗначенияНастроекПанелиПользователя.СтандартныйПериод.ДатаНачала   = НачалоМесяца(ТекущиеДанные.ПериодРегистрации);
        ЗначенияНастроекПанелиПользователя.СтандартныйПериод.ДатаОкончания = КонецМесяца(ТекущиеДанные.ПериодРегистрации);
        РасчетныйЛисток.ЗначенияНастроекПанелиПользователя = Соединение.NewObject("ХранилищеЗначения", ЗначенияНастроекПанелиПользователя);
        
        Соединение.ТиповыеОтчеты.УстановитьПараметр(РасчетныйЛисток.КомпоновщикНастроек,  "Группировать",  ложь);
        
        Если Найти(ИмяФормы,"Удержания") > 0 или Найти(ИмяФормы,"Организаций") = 0 Тогда
            Соединение.ТиповыеОтчеты.ДобавитьОтбор(РасчетныйЛисток.КомпоновщикНастроек, "ФизЛицо", ТекущиеДанные.ФизЛицо);
        Иначе
            УстановитьОтбор(РасчетныйЛисток, "Сотрудник", ТекущиеДанные.Сотрудник, Соединение);
        КонецЕсли;
        
        ДокументРезультат = РасчетныйЛистокФорма.ЭлементыФормы.Результат;
        РасчетныйЛистокФорма.ОбновлениеОтображения();
        //РасчетныйЛисток.СформироватьОтчет(ДокументРезультат);
        //РасчетныйЛистокФорма.Модифицированность = Истина;
        РасчетныйЛистокФорма.ОбновитьОтчет();
        
    КонецЕсли;
    
КонецПроцедуры

&НаКлиенте
Процедура УстановитьОтбор(Отчет, Поле, Значение, Соединение)
    Если Отчет.ЗначенияНастроекПанелиПользователя = Неопределено тогда
        Возврат;
    КонецЕсли;
    ЗначениеПользовательскойНастройки = Отчет.ЗначенияНастроекПанелиПользователя.Получить();
    Если ЗначениеПользовательскойНастройки = Неопределено тогда
        Возврат;
    КонецЕсли;
    Если ЗначениеПользовательскойНастройки.ДинамическиеОтборы.Получить(Поле) <> Неопределено тогда
        Если ТипЗнч(ЗначениеПользовательскойНастройки.ДинамическиеОтборы.Получить(Поле).Значение) <> Тип("СписокЗначений") тогда
            ЗначениеПользовательскойНастройки.ДинамическиеОтборы.Получить(Поле).Значение = Значение;
            ЗначениеПользовательскойНастройки.ДинамическиеОтборы.Получить(Поле).Использование = истина;
        Иначе
            ЗначениеПользовательскойНастройки.ДинамическиеОтборы.Получить(Поле).Значение.Очистить();
            ЗначениеПользовательскойНастройки.ДинамическиеОтборы.Получить(Поле).Значение.Добавить(Значение);
            ЗначениеПользовательскойНастройки.ДинамическиеОтборы.Получить(Поле).Использование = истина;
            Если ЗначениеПользовательскойНастройки.ДинамическиеОтборы.Получить(Поле).ВидСравнения = "" Тогда
                ЗначениеПользовательскойНастройки.ДинамическиеОтборы.Получить(Поле).ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
    Отчет.ЗначенияНастроекПанелиПользователя = Соединение.NewObject("ХранилищеЗначения", ЗначениеПользовательскойНастройки);
КонецПроцедуры
2 Надмозг
 
04.02.19
13:10
Формирование значений параметров не так важно. Там все ок, Соединение тоже банально, поэтому не скидываю
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший