8.х Проблема с зависанием 1С при выполнении обработки

Тема в разделе "Установка платформы "1С:Предприятие 8"", создана пользователем Pilot2903, 22 мар 2012.

  1. TopicStarter Overlay
    Pilot2903
    Offline

    Pilot2903

    Регистрация:
    22 мар 2012
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    Есть обработка которая осуществляет загрузку данных из текстовых файлов в Торговлю редакции 11.0.7.13.
    Одна из процедур осуществляет загрузку цен номенклатуры (создает документы).
    Сама процедура загрузки цен запускается &НаСервере, а вызывается &НаКлиенте. Сама процедура нормально отрабатывает, создает документы, но в процессе выхода из процедуры ИНОГДА вешает 1С намертво.
    Т.е. при переходе из &НаСервере в &НаКлиенте все виснет, причем навсегда (пока в диспетчере задач не убьешь процесс).
    Текст процедур:

    Код:
    &НаСервере
    Процедура ЗагрузитьЦены(Файл,Дата)
    
    лТаблЗнач = Новый ТаблицаЗначений;
    лТаблЗнач.Колонки.Добавить("Номенклатура");
    лТаблЗнач.Колонки.Добавить("ТипЦены");
    лТаблЗнач.Колонки.Добавить("Цена");
    лСписЗнач = Новый СписокЗначений;
    лТекст = Новый ТекстовыйДокумент;
    лТекст.Прочитать(Файл+"\Prices.txt");
    лНом = "";
    лНомСтар = лНом;
    Для й = 1 По лТекст.КоличествоСтрок() Цикл
    СтрокаТекста = лТекст.ПолучитьСтроку(й);
    лСписЗнач.Очистить();
    ИзСтрокиСРазделителями(лСписЗнач,СтрокаТекста);
    лНом = Справочники.Номенклатура.НайтиПоКоду(лСписЗнач[0].Значение);
    лТипЦен = Справочники.ВидыЦен.НайтиПоНаименованию(лСписЗнач[1].Значение);
    лЦена = Число(лСписЗнач[2].Значение);
    
    Если не ЗначениеЗаполнено(лТипЦен) Тогда
    лТипЦен = СоздатьТипЦены(лСписЗнач[1].Значение);
    КонецЕсли;
    
    Если не ЗначениеЗаполнено(лНом) Тогда
    Продолжить;
    КонецЕсли;
    
    Если не ЦенаНовая(лНом,лТипЦен,лЦена,ТекущаяДата()) Тогда
    Продолжить;
    КонецЕсли;
    
    Отбор = Новый Структура;
    Отбор.Вставить("Номенклатура",лНом);
    Отбор.Вставить("ТипЦены",лТипЦен);
    МассивСтрок = лТаблЗнач.НайтиСтроки(Отбор);
    Если МассивСтрок.Количество() > 0 Тогда
    Продолжить;
    КонецЕсли;
    
    СтрокаТабл = лТаблЗнач.Добавить();
    СтрокаТабл.Номенклатура = лНом;
    СтрокаТабл.ТипЦены = лТипЦен;
    СтрокаТабл.Цена = лЦена;
    КонецЦикла;
    
    ТаблВидовЦен = лТаблЗнач.Скопировать(,"ТипЦены");
    ТаблВидовЦен.Свернуть("ТипЦены");
    
    лДокУстЦен = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
    лДокУстЦен.Дата = Дата;
    лДокУстЦен.Ответственный = ПараметрыСеанса.ТекущийПользователь;
    лДокУстЦен.Статус = Перечисления.СтатусыУстановокЦенНоменклатуры.Согласован;
    лДокУстЦен.ВидыЦен.Очистить();
    лДокУстЦен.Товары.Очистить();
    Для Каждого СтрокаТабл из ТаблВидовЦен Цикл
    СтрокаВидовЦен = лДокУстЦен.ВидыЦен.Добавить();
    СтрокаВидовЦен.ВидЦены = СтрокаТабл.ТипЦены;
    СписокЗависимыхЦен = НайтизависимыеЦены(СтрокаТабл.ТипЦены);
    Если СписокЗависимыхЦен.Количество() > 0 Тогда
    Для Каждого Элемент из СписокЗависимыхЦен Цикл
    СтрокаВидовЦен = лДокУстЦен.ВидыЦен.Добавить();
    СтрокаВидовЦен.ВидЦены = Элемент.Значение;
    КонецЦикла;
    КонецЕсли;
    КонецЦикла;
    
    лДокНоменклатура = "";
    й = 0;
    Макс = лТаблЗнач.Количество();
    Для Каждого СтрокаТабл из лТаблЗнач Цикл
    й = й + 1;
    Если (лДокУстЦен.Товары.Количество() > 5000) и (лДокНоменклатура <> СтрокаТабл.Номенклатура) Тогда
    ЗаписатьОбъект(лДокУстЦен, РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
    лОбъект = лДокУстЦен.Скопировать();
    лДокУстЦен = лОбъект.Скопировать();
    лДокУстЦен.Товары.Очистить();
    лДокУстЦен.Дата = Дата;
    лДокУстЦен.Статус = Перечисления.СтатусыУстановокЦенНоменклатуры.Согласован;
    ЗаписатьОбъект(лДокУстЦен, РежимЗаписиДокумента.Запись);
    ЗаписатьОшибкуВЛог("Записана установка цен "+лДокУстЦен.Ссылка);
    КонецЕсли;
    
    лСтрокаДок = лДокУстЦен.Товары.Добавить();
    лСтрокаДок.Номенклатура = СтрокаТабл.Номенклатура;
    лСтрокаДок.ВидЦены = СтрокаТабл.ТипЦены;
    лСтрокаДок.Цена = СтрокаТабл.Цена;
    Индикатор1 = й/Макс*100;
    лДокНоменклатура = лСтрокаДок.Номенклатура;
    
    ЗаписатьОбъект(лДокУстЦен, РежимЗаписиДокумента.Запись);
    
    КонецЦикла;
    лДокУстЦен.Дата = ТекущаяДата();
    лДокУстЦен.Статус = Перечисления.СтатусыУстановокЦенНоменклатуры.Согласован;
    Если лДокУстЦен.Товары.Количество() > 0 Тогда
    ЗаписатьОбъект(лДокУстЦен, РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
    ЗаписатьОшибкуВЛог("Записана установка цен "+лДокУстЦен.Ссылка);
    КонецЕсли;
    
    КонецПроцедуры
    &НаКлиенте
    Процедура ВыполнитьЗагрузкуЦен(ДатаЦен,Файл)
    
    Состояние("Загрузка цен...");
    
    ЗагрузитьЦены(Файл,ДатаЦен);
    
    КонецПроцедуры
    Забыл добавить, проблема возникает как в файловой базе, так и в клиент-сервере.
  2. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    дык если зависло, то всегда можно понаставлять точек останова и выявить, где бесконечный цикл.
  3. TopicStarter Overlay
    Pilot2903
    Offline

    Pilot2903

    Регистрация:
    22 мар 2012
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    Там нет бесконечного цикла, я же сказал, что виснет при выходе из процедуры &НаСервере и переходе &НаКлиент, по записям в лог-файл это следует однозначно.
  4. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    А если вот так:
    Код:
    &НаКлиенте
    Процедура ВыполнитьЗагрузкуЦен(ДатаЦен,Файл)
    Состояние("Загрузка цен...");
    ЗагрузитьЦены(Файл,ДатаЦен);
    А = 100;
    КонецПроцедуры
    и в процедуре ЗагрузитьЦены во конце тоже поставить чета типа
    Б = 200;

    И поставить на них точку останова - посмотрите в отладчике. Точно после того, как с Б "спрыгнуло" на А не запрыгнуло?
  5. TopicStarter Overlay
    Pilot2903
    Offline

    Pilot2903

    Регистрация:
    22 мар 2012
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    На самом деле процедура "ВыполнитьЗагрузкуЦен" сама тоже вызывается из другой клиентской процедуры, код выглядит так
    ЗаписатьОшибкуВЛог("Начата загрузка цен");

    ВыполнитьЗагрузкуЦен(КонДата,Объект.Файл);

    ЗаписатьОшибкуВЛог("Загрузка цен завершена");
    Как нетрудно догадаться "ЗаписатьошибкуВЛог" - это просто запись в лог файл, необязательно ошибку.
    Так вот, документы, судя по логу и базе грузятся все, т.е. "ЗагрузитьЦены" отрабатывает, а вот запись "Загрузка цен завершена" в логе уже не появляется.
    Опять же точка останова не поможет, т.к. зависание происходит, как я писал, ИНОГДА, примерно 1-2 случая из 10. Количество загруженных документов "Установка цен номенклатуры", что при зависании, что без одинаково - 22 штуки. Можно конечно добавить запись в лог-файл вместо строки с "А = 100;", но учитывая описанную мною ситуацию ничего нового я не увижу.
  6. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    зря вы так про точку останова, она вам точно поможет понять узкое место в вашей процедуре. В ысначала попробуйте, а потом посмотрим. Раз конкретно 22 строки толкьо пишет, то я бы сделала следующее:
    1. Посмотрела в сам файл на 22 и 23 строки, поанализировала их
    2. Отладчиком прошлась, особенно при записи 21, 22 строки и переходе между 22 и 23
  7. TopicStarter Overlay
    Pilot2903
    Offline

    Pilot2903

    Регистрация:
    22 мар 2012
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    Да ё-мое.
    Во-первых. Не строки 21,22,23, а 22 документа "Установка цен номенклатуры" по 5000 записей в каждом (в последнем меньше), смотрите первый мой пост.
    Во-вторых. Какое узкое место ? Процедура отрабатывает полностью сколько раз еще это написать. Вот эти строки:
    Если лДокУстЦен.Товары.Количество() > 0 Тогда
    ЗаписатьОбъект(лДокУстЦен, РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
    ЗаписатьОшибкуВЛог("Записана установка цен "+лДокУстЦен.Ссылка);
    КонецЕсли;

    КонецПроцедуры
    программа точно отрабатывает, запись в лог происходит. Лог - это отдельный файл в который я записываю "ключевые" на мой взгляд моменты, а не файл с исходными данными. Файл с исходными данными, как легко догадаться, имеет размер более 100 000 строк.
    Итак повторяю, последние строки процедуры отрабатываются (иначе записи в логе не было бы), затем поидее должен быть возврат на "клиента", и вот тут-то и происходит затык, ну или при переходе уже с "клиента" на "клиента" (процедура "ВыполнитьЗагрузкуЦен" тоже вызывается), но это маловероятно, да и прнципиально ситуацию не меняет, т.к. причина такого затыка неясна.
  8. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    во-первых, не надо нервничать
    во-вторых, обрамляйте ваш код в теги, в первом посте вам уже поправили и указали на это
    в-третьих, про 22 дока... в вашем посте ничего не сказано было, а слишком детельно изучать код - на это время треба, не у всех его много, описали бы изначально подробно задачу
    в-четвертых, попробуйте сделать так, как вам посоветовал uza - определите в какой именно момент виснет
    в-пятых, ну а раз не каждый раз виснет, то ищите закономерности...

    в-шестых, у вас в 2-х местах одинаковый текст в логи пишется, откуда вы узнаете, что именно из последнего куска последняя запись в вашем логе?
  9. TopicStarter Overlay
    Pilot2903
    Offline

    Pilot2903

    Регистрация:
    22 мар 2012
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    Я код привел как раз потому что ошибка, на мой взгляд, из-за кода. В обработке множество процедур исполняемых на сервере и вызывающихся с клиента, но ни одна из них так себя не ведет. Есть подозрение, что это из-за большой таблицы значений, формирующейся при выполнении обработки.
    Насчет определить когда виснет - я же сказал, что виснет при выходе из серверной процедуры, что следует из лога.
    И где там
    ?
  10. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    данная конструкция вызывается в 2-х местах
    Код:
    ЗаписатьОшибкуВЛог("Записана установка цен "+лДокУстЦен.Ссылка);
    на этапе отладки вашего механизма (в копии конечно) можно в лог писать любую информацию и из любого места, тем самым отследить где конкретно валится алгоритм. Раз у вас зависает и на файловом варианте и на клиентсерверном, то дело не при выходе с серверной процедуры, а где то именно косячит. Надо искать.

    Ищите закономерности, когда именно зависает, может действительно много данных, может где какое исключение происходит при обработке.
    А раз вы уверены, что ошибка именно в коде, то тут уж точно отладчик вам в помощь.
  11. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    код нечитабельный. хоть бы комментарии поставили. минут 5 уже втыкаю пытаясь понять, че делает процедура.

    нафига бить 100 000 на документы по 5 000?

    10 раз запуситите загрузку и ждите пока подвиснет. потом понатыкайте точек останова = > и будет вам щастье.

    вот это у вас и внутри цикла и после цикла. с чего вы уверены, что у вас последняя строка после цикла отрабатывает?
    Код:
    ЗаписатьОшибкуВЛог("Записана установка цен "+лДокУстЦен.Ссылка);
    раз уж вам не нравятся точки останова, то закомментируйте строку внутри цикла, оставьте только строку после цикла. посмотрите записалось ли что-то в лог.
  12. TopicStarter Overlay
    Pilot2903
    Offline

    Pilot2903

    Регистрация:
    22 мар 2012
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    Документы бьются по 5000 для удобства ибо проводить, а то и не дай Бог просматривать документ на 100 000 элементов это ж..а, проверено, открывается такой документ всегда (т.е. никак не открывается).
    Приведенные вами две одинаковые строки не одинаковы, там разные ссылки на документы, и в логе они будут выглядеть по разному.
    Уверенность у меня от того, что документов должно получится 22 штуки, файл с ценами практически не меняется, это полная выборка. В логе что при зависании, что при нормальной работе, я эти 22 штуки наблюдаю. В базе они, кстати, тоже присутствуют.
    Приведенная вами строка это как раз запись последнего документа, в котором легко может быть меньше 5000 элементов.
    Точка останова не работает, т.к. в момент зависания процедура уже отработала. Я ставил точки останова везде после зависона и ни одна не сработала.

    Повторюсь, где виснет я знаю - в момент перехода с сервера на клиент, я не знаю почему так. Зачем все эти советы про точки останова и комментирование ?
  13. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    Вам посоветовали поставить точек останова и долбить по клаве в области F10.
    Но вы то предложение отклонили. Вы же мудрый шо пипец, даже вот и непонятно зачем на форуме помощи то просите. Не иначе чтоб над нами, ламьем слепошарым, поглумиться.
    Я вот бегло код вычитал, хоть он и без каментов (за что в путнем ВУЗе натурально могут заставить пересдавать лабы) - не вижу я там вечного цикла. Сбой где то в ином месте. Событие там какой, аль файл фиксироваться не могет, аль транзакция улетает в небеса, аль конект рвется, аль хренегознаетчтоеще.

    Однако, если бы вы вчера, в 10:51, как тока я свое предложение Вам дал - сделали так, как я рекомендовал. Да безостановочно фтыкали бы F10/F11 - уже бы раз пяцот полный цикл прогнали, и не то чтобы словили раз 10 момент предпологаемого зависона (чего для анализа вполне даже хватает), но уже бы и весь код по дереву алгоритма изучили - хоть перед доской отвечай по памяти.

    Хотите помощи? Сделайте как сказал я. И вот наглядно (а хоть бы и видео пруфом) подтвердите. Да! Йоптыть, до конца программы доходит - вот она точка останова, вот он курсор программный, а вот в вызвавшую программу (вот она точка останова вызова, вот она точка "за вызовом") не вертается. Вот то уже будет смысл маковку чесать да думать. А так - пена одна, и уж часов 8 потерянного рабочего времени (с вашей стороны)
  14. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    1) Послушать таки всех, кто предлагал вам пользоваться отладчиком.
    2) Так же проверить что происходит в подписках на событие ПриЗаписи, ПриПроведении ну и какие там еще есть документа УстановкаЦенНоменклатуры.
  15. TopicStarter Overlay
    Pilot2903
    Offline

    Pilot2903

    Регистрация:
    22 мар 2012
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    Т.е. я должен поставить точку останова в конце процедуры, подождать пока отработает вся загрузка цен целиком (чуть меньше часа), а потом надеяться что именно сейчас при нажатии F10/F11 оно таки зависнет ? А не на 5-6 раз ? Я правильно вас понял ?

    Так ведь документы создаются и проводятся, и дальнейшему исполнению кода не препятствуют, в чем смысл ?
  16. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    1) Смысла вообще нет - мы все умрем, сгнием, и нас съедят червяки.

    2) А уменьшить (хоть бы и принудительно) обрабатываемую выборку на время эксперимента - это нет, это не канает?

    3) Алгоритмы событий-подписок могут сделать много чего. Иной раз так глюк "выстреливает" что оторопь берет. Это давно (и/или упорно) практикующие кодеры знают (потому каждый из ответивших Вас и тыкнул в сторону парсера).

    4) Даже китайцы, даже ИНДУСЫ не брезгуют отладкой! Но вы не поддавайтесь, будьте выше этого.
  17. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    а в чем смысл спрашивать помощи, если вы эту предложенную помощь отвергаете....
  18. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Может я конечно тему не внимательно прочитал, но какому "дальнейшиму исполнению кода" если у вас из процедуры по вашим словам возврата не происходит?
    Что у вас там происходит - я не знаю. В чем причина - тоже не знаю. Вы пришли сюда за советом - мое дело всего лишь предложить вариант локализации проблемы.
  19. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    З.Ы. uza как всегда жестко, но по делу...
  20. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    [off]
    Вариант кремации - не рассматриваем? :D
    [/off]
Похожие темы
  1. Dimka77
    Ответов:
    7
    Просмотров:
    2.774
  2. Dimka77
    Ответов:
    4
    Просмотров:
    1.107
  3. SerzhM
    Ответов:
    9
    Просмотров:
    1.271
  4. Nik02071
    Ответов:
    2
    Просмотров:
    656
  5. A|_E><Ey
    Ответов:
    2
    Просмотров:
    1.099
Загрузка...

Поделиться этой страницей