Имя: Пароль:
1C
1С v8
8.3. Непонятка с табличными частями.
0 Target1025
 
06.11.20
18:42
Пишу внешнюю обработку, которая должна править документ Премии. В премиях есть таблица Начисления, где проставляются результаты; и есть таблица РаспределениеПоТерриториямУсловиямТруда, которая, в общем случае стыкуется "один-в-один", но вот туда результаты не пишутся. Сложность в том, что отладить невозможно, т.к. обработка внешняя.

Код выглядит так:
        ВладелецФормы.Модифицированность = Истина;
        РаспределениеПоТерриториямУсловиямТруда = ВладелецФормы.Объект.РаспределениеПоТерриториямУсловиямТруда;
        Для Каждого Стр из ВладелецФормы.Объект.Начисления Цикл
            Стр.Результат = МассивДанных[Инд];
            НомерТекСтроки = Стр.номерСтроки;
            Сообщить("НомерТекСтроки = " + НомерТекСтроки);
            Отбор = новый Структура;
            Отбор.Вставить("ИдентификаторСтроки",НомерТекСтроки);
            Строки = РаспределениеПоТерриториямУсловиямТруда.НайтиСтроки(Отбор);
            Сообщить("Строки.Количество = " + Строки.КОличество());
            Если Строки.Количество() = 1 Тогда
                
                Для Каждого Стр2 Из Строки Цикл
                    Сообщить("Стр2.результат="+Стр2.результат);
                    Стр2.результат = МассивДанных[Инд];
                    Сообщить("Стр2.результат="+Стр2.результат);
                КонецЦикла;    
            КонецЕсли;    
            Инд = Инд + 1;
        Конеццикла;    

Стр2.результат меняется, пишется примерно так:
НомерТекСтроки = 152
Строки.Количество = 1
Стр2.результат=0
Стр2.результат=30 737

Но вот в дальнейшем, в документе, таблица начислений имеет проставленный из массива результат, а таблица распределений - нет. Голову, сломал, не могу понять, что некорректно
1 GreyK
 
06.11.20
18:51
(0) В чём трудности отладки внешнего файла обработки? Прав нет?
2 SleepyHead
 
гуру
06.11.20
18:56
(0) Ну так посмотри, как в форме пересчитываются результаты распределения по территориям, сделай так же или похоже.
3 Target1025
 
06.11.20
18:57
(1) Когда работает подключенная внешняя обработка, я могу достучаться до таблиц через ВладельцаФормы и правлю таблицы на клиентской части кода, когда я запускаю её отдельно, мне нужно обрабатывать объект на серверной части, то есть код получается разный.
4 Target1025
 
06.11.20
18:57
(2) Попробую.
5 DrZombi
 
гуру
06.11.20
22:05
(0) Бред сивой кобылы...
6 DrZombi
 
гуру
06.11.20
22:12
+(0) По пунктам:
1. Создаете себе расширение, для отладки внешних обработок (если конфа на поддержке)
2. В справочник "ДополнительныеОтчетыИОбработки" добавить реквизиты:
       2.1 СОГ_ПолныйПутьДляОтладки - Полный путь к отладке (строка)
       2.2 СОГ_ИспользоватьОтладку - Булево, признак того, что отладка
3. В общий модуле "ДополнительныеОтчетыИОбработки", нужно править одну лишь функцию "СОГ_ПодключитьВнешнююОбработку" (код приложил ниже в топике)
4. Настроить на своем ПК, удаленный доступ, т.к. отладка возможно только так.
     Пример пути к обработке: \\ВашПК\ОбщийДоступДляСервера\Отладка ЗУП\ВашаОтбработка.epf
5. В конфигураторе так же открыть сетевой путь: \\ВашПК\ОбщийДоступДляСервера\Отладка ЗУП\ВашаОтбработка.epf
6. Не забудь, настроить доступ к своему сетевому ресурсу от сервера.
7 DrZombi
 
гуру
06.11.20
22:14
+(0)Код: В общий модуле "ДополнительныеОтчетыИОбработки",  функция "СОГ_ПодключитьВнешнююОбработку"
В комментариях "//+" и "//-", то что не типовое от 1с :)

&Вместо("ПодключитьВнешнююОбработку")
Функция СОГ_ПодключитьВнешнююОбработку(Ссылка) Экспорт
    
    //+
    //СОГ_ДопФункции.ПроверитьВерсиюИсполняемогоКода("3.0.83.25"); //пропустил... маленький приоритет
    //-
    
    СтандартнаяОбработка = Истина;
    Результат = Неопределено;
    
    ИнтеграцияПодсистемБСП.ПриПодключенииВнешнейОбработки(Ссылка, СтандартнаяОбработка, Результат);
    Если Не СтандартнаяОбработка Тогда
        Возврат Результат;
    КонецЕсли;
        
    // Проверка корректности переданных параметров.
    Если ТипЗнч(Ссылка) <> Тип("СправочникСсылка.ДополнительныеОтчетыИОбработки")
        Или Ссылка = Справочники.ДополнительныеОтчетыИОбработки.ПустаяСсылка() Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    // Подключение
#Если ТолстыйКлиентОбычноеПриложение Тогда
    ИмяОбработки = ПолучитьИмяВременногоФайла();
    ХранилищеОбработки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "ХранилищеОбработки");
    ДвоичныеДанные = ХранилищеОбработки.Получить();
    ДвоичныеДанные.Записать(ИмяОбработки);
    Возврат ИмяОбработки;
#КонецЕсли
    
    Вид = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Вид");
    Если Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет
        Или Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет Тогда
        Менеджер = ВнешниеОтчеты;
    Иначе
        Менеджер = ВнешниеОбработки;
    КонецЕсли;
    
    //+
    Попытка
    Если ТипЗнч(Ссылка) = Тип("СправочникСсылка.ДополнительныеОтчетыИОбработки") Тогда
        ПараметрыЗапуска = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, "БезопасныйРежим, ХранилищеОбработки, СОГ_ПолныйПутьДляОтладки, СОГ_ИспользоватьОтладку");
        
        Если ПараметрыЗапуска.СОГ_ИспользоватьОтладку = Истина и НЕ ПустаяСтрока(ПараметрыЗапуска.СОГ_ПолныйПутьДляОтладки) Тогда
            АдресВоВременномХранилище = СокрЛП(ПараметрыЗапуска.СОГ_ПолныйПутьДляОтладки); //Указывать сетевой путь, т.к. обработка запускается с Сервера...
            пФайл = Новый Файл(АдресВоВременномХранилище);
            Если НЕ (пФайл.Существует() и пФайл.ЭтоФайл()) Тогда
                //Нет файла, либо не доступен...
                АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ПараметрыЗапуска.ХранилищеОбработки.Получить());
            КонецЕсли;
            
        Иначе
            АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ПараметрыЗапуска.ХранилищеОбработки.Получить());
        КонецЕсли;
        
    Иначе
    //-
    
    ПараметрыЗапуска = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, "БезопасныйРежим, ХранилищеОбработки");
    АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ПараметрыЗапуска.ХранилищеОбработки.Получить());
    
    //+    
    КонецЕсли;
    Исключение
    //Добавлено в исключение, чтобы восстановить работоспособность...    
    ПараметрыЗапуска = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, "БезопасныйРежим, ХранилищеОбработки");
    АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ПараметрыЗапуска.ХранилищеОбработки.Получить());
    КонецПопытки;
    //-
    
    Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда
        МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме");
        ИспользуютсяПрофилиБезопасности = МодульРаботаВБезопасномРежиме.ИспользуютсяПрофилиБезопасности();
    Иначе
        ИспользуютсяПрофилиБезопасности = Ложь;
    КонецЕсли;
    
    Если ИспользуютсяПрофилиБезопасности Тогда
        
        МодульРаботаВБезопасномРежимеСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежимеСлужебный");
        БезопасныйРежим = МодульРаботаВБезопасномРежимеСлужебный.РежимПодключенияВнешнегоМодуля(Ссылка);
        
        Если БезопасныйРежим = Неопределено Тогда
            БезопасныйРежим = Истина;
        КонецЕсли;
        
    Иначе
        
        БезопасныйРежим = ПолучитьФункциональнуюОпцию("СтандартныеПодсистемыВМоделиСервиса") Или ПараметрыЗапуска.БезопасныйРежим;
        
        Если БезопасныйРежим Тогда
            ЗапросРазрешений = Новый Запрос(
                "ВЫБРАТЬ ПЕРВЫЕ 1
                |    ДополнительныеОтчетыИОбработкиРазрешения.НомерСтроки,
                |    ДополнительныеОтчетыИОбработкиРазрешения.ВидРазрешения
                |ИЗ
                |    Справочник.ДополнительныеОтчетыИОбработки.Разрешения КАК ДополнительныеОтчетыИОбработкиРазрешения
                |ГДЕ
                |    ДополнительныеОтчетыИОбработкиРазрешения.Ссылка = &Ссылка");
            ЗапросРазрешений.УстановитьПараметр("Ссылка", Ссылка);
            ЕстьРазрешений = Не ЗапросРазрешений.Выполнить().Пустой();
            
            РежимСовместимости = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "РежимСовместимостиРазрешений");
            Если РежимСовместимости = Перечисления.РежимыСовместимостиРазрешенийДополнительныхОтчетовИОбработок.Версия_2_2_2
                И ЕстьРазрешений Тогда
                БезопасныйРежим = Ложь;
            КонецЕсли;
        КонецЕсли;
        
    КонецЕсли;
    
    ЗаписатьПримечание(Ссылка,
        СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Подключение, БезопасныйРежим = ""%1"".'"), БезопасныйРежим));
    
    //+
    Если Не ПустаяСтрока(АдресВоВременномХранилище) и Не ЭтоАдресВременногоХранилища(АдресВоВременномХранилище) Тогда
        ИмяОбработки = Менеджер.Создать(АдресВоВременномХранилище,Ложь);
        ИмяОбработки = ИмяОбработки.Метаданные().Имя;
    Иначе    
    //-
        
    ИмяОбработки = Менеджер.Подключить(АдресВоВременномХранилище, , БезопасныйРежим,
        ОбщегоНазначения.ОписаниеЗащитыБезПредупреждений());
        
    //+
    КонецЕсли;
    //-
    
    Возврат ИмяОбработки;
    
КонецФункции
8 DrZombi
 
гуру
06.11.20
22:15
+(0) отладка нормально робит :)