Проверка регистраторов при обновлении конфигурации

23.04.20

Задачи пользователя - Корректировка данных

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

При обновлении конфигурации поставщика может быть изменен состав движений документа. Если разработчиком в конфигурацию были добавлены свои регистры, и в качестве регистраторов выбраны документы основной поставки, то этот регистратор у них при этом слетит. Их надо восстановить вручную. Если забыть это сделать, то данные движений в рабочей базе будут утеряны. 

Также можно забыть восстановить слетевшие изменения в определяемых типах. 

Чтобы гарантировать себя от этой ситуации, я сделал проверку состава регистраторов для добавленных регистров. Она состоит из двух модулей - для клиентской и серверной части.

Серверный модуль выглядит так:

Процедура ПроверкаКонфигурации(Отказ) Экспорт
	
	Если Не РольДоступна("ПолныеПрава") Тогда
		возврат;
	КонецЕсли;
	
	ПроверитьРегистраторы_РегистраНакопления_мт_ВыполнениеПроизводственныхОпераций(Отказ);
	
	ПроверитьОпределяемыйТип_ВладелецПрисоединенныхФайлов(Отказ);
	ПроверитьОпределяемыйТип_ПрисоединенныйФайл(Отказ);
	ПроверитьОпределяемыйТип_ПрисоединенныйФайлОбъект(Отказ);
	
КонецПроцедуры

Процедура ПроверитьРегистраторы_РегистраНакопления_мт_ВыполнениеПроизводственныхОпераций(Отказ)
	
	МетаданныеРегистра = Метаданные.РегистрыНакопления.мт_ВыполнениеПроизводственныхОпераций;
	
	ТребуемыеРегистраторы = Новый Массив;
	ТребуемыеРегистраторы.Добавить(Метаданные.Документы.КорректировкаРегистров);
	ТребуемыеРегистраторы.Добавить(Метаданные.Документы.ПоступлениеОтПереработчика);
	ТребуемыеРегистраторы.Добавить(Метаданные.Документы.ПроизводственнаяОперация2_2);
	
	ПроверитьНаличиеРегистраторов(МетаданныеРегистра, ТребуемыеРегистраторы, Отказ);
	
КонецПроцедуры

Процедура ПроверитьОпределяемыйТип_ВладелецПрисоединенныхФайлов(Отказ)
	
	МетаданныеОпределяемогоТипа = Метаданные.ОпределяемыеТипы.ВладелецПрисоединенныхФайлов;
	
	ТребуемыеТипы = Новый Массив;
	ТребуемыеТипы.Добавить(Тип("ДокументСсылка.мт_АктОБраке"));
	ТребуемыеТипы.Добавить(Тип("ДокументСсылка.мт_СогласованиеОтклонений"));
	
	ПроверитьВхождениеТипов_в_ОпределяемыйТип(МетаданныеОпределяемогоТипа, ТребуемыеТипы, Отказ)
	
КонецПроцедуры

Процедура ПроверитьНаличиеРегистраторов(МетаданныеРегистра, ТребуемыеРегистраторы, Отказ)
	
	ТекстСообщенияОбОшибке = "";
	
	Для Каждого ОбъектМетаданных Из ТребуемыеРегистраторы Цикл
		
		Если НЕ ОбъектМетаданных.Движения.Содержит(МетаданныеРегистра) Тогда
			
			Если ТекстСообщенияОбОшибке = "" Тогда
				ТекстСообщенияОбОшибке = "В регистре "+МетаданныеРегистра.ПолноеИмя() + " не указаны регистраторы:"
			КонецЕсли;
			
			ТекстСообщенияОбОшибке = ТекстСообщенияОбОшибке + Символы.ВК + ОбъектМетаданных.Имя;
			Отказ = Истина;
			
		КонецЕсли;
		
	КонецЦикла;
		
	Если ЗначениеЗаполнено(ТекстСообщенияОбОшибке) Тогда
		ЗаписьЖурналаРегистрации("Проверка конфигурации", УровеньЖурналаРегистрации.Ошибка,,,ТекстСообщенияОбОшибке);
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщенияОбОшибке);
	КонецЕсли;
	
КонецПроцедуры

Процедура ПроверитьВхождениеТипов_в_ОпределяемыйТип(МетаданныеОпределяемогоТипа, ТребуемыеТипы, Отказ)
	
	ТекстСообщенияОбОшибке = "";
	
	Для Каждого Тип Из ТребуемыеТипы Цикл
		
		Если НЕ МетаданныеОпределяемогоТипа.Тип.СодержитТип(Тип) Тогда
			
			Если ТекстСообщенияОбОшибке = "" Тогда
				ТекстСообщенияОбОшибке = "В определяемом типе "+МетаданныеОпределяемогоТипа.ПолноеИмя() + " не указан тип:"
			КонецЕсли;
			
			ТекстСообщенияОбОшибке = ТекстСообщенияОбОшибке + Символы.ВК + Строка(Тип);
			Отказ = Истина;
			
		КонецЕсли;
		
	КонецЦикла;
		
	Если ЗначениеЗаполнено(ТекстСообщенияОбОшибке) Тогда
		ЗаписьЖурналаРегистрации("Проверка конфигурации", УровеньЖурналаРегистрации.Ошибка,,,ТекстСообщенияОбОшибке);
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщенияОбОшибке);
	КонецЕсли;
	
КонецПроцедуры

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

Процедура ПроверкаКонфигурации() Экспорт
	
	Отказ = Ложь;
	мт_ТестированиеКонфигурации_Сервер.ПроверкаКонфигурации(Отказ);
	
	Если Отказ Тогда
		
		ПоказатьПредупреждение(, "Обнаружены ошибки при проверке конфигурации (см. журнал регистрации)");
		
	КонецЕсли;
	
КонецПроцедуры

Функция вызывается при старте системы. Сообщение об ошибке будет выдано при запуске тестовой копии обновленной базы, и будет исправлено до того, как попадет в рабочую базу.

См. также

Исправление в 1С:ЗУП/ЗКГУ ошибок по НДФЛ и взаиморасчетам с сотрудниками на начало расчетного года.

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

Обработка исправляет технические ошибки по НДФЛ, взаиморасчетам с сотрудниками в 1С:ЗУП (1С:ЗКГУ) на начало года. Фактически все ошибки, которые проявляются в ведомостях на выплату, расчетных листках, при заполнении ведомостей на выплату и отчетах 6-НДФЛ и т.д. нужно начинать исправлять с начала расчетного года. Это позволит быть уверенными, что после завершения расчетов предыдущего года, начали работать с «чистого листа» без ошибочных остатков.

4800 руб.

06.10.2023    2330    28    15    

33

Тестирование и исправление ключей аналитики ERP, УТ11, КА

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

Незаменимая обработка для сопровождения конфигураций: ERP, УТ, КА. Позволяет вычистить многие ошибки в ключах аналитики, в ключевых справочниках конфигурации.

3600 руб.

10.02.2017    106818    634    173    

676

Ускоренное проведение документов (x4), устранение ошибок 60/62 счетов и зачет авансов (Бухгалтерия 3.0)

Закрытие периода Инструменты администратора БД Корректировка данных Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение «Оперативное проведение» в 4 раза уменьшает время проведения документов и закрытия месяца. Является комплексным решением проблем 62 и 60 счетов. Оптимизирует проведение при включенной функциональной опции «Раздельный учет НДС». Используется в более 10 организациях уже 2 года. Совместимо с конфигурацией Бухгалтерия 3.0 (+КОРП).

14400 руб.

29.04.2020    27385    79    146    

59

Исправление ошибки закрытия месяца "Обнаружены ненулевые остатки по суммам при нулевом остатке по количеству в регистре себестоимости по организации". УТ 11.4,УТ 11.5, КА 2.4,КА 2.5, ERP 2.4, ERP 2.5, КА 2 Казахстан, Управление торговлей 3 для Казахстана

Закрытие периода Корректировка данных Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 11 Управленческий учет Платные (руб)

Закрытие месяца - важный процесс в современных конфигурациях, таких как УТ 11.4, УТ 11.5, КА 2.4, КА 2.5 ERP 2.4,ERP 2.5, КА 2 Казахстан, УТ 3 Казахстан регламентные операции влияют на расчет себестоимости, и ошибки в данном расчете не дают картины деятельности организации.

2400 руб.

27.10.2021    22333    299    35    

71

SALE! 20%

Заполнение документа "Корректировка регистров" произвольными данными

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

Внешняя обработка, позволяющая произвольным образом заполнять документ "Корректировка регистров" Предназначена для использования в конфигурациях "Управление торговлей 11", "Управление небольшой фирмой", "ERP Управление предприятием", а также в других конфигурациях, в состав которых входит библиотека стандартных подсистем (БСП) версии 2.2+ и указанный выше документ.

2400 1920 руб.

13.07.2015    50169    171    29    

121
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. cleaner_it 220 26.04.20 16:09 Сейчас в теме
При обновлении конфигурации поставщика может быть изменен состав движений документа. Если разработчиком в конфигурацию были добавлены свои регистры, и в качестве регистраторов выбраны документы основной поставки, то этот регистратор у них при этом слетит. Их надо восстановить вручную.


Неправильно обновляли, раз в основной конфигурации состав движений был заменён на состав движений из конфигурации поставщика. Есть ведь возможность объединения состава движений.
2. ipoloskov 162 26.04.20 18:07 Сейчас в теме
(1) если поставщик исключил движение по определенному регистратору - при объединении состава движений, он будет удален?
4. cleaner_it 220 27.04.20 15:46 Сейчас в теме
(2)
регистратору


Останется. Не путайте конфигурацию поставщика и основную конфигурацию
6. ipoloskov 162 27.04.20 16:25 Сейчас в теме
(4) поэтому я и не использую режим объединения состава движений
3. GAS.tlt 5 26.04.20 18:14 Сейчас в теме
(1)
А теперь представте кейс:
Вам постоянно нужно обновлять 15 разных измененных больших конфигураций. И релизов нужно накатить не 1 а штук 5. Можно конечно на каждом этапе галочки проверять (15*5=75 раз ), а можно использовать метод автора, плюс написать в autoIT скрипт обновления который без пользователя работает и если уже движения слетели (это будет происходить очень редко) ты об этом узнаешь, откатишься на резервную копию и обновишь руками установив нужную галочку.
Автору жирный плюс. Буду использовать. (Жалко что я сам до этого не додумался)
5. cleaner_it 220 27.04.20 15:52 Сейчас в теме
(3) Автообновлениями не занимался) Если дописывать через расширения, подписки на события, и переопределяемые модули - то контролировать попросту нечего. А если лезть глубже - то никакому скрипту я обновление не доверю. Не один, и не два раза встречался, когда добавленная дописка теряет актуальность, и её нужно убрать, или переместить, или ещё немного дописать. Со старыми конфигурациями на обычных формах сложнее, конечно, но с другой стороны - там в последние годы ничего и не пишут особо.

Автору плюс в любом случае - разработка концептуальная, пригодиться может и в других случаях
wolfsoft; +1 Ответить
7. astratek 2 28.04.20 14:23 Сейчас в теме
Небольшое замечание, отрази в статье, что вызывать надо только при обновлении конфигурации, а не при каждом запуске системы.
8. ipoloskov 162 28.04.20 15:47 Сейчас в теме
(7) я думал вызывать только при обновлении. Но потом решил, что лучше при каждом запуске, чтобы проверялось и при обычной разработке. Тормозов это не добавляет, и вызывается только для ограниченного количества пользователей: только для тех, у кого полные права.
9. i.s.o 23.06.20 11:31 Сейчас в теме
Спасибо, возьму это на заметку.
Но, я пошел немного другим путем - для всех "моих" регистров есть один регистратор - это, скажем, ДокументРегистраторДляДополнийКонфигурации с реквизитом "ДокументИсточник" - ссылка на документ стандартной конфигурации. Также есть и другие необходимые мне реквизиты. Каждый "мой" регистр обязательно содержит измерение "ДокументИсточник" - ссылки на документы стандартной конфигурации.
Есть "свои" подписки на события, где описано для каких документов необходимо создавать документ ДокументРегистраторДляДополнийКонфигурации, и все дальнейшие действия происходят уже с этим документом. И всегда есть доступ к ДокументуИсточнику, и из ДокументаИсточника можно посмотреть движения по ДокументРегистраторДляДополнийКонфигурации для этого ДокументаИсточника (отдельно для форм при открытии формируются кнопки для этого, и то для пользователей, кому это необходимо).
Отдельно могу перепроводить ДокументРегистраторДляДополнийКонфигурации, совсем не затрагивая ДокументИсточник (только чтение его).
И при обновлении вообще никогда не сталкиваюсь с тем, что будут мои дополнения затронуты.
10. ipoloskov 162 24.06.20 12:23 Сейчас в теме
(9) я так сделал на одном проекте ERP. Потом отказался от этой схемы и переделал на обычную.
Причина в том, что однажды мне при проведении потребовались остатки на дату документа, естественно, без учета движений этого документа. На обычной схеме это делается просто: берем остатки по регистру на дату документа, и вычитаем движения по регистру этого документа. Запрос получается простой.

На схеме с отдельным документом мне нужно найти вспомогательный документ и вычесть его движения. Получился такой вот монстр:
	Если ПолучатьОстаткиПроверенныхОТКНаДату=Неопределено
		И ЗначениеЗаполнено(ИсключатьДвиженияДокумента) Тогда
		
		//В целом ряде документов движения по мт_ДеталиПроверенныеОТК делает другой документ, а именно мт_УчетОстатковСерийныхНомеров.
		ДвижениеПоРегистру_ДеталиПроверенныеОТК_ДелаетОтдельныйДокум­ент_УчетОстатковСерийныхНомеров = 
			ТипЗнч(ИсключатьДвиженияДокумента) <> Тип("ДокументСсылка.мт_СборочнаяВедомость");
		
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "ПОМЕСТИТЬ ВТ_ПрошлиПроверкуОТК", "ПОМЕСТИТЬ ВТ_ПрошлиПроверкуОТК_Предварительно");
		Запрос.УстановитьПараметр("ИсключатьДвиженияДокумента", ИсключатьДвиженияДокумента);
		
		Запрос.Текст = Запрос.Текст + ";
						|
	               		|////////////////////////////////////////////////////////////­////////////////////
						|ВЫБРАТЬ
						|	ВТ_ПрошлиПроверкуОТК_Предварительно.Номенклатура КАК Номенклатура,
						|	ВТ_ПрошлиПроверкуОТК_Предварительно.Характеристика КАК Характеристика,
						|	ВТ_ПрошлиПроверкуОТК_Предварительно.Серия КАК Серия,
						|	ВТ_ПрошлиПроверкуОТК_Предварительно.ПровереноОстаток КАК ПровереноОстаток,
						|	ВТ_ПрошлиПроверкуОТК_Предварительно.ГодныеОстаток КАК ГодныеОстаток
						|ПОМЕСТИТЬ ВТ_ПрошлиПроверкуОТК_Объединенная
						|ИЗ
						|	ВТ_ПрошлиПроверкуОТК_Предварительно КАК ВТ_ПрошлиПроверкуОТК_Предварительно
						|
						|ОБЪЕДИНИТЬ ВСЕ
						|
						|ВЫБРАТЬ
						|	мт_ДеталиПроверенныеОТК.Номенклатура,
						|	мт_ДеталиПроверенныеОТК.Характеристика,
						|	мт_ДеталиПроверенныеОТК.Серия,
						|	СУММА(ВЫБОР
						|			КОГДА мт_ДеталиПроверенныеОТК.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
						|				ТОГДА -мт_ДеталиПроверенныеОТК.Проверено
						|			ИНАЧЕ мт_ДеталиПроверенныеОТК.Проверено
						|		КОНЕЦ),
						|	СУММА(ВЫБОР
						|			КОГДА мт_ДеталиПроверенныеОТК.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
						|				ТОГДА -мт_ДеталиПроверенныеОТК.Годные
						|			ИНАЧЕ мт_ДеталиПроверенныеОТК.Годные
						|		КОНЕЦ)
						|ИЗ";
		
		Если ДвижениеПоРегистру_ДеталиПроверенныеОТК_ДелаетОтдельныйДокум­ент_УчетОстатковСерийныхНомеров Тогда
			
			Запрос.Текст = Запрос.Текст + "
						|	Документ.мт_УчетОстатковСерийныхНомеров КАК мт_УчетОстатковСерийныхНомеров
						|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.мт_ДеталиПроверенныеОТК КАК мт_ДеталиПроверенныеОТК
						|		ПО мт_УчетОстатковСерийныхНомеров.Ссылка = мт_ДеталиПроверенныеОТК.Регистратор
						|ГДЕ
						|	мт_УчетОстатковСерийныхНомеров.ДокументОснование = &ИсключатьДвиженияДокумента";
			
		Иначе
			
			Запрос.Текст = Запрос.Текст + "
						|	РегистрНакопления.мт_ДеталиПроверенныеОТК КАК мт_ДеталиПроверенныеОТК
						|ГДЕ
						|	мт_ДеталиПроверенныеОТК.Регистратор = &ИсключатьДвиженияДокумента";
			
		КонецЕсли;
		
		Запрос.Текст = Запрос.Текст + "
						|
						|СГРУППИРОВАТЬ ПО
						|	мт_ДеталиПроверенныеОТК.Номенклатура,
						|	мт_ДеталиПроверенныеОТК.Характеристика,
						|	мт_ДеталиПроверенныеОТК.Серия
						|;
						|
						|////////////////////////////////////////////////////////////­////////////////////
						|ВЫБРАТЬ
						|	ВТ_ПрошлиПроверкуОТК_Объединенная.Номенклатура КАК Номенклатура,
						|	ВТ_ПрошлиПроверкуОТК_Объединенная.Характеристика КАК Характеристика,
						|	ВТ_ПрошлиПроверкуОТК_Объединенная.Серия КАК Серия,
						|	СУММА(ВТ_ПрошлиПроверкуОТК_Объединенная.ПровереноОстаток) КАК ПровереноОстаток,
						|	СУММА(ВТ_ПрошлиПроверкуОТК_Объединенная.ГодныеОстаток) КАК ГодныеОстаток
						|ПОМЕСТИТЬ ВТ_ПрошлиПроверкуОТК
						|ИЗ
						|	ВТ_ПрошлиПроверкуОТК_Объединенная КАК ВТ_ПрошлиПроверкуОТК_Объединенная
						|
						|СГРУППИРОВАТЬ ПО
						|	ВТ_ПрошлиПроверкуОТК_Объединенная.Номенклатура,
						|	ВТ_ПрошлиПроверкуОТК_Объединенная.Характеристика,
						|	ВТ_ПрошлиПроверкуОТК_Объединенная.Серия";
		
	КонецЕсли;
Показать

А монстров я не люблю.
Кроме того, если возникает ошибка при проведении вспомогательного документа, ее оказалось трудно поймать.
11. Smirnov1980 7 28.06.21 05:39 Сейчас в теме
Как всегда, пока не клюнет, авось пронесет... не пронесло, последнее обновление УПП зачистило порядка 20 регистров на документах ПТУ и РТУ.., а тут предложено предупреждающее данную ситуацию решение.
Для исправления пришлось работать в выходные, писать обработку по переносу данных и за все года записи в регистрах с дампа переносить в рабочую. Никому не пожелаю.

Спасибо за статью. Внедрим у себя, администраторам полегче будет, "минное поле обновлений" теперь будет с предупреждением :).
12. Smirnov1980 7 28.06.21 09:30 Сейчас в теме
Определение не типовых регистров и их типовых регистраторов
13. ipoloskov 162 29.06.21 14:02 Сейчас в теме
Развитие этой идеи можно посмотреть на гитхабе:
https://github.com/poloskovi/testconfig
Оставьте свое сообщение