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

23.04.20

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

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

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

60000 руб.

06.10.2023    4756    38    20    

45

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

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

14400 руб.

29.04.2020    34196    109    152    

75

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

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

3600 руб.

10.02.2017    111705    672    175    

711

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

Представьте, что есть система QR - кодирования, которая НЕ ТРЕБУЕТ изменения конфигурации, НЕ ТРЕБУЕТ изменения ни одной печатной формы для добавления QR-кода, включая внешние, НЕ ХРАНИТ данные штрихкодов и их связь, от чего база не "пухнет", ИМЕЕТ возможность закодировать в QR-коде произвольные данные параметров для последующей обработки полученных данных, УМЕЕТ прикреплять сканы, УМЕЕТ обработать считанный QR-код как ВЫ захотите. А также ХРАНИТ историю операций в обход базы для каждого пользователя в отдельности и УМЕЕТ работать с 2D - сканерами. А также автоматически распознавать отсканированные печатные формы (картинки или pdf-файлы) и выполнять заданные произвольные алгоритмы, в том числе прикрепление их к документам! Обновление 3.2 от 09.06.2024!

19200 руб.

26.08.2018    52741    16    61    

55

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

Вы наконец разобрались с закрытием месяцев и пора начать контролировать сроки оплаты поставщикам и задолженности клиентов, но в базе расчеты не идут из-за развернутого сальдо? Не беда, есть решение!

12000 руб.

02.11.2020    7625    6    0    

8

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

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

2400 руб.

13.07.2015    51482    175    29    

127

Корректировка данных Бухгалтер Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бухгалтерский учет Налоговый учет Налог на прибыль Платные (руб)

Обработка служит для: выравнивания бухгалтерского и налогового учета на определенную дату по выбранным счетам; закрытия остатков по выбранным счетам; обнуления налогового учета (ПР, ВР также будут обнулены)

2880 руб.

05.05.2024    739    11    0    

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


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


Останется. Не путайте конфигурацию поставщика и основную конфигурацию
6. ipoloskov 164 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 209 27.04.20 15:52 Сейчас в теме
(3) Автообновлениями не занимался) Если дописывать через расширения, подписки на события, и переопределяемые модули - то контролировать попросту нечего. А если лезть глубже - то никакому скрипту я обновление не доверю. Не один, и не два раза встречался, когда добавленная дописка теряет актуальность, и её нужно убрать, или переместить, или ещё немного дописать. Со старыми конфигурациями на обычных формах сложнее, конечно, но с другой стороны - там в последние годы ничего и не пишут особо.

Автору плюс в любом случае - разработка концептуальная, пригодиться может и в других случаях
wolfsoft; +1 Ответить
7. astratek 2 28.04.20 14:23 Сейчас в теме
Небольшое замечание, отрази в статье, что вызывать надо только при обновлении конфигурации, а не при каждом запуске системы.
8. ipoloskov 164 28.04.20 15:47 Сейчас в теме
(7) я думал вызывать только при обновлении. Но потом решил, что лучше при каждом запуске, чтобы проверялось и при обычной разработке. Тормозов это не добавляет, и вызывается только для ограниченного количества пользователей: только для тех, у кого полные права.
9. i.s.o 23.06.20 11:31 Сейчас в теме
Спасибо, возьму это на заметку.
Но, я пошел немного другим путем - для всех "моих" регистров есть один регистратор - это, скажем, ДокументРегистраторДляДополнийКонфигурации с реквизитом "ДокументИсточник" - ссылка на документ стандартной конфигурации. Также есть и другие необходимые мне реквизиты. Каждый "мой" регистр обязательно содержит измерение "ДокументИсточник" - ссылки на документы стандартной конфигурации.
Есть "свои" подписки на события, где описано для каких документов необходимо создавать документ ДокументРегистраторДляДополнийКонфигурации, и все дальнейшие действия происходят уже с этим документом. И всегда есть доступ к ДокументуИсточнику, и из ДокументаИсточника можно посмотреть движения по ДокументРегистраторДляДополнийКонфигурации для этого ДокументаИсточника (отдельно для форм при открытии формируются кнопки для этого, и то для пользователей, кому это необходимо).
Отдельно могу перепроводить ДокументРегистраторДляДополнийКонфигурации, совсем не затрагивая ДокументИсточник (только чтение его).
И при обновлении вообще никогда не сталкиваюсь с тем, что будут мои дополнения затронуты.
10. ipoloskov 164 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 164 29.06.21 14:02 Сейчас в теме
Развитие этой идеи можно посмотреть на гитхабе:
https://github.com/poloskovi/testconfig
Оставьте свое сообщение