Грамотная корректирвка текстов запросов для обновлений
Когда в процессе доработки конфигурации требуется изменение текста запроса, используются разные методы.
Некоторые программисты вносят изменения непосредственно в текст запроса, вставляя свои комментарии, чтобы было понятно, что это доработка.
Но мне больше нравится изменение текста запроса с помощью кода, ориентируясь на определенный участок в тексте запроса (маркер). Обычно достаточно вызова функции СтрЗаменить, но есть недостаток — если после обновления типовой конфигурации текст запроса изменился, то замена не сработает и об этом будет неизвестно пользователю, пока не проявятся результаты ошибки.
Поэтому обычно я использую несколько доработанную методику — замену текста запроса делаю с помощью функции:
Процедура ЗаменитьТекстЗапроса(ТекстЗапроса, Искать, Заменить, ИмяМодуля) Экспорт Если Найти(ТекстЗапроса, Искать) = 0 Тогда ВызватьИсключение "Не найден текст для замены: """ + Искать + """ в тексте запроса в модуле: " + ИмяМодуля + Символы.ПС + "Конфигурация изменилась. Требуются доработки"; КонецЕсли; ТекстЗапроса = СтрЗаменить(ТекстЗапроса, Искать, Заменить); КонецПроцедуры
Вот как выглядит замена:
//ИскМаркер = "ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки"; //В УТ 11.5 новая таблица ЛЕВОЕ СОЕДИНЕНИЕ ВтДоступныеТовары КАК СвободныеОстатки ИскМаркер = "ЛЕВОЕ СОЕДИНЕНИЕ ВтДоступныеТовары"; ЗаменитьТекстЗапроса( Запрос.Текст, ИскМаркер, "ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаВыгрузки КАК ТаблицаВыгрузки | ПО | КодыТоваровПодключаемогоОборудованияOffline.Номенклатура = ТаблицаВыгрузки.Номенклатура | И КодыТоваровПодключаемогоОборудованияOffline.Характеристика = ТаблицаВыгрузки.Характеристика |" + ИскМаркер, "ПодключаемоеОборудованиеOfflineВызовСервера");
Таким образом, если исходный маркер не найден, в процессе работы кода будет выдана ошибка и будет понятно, что нужно менять. Вот пример такой ошибки, который как раз встретился при обновлении с УТ 11.4 на УТ 11.5:
Обновляйте запросы грамотно!
А использовать обьектную модель запроса не пробовал? Сложнее, но надежно.
Было бы надежнее, если бы 1С не тасовало запросы. А так одинаково надежно — сообщение об отсутствии маркера будет выдано.