Приветствую всех и заранее благодарю за внимание и помощь.
Проблема возникла довольно странная, найти и объяснить её причины не могу...
Сделал некоторый модуль, который обрабатывает большой объем данных и пишет результаты в регистр сведений.
Проблема в том, что данные в регистр пишутся неверные... НО, если я ставлю точку останова и пробегаю по модулю вручную, нажимая F5, всё отрабатывает правильно и результаты пишутся правильные, но стоит убрать точку и запустить процесс в автоматическом режиме, всё снова идет криво... я не думал, что точка останова может влиять на результат, но на практике вышло так...
Ничего в коде не меняю, только ставлю точку и запускаю функцию, потом убираю точку и запускаю функцию. в первом случае получаю правильный результат, во втором нет.
Подскажите как с этим бороться >_<
---
pechenka1440, Какие измерения регистра ЭффективностьМенеджеров?

Как вариант, у вас получется несколько записей с одним набором реквизитов.
Набор.Дата = Строка(ТекущаяДата());
В режиме отладки дата разная, в рабочем режиме все записи в одну секунду и предыдущие перетираются следующими.

Локализуйте проблему.
Допишите в процедуру ЗаписьРегистра() Сообщить(<ключи>). Хотя бы поймете, проблема в том, что не записывает или не заходит.
---
pechenka1440, А что значит правильный или неправильный?
---
ekaruk, Правильный - тот результат, который планировался мной. Скажем, должно быть в итоге очень много строк с данными по каждой сделке, пользователям, выполнившим определенные этапы по сделке и тд.
А на практике получается, что с точками останова в регистр попадают все 10 этапов по каждой сделке, как и должно быть, а без точек останова какие-то этапы в регистр не попадают...
---
pechenka1440,
мистические вещи порой случаются, но только до тех пор пока не найдёшь причину :)
вот спасительный код:

```1c
    Пока ЕстьПроблема Цикл
    ЛокализацияПроблемы();
    ЛогированиеОтладки();
    КонецЦикла;
```

Удачи!
---
pechenka1440, Чудес не бывает.
При отладке через точку останова Вы делаете что-то, чего не происходит при обычной работе.
---
ekaruk, что например? при отладке я только смотрю какие значения получаются. Если что-то и происходит, что влияет на результат, то без моего ведома...

(9) StBender, Вот код, постарался подробнее прокомментировать...
Результат запроса неизменен, Добавил дополнительные сортировки, чтоб порядок строк был правильным и неизменным. Последовательность этапов известна, задачи по этим этапам появляются в строгоопределенном порядке последовательно, есть по чему сортировать с полной уверенностью. В консоли запросов проверял. И массово, и по конкретным сделкам.

Так вот если в функции ЗаписьРегистра() ставлю точку останова, тогда все работает как надо. В обычном режиме какие-то этапы пропадают и вместо 6 обязательных строк получаю меньше. По каждой сделке может быть много таких вот шестистрочных записей, так как зависит от того, что со сделкой происходило, каждая смена ведущего менеджера это новые шесть строк, но это всегда число, кратное шести. В режиме отладки пробегал так по сотне сделок наверно, все выполнялось хорошо, тут же убрал точку останова и продолжил выполнение, последующие записи стали писаться криво

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

    МассивДанных = Новый Массив(10); // 0 - номер звонка, 1-4 точки маршрута, 5 - источник клиента, 6 - рекламный источник, 7 - дата начала сделки, 8 - ведущий, 9 - результат БП
    МассивДанных = ОчиститьМассив(МассивДанных);
    НовыйИсточник = ИСТИНА;

    ТЗ = Новый ТаблицаЗначений;
    ТЗ = Запрос.Выполнить().Выгрузить();

    Флаг = ТЗ.Добавить(); // В коде выполняются проверки значений следующей строки
    Флаг.НомерЗвонка = 11111; // поэтому добавляю пустую строку, на которой останавлваю процедуру, чтоб не было ошибок

    Для НСтр = 1 По ТЗ.Количество() ЦИКЛ

    Если ТЗ[НСтр].НомерЗвонка = 11111 Тогда Возврат ; КонецЕсли;

    Если НовыйИсточник Тогда
    //Если источник не меняется, то и эти данные не меняются, поэтому записываем их один раз здесь
    МассивДанных[0] = ТЗ[НСтр].НомерЗвонка;
    МассивДанных[6] = ТЗ[НСтр].РекламныйИсточник;
    МассивДанных[7] = ТЗ[НСтр].ДатаНачалаСделки;
    МассивДанных[8] = ТЗ[НСтр].Ведущий;
    МассивДанных[9] = ТЗ[НСтр].РезБП;

    //Определяем откуда менеджер получил клиента
    Если ТЗ[НСтр].ТочкаМаршрута = Перечисления.РЗБП_ТочкиМаршрута.ЗаведениеЗвонка Тогда
    МассивДанных[5] = "Первичный звонок";
    ИначеЕсли ТЗ[НСтр].ТочкаМаршрута = Перечисления.РЗБП_ТочкиМаршрута.ОбщийБанк Тогда
    МассивДанных[5] = "Общий банк";
    ИначеЕсли ТЗ[НСтр].БезТелефона Тогда
    МассивДанных[5] = "Без телефона";
    Иначе
    МассивДанных[5] = "Другой менеджер";
    КонецЕсли;

    НовыйИсточник = ЛОЖЬ;
    КонецЕсли;

    Если ТЗ[НСтр].ТочкаМаршрута = Перечисления.РЗБП_ТочкиМаршрута.ВедениеКлиента Тогда
    //Если в текущей строке информация по этапу Ведение клиента, записываем имя исполнителя в массив
    МассивДанных[1] = ТЗ[НСтр].Исполнитель;

    //Код результата Отказ значит, что менеджер отказался от клиента, то же самое если следующий этап не Показ,
    //если текущий ведущий менеджер отличается от ведущего в следующей строке, значит сделку другому менеджеру передал руководитель
    //в обоих случаях записываем данные и со следующей строки начинаем снова для следующего ведущего
    Если ТЗ[НСтр].КодРезультата = Перечисления.РЗБП_КодыРезультата.з_Отказ ИЛИ ТЗ[НСтр+1].Ведущий <> ТЗ[НСтр].Ведущий ИЛИ ТЗ[НСтр+1].ТочкаМаршрута <> Перечисления.РЗБП_ТочкиМаршрута.Показ Тогда
    НовыйИсточник = ИСТИНА;
    ДобавитьСтрокиВРегистр(МассивДанных);
    МассивДанных = очиститьМассив(МассивДанных);
    КонецЕсли;

    ИначеЕсли ТЗ[НСтр].ТочкаМаршрута = Перечисления.РЗБП_ТочкиМаршрута.Показ Тогда

    МассивДанных[2] = ТЗ[НСтр].Исполнитель;

    //так же, если текущий ведущий отличается от следующего, значит пишем данные и начинаем снова
    Если ТЗ[НСтр].Ведущий <> ТЗ[НСтр+1].Ведущий Тогда
    НовыйИсточник = ИСТИНА;
    ДобавитьСтрокиВРегистр(МассивДанных);
    МассивДанных = очиститьМассив(МассивДанных);
    КонецЕсли;

    ИначеЕсли ТЗ[НСтр].ТочкаМаршрута = Перечисления.РЗБП_ТочкиМаршрута.ВыводНаПД Тогда
    //здесь всё аналогично этапу ведение клиента
    МассивДанных[3] = ТЗ[НСтр].Исполнитель;
    Если ТЗ[НСтр].КодРезультата = Перечисления.РЗБП_КодыРезультата.з_Отказ ИЛИ ТЗ[НСтр].Ведущий <>ТЗ[НСтр+1].Ведущий ИЛИ ТЗ[НСтр+1].ТочкаМаршрута <> Перечисления.РЗБП_ТочкиМаршрута.ПриемДоговораВАрхив ТОГДА
    НовыйИсточник = ИСТИНА;
    ДобавитьСтрокиВРегистр(МассивДанных);
    МассивДанных = очиститьМассив(МассивДанных);
    КонецЕсли;

    ИначеЕсли ТЗ[НСтр].ТочкаМаршрута = Перечисления.РЗБП_ТочкиМаршрута.ПриемДоговораВАрхив Тогда
    //Это финальный этап, который нас интересует, он всегда последний, так что всегда записыаем данные и начинаем снова по новой сделке
    МассивДанных[4] = ТЗ[НСтр-1].Исполнитель;
    НовыйИсточник = ИСТИНА;
    ДобавитьСтрокиВРегистр(МассивДанных);
    МассивДанных = очиститьМассив(МассивДанных);
    КонецЕсли;

    //Может быть такое, что сделка еще не дошла до финала, а значит будет информация не по всем этапам
    //поэтому проверяем номер следующего звонка (номер сделки по сути, уникальный)
    Если ТЗ[НСтр].НомерЗвонка <> ТЗ[НСтр+1].НомерЗвонка И ЗначениеЗаполнено(МассивДанных[0]) Тогда
    НовыйИсточник = ИСТИНА;
    ДобавитьСтрокиВРегистр(МассивДанных);
    МассивДанных = очиститьМассив(МассивДанных);
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры;

    &НаСервере
    Функция очиститьМассив(масс)
    //Если использую МассивДанных.Очистить(), то при следующем обращении к массив происходит ошибка, что индекс находится за пределами
    //Поэтому очищаю массив вручную
    Для ы = 0 По 9 цикл
    Масс[ы] = ";
    КонецЦикла;
    Возврат Масс;
    КонецФункции

    &НаСервере
    Процедура ДобавитьСтрокиВРегистр(Масс)
    // Имеем 4 этапа, Ведение (Масс[1]), Показ (Масс[2]), Вывод (Масс[3]), Подписание (Масс[4]). нужно записать шесть комбинаций этих этапов
    // Ведение-Показ, Ведение-Вывод, Ведение-Подписание, Показ-Вывод, Показ-Подписание, Вывод-Подписание

    Для ы=1 ПО 4 цикл
    Для а=ы+1 По 4 Цикл
    ЗаписьРегистра(Масс[5], Масс[0], Масс[6], Масс[7], Масс[9], ПолучитьТип(ы), Масс[ы] ,ПолучитьТип(а), Масс[а], Масс[8]);
    КонецЦикла;
    КонецЦикла;

    КонецПроцедуры

    &НаСервере
    Функция ПолучитьТип(ном)
    //Добавляем цифры для удобной сортировки по этапам
    Если ном = 1 Тогда Возврат ном+". "+Перечисления.РЗБП_ТочкиМаршрута.ВедениеКлиента;
    ИначеЕсли ном = 2 Тогда Возврат ном+". "+Перечисления.РЗБП_ТочкиМаршрута.Показ;
    ИначеЕсли ном = 3 Тогда Возврат ном+". "+Перечисления.РЗБП_ТочкиМаршрута.ВыводНаПД;
    ИначеЕсли ном = 4 Тогда Возврат ном+". "+Перечисления.РЗБП_ТочкиМаршрута.ПодписаниеДоговора;
    КонецЕсли;
    КонецФункции

    &НаСервере
    Функция ЗаписьРегистра(Ист, НомЗ,Рекл,НачСд, РезБП, ТипВх, МенВх,ТипВых,МенВых,Вед)
    //Все данные пишем строками, с ними потом будет работать другая программа, которая не понимает ссылок 1С
    //записывем даже пустые данные (менеджеры могут быть пустыми, если никто не выполнил задачу по этому этапу)

    //Кстати, если здесь ставлю точку останова, то результат меняется
    Набор = РегистрыСведений.ЭффективностьМенеджеров.СоздатьМенеджерЗаписи();
    Набор.ИсточникКлиента = Строка(Ист);
    Набор.НомерЗвонка = Строка(НомЗ);
    Набор.РекламныйИсточник = Строка(Рекл);
    Набор.ДатаНачалаСделки = Строка(НачСд);
    Набор.РезультатБП = Строка(РезБП);
    Набор.Ведущий = Строка(Вед);
    Набор.Дата = Строка(ТекущаяДата());
    Набор.ТипВхода = Строка(ТипВХ);
    Набор.МенеджерВхода = Строка(МенВХ);
    Набор.ТипВыхода = Строка(ТипВых);
    Набор.МенеджерВыхода = Строка(МенВых);
    Набор.Записать();
    КонецФункции
```
---
pechenka1440, Какие измерения регистра ЭффективностьМенеджеров?

Как вариант, у вас получется несколько записей с одним набором реквизитов.
Набор.Дата = Строка(ТекущаяДата());
В режиме отладки дата разная, в рабочем режиме все записи в одну секунду и предыдущие перетираются следующими.

Локализуйте проблему.
Допишите в процедуру ЗаписьРегистра() Сообщить(<ключи>). Хотя бы поймете, проблема в том, что не записывает или не заходит.
---
ekaruk, огромное спасибо! Совсем забыл о такой особенности регистра, и хотя специально делал много разных измерений специально, чтобы не было дублей, всё равно на этом попался... И не подумал, что во время отладки ТекущаяДата между инетациями увеличивается... Проблема решена, огромное спасибо!
---
pechenka1440, как минимум нужно видеть ваш код.
---
pechenka1440, Удивительно!
1. А Вы точно уверены, что Ваш большой объем данных не модифицируется между попытками с остановом и без...?
2. Может на входе подаются параметры, которые также не неизменны...?
3. Если в модуле используются запросы, попробуйте проанализировать результат их выполнения в режиме предприятия, с помощью консоли запросов...
Проведите несколько итераций, дабы убедиться что результат - неизменен... ну или наоборот.
---
Caspersky, Дополню:
4. Может в окне "Табло" выполняется какой-то код. И он влияет на результат (на примере чтения xml через ФабрикаXDTO).
---
Может всё же дело в самой функции? Приложите код, что ли.