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

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%

Перенос данных 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. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

27660 руб.

12.06.2017    145302    844    299    

437

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

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

35000 руб.

23.07.2020    55581    254    73    

208

SALE! 10%

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

Перенос документов, начальных остатков и справочной информации из УПП 1.3 в ERP 2 | из УПП 1.3 в УТ 11 | из УПП в КА 2 | Правила конвертации (КД 2) | Более 360 предприятий выполнили переход с использованием этого продукта! | Сэкономьте время - используйте готовое решение для перехода! | Позволяет перенести из УПП 1.3 в ERP / УТ 11 / КА 2 всю возможную информацию | В переносе есть фильтр по организации и множество других опциональных параметров выгрузки | Есть несколько алгоритмов выгрузки остатков на выбор

55778 50200 руб.

04.08.2015    170270    354    281    

390

SALE! 10%

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

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой

55778 50200 руб.

15.04.2019    73954    196    154    

135

SALE! 10%

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

Перенос данных из ERP в ЗУП 3 | из КА 2 в ЗУП | Готовые правила конвертации данных (КД 2) для переноса остатков, документов с движениями и справочной информации 3 | Есть перенос начальной задолженности по зарплате и начальной штатной расстановки на выбранную дату | Обороты за прошлые годы (данные для расчета среднего) переносятся свернуто в документ "Перенос данных" | Есть фильтр по организациям | Документы за текущий период переносятся сразу с движениями, поэтому не потребуется делать перерасчеты | Перенос можно проверить перед покупкой, обращайтесь!

53111 47800 руб.

03.12.2020    38121    106    69    

100

Перенос данных 1C Программист Бухгалтер Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет НДФЛ ФОМС, ЕФС Платные (руб)

Обработки для быстрого перехода с конфигураций «КАМИН:Расчет заработной платы 3.0», «КАМИН:Зарплата для бизнеса 4.0» и «КАМИН:Зарплата 5.0» на конфигурацию «Зарплата и управление персоналом» версии 3.1.

12000 руб.

25.09.2016    82643    342    253    

292

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

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

35000 руб.

15.12.2021    25878    183    55    

139

SALE! 10%

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

Правила переноса данных из БП 3.0 в УТ 11 | из БП 3.0 в КА 2 | из БП 3.0 в ERP | Сэкономьте свое время - используйте готовое решение для перехода! | Постоянно работаем над развитием переноса данных | Обновляем на новые релизы 1С | Есть фильтр выгрузки по организациям | Переносятся начальные остатки на выбранную дату, документы за период времени и вся возможная справочная информация | Перенос сделан на технологии КД 2 (правила конвертации данных) Воспользовались более 122 предприятий! |

55778 50200 руб.

31.10.2014    238451    105    338    

308
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. aspirator23 340 26.11.17 09:51 Сейчас в теме
РИБ и расширения - больная тема. В узлах они точно должны быть, если курс взят на расширения. Вероятно их все же включат в обмены. Но когда это произойдет неизвестно.
2. markers 278 26.11.17 12:18 Сейчас в теме
(1) Возможно-возможно и хоть и расширения сами по себе очень легкие (наше весит порядка 1.2 мб), но всё-же хотелось бы чтобы передавалась разница, а не целиком расширение. Но ждать когда это чудо произойдет, мы не можем. Тем-более мы всё ещё сидим на 8.3.8 ибо пока не можем перейти на более новые версии (не работает механизм авто установки новой версии тонкого клиента, скачивает и потом не устанавливает, а точек у нас много), хотя хотелось бы, в 8.3.9 и в 8.3.10 очень много вкусного есть, не говоря уже о 8.3.11
3. aspirator23 340 26.11.17 15:52 Сейчас в теме
(2) В 8.3.12 расширения через РИБ скорее всего не будет. Следовательно минимум год выкручиваться придется альтернативными способами.
4. markers 278 17.01.18 09:43 Сейчас в теме
(3) К слову, таки добавили
5. aspirator23 340 17.01.18 13:01 Сейчас в теме
9. wolder 133 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 278 11.06.19 11:47 Сейчас в теме
(7) Спасибо за замечание, у меня такое бывает ;) И хорошо что кому-то принес пользу ;)
10. wolder 133 11.02.20 06:32 Сейчас в теме
По своему опыту расскажу, что:
Имеем УТ 11.4.11.63 ЦБ была типовая :) так как для планаОбмена.СОтборами пришлось ставить галочку "Включать расширения конфигурации" и на самих расширениях ставить галочки "Используется в распределенной ИБ", только тогда удалось сформировать файл базы данных узла. Обмен между ЦБ и узлом пошел, всё хорошо, в узле есть расширения.
Но на этом проблема не закончилась, так как понятное дело, что в ЦБ придется делать модификации расширений и что-то дорабатывать в них. Так и получилось, внес изменения в расширения ЦБ, сохранил, жму кнопку "Синхронизация" и она мне выдает "Ошибка чтения файла сообщения обмена: Данные принимаются от узла с другим набором расширений, меняющих структуру данных.
Необходимо произвести перенос расширений конфигурации в узел.
{Обработка.КонвертацияОбъектовРаспределенныхИнформационныхБаз.МодульОбъекта( …. . .. . ….. );
по причине:
Данные принимаются от узла с другим набором расширений, меняющих структуру данных."
Необходимо произвести перенос расширений конфигурации в узел.
———————————————————————————-
Тут я поторопился, решил выгрузить расширения из ЦБ и загрузить в узел, но как вы уже успели догадаться это не возможно, так как конфигурация узла закрыта для изменений в том числе расширений. Т.е. нельзя загрузить расширения в узел.
Выполнять танцы с бубном по снятию признака узла бд, после обновить расширения, а затем вернуть признак узла, это крайне не удобно так как периодичность внесения изменений в ЦБ расширения будет огромная.
Т.е. тут нужно сразу понять, что сообщение об ошибках обмена началось ещё со стороны ЦБ в момент синхронизации с узлом. Очевидно это та самая ошибка по контрольной сумме версий конфигурации, из-за чего становиться физически очень сложный обмен РБД при наличии расширений конфигурации и дальнейших их модификаций. Причем и при не желании переносить расширения ЦБ в узлы, нам это приходится всё равно делать этот перенос с изменением и снятием с поддержки конфигурации ЦБ и установкой в план обмена переноса расширений, так и при наличии принудительного обмена расширениями они фактически не могут мигрировать между конфигурациями ЦБ и узла, так как появляется расхождение контрольной суммы. Фатальная ситуация.

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