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

21.12.15

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Расширение
.zip 80,16Kb ver:1
19
19 Скачать (1 SM) Купить за 1 850 руб.

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

Начиная с 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 Бесплатно (free)

Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).

03.02.2025    5951    bayselonarrend    126    

59

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

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    7695    dsdred    57    

99

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

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    11411    bayselonarrend    21    

162

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

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

13.03.2024    7814    dsdred    18    

82

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

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

24.01.2024    26799    YA_418728146    33    

73
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. dock 45 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 76 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 536 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 Сейчас в теме
Если что в модуле формы есть процедура "КонтрольНеСогласованныхИзмененийОбработатьСобытиеПриИзменен­ии", туда и надо добавить новый реквизит, а также свою процедуру на событие "ПриИзменении"
Например:
ИначеЕсли Элемент.Имя = "Соглашение" Тогда
СоглашениеПриИзменении(Элемент);
13. kirilyan 25.01.25 16:52 Сейчас в теме
(12) Угу.. в основную конфигурацию? которая на поддержке и все такое?
в 2024 году нужно тащить в расширение процедуру Подключаемый_ПриИзменении_УстановитьДоступностьЭлементовПоСт­атусуСервер с аннотацией &Вместо, прописывать код для нужных элементов и дальше ПродолжитьВызов()
Оставьте свое сообщение