Воспользовался в расширении новой директивой "&ИзменениеИКонтроль".
Директива отрабатывает правильно. В случае точного соответствия измененной функции/процедуры оригинальному тексту происходит подмена.
Если же добавить в модифицированный текст хотя бы одну строчку вне директив "#Вставка" - "#Удаление", то подмены не происходит, выполняется оригинальный метод. Проблема заключается в том, что вопреки методической документации, модификация игнорируется без каких-либо уведомлений. То есть если код оригинального метода не соответствует коду в расширении, то расширение остается подключенным, успешно проходит проверку применимости, но при выполнении отрабатывает текст из исходной конфигурации. В документации указано:
Как только разработчик конфигурации исправит ошибку (и расширяемая конфигурация будет обновлена), наше расширение перестанет выполняться с диагностикой следующего вида:
Расширение1: Обычная: Ошибка применения модуля "Расширение1 ОбщийМодуль.ОбщийМодуль1.Модуль". Текст модуля для метода "ВозведениеВСтепень" изменился
Если проверка применимости расширений выполняется в конфигураторе, то результатом проверки будет сообщение об ошибки и возможность восстановить соответствие с методом конфигурации.
Ничего подобного у меня не произошло. Никаких сообщений не выдалось ни в режиме конфигуратора, ни в режиме предприятия. Но модификация при этом отрабатывать перестала. В итоге работа ничем не отличается, от директивы "&Вместо", поскольку придется при каждом обновлении конфигурации вручную проверять модификацию и оригинал.
Возможно, я что-либо неверно делаю, или неправильно понял. Кто-нибудь пробовал пользоваться этой директивой и видел заявленную разработчиками реакцию конфигуратора при проверке расширения?
(1) Много есть проблем еще в расширениях. Есть еще "После", которое не отрабатывает после проведения, и после отмены проведения. К сожалению, пока в инете много подобных историй и разработчики негласно исправляют какие-то дефекты, а какие-то даже не пытаются.
(3) да, Вы бы попробовали обратиться в поддержу "1С", возможно включат Вашу ошибку в "Публикуемые ошибки" или ответят, что вопрос в разработке. Расширения ещё работают не по инструкции, к сожалению.
(4) Обращусь, наверное. Хотел сначала спросить на форуме, возможно я что-либо неправильно понял и кто-то подскажет, что именно. Вообще, к ним обращаться - то еще развлечение. Уже пробовал как-то. Через недельку ответили "ошибка не воспроизведена", а между тем глюк в следующем релизе платформы исправили.
(5) Когда сталкиваюсь с проблемами расширений. Больше всего печалит:
1) Реквизиты не надежные.
2) Формы, откровенно говоря при обновлении почему-то меняют свои параметры, хотя должны полностью соответствовать форме в расширении.
3) Чисто логическая проблема - процедуры и функции лучше не вставлять целиком в расширение, так как сбои в работе конфигурации начинаются при изменении процедуры которая заменена, а ты ни сном ни духом.
Если вас такой расклад наведет на мысль, буду рад.
А пока я стараюсь просто обходить все эти "неучтенки" другими способами не связанными с расширениями.
(7) Вроде как именно для решения логической проблемы за нумером 3 и сделали ИзменениеИКонтроль. Основной смысл - при обновлении основной конфы получить ошибку при проверке применимости. И именно это не отработало, как надо. Придется по старинке каждый раз проверять оригинальный код.
(6) К сожалению, как раз это - не песочница. В песочницах обычно необходимости в расширениях нету.
(8)
да вы правы я доисправлялся, что сам не заметил, как глупость вставил.
Подразумевается изменение при котором функция осталась в действующей конфигурации, как функция не удаленная при обновлении, она используется во всех функциях и модулях системы, а её уже официальная редакция не поддерживает и оказывается, при обновлении просто не затерли, а ты вставил в расширение когда-то и забыл, и потом получается комбинация при которой функции входящие в расширения повисают в воздухе.
Вообщем я на такую штуку нарывался, решил сообщить.
(3) У меня в 8.3.15.1656 все работает. Добавляешь даже лишнюю пустую строку в не конструкций #Удаление #КонецУдаления или #Вставка #КонецВставки. Появляется ошибка и в конфигураторе при нажатии на "Проверка возможности применения" и в предприятии. На любой лишний пробел ругается вообщем.
ИзменениеИКонтроль может и включено уже в финальные релизы, но все же это пока в статусе "неплохая идея".
при работе с расширениями я стараюсь использовать свое правило: в боевую базу входят только те механизмы расширений от финала которых прошло минимум полгода.
т.е., если ИзменениеИКонтроль зафиналили первый раз в августе, то где-то в феврале (в лучшем случае) я буду пробовать его "воткнуть" в боевую при условии, что ничто меня не будет смущать.
а бежать впереди планет всей можно и нужно в своих тестовых песочницах.
надеюсь автор именно в таких местах обнаружил баги и очень хорошо,
т.к. чем раньше и чаще пинать баг - тем больше вероятность, что будет "гол".
а бежать впереди планет всей можно и нужно в своих тестовых песочницах.
Абсолютно согласен.
Также как и с тем, что - всё (включая и расширения) нужно применять к месту.
А не "потомучто это новое!"
Встречал я таких "современников", которые вместо элементарной Доп-Обработки ИзменениеТабличнойЧасти - сделали Отдельное Расширение.
И "убеждали" свою "правоту" именно этой "коронной" фразой -
"Это новая современная технология! И я никого слушать не буду, а буду делать, только так!"
(10) Нет, основная-то конфигурации не подняла еще. 8.3.12 стоит, основная - отраслевая, сделана на базе Бухгалтерии. Платформа 8.3.15. Если поменять режим совместимости расширения, оно не пройдет проверку применимости. Обещают, что можно будет в расширении поднимать режим совместимости выше основной, но для этого, насколько я понимаю, сама основная должна доползти до версии, где такую возможность реализовали. Вообще говоря, боюсь себе представить, как расширение будет работать при таком раскладе.
Просто сейчас сама директива отрабатывает именно так, как заявлено, не смотря на режим совместимости, то есть заходит в измененный код только когда он соответствует основной конфигурации. Возникло предположение, что проверка конфигурации тоже отработает, так как реализована в конфигураторе и, по идее, не должна обращать внимания на режим совместимости. А получилось ни два ни полтора. "Контроль" срабатывает, но молча. Полагаете, когда основная конфигурация доползет до 8.3.15, то все будет работать правильно?
Не подумал. Сделаю копию базы, сниму с поддержи, подниму совместимость и проверю. По результату напишу.
Сейчас релиз платформы последний стоит, 8.3.15.1700. В боевой базе основную конфигурацию с поддержки в снимать не планируется, собственно почему и делаю расширениями. В виде эксперимента на копии попробую выровнять режим в потолок и в основной и в расширении и посмотрю, что получится.
ИзменениеИКонтроль
Отработал корректно, при условии, что не было лишних пробелов вне дериктивы
препроцессора #Вставка … #КонецВставки и #Удаление … #КонецУдаления
Сразу не заработал, были лишние пробелы перед дериктивой и после, как обычно делаешь отступы по коду
Обновление конф с данными механизмом еще не проводилось, посмотрим как себя поведет
примеры в скрине
лишних строк ( в том числе пустых ) вообще в функции не должно быть ( в том числе в начале и в конце функции) , а также не убирать пустые строки ,которые есть в типовой функции
когда вставляете #Вставка … #КонецВставки и #Удаление … #КонецУдаления
тоже надо следить чтоб не до не после не было лишних пустых строк, и не убирать типовые пустые строки
(21)
Смысл директивы &ИзменениеИКонтроль как раз и заключается в том, что должна выводится ошибка в случае отклонения кода в расширении от кода в основной конфигурации. Если не использовать никаких лишних строк и пробелов, тогда код будет выполнятся, но при изменении кода поставщиком код расширения перестанет исполнятся и программист при обновлении не получит никакого сообщения.
У меня был момент, когда при использовании директивы &ИзменениеИКонтроль программа выдала ошибку о том, что в программе несоответствие кода, но потом сообщение перестало выводиться.
Вывод: код отрабатывает до момента изменения кода в конфигурации поставщика, как только поставщик изменит код директива &ИзменениеИКонтроль перестанет отрабатываться, следовательно директива не отрабатывается так, как заявлено.
(24) Просто после обновления желательно делать проверку конфигурации во всех расширениях. Конечно вылезет много ошибок, которые таковыми не являются, зато и реальные отличия конфигурации поставщика будут видны.
(21) А еще никаких тонкостей не находили? Пробую у клиента поменять одну процедуру модуля документа объекта и одну функцию общего модуля. Вот функцию победил,а процедура упорно ругается на несоответствие кода. Ради теста полностью очистил модуль расширения, повторно добавил в расширение с директивой "Вызывать вместо (с контролем) и запустил (без вноса каких-либо правок). Все - равно ошибку выдает.
Помимо в расширение добавлены 2 реквизита и табличные части (только наименования без наполнения. в коде идет наполнение этих таблиц. может быть в них дело?
Если полностью очищаю модуль документа объекта в расширении, то ошибок не бьет.
Какие есть нюансы.
1. Не переносит переменные.
2. Не должно быть лишних пробелов и строк.
3. Режим совместимости выше 8.3.10 по идее, а платформа 8.3.15+.
Если не понятно в чем проблема, то берете программу для сравнения текстов. Я пользуюсь винмердж.
И сравниваете все посимвольно.
Находите отличие и исправляете руками.
На 1С:Предприятие 8.3 (8.3.16.1063)
Как не пытался экспортная клиентская процедура не меняется.
Если не вносить правок работает)) Но как я понял это косяк должны исправлять.
В итоге плюнул и сделал через вместо по старинке.
(28) Судя по всему, баг платформы - "Расширение методов конфигурации с помощью аннотации ИзменениеИКонтроль не работает, если вызов метода происходит на клиенте." По заверениям 1С, исправлено в 8.3.18, 8.3.15.1958, 8.3.16.1296, 8.3.17.1386
Может зависеть от режима совместимости основной конфигурации (и режима совместимости расширения) (скорее всего, если ниже 8.3.15, то не будет срабатывать "ИзменениеИКонтроль")
В параметрах расширения выставите галочки и поедет) сам долго пытался понять почему в одном расширении у меня заработало а в другом нет, пока не обнаружил связь ) после выставления галочек сделайте изменения в расширении(пробела будет достаточно) и примите их. После чего все работает)
(37) при определенных моментах при наличии ИзменениеИКонтроль в расширениях, невозможно обновить конфу... и на 17-й платформе в том числе
Был опыт неделю назад. Пока не вынес все эти криворукожопосделанные вставки и удаления, ни в какую не обновлялось... такая вот проза (((
Мож кто знает как после обновления найти все "Текст модуля для метода "" изменился" ? Проверки пименимости проходят, но режиме юзеров начинают вылазить Текст модуля для метода "" изменился.
Модули в расширении через &ИзменениеИКонтроль.
В идеале при обновлении основной конфы - обновлялись бы и куски кода оставшиеся оригинальными в расширении
Это просто полнейшая феерия!!!
Система вообще игнорирует фукнцию в расширении с директивой "&ИзменениеИКонтроль", если в основной конфигурации в строке объявления метода есть перенос строки!
НЕ БУДЕТ РАБОТАТЬ для метода в основной конфигурации:
Функция ВариантыОтветовДляВыполненияЗадачиПоПочте(
ЗадачаСсылка,
БизнесПроцессСсылка,
ТочкаМаршрута) Экспорт
Результат = Новый Структура;
...
КонецФункции
Но БУДЕТ РАБОТАТЬ для метода основной конфигурации:
Функция СформироватьТекстУведомленияПоЗадачеСВозможностьюВыполненияПоПочте(ЗадачаСсылка, ПолучательУведомления) Экспорт
// Получение файлов предметов задачи
Предметы = МультипредметностьКлиентСервер.ПолучитьМассивПредметовОбъекта(ЗадачаСсылка);
...
КонецФункции
Вывод: в моем случае я разрешил редактирование модулей и подкорректировал объявление необходимых методов без переноса строк как во втором представленном выше варианте. После этого переопределение методов в расширении с директивой "&ИзменениеИКонтроль" заработало как следует.
Дополнение:
1. Последующее изменение модуля основной конфигурации на исходный отрабатывает правильно: в режиме предприятия выводится уведомление об изменении соответствующего метода.
2. Вывод в (43) - это не единственное и не лучшее решение. Если вручную полностью скопировать метод, объявляемый в несколько строк (первый случай упомянутый в (43)) вместе со строкой, которая его объявляет, то механизм "&ИзменениеИКонтроль" также работает корректно, код переопределенного метода выполняется.
Данный метод в расширении успешно переопределит метод основной конфигурации:
&ИзменениеИКонтроль("ВариантыОтветовДляВыполненияЗадачиПоПочте")
Функция MY_ВариантыОтветовДляВыполненияЗадачиПоПочте(
ЗадачаСсылка,
БизнесПроцессСсылка,
ТочкаМаршрута) Экспорт
Результат = Новый Структура;
...
КонецФункции
https://its.1c.eu/db/v8315doc#bookmark:dev:TI000002149 Если проверка применимости расширений выполняется в конфигураторе, то результатом проверки будет сообщение об ошибки и возможность восстановить соответствие с методом конфигурации.
Для восстановления следует нажать гиперссылку в колонке Действие. В результате будет открыта форма трех-стороннего объединения модуля. В объединении будут участвовать:
● Оригинальный текст метода, который был в расширяемой конфигурации. Файл будет иметь имя ИмяМетод_RESTORED_.
● Текст метода из расширения (с директивами препроцессора). Файл будет иметь имя ПрефиксРасширенияИмяМетода.
● Текст метода, который сейчас находится в расширяемой конфигурации. Файл будет иметь имя ИмяМетод.
Результат объединения будет помещен в расширение. Если в конфигурации не настроено использование внешней программы для трехстороннего объединения ‑ восстановить соответствие с методом конфигурации будет невозможно. Внешняя программа, необходимая для объединения, указывается в свойстве Режим "Объединить с помощью внешней программы" в диалоге настройки параметров конфигуратора (Главное меню ‑ Сервис ‑ Параметры ‑ Сравнение/объединение ‑ группа Модули ‑ группа Обновление конфигурации на поддержке и актуализация расширения конфигурации). Это свойство не должно быть установлено в значение Не использовать.
То же столкнулась с проблемой, что расширение перестало работать. На сайте ИТС нашла эту статью. Возможно дело в том, что не настроено использование внешней программы для трехстороннего объединения. Только не понятно как настраивать ))
Также для аннотации &ИзменениеИКонтроль нельзя вписывать никакой код ВНЕ самих вставок.
Ну почему-же. Можно менять в расширении имена параметров в определении/заголовке заимствованной процедуры (количество параметров должно быть равно количеству в оригинальной процедуре). Я такое иногда использую чтобы передавать дополнительные параметры в перехваченные процедуры (если в оригинале нет параметра с типом структура или соответствие) - упаковав при вызове оригинальный параметр в структуру, а в принимающей модифицированной процедуре проверяю тип параметра для понимания, что вызов был с доп. параметрами. А переименование параметра в заголовке процедуры помогает сориентироваться в новой смысловой нагрузке
Оригинал
// Сообщает об ошибках проведения по регистру Запасы.
//
// Параметры:
// ДокОбъект - ДокументОбъект - проводимый документ,
// ВыборкаЗаписей - ВыборкаИзРезультатаЗапроса - выборка из результата запроса контроля остатков,
// Отказ - Булево - признак наличия ошибок.
// ОстаткиРезервов - ТаблицаЗначений - таблица остатков резервов интеркампани.
Процедура Запасы(ДокОбъект, ВыборкаЗаписей, Отказ, ОстаткиРезервов = Неопределено) Экспорт
Если ТипЗнч(ДокОбъект) = Тип("ДокументОбъект.ОтчетОРозничныхПродажах")
И НЕ Константы.КонтролироватьОстаткиПриПробитииЧековККМ.Получить() Тогда
ЗаголовокОшибки = НСтр("ru = 'Внимание:'");
Иначе
ЗаголовокОшибки = НСтр("ru = 'Ошибка:'");
КонецЕсли;
Показать
Расширение
//ОстаткиРезервов - ДополнительныеПраметры заменил имя переменной в расширении
&ИзменениеИКонтроль("Запасы")
Процедура РК_Запасы(ДокОбъект, ВыборкаЗаписей, Отказ, ДополнительныеПраметры = Неопределено) Экспорт
#Вставка
Если ДополнительныеПраметры = Неопределено или ТипЗнч(ДополнительныеПраметры) = Тип("ТаблицаЗначений") Тогда //стоковый вызов
ДатаКонтроляОстатков = ТекущаяДата();
ОстаткиРезервов = ДополнительныеПраметры; //Передаем оригинальный параметр
ИначеЕсли ТипЗнч(ДополнительныеПраметры) = Тип("Структура") Тогда //Значит из расширения вызываем
ДатаКонтроляОстатков = ДополнительныеПраметры.ДатаКонтроляОстатков;
ОстаткиРезервов = ДополнительныеПраметры.ОстаткиРезервов;//Передаем оригинальный параметр
КонецЕсли;
#КонецВставки
у меня проблема оказалась в том, что автоформатирование встроенного языка срабатывало. Я делал вставку посередине условия, те добавлял одну ветку ИначеЕсли и в этот момент код форматировался сам и была проблема, что текст модуля, мол, изменился. Решил отключением Встроенного языка, включением просто Текст, потом вставляем. все ок
Вдруг кому интересно, на 8.3.19.1467 глюк еще наблюдается, на 8.3.20.1710 и старше - уже нет. На данный момент актуальные платформы - 8.3.22.1709, 8.3.21.1624, 8.3.20.2184, 8.3.19.1726, 8.3.18.1959, 8.3.17.2760
1С:Предприятие 8.3 (8.3.20.1789)
Словил эту ошибку. Модули поменялись, в конфигураторе все сделал красиво. Но ошибка упорно появлялась, тогда подумал наверное кеш. Закрыл конфигуратор, открыл и все проверка прошла.
(66) ну это сродни динамическому обновлению конфигурации. Мы тоже перешли на 8.3.25. Но там это уже после всех обновлений. Словлю отпишу потом в поддержку, а то была слишком древняя платформа, чтобы писать.