Черный лебедь из-за классической ошибки
Иногда программиста 1С поджидают черные лебеди. Порой это случается, когда берешься за задачу, которая оказывается сложнее, чем кажется, как это было с колонкой добавления остатков в СКД, которая в итоге вылилась в 3 дополнительных часа на ознакомление с архитектурой типовой формы отчетов.
Но иногда можно споткнуться на ровном месте, как в случае, о котором я расскажу.
Я занимался переводом обычной формы в управляемую. Всё шло хорошо. Разве что после смены закладки иногда слетали размеры формы. Но я списывал всё это на «глюки управляемых форм» и решил, что проверю причины позже. А пока занимался другими вещами.
И вдруг после очередной доработки у меня стала вылетать 1С. Проверил предыдущую сохраненную версию — не вылетает. Сравнил код — вроде ничего криминального. Откатываться на предыдущую версию не хотелось — кстати, это бы и не помогло, как выяснилось позже.
В итоге я начал искать место, где происходил вылет. Ситуация отладки усложнялась тем, что для моделирования нужно было нажать 4 галочки и сделать переключение страницы, т.е. времени на отладку после перезапуска 1С уходило много.
Оказывается, 1С вылетала после возврата из функции СформироватьHMTL, результат которой присваивался полю HTML-документа.
Это дало мне еще одну ложную «наводку», я подумал, что глюки связаны с браузером, потому что возвращался сложный HTML текст с Java-скриптами.
Вернул простой HTML, все заработало. Но это не продвинуло меня к решению, функциональность HTML надо было сохранить.
Сначала попробовал сделать, чтобы результат возвращался в клиентскую переменную, а уже отдельной кнопкой присваивать значение полю браузера, подумал что проблема в асинхронности. Но это не помогло — после формирования 1С вылетала, еще даже до присвоения по кнопке.
Тогда я подумал, что причина где-то внутри функции СформироватьHMTL. И интуиция меня не подвела.
Посмотрите на картинку. Там, где красные линии, я делал возвраты текста HTML-заглушки и 1С не вылетала:

Но когда я сделал возврат на синей линии, 1С вылетела. И тут меня осенило. Я увидел внутри цикла обращение к полям Ширина и Высота. А ведь это же поля формы!
Я на всякий случай объявил все переменные, которые использовались в этой функции и вылеты прекратились! Как внезапный бонус перестала и разъезжаться форма.
Функция СформироватьHTML происходило из события активизации строки, неудивительно, что если размеры формы менялись в цикле многократно из такого события, 1С «сходила с ума».
А ведь действительно, часто программисты 1С пренебрегают объявлением переменных и как раз тут ружьё, которое висело на стене «выстрелило«.
Видимо, раньше просто не было тех данных, которые приводили к критическим последствиям, хотя судя по изменению размеры элементов на форме, Ширина и Высота формы все же менялись в цикле, но не так критично. Просто на определенном наборе данных или на определенных настройках формы (что скорее всего) 1С уже не вытягивала подобное насилие.
Потери времени на эту проблему составили 2 часа. Увы, понимание что в данном случае помог бы простейший рефакторинг кода функции, пришло слишком поздно!

Рефакторинг он такой))), переменные они не объявляют) хех.
Да, этим грешат многие, в том числе и я. Но код с шириной и высотой был не мой, я переносил его с ОФ на УФ.
Может проблема в том, что присваиваешь строки заведомо числовым значениям?
Ну и как тут не упомянуть про «ничего лучше 1с для разработки не придумали»
Ну во-первых присваиваю не я, код не мой, я его только адаптирую.
А вообще проблема в том, что вместо локальных переменных я присваиваю значения свойствам формы. Я об этом и написал, КЭП.
А так да, лучше чем 1С среды разработки не существует.
Мощное средство. Падает неизвестно где без эксепшена. Можно присваивать что угодно чему угодно
Да, но выяснить можно..