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

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 Программист Платформа 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    166940    336    278    

376

SALE! 15%

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

26280 руб.

12.06.2017    141996    802    297    

421

SALE! 10%

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

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

35000 31500 руб.

15.12.2021    24255    171    51    

130

SALE! 10%

Перенос данных 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.19.x).

35000 31500 руб.

23.07.2020    51744    229    70    

187

SALE! 10%

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

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена | Можно выполнить переход с УПП на БП 3 или запускать выгрузку данных за выбранный период времени | Переносятся документы, начальные остатки и вся справочная информация | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

48278 43450 руб.

25.02.2015    171364    304    257    

379

SALE! 10%

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

Правила переноса кадровых и расчетных данных и справочной информации из "1С:УПП1.3" или "1С:КА 1.1" в "1С:ЗУП 3.1 | Разработан в формате КД 2 (правила конвертации данных) | При выгрузке есть фильтр по организациям | Обновляется при выходе новых релизов 1С | Развитие алгоритмов | Расчетные документы переносятся в документ "Перенос данных" | Создаются документы "Начальная штатная расстановка" и "Начальная задолженность по зарплате", переносятся кадровые документы

55778 50200 руб.

29.10.2018    56350    60    105    

61

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    36784    95    66    

92

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

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

12000 руб.

25.09.2016    80938    315    250    

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

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