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

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_ПереопределитьОбработчикиПриИзменении();
	
КонецПроцедуры

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

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

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4506    dsdred    53    

71

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

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

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

24.01.2024    5286    YA_418728146    25    

63

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

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

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

11.12.2023    6408    dsdred    36    

111

1С-ная магия

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

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

06.10.2023    18470    SeiOkami    46    

118

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

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

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

14.09.2023    12086    human_new    27    

74

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

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

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

28.08.2023    8813    YA_418728146    6    

141

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

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

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

20.08.2023    6277    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

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

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15980    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
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 14 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 528 17.10.22 17:09 Сейчас в теме
Автор, дополните статью пожалуйста следующей информацией.

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

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

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

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

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

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

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

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

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

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


Теперь оба реквизита доступны для редактирования в форме документа.
Оставьте свое сообщение