Имя: Пароль:
1C
1С v8
У единственного пользователя неправильно работает обработка
,
0 inlimbo
 
14.03.14
14:46
Это продолжение моей предыдущей темы. Для ознакомления ее текст:
Доброго времени суток!

Клиент-сервное решение, УПП , платформа 8.2. Пользователи работают через RDP.

Я уже много чего перепробывала, но проблема не уходит.

После обновления конфигурации(УПП) у одного пользователя стала неправильно работать обработка "Согласование заявок". Эта обработка есть копия стандартной с добавлением условия на выбор следующего этапа согласования.
В отладчике проверила работу обработки под этим пользователем, там все нормально срабатывает. А вот у него нет!
Воникло подозрение, что это кэш. Почистили кэш в его RDP сессии. Заработало!
Но на следующий день опять та же песня! Создали новую учетку в 1С, помогло. На след день опять то же самое. Удалили учетку с терминального сервера и создали новую, помогло. Но на следующий день опять то же самое.
Вопрос: что же еще может влиять на его работу? И что такое кэш конфигурации сервера 1С, для чего он нужен?
1 vicof
 
14.03.14
14:50
Кэш
2 timurhv
 
14.03.14
14:51
(0) Уверены что не ошибка в коде? Может в каких-то ситуациях работает по-другому алгоритму?
3 inlimbo
 
14.03.14
14:53
Дискуссия закончилась 8 марта и ни к чему не привела.
Вот что я выяснила за неделю моих экспериментов над злосчастным пользователем и его этапом согласования:
Оказывается у него с завидным постоянством (в результате чего непонятно) выполняется код той старой обработки.
Тест был чрезвычайно прост: в новую обработку добавлены сообщения о ходе работы именно этой обработки, в старую добавлено сообщение, что идет выполнение старой обработки.
Также почистили кеш сервера приложения, почистили его кэш на RDP сервере.
Обновление конфигурации(не динамическое) и пробуем: сначала все работает как наддо, то есть выполняется новая обработка(видно по сообщениям). через несколько часов работы видим что при согласовании используется уже другая обработка.
4 Necessitudo
 
14.03.14
14:56
Переставьте сервер приложений
5 inlimbo
 
14.03.14
14:56
Я трублю права к этой старой обработке. Правда она стандартная и находится на поддержке.
Но меня все таки мучает вопрос : КАК?? как они взаимосвязаны?
Я знаю что создатели новой обработки создали ее скорее всего копированием старой и внесением новых изменений.
6 The_SpecialOne
 
14.03.14
14:57
...в старую добавлено сообщение, что идет выполнение старой обработки.

И что выдаются сообщения из нее?
Так может юзер сам что-то не то запускает?
7 inlimbo
 
14.03.14
14:57
(6) Нет , при мне юзер делает все как надо.
8 inlimbo
 
14.03.14
14:59
(6) Сообщения выдаются, добавленные мной
9 МойКодУныл
 
14.03.14
15:00
Включить отладку на сервере, подключится к пользователю и посмотреть стек вызовов, когда зайдет в старую обработку. МОжет станет понятно как.
10 inlimbo
 
14.03.14
15:03
(9)Пробовала, взял тогда новую. Надо наверное еще раз попробовать. Как посмотреть стек вызовов?
11 The_SpecialOne
 
14.03.14
15:03
после того, как "переключается" работа на старую перезапуск 1С не помогает вернутся к новой?
12 The_SpecialOne
 
14.03.14
15:04
(10) Ctrl+Alt+C
13 inlimbo
 
14.03.14
15:05
(11) не обращала внимания.
14 The_SpecialOne
 
14.03.14
15:07
(13) обратите как-нибудь. Если поможет, то скорее всего ошибка где-то в коде
15 inlimbo
 
14.03.14
15:09
(14) Тогда бы она отражалась на других пользователях
16 The_SpecialOne
 
14.03.14
15:10
все делают одни и те же действия с обработкой?
17 inlimbo
 
14.03.14
15:11
(16) все обращаются к одной и той же форме(форма управляемая между прочим), процедуре в модуле обработки.
18 The_SpecialOne
 
14.03.14
15:13
(17) можно взглянуть одним глазком на обработку?
19 inlimbo
 
14.03.14
15:19
Ладно:
Функция ОбработатьСогласованиеЗаявок() Экспорт
    
    //Получим этапы согласования текущего пользователя
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
                   |    МаршрутыСогласованияСогласующиеЛица.Ссылка КАК МаршрутСогласования
                   |ИЗ
                   |    Справочник.МаршрутыСогласования.СогласующиеЛица КАК МаршрутыСогласованияСогласующиеЛица
                   |ГДЕ
                   |    МаршрутыСогласованияСогласующиеЛица.Пользователь = &ТекПользователь";
                  
    Запрос.УстановитьПараметр("ТекПользователь", ТекущийПользователь);
    ЭтапыТекущегоПользователя = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("МаршрутСогласования");
    СоответствиеСледующиеЭтапы = Новый Соответствие();
    
    ЕстьОшибки = Ложь;
    
    УспешноОбработанныеЗаявки = Новый Массив;
    
    Для Каждого СтрокаТабличнойЧасти ИЗ ЗаявкиНаРасходованиеСредств Цикл
        Если НЕ СтрокаТабличнойЧасти.Пометка Тогда
            Продолжить;
        КонецЕсли;
        
        Если НЕ ЗначениеЗаполнено(СтрокаТабличнойЧасти.Состояние)
            ИЛИ (СтрокаТабличнойЧасти.ПоследнийСогласующий = ТекущийПользователь
                И СтрокаТабличнойЧасти.ТекущееСостояние = СтрокаТабличнойЧасти.Состояние) Тогда
                
            УспешноОбработанныеЗаявки.Добавить(СтрокаТабличнойЧасти);
            Продолжить;
        КонецЕсли;

        Отказ = Ложь;
        ТекстПоля = ОбщегоНазначенияКлиентСервер.ПолучитьТекстДляВыдачиСообщенийПоСтрокеТЧ("ЗаявкиНаРасходованиеСредств", СтрокаТабличнойЧасти.НомерСтроки, "Дата");
        
        Если СтрокаТабличнойЧасти.ПоследнийСогласующий = ТекущийПользователь
            ИЛИ НЕ ЗначениеЗаполнено(СтрокаТабличнойЧасти.Этап.Родитель) Тогда
            
            НовыйЭтап = СтрокаТабличнойЧасти.Этап;
            
        Иначе
            
            //Определим новый этап - это может быть следующий этап (непосредственный родитель)
            //    или один из вышестоящих этапов
            НовыйЭтап = Неопределено;
            ОпределитьСледующийЭтапСогласования(НовыйЭтап, СтрокаТабличнойЧасти.Этап, ЭтапыТекущегоПользователя, СоответствиеСледующиеЭтапы);
            
            //Если новый этап не удалось определить - сообщим об ошибке
            //    Такой ситуации возникать не должно.
            Если НовыйЭтап = Неопределено Тогда
                ТекстСообщения = НСтр("ru = 'Не удалось определить следующий этап согласования заявки &Заявка.
                                            |Состояние заявки изменено не будет.'");
                ТекстСообщения = СтрЗаменить(ТекстСообщения, "&Заявка", СтрокаТабличнойЧасти.Заявка);
                
                ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, ЭтотОбъект, ТекстПоля,, Отказ);
                Продолжить;
            КонецЕсли;
        КонецЕсли;
        
        НовыйУровень = НовыйЭтап.Уровень() + 1;
        
        //Обработаем состояние Отказано
        Если СтрокаТабличнойЧасти.Состояние = Перечисления.СостоянияОбъектов.Отклонен
            И СтрокаТабличнойЧасти.Заявка.Проведен Тогда
            
            Попытка
                ЗаявкаОбъект = СтрокаТабличнойЧасти.Заявка.ПолучитьОбъект();
                ЗаявкаОбъект.Заблокировать();
                ЗаявкаОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
            Исключение
                ТекстСообщения = НСтр("ru = 'Не удалось отменить проведение документа &Заявка.
                                            |Состояние заявки изменено не будет.'");
                ТекстСообщения = СтрЗаменить(ТекстСообщения, "&Заявка", СтрокаТабличнойЧасти.Заявка);
                ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, ЭтотОбъект, ТекстПоля,, Отказ);
            КонецПопытки;
        КонецЕсли;
        
        // Обработаем изменение состояния с Отказано на другое
        Если СтрокаТабличнойЧасти.ТекущееСостояние = Перечисления.СостоянияОбъектов.Отклонен
            И НЕ СтрокаТабличнойЧасти.Заявка.Проведен Тогда
            
            Попытка
                ЗаявкаОбъект = СтрокаТабличнойЧасти.Заявка.ПолучитьОбъект();
                ЗаявкаОбъект.Заблокировать();
                ЗаявкаОбъект.Записать(РежимЗаписиДокумента.Проведение);
            Исключение
                ТекстСообщения = НСтр("ru = 'Не удалось провести документ &Заявка.
                                            |Состояние заявки изменено не будет'");
                                            
                ТекстСообщения = СтрЗаменить(ТекстСообщения, "&Заявка", СтрокаТабличнойЧасти.Заявка);
                ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, ЭтотОбъект, ТекстПоля,, Отказ);
            КонецПопытки;
        КонецЕсли;
        
        Если Отказ Тогда
            ЕстьОшибки = Истина;
            Продолжить;
        КонецЕсли;
        
        //Изменим состояние заявки в регистре
        НаборЗаписейСостояниеСогласования = РегистрыСведений.СостоянияСогласованияЗаявок.СоздатьНаборЗаписей();
        НаборЗаписейСостояниеСогласования.Отбор.Заявка.Установить(СтрокаТабличнойЧасти.Заявка);
        НаборЗаписейСостояниеСогласования.Прочитать();
        
        //Проверим последнюю запись - если она относится к тому же пользователю и этапу, удалим ее
        Если НаборЗаписейСостояниеСогласования.Количество() > 0 Тогда
            ПоследняяЗапись = НаборЗаписейСостояниеСогласования[НаборЗаписейСостояниеСогласования.Количество()-1];
            Если ПоследняяЗапись.Пользователь = ТекущийПользователь
                И ПоследняяЗапись.Этап = НовыйЭтап Тогда
                
                НаборЗаписейСостояниеСогласования.Удалить(ПоследняяЗапись);
            КонецЕсли;
        КонецЕсли;

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

                    КонецЕсли;    
                    если МС_Родитель.СтатьиОборотовПоБюджетам.Найти(СтрокаТабличнойЧасти.Заявка.СтатьяОборотов, "СтатьяОборотовПоБюджетам") <> неопределено Тогда
                        НоваяЗапись.Этап = МС_Родитель;
                        НоваяЗапись.Состояние = ?(ЗначениеЗаполнено(МС_Родитель.Родитель), Перечисления.СостоянияОбъектов.Согласован, Перечисления.СостоянияОбъектов.Утвержден);
                        НоваяЗапись.Уровень = МС_Родитель.Уровень() + 1;
                        НадоПропускать = истина;
                        Если ЭтоСмагин Тогда Сообщить("Изменен на этап согласования :" + НоваяЗапись.Этап ); КонецЕсли ;
                    КонецЕсли;    
                    Если МС_Родитель.СверхБюджет и ЗначениеЗаполнено(СтрокаТабличнойЧасти.Заявка.Сценарий) Тогда
                        Если СтрокаТабличнойЧасти.Заявка.УЮСуммаСверхБюджета = 0 Тогда
                            НоваяЗапись.Этап = МС_Родитель;
                            НоваяЗапись.Состояние = ?(ЗначениеЗаполнено(МС_Родитель.Родитель), Перечисления.СостоянияОбъектов.Согласован, Перечисления.СостоянияОбъектов.Утвержден);
                            НоваяЗапись.Уровень = МС_Родитель.Уровень() + 1;
                            НадоПропускать = истина;
                            Если ЭтоСмагин Тогда Сообщить("Изменен на этап согласования :" + НоваяЗапись.Этап ); КонецЕсли ;
                        Иначе
                            Если СтрокаТабличнойЧасти.Заявка.УЮСуммаСверхБюджета <= МС_Родитель.СверхБюджетОрганичение Тогда
                                НоваяЗапись.Этап = МС_Родитель;
                                НоваяЗапись.Состояние = ?(ЗначениеЗаполнено(МС_Родитель.Родитель), Перечисления.СостоянияОбъектов.Согласован, Перечисления.СостоянияОбъектов.Утвержден);
                                НоваяЗапись.Уровень = МС_Родитель.Уровень() + 1;
                                НадоПропускать = истина;
                                Если ЭтоСмагин Тогда Сообщить("Изменен на этап согласования :" + НоваяЗапись.Этап ); КонецЕсли ;
                            Иначе
                                Прервать;
                            КонецЕсли;
                        КонецЕсли;
                    КонецЕсли;
                    Если НадоПропускать = ложь Тогда
                        Прервать;
                    КонецЕсли;
                    МС_Родитель = МС_Родитель.Родитель;
                    Если не ЗначениеЗаполнено(МС_Родитель) Тогда
                        Прервать;
                    КонецЕсли;
                КонецЦикла;
            //Конецесли;
        КонецЕсли;
        //ИТ партнер
        НаборЗаписейСостояниеСогласования.Записать();
        Если ЭтоСмагин Тогда Сообщить("Этап согласования определен :" + НоваяЗапись.Этап ); КонецЕсли ;

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

                Запрос = Новый Запрос;
                Запрос.Текст =
                    "ВЫБРАТЬ
                    |    Пользователи.Ссылка КАК Пользователь
                    |ИЗ
                    |    РегистрСведений.ОтветственныеЛица.СрезПоследних(&ДатаОтбора, СтруктурнаяЕдиница = &СтруктурнаяЕдиница) КАК ОтветственныеЛицаСрезПоследних
                    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Пользователи
                    |        ПО ОтветственныеЛицаСрезПоследних.ФизическоеЛицо = Пользователи.ФизЛицо";

                Запрос.УстановитьПараметр("ДатаОтбора", СтрокаТабличнойЧасти.Заявка.Дата);
                Запрос.УстановитьПараметр("СтруктурнаяЕдиница", СтрокаТабличнойЧасти.Заявка.БанковскийСчетКасса);

                Результат = Запрос.Выполнить();

                ВыборкаДетальныеЗаписиКасса = Результат.Выбрать();

                Если ВыборкаДетальныеЗаписиКасса.Следующий() Тогда
                    ОтправитьСообщение(ВыборкаДетальныеЗаписиКасса.Пользователь, СтрокаТабличнойЧасти.Заявка.Номер, СтрокаТабличнойЧасти.Заявка.Дата, "Деньги по заявке можно выдавать.", " ");
                КонецЕсли;
        КонецЕсли;
        
        Если ТипЗнч(СтрокаТабличнойЧасти.Заявка.БанковскийСчетКасса) = Тип("СправочникСсылка.БанковскиеСчета") Тогда
            Если Найти(СтрокаТабличнойЧасти.Заявка.БанковскийСчетКасса.Наименование, "Иной") > 0 Тогда
                    //10.09.2013 Ощепкова
                    мЛицаОтветсвенныеЗаСчетИной = ВернутьМассивПользователейПоСчетуИной() ;
                    Для каждого стр из мЛицаОтветсвенныеЗаСчетИной Цикл
                        ОтправитьСообщение(стр, СтрокаТабличнойЧасти.Заявка.Номер, СтрокаТабличнойЧасти.Заявка.Дата, "Заявка утверждена: ", СтрокаТабличнойЧасти.Заявка.Описание);
                    КонецЦикла;

                    //МаршрутКазначейство = Справочники.МаршрутыСогласования.НайтиПоНаименованию("Казначейство");
                    //Для каждого стр из МаршрутКазначейство.СогласующиеЛица Цикл
                    //    ОтправитьСообщение(стр.Пользователь, СтрокаТабличнойЧасти.Заявка.Номер, СтрокаТабличнойЧасти.Заявка.Дата, "Заявка утверждена: ", СтрокаТабличнойЧасти.Заявка.Описание);
                    //КонецЦикла;
                    //.
                    
            КонецЕсли;
                
        Иначе
                //Верификация
                Запрос = Новый Запрос("ВЫБРАТЬ
                            |    Пользователи.Ссылка Как Пользователь
                            |ИЗ
                            |    Справочник.Пользователи КАК Пользователи
                            |ГДЕ
                            |    Пользователи.Верификация = ИСТИНА");
                Результат = Запрос.Выполнить();
                ВыборкаПользователей = Результат.Выбрать();
                Пока ВыборкаПользователей.Следующий() Цикл
                     ОтправитьСообщение(ВыборкаПользователей.Пользователь, СтрокаТабличнойЧасти.Заявка.Номер, СтрокаТабличнойЧасти.Заявка.Дата, "Заявка требует верификации: ", " ");                                     
                КонецЦикла;    
        КонецЕсли;
            
        ОтправитьСообщение(СтрокаТабличнойЧасти.Заявка.Ответственный, СтрокаТабличнойЧасти.Заявка.Номер, СтрокаТабличнойЧасти.Заявка.Дата, "Заявка утверждена: ", СтрокаТабличнойЧасти.Заявка.Описание + Символы.ПС + Символы.ПС + "Комментарий: " + СтрокаТабличнойЧасти.Заявка.Комментарий );
        
    КонецЕсли;    
//&    

        УспешноОбработанныеЗаявки.Добавить(СтрокаТабличнойЧасти);
        
    КонецЦикла;
    
    // Удалим из списка заявки по которым удалось изменить состояние
    Для каждого ЭлКоллекции Из УспешноОбработанныеЗаявки Цикл
        ЗаявкиНаРасходованиеСредств.Удалить(ЭлКоллекции);
    КонецЦикла;
    
    Возврат НЕ ЕстьОшибки;
    
КонецФункции

//Процедура определяет этап согласования, который соответствует маршруту согласования и текущему пользователю
Процедура ОпределитьСледующийЭтапСогласования(НовыйЭтап, ТекущийЭтап, ЭтапыТекущегоПользователя, СоответствиеСледующиеЭтапы)
    
    НовыйЭтап = СоответствиеСледующиеЭтапы.Получить(ТекущийЭтап);
    
    Если НовыйЭтап = Неопределено Тогда
        Если ЭтапыТекущегоПользователя.Найти(ТекущийЭтап)<>Неопределено Тогда
            НовыйЭтап = ТекущийЭтап;
            СоответствиеСледующиеЭтапы.Вставить(ТекущийЭтап, НовыйЭтап);
        ИначеЕсли ЗначениеЗаполнено(ТекущийЭтап.Родитель) Тогда
            ОпределитьСледующийЭтапСогласования(НовыйЭтап, ТекущийЭтап.Родитель, ЭтапыТекущегоПользователя, СоответствиеСледующиеЭтапы)
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры
20 inlimbo
 
14.03.14
15:20
это из модуля объекта
21 inlimbo
 
14.03.14
16:24
1с отправила письмо.
Обрублю права на эту обработку и попробую еще раз в отладчике глянуть.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан