Черный лебедь из-за классической ошибки

Иногда программиста 1С поджидают черные лебеди. Порой это случается, когда берешься за задачу, которая оказывается сложнее, чем кажется, как это было с колонкой добавления остатков в СКД, которая в итоге вылилась в 3 дополнительных часа на ознакомление с архитектурой типовой формы отчетов.

Но иногда можно споткнуться на ровном месте, как в случае, о котором я расскажу.

Я занимался переводом обычной формы в управляемую. Всё шло хорошо. Разве что после смены закладки иногда слетали размеры формы. Но я списывал всё это на «глюки управляемых форм» и решил, что проверю причины позже. А пока занимался другими вещами.

И вдруг после очередной доработки у меня стала вылетать 1С. Проверил предыдущую сохраненную версию — не вылетает. Сравнил код — вроде ничего криминального. Откатываться на предыдущую версию не хотелось — кстати, это бы и не помогло, как выяснилось позже.

В итоге я начал искать место, где происходил вылет. Ситуация отладки усложнялась тем, что для моделирования нужно было нажать 4 галочки и сделать переключение страницы, т.е. времени на отладку после перезапуска 1С уходило много.

Оказывается, 1С вылетала после возврата из функции СформироватьHMTL, результат которой присваивался полю HTML-документа.

Это дало мне еще одну ложную «наводку», я подумал, что глюки связаны с браузером, потому что возвращался сложный HTML текст с Java-скриптами.

Вернул простой HTML, все заработало. Но это не продвинуло меня к решению, функциональность HTML надо было сохранить.

Сначала попробовал сделать, чтобы результат возвращался в клиентскую переменную, а уже отдельной кнопкой присваивать значение полю браузера, подумал что проблема в асинхронности. Но это не помогло — после формирования 1С вылетала, еще даже до присвоения по кнопке.

Тогда я подумал, что причина где-то внутри функции СформироватьHMTL. И интуиция меня не подвела.

Посмотрите на картинку. Там, где красные линии, я делал возвраты текста HTML-заглушки и 1С не вылетала:

Но когда я сделал возврат на синей линии, 1С вылетела. И тут меня осенило. Я увидел внутри цикла обращение к полям Ширина и Высота. А ведь это же поля формы!

Я на всякий случай объявил все переменные, которые использовались в этой функции и вылеты прекратились! Как внезапный бонус перестала и разъезжаться форма.

Функция СформироватьHTML происходило из события активизации строки, неудивительно, что если размеры формы менялись в цикле многократно из такого события, 1С «сходила с ума».

А ведь действительно, часто программисты 1С пренебрегают объявлением переменных и как раз тут ружьё, которое висело на стене «выстрелило«.

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

Потери времени на эту проблему составили 2 часа. Увы, понимание что в данном случае помог бы простейший рефакторинг кода функции, пришло слишком поздно!

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментариев 6

  1. Klopik:

    Рефакторинг он такой))), переменные они не объявляют) хех.

    • Да, этим грешат многие, в том числе и я. Но код с шириной и высотой был не мой, я переносил его с ОФ на УФ.

  2. rzd:

    Может проблема в том, что присваиваешь строки заведомо числовым значениям?

    Ну и как тут не упомянуть про «ничего лучше 1с для разработки не придумали»

    • Ну во-первых присваиваю не я, код не мой, я его только адаптирую.
      А вообще проблема в том, что вместо локальных переменных я присваиваю значения свойствам формы. Я об этом и написал, КЭП.
      А так да, лучше чем 1С среды разработки не существует.

    • Павел:

      Мощное средство. Падает неизвестно где без эксепшена. Можно присваивать что угодно чему угодно

Добавить комментарий для fixin Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *