Расширения конфигурации и Контроль несогласованных изменений

21.12.15

Разработка - Механизмы платформы 1С

Как обойти "контроль несогласованных изменений" при добавлении своих обработчиков в "расширения конфигурации".

Скачать исходный код

Наименование Файл Версия Размер
Расширение
.zip 80,16Kb
17
.zip 1 80,16Kb 17 Скачать

Речь пойдет о "расширениях конфигурации" и механизме "контроля несогласованных изменений".

Начиная с 8.3.6. появился новый механизм разработчиков "Расширения конфигурации".

Позволяет дорабатывать некоторые вещи, оставляя при этом конфигурацию типовой. 

В данном примере мы будет дорабатывать форму документа. 

Условная задача:  клиент хочет на форме документа одновлеменно видеть 2 ед.изм. и пересчет между ними.

Тестировалось на "Управлении торговлей" ред 11.2 и ERP 2.1

Итак, берем типовую демо базу УТ 11.2  ( в моем случае 11.2.2.116),  открываем конфигурацию.

Добавляем новое расширение (Конфигуратор - "Расширения конфигурации" - Добавить).

У нас открывается дополнительное окно конфигурации - если раскрыть дерево объектов, в нем ничего нет.

Возвращаемся в окно основной конфигурации добавляем объекты в наше расширение:

 - документы - заказы клиентов - форма документа - пкм - добавить в расширение (см. скрин №1)

при этом в расширение так же добавляется все объекты на которые есть ссылки в форме,

Если нам нужен реквизит, а его нет в расширении, значит, реквизит не выведен на форму, и его нужно принудительно добавить в расширение (возвращаемся в основную конфигурацию - на реквизит - пкм - добавить в расширение.

Теперь у нас в дереве конфигурации расширения появилась форма документа Заказ клиента

Открываем форму, добавляем в реквизиты формы в табличную часть Товары 2 реквизита формы  - "доп.ед.изм." и "кол-во доп.ед.изм." и привязываем к ним обработчики "При изменении".

(см. скрин №2)

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

Заходим в Заказ клиента и пробуем изменить наши доп. реквизиты - получаем ошибку "Внутренняя ошибка подсистемы контроля несогласованных изменений."

(см. скрин №3) 

Начинаем копать:

Происходит следующее

- "ПриСозданииНаСервере" и "ПриЧтенииНаСервере" вызывается  

   - процедура "ПриЧтенииСозданииНаСервере"  из нее вызывается

      - процедура "УстановитьДоступностьЭлементовПоСтатусуСервер"  в ней вызывается 

         - процедура ОбщегоНазначенияУТ.УстановитьПодпискуНаСобытияИзмененияЭлементовФормы

И вот эта чудесная процедура делает следующее: она пробегается по объектам табличной части товары и если находит обработчик при изменении она его переопределяет на свой - в форме документа процедура "Подключаемый_ПриИзменении_УстановитьДоступностьЭлементовПоСтатусуСервер"

Теперь на все обрабочики "при изменении" будет вызываться именно эта процедура !

А что делает эта процедура - она вызывает следующую 

"КонтрольНеСогласованныхИзмененийОбработатьСобытиеПриИзменении"

и вот эта процедура пробегается по списку объектов и обратно переназначает изначальные обработчики "при изменении", но только на тот список объектов который прописан в процедуре, все новые дают ошибку.

А происходит это, видимо, потому, что в процедуре "УстановитьДоступностьЭлементовПоСтатусуСервер" (см. 3 шаг выше) содержится строка 

МассивЭлементов.Добавить("Товары;ПередНачаломДобавления,ПередУдалением") 

и он обрабатывает все подчиненные объекты таблицы товары.

Как это обойти.

Если коротко, то после выполнения стандартных обработчиков мы переопределяем наши обработчики обратно

и удаляем из списка реквизитов контроля.

1) создаем процедуру переопределения

&НаСервере
Процедура Расш1_ПереопределитьОбработчикиПриИзменении()
	
	Если СтруктураДействийКонтрольНеСогласованныхИзменений <> Неопределено Тогда
		
		Если СтруктураДействийКонтрольНеСогласованныхИзменений.ПриИзменении.Свойство("ТоварыДопЕдИзм") Тогда
			СтруктураДействийКонтрольНеСогласованныхИзменений.ПриИзменении.Удалить("ТоварыДопЕдИзм");
		КонецЕсли;
		Если СтруктураДействийКонтрольНеСогласованныхИзменений.ПриИзменении.Свойство("ТоварыКоличествоДопЕдИзм") Тогда
			СтруктураДействийКонтрольНеСогласованныхИзменений.ПриИзменении.Удалить("ТоварыКоличествоДопЕдИзм");
		КонецЕсли;
				
	КонецЕсли;
	
	Элементы.ТоварыДопЕдИзм          .УстановитьДействие("ПриИзменении", "Расш1_ТоварыДопЕдИзмПриИзменении");
	Элементы.ТоварыКоличествоДопЕдИзм.УстановитьДействие("ПриИзменении", "Расш1_ТоварыКоличествоДопЕдИзмПриИзменении");
	
КонецПроцедуры

2) подключаем вызов 

- ПриСозданииНаСервере - после обработчика

&НаСервере
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
			
	УстановитьВыполнениеПослеОбработчиковСобытия("Расш1_ОбработчикСобытия_ПриСозданииНаСервере", Неопределено);	
	//после работы типового будет вызвана процедура  а из нее переопределение обработчиков
	
КонецПроцедуры

&НаСервере
Процедура Расш1_ОбработчикСобытия_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка, ДополнительныйПараметр)
	
	Расш1_ПереопределитьОбработчикиПриИзменении();
	
КонецПроцедуры


- ПриЧтенииНаСервере - перед обработчиком

&НаСервере
Процедура Расш1_ПриЧтенииНаСервере(ТекущийОбъект)	
	
	Расш1_ПереопределитьОбработчикиПриИзменении();
	//ПриЧтенииНаСервере будем вызывать переопределение перед типовой обработкой
	
КонецПроцедуры

 

- ОбработкаОповещения - после обработчика

 &НаКлиенте

Процедура Расш1_ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	УстановитьВыполнениеПослеОбработчиковСобытия("Расш1_ОбработчикСобытия_ОбработкаОповещения", Неопределено);
	//после работы типового будет вызвана процедура  а из нее переопределение обработчиков
	
КонецПроцедуры

&НаКлиенте
Процедура Расш1_ОбработчикСобытия_ОбработкаОповещения(ИмяСобытия, Параметр, Источник, ДополнительныйПараметр)	
	
	Расш1_ПереопределитьОбработчикиПриИзменении();
	
КонецПроцедуры

Пример расширения во вложении.

контроль несогласованных изменений расширения конфигурации

См. также

Сервисы интеграции без Шины и интеграции

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    3225    dsdred    16    

65

Как готовить и есть массивы

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    7520    YA_418728146    25    

69

Планы обмена VS История данных

Перенос данных 1C Механизмы платформы 1С Системный администратор Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    7762    dsdred    36    

115

1С-ная магия

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    20119    SeiOkami    46    

124

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Системный администратор Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    14051    human_new    27    

77

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    10421    YA_418728146    7    

148

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    7018    sebekerga    54    

99
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. dock 44 27.12.15 03:01 Сейчас в теме
Расширения - хороший инструмент...
Но вот почему у 1с без костылей никак ?...
2. ben_art 13 22.04.16 12:49 Сейчас в теме
Не могли бы вы подсказать , что сделать если после переопределения ошибка все равно воспроизводится , но только после записи документа ?
в не записанном или в вновь открытом нет ошибки.
Вопрос решился добавлением переопределения в процедуру "после записи"
3. nytlenc 28.09.16 07:59 Сейчас в теме
4. alexex 44 11.05.17 03:29 Сейчас в теме
Подробно, спасибо!
p.s. Аналогично допиливаю доп. ед. измерения для УТ 11, писал в тех. поддержку 1с, они не понимают для чего нужны доп. ед. изм., просили ПОЛНОСТЬЮ описать бизнес процесс предприятия, по мне быстрее допилить УТ чем вести бесполезную переписку и доказывать для чего необходим данный функционал.
5. rif-nrr 15 22.06.17 18:43 Сейчас в теме
Спасибо за отличный материал! Очень помогло, только пришлось команду УстановитьВыполнениеПослеОбработчиковСобытия заменить на саму процедуру Расш1_ПереопределитьОбработчикиПриИзменении - ругается что можно только из самой формы такое делать, а не из расширения
6. Suxar 31.08.17 16:28 Сейчас в теме
Спасибо за статью, кое что прояснилось.
Но подобные проблемы могут возникать не только при работе с расширениями.

Я правда по другому сделал, дописал КонтрольНеСогласованныхИзмененийОбработатьСобытиеПриИзменени­и()
7. sergey512 35 05.02.19 15:26 Сейчас в теме
Можно сделать проще. Переопределить функцию УФ УстановитьДоступностьЭлементовПоСтатусуСервер() используя тип вызова &Вместо. Скопировать весь код из переопределяемой функции и закомментить те элементы, контроль по которым необходимо отключить. Переопределить еще одну функцию УФ КонтрольНеСогласованныхИзмененийОбработатьСобытиеПриИзменени­и(Элемент) используя тип вызова &Вместо. Есть у такого способа один минус: при обновлении конфигурации нужно будет обновлять вручную переопределенную функцию УстановитьДоступностьЭлементовПоСтатусуСервер(). Проверяно на ERP 2.4.6.160.

&НаСервере
&Вместо("УстановитьДоступностьЭлементовПоСтатусуСервер")
Процедура st_УстановитьДоступностьЭлементовПоСтатусуСервер()
	// Вставить содержимое метода.
	//ПродолжитьВызов();
	
	УстановитьПодписку = Ложь;
	
	Если Объект.Статус = Перечисления.СтатусыЗаказовКлиентов.НеСогласован И ИспользоватьСтатусы Тогда
		
		УстановитьПодписку = Ложь;
		
	ИначеЕсли (Объект.Статус = Перечисления.СтатусыЗаказовКлиентов.НеСогласован И Не ИспользоватьСтатусы) 
		ИЛИ Объект.Статус = Перечисления.СтатусыЗаказовКлиентов.КОбеспечению
		ИЛИ Объект.Статус = Перечисления.СтатусыЗаказовКлиентов.КОтгрузке 
		ИЛИ Объект.Статус = Перечисления.СтатусыЗаказовКлиентов.Закрыт Тогда
		
			УстановитьПодписку = Объект.Согласован;
		
	КонецЕсли;
	
	МассивЭлементов = Новый Массив;
	
	// Элементы управления шапки
	МассивЭлементов.Добавить("Дата");
	МассивЭлементов.Добавить("Партнер");
	МассивЭлементов.Добавить("Соглашение");
	МассивЭлементов.Добавить("Валюта");
	МассивЭлементов.Добавить("ЦенаВключаетНДС");
	МассивЭлементов.Добавить("НалогообложениеНДС");
	МассивЭлементов.Добавить("Организация");
	МассивЭлементов.Добавить("Контрагент");
	МассивЭлементов.Добавить("Договор");
	МассивЭлементов.Добавить("Склад");
	МассивЭлементов.Добавить("ЖелаемаяДатаОтгрузки");
	МассивЭлементов.Добавить("НеОтгружатьЧастями");
	МассивЭлементов.Добавить("ДатаОтгрузки");
	МассивЭлементов.Добавить("ДатаСогласования");
	МассивЭлементов.Добавить("ХозяйственнаяОперация");
	МассивЭлементов.Добавить("КартаЛояльности");
	МассивЭлементов.Добавить("ВернутьМногооборотнуюТару");
	МассивЭлементов.Добавить("СрокВозвратаМногооборотнойТары");
	МассивЭлементов.Добавить("ТребуетсяЗалогЗаТару");
	
	// Элементы управления, связанные с таблицей Товары
	МассивЭлементов.Добавить("ТоварыНоменклатура");
	МассивЭлементов.Добавить("ТоварыХарактеристика");
	//МассивЭлементов.Добавить("ТоварыКоличествоУпаковок");  
	МассивЭлементов.Добавить("ТоварыУпаковка");
	МассивЭлементов.Добавить("ТоварыВидЦены");
	//МассивЭлементов.Добавить("ТоварыЦена");
	МассивЭлементов.Добавить("ТоварыСтавкаНДС");
	МассивЭлементов.Добавить("ТоварыПроцентРучнойСкидки");
	МассивЭлементов.Добавить("ТоварыСуммаРучнойСкидки");
	МассивЭлементов.Добавить("ТоварыСумма");
	МассивЭлементов.Добавить("ТоварыСуммаНДС");
	МассивЭлементов.Добавить("ТоварыСодержание");
	
	// Элементы управления шапки
	МассивЭлементов.Добавить("Товары;ПередНачаломДобавления,ПередУдалением;ТоварыДатаОтгрузки");
	
	МассивЭлементов.Добавить("ТоварыКонтекстноеМенюДобавить");
	МассивЭлементов.Добавить("ТоварыКонтекстноеМенюСкопировать");
	МассивЭлементов.Добавить("ТоварыКонтекстноеМенюУдалить");
	
	МассивЭлементов.Добавить("ТоварыДобавить");
	МассивЭлементов.Добавить("ТоварыИзменить");
	МассивЭлементов.Добавить("ТоварыСкопировать");
	МассивЭлементов.Добавить("ТоварыУдалить");
	
	МассивЭлементов.Добавить("ТоварыОткрытьПодбор");
	МассивЭлементов.Добавить("ТоварыДополнитьМногооборотнойТарой");
	МассивЭлементов.Добавить("ТоварыПоискПоШтрихкоду");
	МассивЭлементов.Добавить("ТоварыЗагрузитьДанныеИзТСД");
	МассивЭлементов.Добавить("ТоварыЗаполнитьСкладВВыделенныхСтроках");
	МассивЭлементов.Добавить("ТоварыЗагрузитьИзВнешнегоФайла");
	МассивЭлементов.Добавить("ТоварыСоставНабора");
	
	МассивЭлементов.Добавить("ТоварыЗаполнитьЦеныПоСоглашению");
	МассивЭлементов.Добавить("ТоварыЗаполнитьЦеныВыделенныхСтрокПоВидуЦен");
	
	МассивЭлементов.Добавить("СчитатьКартуЛояльности");
	МассивЭлементов.Добавить("СчитатьКартуЛояльностиКлиент");
	МассивЭлементов.Добавить("КартаЛояльности");
	МассивЭлементов.Добавить("ТоварыРассчитатьСкидкиНаценки");
	МассивЭлементов.Добавить("ТоварыОтменитьРучныеСкидки");
	МассивЭлементов.Добавить("ТоварыНазначитьРучнуюСкидку");
	МассивЭлементов.Добавить("ТоварыНазначитьРучнуюСкидкуВыделенныхСтрок");
	МассивЭлементов.Добавить("ТоварыНазначитьАвтоматическиеСкидки");
	
	ОбщегоНазначенияУТ.УстановитьПодпискуНаСобытияИзмененияЭлементовФормы(ЭтаФорма, МассивЭлементов, УстановитьПодписку);
	
КонецПроцедуры

&НаКлиенте
&Вместо("КонтрольНеСогласованныхИзмененийОбработатьСобытиеПриИзменен­ии")
Процедура st_КонтрольНеСогласованныхИзмененийОбработатьСобытиеПриИзмен­ении(Элемент)
	
	ПродолжитьСтандартныйВызов = Истина;
	
	Если Элемент.Имя = "Товарыst_КоличествоУпаковокПлан" Тогда
		st_Товарыst_КоличествоУпаковокПланПриИзмененииВместо(Элемент);
		ПродолжитьСтандартныйВызов = Ложь;
		
	ИначеЕсли Элемент.Имя = "Товарыst_Цена" Тогда
		st_Товарыst_ЦенаПриИзмененииВместо(Элемент);
		ПродолжитьСтандартныйВызов = Ложь;

	КонецЕсли;

	Если ПродолжитьСтандартныйВызов Тогда
		ПродолжитьВызов(Элемент);
	КонецЕсли;	
	
КонецПроцедуры
Показать
8. a_v_u 74 05.02.19 21:05 Сейчас в теме
(7) теперь да, можно проще, данный функционал появился кажется начиная с 8.3.10 или выше, раньше не было.
9. AllexSoft 10.12.19 12:30 Сейчас в теме
Зачем вообще нужен данный функционал Контроль несогласованных изменений? Ну например у нас отключено использование статусов в настройках.. какой смысл в этом всем? Выпилил этот бред вообще из нужных форм.
10. programmarket 28.05.21 12:22 Сейчас в теме
Из-а подобного бреда формы открываются так долго, что успеваешь попить чай.
11. Hatson 530 17.10.22 17:09 Сейчас в теме
Автор, дополните статью пожалуйста следующей информацией.

Для примера возьмем ERP 2.4 и документ Заказ переработчику

Задача: добавить 2 реквизита в табличную часть Материалы. Первый реквизит "Рекв_1" - вычисляемый, то есть добавляется только на форму в дерево реквизитов ТЧ на закладке "Реквизиты". Второй "Рекв_2" - хранимый, добавляется в дерево метаданных документа в ТЧ Материалы.

1) Размещаем оба реквизита на форме в соответствующей коллекции, получаем имена этих реквизитов на форме: МатериалыРекв_1, МатериалыРекв_2

2) Находим процедуру в модуле формы

Процедура УстановитьДоступностьЭлементовПоСтатусуСервер()

3) Находим строку

МассивЭлементов.Добавить("Материалы;ПередНачаломДобавления,ПередУдалением");

4) Заменяем ее на

МассивЭлементов.Добавить("Материалы;ПередНачаломДобавления,ПередУдалением;МатериалыРекв_1,МатериалыРекв_2");

То есть после ";" указываются имена элементов управления, которые необходимо исключить из проверки.


Теперь оба реквизита доступны для редактирования в форме документа.
12. BenDigget 12.04.24 13:21 Сейчас в теме
Если что в модуле формы есть процедура "КонтрольНеСогласованныхИзмененийОбработатьСобытиеПриИзменен­ии", туда и надо добавить новый реквизит, а также свою процедуру на событие "ПриИзменении"
Например:
ИначеЕсли Элемент.Имя = "Соглашение" Тогда
СоглашениеПриИзменении(Элемент);
Оставьте свое сообщение