Мистика с 1С:Предприятие 8.2
Я уже давно работаю с платформой 1С:Предприятие 8 и за это время успел полюбить ее всем сердцем. Я привык к подводным камням. Меня не пугает падение платформы во время ошибок в отчетах, построенных на базе технологии СКД (иногда при модификации готового отчета платформа вылетает в небытие). Я смирился с тормозами хранилища конфигурации. Я привык, что встроенный отладчик не дает мне разгуляться и не разрешает изменять значения переменных во время отладки. В общем, я простил платформе многое.
Я уже думал, что основной список багов любимой платформы мне известен, но оказалось, что я сильно ошибался. Недавно мне потребовалось обновить конфигурацию одной базульки в удаленном филиале. Подключаюсь к ним через Radmin, заливаю конфу, с которой собираюсь делать объединение, и собственно говоря, приступаю к объединению. Изменений в новой версии конфигурации было сделано минимум (добавилось несколько документов и справочников). Процесс объединения завершился быстро и без единого намека на ошибку.
С чувством выполненного долга запускаю платформу в режиме "предприятие" и тут же получаю "облом". Во время загрузки возникает ошибка в коде и приложение стартануть не может. Загружаюсь в конфигураторе и осматриваю строчку кода, на которой вываливается программа. В общем виде строка выглядит примерно так:
ПараметрыСеанса.Пользователь = НайтиПользователя(ИскомыйПользователь);
Функция "НайтиПользователя" должна возвращать ссылку на элемент справочника "Пользователи". Код функции НайтиПользователя() абсолютно ничем не отличается от конфигурации с которой происходило объединение, поэтому вариант с неполным объединением сразу отпал.
Решил я поставить бряк и посмотреть, что мне возвращает функция "НайтиПользователя". Вот тут и случилась мистическая загадка. Вместо ссылки на элемент справочника "Пользователи" функция возвращает ссылку на элемент справочника "Статьи затрат". Из-за этого и происходит ошибка при старте приложения (типы же не совпадают).
Открыл в очередной раз код функции "НайтиПользователя". В нем тусуется один запрос, в котором все четко прописано (откуда выбирать данные), что нужно брать данные из справочника "Пользователи", но возвращает он определенно другое. Вариантов решения этой проблемы у меня не было, поэтому я просто закомментировал код дополнительных проверок и оставил только такой код:
Возврат Справочники.Пользователи.НайтиПоНаименованию(ИскомыйПользователь);
Сохраняю внесенные изменения и пробую еще раз запустить 1С'ку в режиме "Предприятие". Сразу же срабатывает брекпоинт, и опять в качестве результата возвращается не ссылка на элемент справочника "Пользователи", а ссылка на элемент справочника "Статьи затрат".
Тут я уже понял, что дело явно не в коде. Наверняка косяк был в самой базульке. Попробовал запустить утилиту chdbfl.exe и протестировать базу на ошибки. Увы, никаких ошибок найдено не было. Попробовал запустить тестирование конфигурации, но все тщетно. Ошибки не обнаруживались, но конфигурация по-прежнему не работала.
Совсем отчаявшись, я решил откатиться к бэкапу и попробовать повторить все действия заново. Трюк сработал, и все заработало как надо. Вот теперь спрашивается, что это было и как с такими вещами в случае чего бороться? Единственное, что мне приходит в голову - был косяк с жестким диском. Только тогда почему повторная загрузка исправила все проблему? В общем, сплошная мистика и лишнее подтверждение словам: "У кого бэкапов больше, тот и сильнее!".
- Spider_NET's блог
- Добавить комментарий
- 2327 просмотров
Комментарии
15 комментария(ев)Дата: Пнд, 23/07/2012 - 21:42
Жди беды....
Дата: Втр, 24/07/2012 - 02:13
бывает...
Дата: Втр, 24/07/2012 - 03:50
Ну, уж скорее с памятью, чем с винтом.
Дата: Втр, 24/07/2012 - 08:48
Фиг его знает. Тот комп работает до сих пор и вроде никаких лагов замечено не было.
Дата: Втр, 24/07/2012 - 10:43
У платформы на самом деле хватает глюков. Очень разочаровался в работе 1С через веб. Криво работает, тормозит, периодически вылетает. Причем косяки есть как при работе через инет, так и по локальной сети... =(
Дата: Втр, 24/07/2012 - 11:58
Увы, никуда от этого не денешься. Сейчас 1С'ка активно развивает управляемые формы, поэтому глюков не избежать =(
Дата: Втр, 24/07/2012 - 18:11
Я думаю был косяк не с жестким диском, а с загрузкой.
Поиск объекта выполняется по UUID, который может быть любым. Поэтому при загрузке UUID мог смело приляпаться не тому элементу справочника.
Дата: Втр, 24/07/2012 - 21:04
Вполне может быть. Я просто был удивлен. За 6 лет практики такое впервые.
Дата: Втр, 24/07/2012 - 21:16
На самом деле косяк напрашивался. Нельзя одной строкой идентифицировать объект. Как минимум, в идентификацию нужно и свойства объекта закладывать.
Дата: ЧТ, 02/08/2012 - 14:54
Цитировать
Можно. Неявно, но можно )
Дата: ЧТ, 02/08/2012 - 16:27
И как же изменить значение переменной в отладке?
Дата: ЧТ, 02/08/2012 - 20:50
Говорю же - неявно )
В отлаживаемый модуль добавляем функцию:
Функция ПрисвоитьЗначение(Переменная, НовоеЗначение)
Переменная = НовоеЗначение;
КонецФункции // ПрисвоитьЗначение()
Все. Теперь в любом месте отладки, где требуется изменить переменную, в окне вычисления вызываем ф-ю, которая меняет значение переменной - ПрисвоитьЗначение(Текст, "Ура получилось!") или так ПрисвоитьЗначение(А, Истина) или даже так ПрисвоитьЗначение(А, Новый Структура("Ключ", "Получилось!")). Вуаля!
Дата: ЧТ, 02/08/2012 - 21:28
С этим есть ещё больший прикол. Я после этого на всю жизнь запомнил, что в 1С функция не должна изменять входные данные.
Глобальную функцию можно вызвать в режиме Предприятие через табло. И если функция изменяет данные, то она их спокойно изменит даже из табло. Мы тогда пытались придумать какую-нибудь инъекцию для УТ, но до конца так и не додумали.
Дата: ВС, 12/08/2012 - 22:03
Я про этот способ слышал, но не пользуюсь им. Хочется, чтобы это было реализовано на нормальном уровне и средствами IDE, а не кустарно =)
Дата: Пнд, 03/09/2012 - 20:34
Столкнулись с такой бедой после обычного обновления БД (F7) после этого ссылки на объекты стали выдавать левые ссылки на объекты.
Ответ от 1С - был один - попробуйте утилиту для проверки chdbfl.exe.
Лечение:
Чистка всех временных папочек 1с, куда она сохраняет свой мусорUsers ... ApplicationData .. temp и
Затем Сохранить конфигурацию в файл и тут же после сохранения
Загрузить конфигурацию из файла