Расширения конфигурации и РИБ, друзья или враги? Или как мы передаем расширения подчиненным РИБ узлам

11.06.19

Интеграция - Обмен между базами 1C

Читая комментарии к курсу касательно новых возможностей расширений конфигурации, которые привнес релиз 8.3.11, на одном из известных сайтов с курсами, я обратил внимание, что коллегам приходится отказываться от расширений из-за решения перейти на РИБ. Мы сами относительно недавно начали переходить на РИБ, и мы также активно пользуемся расширениями и в этой статье я хотел бы рассказать, как мы решили эту проблему.

Компания, в которой я в данный момент работаю, решила активно пользоваться расширениями, начиная с 8.3.8 для облегчения обновления 1С Розница, вынеся в расширения большую часть интерфейсных и не только модификаций. До недавнего времени, вся наша филиальная сеть магазинов работала напрямую через веб-сервер, но из-за того что покрытие интернетом не везде хорошее, стали постепенно задумываться о разворачивании РИБ узлов в таких проблемных магазинах и тут же встал вопрос, "Что делать с расширением?" и так как мы сделали обмен через веб-сервис, решили "А почему бы не передавать расширение узлу через веб-сервис?".

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

В нашем веб-сервисе мы добавили функцию "GetExtandedConfig" с параметрами:

  • Name, Направление передачи: Входящий, Тип: string - Имя расширения
  • Hash, Направление передачи: Входящий, Тип: string - Хеш установленного расширения либо Неопределено если не установлено
  • Result, Направление передачи: Выходной, Тип: boolean - Результат операции
  • Data, Направление передачи: Выходной, Тип: ValueStorage (http://v8.1c.ru/8.1/data/core) - Двоичные данные установленного расширения центральной базы (если изменений расширения нет, то Неопределено)
  • Функция возвращает тип: string - Описание проблемы, если таковая возникла

В коде функции мы написали это:

// Соответствует операции GetExtandedConfig
Функция ПолучитьРасширениеКонфигурации(ИмяРасширения, ХешСумма, Результат, ИсхДанные)

	УстановитьПривилегированныйРежим(Истина); // Пользователь вебсервиса не полноправный пользователь, компенсируем это
	
	Если ПустаяСтрока(ИмяРасширения) Тогда
		
		Результат = Ложь;
		Возврат "Не указано имя расширения!";
		
	КонецЕсли;
	
	Расширения = РасширенияКонфигурации.Получить(Новый Структура("Имя", ИмяРасширения)); // Ищем расширение по полученному имени
	
	Если Расширения.Количество() <= 0 Тогда
		
		Результат = Ложь;
		Возврат "Расширение по указанному имени не найдено!";
		
	КонецЕсли;
	
	ТребуемоеРасширение = Расширения[0];
	
	Если ПустаяСтрока(ХешСумма) или ХешСумма <> Base64Строка(ТребуемоеРасширение.ХешСумма) Тогда // Либо первое получение, либо расширение изменилось
		
		Результат = Истина;
		ИсхДанные = Новый ХранилищеЗначения(ТребуемоеРасширение.ПолучитьДанные()); // Сжимать смысла нет, только ресурсы тратить
		Возврат "Доступно обновление расширения";
		
	КонецЕсли;
	
	Результат = Истина;
	Возврат "Нет обновлений расширения";
	
КонецФункции // ПолучитьРасширениеКонфигурации()

На "клиентской" стороне, после обмена данными через веб-сервис, проверяем, есть ли изменения в расширении и код выглядит так:

Функция ДоступнаЗащитаОтОпасныхДействий() Экспорт

	СисИнфо = Новый СистемнаяИнформация;
	Возврат ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СисИнфо.ВерсияПриложения, "8.3.9.2033") >= 0;

КонецФункции // ДоступнаЗащитаОтОпасныхДействий()

Процедура ПроверитьИОбновитьРасширениеКонфигурации(ПроцессорОбмена) Экспорт

	// ПроцессорОбмена - WS-ссылка с установленным соединением
	
	ПоддержкаЗащитыОтОпасныхДействий = ДоступнаЗащитаОтОпасныхДействий(); // Проверим, поддерживает ли платформа защиту от опасных действий
	
	Попытка
		
		МассивОбновляемыхРасширений = Новый Массив;
		Расширения = РасширенияКонфигурации.Получить(); // Получаем список установленных расширений
		
		Для Каждого Расширение из Расширения Цикл
			
			МассивОбновляемыхРасширений.Добавить(Новый Структура("Имя, УникальныйИдентификатор, ХешСумма", Расширение.Имя, Расширение.УникальныйИдентификатор, Расширение.ХешСумма));
			
		КонецЦикла;
		
		Если МассивОбновляемыхРасширений.Количество() <= 0 Тогда // Если расширений в базе нет, добавляем в список "предопределенное" расширение, наше основное
			
			МассивОбновляемыхРасширений.Добавить(Новый Структура("Имя, УникальныйИдентификатор, ХешСумма", "Экстра", Неопределено, Неопределено));
			
		ИначеЕсли ОбменДаннымиСервер.ТребуетсяУстановкаОбновления() Тогда
			
			// Расширение уже есть, но сейчас требуется обновление конфигурации, по этому не будем пока обновлять расширение.
			// Сделано так, чтоб при первом запуске из начального образа базы, даже если есть изменения конфигурации,
			// расширение бы скачалось и установилось, а если расширение есть, то не качаем его пока не применим изменения.
			
		КонецЕсли;
		
		Для Каждого Расширение из МассивОбновляемыхРасширений Цикл
			
			Результат = Неопределено;
			ВходящиеДанные = Неопределено;
			
			// Делаем запрос к веб-сервису
			СообщениеОбмена = ПроцессорОбмена.GetExtandedConfig(Расширение.Имя, Base64Строка(Расширение.ХешСумма), Результат, ВходящиеДанные);
			
			Если Результат и Не ПустаяСтрока(СообщениеОбмена) Тогда
				
				// Получили положительный ответ и что не было сообщений, а так-же проверим, получили ли мы сами данные
				Если ВходящиеДанные = Неопределено Тогда
					
					Продолжить;
					
				КонецЕсли;
				
			Иначе 
				
				Сообщить("При получении обновления расширения: " + Расширение.Имя + " была получена ошибка: " + СообщениеОбмена);
				Продолжить;
				
			КонецЕсли;
			
			ДанныеРасширения = ВходящиеДанные.Получить(); // Получаем двоичные данные из хранилища значения
			
			// Получены данные расширения, обработаем
			Если Расширение.УникальныйИдентификатор = Неопределено Тогда // Расширение ещё не установлено
				
				РасширениеВБазе = РасширенияКонфигурации.Создать(); // Создаем новое расширение
				РасширениеВБазе.БезопасныйРежим = Ложь;
				
				Если ПоддержкаЗащитыОтОпасныхДействий Тогда
					
					РасширениеВБазе.ЗащитаОтОпасныхДействий.ПредупреждатьОбОпасныхДействиях = Ложь; // Отключаем защиту от опасных действий если поддерживается
					
				КонецЕсли;
				
			Иначе // Получаем уже установленное расширинение старой версии
				
				Раширения = РасширенияКонфигурации.Получить(Новый Структура("УникальныйИдентификатор", Расширение.УникальныйИдентификатор));
				
				Если Расширения.Количество() > 0 Тогда
					
					РасширениеВБазе = Расширения[0];
					
				КонецЕсли;
				
			КонецЕсли;
			
			Если РасширениеВБазе = Неопределено Тогда
				
				Сообщить("При обновлении раширения произошла ошибка, не удалось получить расширение: " + Расширение.Имя);
				Продолжить;
				
			КонецЕсли;
			
			// Проверим, можно ли без ошибок применить расширение
			ОшибкиВРасширении = РасширениеВБазе.ПроверитьВозможностьПрименения(ДанныеРасширения); // Возвращает ИнформацияОПроблемеПримененияРасширенияКонфигурации
			
			Если ОшибкиВРасширении.Количество() > 0 Тогда
				
				Сообщить("При проверке расширения " + Расширение.Имя + ", возникли ошибки:");
				
				// Покажем полный список ошибок
				Для Каждого Ошибка из ОшибкиВРасширении Цикл
					
					Сообщить("(" + Ошибка.Важность + ") " + Расширение.Имя + ": " + Ошибка.Описание);
					
				КонецЦикла;
				
				// Не будем его устанавливать
				Продолжить;
				
			КонецЕсли;
			
			// Всё хорошо! Обновляем расширение!
			РасширениеВБазе.Записать(ДанныеРасширения);
			Сообщить("Успешно обновлено расширение: " + Расширение.Имя + ", получена версия: " + РасширениеВБазе.Версия);
			
		КонецЦикла;
		
	Исключение
		
		Сообщить("Ошибка в процедуре обновления расширения: " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
		
	КонецПопытки;
	
КонецПроцедуры

Вот и всё! Но, как и в каждой бочке, и тут есть ложка дёгтя, о чем и хотелось отдельно упомянуть.

Проблемы механизма

Одна из главных проблем механизма, это то что он не связан тесно с передачей изменений конфигурации, а работает параллельно с ним и в связи с чем может возникнуть ситуация когда к примеру ещё не передан новый предопределенный элемент (Справочника, ПВХ и пр.), а обновленное расширение к нему уже обращается, и контроль "применимости" расширения не видит этой проблемы. Но я думаю, что это не существенная проблема, учитывая, сколько данный механизм решает проблем, да и после получения узлом недостающих данных, проблема уходит.

Заключение

Данный механизм не претендует на какую-либо уникальность, скорей желание показать, что и такую задачу можно разрешить достаточно простым способом. Также я хотел бы сказать, что этот механизм был сделан в спешке из-за наступления дедлайна на пятки и стоило добавить контроль минимальной версии конфигурации для того чтобы не возникло ситуации описанной выше да и качество кода оставляет желать лучшего.

Будут вопросы, обращайтесь!

PS: Если вы используете обмен через файлы (в той или иной вариации), то вы можете при отправке данных центральной базе, добавлять информацию о хеше установленного расширения, а центральной проверять эту добавку и по мимо полезных данных обмена, выгружать расширение актуальной версии. Практически так-же как и БСП добавляет свои данные в сообщение обмена. Ознакомится с примерами дополнения сообщения обмена своими данными, можно ознакомится в статье: https://its.1c.ru/db/metod8dev#content:2278:hdoc Кстати, 8.3.12 делает именно так, она передает полностью расширение, а не изменившуюся часть.

РИБ расширение конфигурации обновление расширения

См. также

SALE! 10%

Перенос данных из УПП 1.3 в ERP 2 / УТ 11 / КА 2. Переносятся документы, справочная информация и остатки

Обмен между базами 1C Платформа 1С v8.3 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Обработка позволяет перенести из УПП 1.3 в ERP / УТ 11 / КА 2 всю возможную информацию. Переносятся документы, а также начальные остатки и справочная информация. Есть фильтр по организации и множество других опциональных параметров выгрузки. Наши правила переноса в продаже с 2015 года, постоянно работаем над их развитием. Более 360 предприятий выполнили переход с использованием этого продукта. Оказываем техническую поддержку по всем вопросам проекта переноса данных из УПП 1.3.

50722 45650 руб.

04.08.2015    159267    363    266    

345

SALE! 10%

[ED3] Обмен для ERP 2.5, КА 2.5, УТ 11.5 БП 3.0, Розница, УНФ и других с EnterpriseData (универсальный формат обмена), правила обмена

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

25080 руб.

12.06.2017    134598    718    291    

387

Перенос данных из УПП 1.3 в БП 3.0. Переносятся документы (обороты за период), справочная информация и остатки

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.223.x) и БП 3.0 (3.0.149.x). Правила подходят для версии ПРОФ и КОРП.

28000 руб.

15.12.2021    20088    132    38    

90

SALE! 10%

Перенос данных из БП 3.0 в УТ 11 / КА 2 / ERP 2

Обмен между базами 1C Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Переносятся документы за выбранный период, нормативно-справочная информация и остатки по счетам бухгалтерского учета из программы "1С:БП 3.0" в "1С:УТ 11" или "1С:КА. 2" или "1С:ERP Управление предприятием, ред. 2".

50722 45650 руб.

31.10.2014    231092    124    326    

295

SALE! 10%

Перенос данных из ERP 2 / КА 2 в ЗУП 3

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Управленческий учет Платные (руб)

Обработка позволяет не только перенести все документы, справочную информацию и начальные остатки из ERP 2 или КА 2 в ЗУП 3, но и организовать регулярный перенос данных между программами 1С:ERP 2 / КА 2 и 1С:ЗУП 3. Вы можете выбрать период отбора данных и установить фильтр по организациям, чтобы выгружать только необходимую информацию. Более того, перенос оперативно обновляется при выходе новых релизов программы 1С, так что вы всегда будете иметь самую актуальную версию обработки.

48278 43450 руб.

03.12.2020    34033    80    57    

78

SALE! 10%

Перенос данных из ERP 2 / КА 2 / УТ 11 в БП 3.0

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос позволяет настроить собственный обмен данными между указанными программами, альтернативный предлагаемому фирмой 1С. Перенос данных осуществляется из 1С:ERP 2 / 1С:КА 2 / 1С:УТ 11 в 1С:БП 3.0. Правила обмена оперативно обновляются при выходе новых релизов программы 1С, так что вы всегда будете иметь самую актуальную версию обработки.

38500 34650 руб.

15.04.2019    68191    176    136    

108

Перенос данных из Парус 10 в ЗГУ ред.3

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Обмен между базами 1C Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    9155    9    8    

10

Перенос данных из УТ 10.3 в УТ 11.5. Переносятся документы (обороты за период), справочная информация и остатки

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 10 1С:Управление торговлей 11 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3 (10.3.87.x) и УТ 11.5 (11.5.16.x).

28000 руб.

23.07.2020    46019    194    64    

153
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. aspirator23 339 26.11.17 09:51 Сейчас в теме
РИБ и расширения - больная тема. В узлах они точно должны быть, если курс взят на расширения. Вероятно их все же включат в обмены. Но когда это произойдет неизвестно.
2. markers 274 26.11.17 12:18 Сейчас в теме
(1) Возможно-возможно и хоть и расширения сами по себе очень легкие (наше весит порядка 1.2 мб), но всё-же хотелось бы чтобы передавалась разница, а не целиком расширение. Но ждать когда это чудо произойдет, мы не можем. Тем-более мы всё ещё сидим на 8.3.8 ибо пока не можем перейти на более новые версии (не работает механизм авто установки новой версии тонкого клиента, скачивает и потом не устанавливает, а точек у нас много), хотя хотелось бы, в 8.3.9 и в 8.3.10 очень много вкусного есть, не говоря уже о 8.3.11
3. aspirator23 339 26.11.17 15:52 Сейчас в теме
(2) В 8.3.12 расширения через РИБ скорее всего не будет. Следовательно минимум год выкручиваться придется альтернативными способами.
4. markers 274 17.01.18 09:43 Сейчас в теме
(3) К слову, таки добавили
5. aspirator23 339 17.01.18 13:01 Сейчас в теме
9. wolder 129 11.02.20 04:32 Сейчас в теме
(5) А что толку то. Я вообще не хотел использовать расширения в узлах РИБ, на типовой УТ 11.4 но при синхронизации программа писала на существование расширений не участвующих в обмене РИБ (так как расширения имеют модификации и новые реквизиты справочников и документом)пришлось снимать с поддержки УТ и ставить галочку обмена в планеОбмена.СНастройками, так же поставил галочку на "Используется в распределенной ИБ" каждого расширения, сформировал базу узла, пошел обмен между узлом и ЦБ, а как только стал вносить изменения в расширения ЦБ, обмен вновь стал ругаться.
История описана вот тут: https://xn----1-bedvffifm4g.xn--p1ai/news/2018-04-19-transfer-of-extensions-to-peripheral-nodes/?comments#comment-821091
Так, что не на много все изменилось, да "косметические" расширения может и будут без проблем мигрировать, а вот с модификацией типовых объектов уже нет.
6. astrallight 06.08.18 05:06 Сейчас в теме
Хорошие новости! "Реализована возможность использования расширений конфигурации в распределенной информационной базе. Для плана обмена реализовано свойство ВключатьРасширенияКонфигурации.
Для расширения конфигурации реализованы свойства ИспользуетсяВРаспределеннойИнформационнойБазе и ГлавныйУзел. Источник: http://downloads.v8.1c.ru/content//Platform/8_3_12_1567/
misha226; +1 Ответить
7. psamt1k 11.06.19 08:19 Сейчас в теме
1. Дико извиняюсь за поднятие старой темы, но

ПоддеРжкаЗащитыОтОпасныхДействий

2. Спасибо, за механизм. Очень помогает (количество РИБ - порядка 10)
8. markers 274 11.06.19 11:47 Сейчас в теме
(7) Спасибо за замечание, у меня такое бывает ;) И хорошо что кому-то принес пользу ;)
10. wolder 129 11.02.20 06:32 Сейчас в теме
По своему опыту расскажу, что:
Имеем УТ 11.4.11.63 ЦБ была типовая :) так как для планаОбмена.СОтборами пришлось ставить галочку "Включать расширения конфигурации" и на самих расширениях ставить галочки "Используется в распределенной ИБ", только тогда удалось сформировать файл базы данных узла. Обмен между ЦБ и узлом пошел, всё хорошо, в узле есть расширения.
Но на этом проблема не закончилась, так как понятное дело, что в ЦБ придется делать модификации расширений и что-то дорабатывать в них. Так и получилось, внес изменения в расширения ЦБ, сохранил, жму кнопку "Синхронизация" и она мне выдает "Ошибка чтения файла сообщения обмена: Данные принимаются от узла с другим набором расширений, меняющих структуру данных.
Необходимо произвести перенос расширений конфигурации в узел.
{Обработка.КонвертацияОбъектовРаспределенныхИнформационныхБаз.МодульОбъекта( …. . .. . ….. );
по причине:
Данные принимаются от узла с другим набором расширений, меняющих структуру данных."
Необходимо произвести перенос расширений конфигурации в узел.
———————————————————————————-
Тут я поторопился, решил выгрузить расширения из ЦБ и загрузить в узел, но как вы уже успели догадаться это не возможно, так как конфигурация узла закрыта для изменений в том числе расширений. Т.е. нельзя загрузить расширения в узел.
Выполнять танцы с бубном по снятию признака узла бд, после обновить расширения, а затем вернуть признак узла, это крайне не удобно так как периодичность внесения изменений в ЦБ расширения будет огромная.
Т.е. тут нужно сразу понять, что сообщение об ошибках обмена началось ещё со стороны ЦБ в момент синхронизации с узлом. Очевидно это та самая ошибка по контрольной сумме версий конфигурации, из-за чего становиться физически очень сложный обмен РБД при наличии расширений конфигурации и дальнейших их модификаций. Причем и при не желании переносить расширения ЦБ в узлы, нам это приходится всё равно делать этот перенос с изменением и снятием с поддержки конфигурации ЦБ и установкой в план обмена переноса расширений, так и при наличии принудительного обмена расширениями они фактически не могут мигрировать между конфигурациями ЦБ и узла, так как появляется расхождение контрольной суммы. Фатальная ситуация.

Стал курить, читать и мельком наткнулся на сообщения коллег о разности поведения механизмов обмена между нажатием кнопки "Синхронизировать" и "Выполнить сценарий".
Удалил файлы обмена старые, нажал "Выполнить сценарий" в ЦБ - всё выгрузилось, т.е. модифицированное расширение выгрузилось в файл обмена для узла, и на узле уже с надеждой жал кнопку "Выполнить сценарий" вместо "Синхронизация" и загрузилось и по журналу регистрации было написано перезагрузить базу (узла) для принятия расширений, перегрузил, ещё раз запустил, опять кнопку "Выполнить сценарий" и всё, он прошел удачно!!!!
11. markers 274 11.02.20 07:50 Сейчас в теме
(10) Вы правы, в случае добавления объектов/реквизитов в расширении, обмен в РИБ работает паршиво. Сам с этим сталкивался из-за чего возвращался к старой классической схеме изменения конфигурации. Тут совет может быть только один - не создавать объекты и реквизиты в расширении (и не делать их модификации), только расширять формы, модули и пр. в общем то, что сложней всего обновить. Реквизиты и объекты, особенно новые, не создают больших проблем при обновлении.
12. malikov_pro 1288 14.11.20 20:57 Сейчас в теме
(11) Возможно ли вашу наработку оформить в виде расширения и опубликовать на github? Она частично связана с моим исследованием по доставке расширений до баз клиента (близкое к пакетнотному менеджеру). Не силен в РИБ, при этом предположу что можно организовать блокировку по получению нового пакета данных и наличия актуального расширения.
13. markers 274 15.11.20 03:41 Сейчас в теме
(12) да. С ссылкой на данную публикацию и автора. Так же скиньте потом ссылку на ваш GitHub. Спасибо!
14. malikov_pro 1288 15.11.20 08:53 Сейчас в теме
(13) https://github.com/malikov-pro/1c_transfer_extention, под Apache-2.0 License
Перенес код, с обвзякой в виде сервисов и обработок буду позже разбираться, созвместно с доставкой расширения в центральную базу.
Оставьте свое сообщение