gifts2017

Проверка измененной конфигурации перед обновлением "боевой" базы

Опубликовал Алексей Ермилов (Alex_E) в раздел Программирование - Инструментарий

Зачем всё это нужно? В принципе, не за чем, если подходить к обновлению изменённой типовой конфигурации ОЧЕНЬ внимательно, то проблем не будет. Если НЕ ОЧЕНЬ внимательно – то потеря данных весьма вероятна, причём выявиться может не сразу, через месяц – другой, что будет хоть и не фатально, но совсем неприятно. Выход - запретить обновление настроенной базы, если указанные типы (регистраторы, объекты для ввода на основании, составы и пр. пр. пр.) забыли включить в состав объектов конфигурации! 23.11.2016 - Обновил текст обработки проверки, теперь можно использовать произвольное выражение, обновил обработку

Тема внесения изменений в типовые обсуждалась не раз, и это тема не этого «романа», скажу только пару слов о том, что подход к изменениям типовой у всех разный. Зачастую внесённые изменения, даже добавлением «своих» объектов, ведут к изменению типовых объектов, в частности, типов реквизитов, составу ввода на основании, регистраторов и пр. пр. пр.

Простой пример, создан новый документ в Бухгалтерии предприятия (БП), который делает движения по счетам учета расчетов с контрагентами, и соответственно этот документ включен в Тип Плана видов характеристик Виды субконто хозрасчетные, также этот документ добавлен в тип  предопределенного субконто Документы расчетов с контрагентами. Всё красиво, но, пойдём дальше, этот документ нужно добавить ещё в ряд объектов типовой конфигурации, чтобы всё «пело и плясало» в лад – это реквизиты документов Корректировка долга, Поступления и списания с расчетного счета, ПКО, РКО, регистр сведений Резервы по сомнительным долгам… в принципе, достаточно для примера. Если при подготовке обновления при выходе типовой БП не забывать включать соответствующие «галки/палки», то всё будет красиво, если же что-то пропустить, и обновить «боевую» базу с отсутствующим в каком-то из объектов типом, то он благополучно из данных пропадёт, причём «молча». Обнаружить пропажу сразу не всегда получается  - у меня реально «очистился» реквизит Документ расчетов с контрагентом регистра сведений Расчет резервов по сомнительным долгам. Вылезло это при закрытии квартала, когда в начислении резерва полезли совершенно неадекватные цифры, и не с первого стакана разобрался, откуда ноги растут. Пример не про изменения типовой от «одинокого» прогера, а из Бухгалтерии строительной организации 2.0, которая является сути изменённой БП. В каком-то из обновления тип указать забыли. Восстановить конечно можно, но сейчас не об этом, не как восстанавливать, а как избежать такой беды.

Много лет просто вставлял в модули свой комментарий с напоминалкой добавить реквизит, и т.п. при обновлении, писал в описании и т.д. Случаи пропажи бывали всё равно, и в общем - то надоели, поэтому придумался такой метод. Создаём табличный документ из двух колонок, в котором добросовестно прописывам в первой колонке объекты для проверки, во второй, что проверяем:

Объект

Типы

КритерииОтбора.ДокументыПоДоговоруКонтрагента.Состав

Документы.ИмпФормированиеДолевогоВклада
Документы.ИмпАктПриемкиЗаконченногоСтроительствомОбъекта

Документы.КорректировкаДолга.ТабличныеЧасти.ДебиторскаяЗадолженность.Реквизиты.Сделка

ДокументСсылка.ИмпФормированиеДолевогоВклада

Документы.КорректировкаДолга.ТабличныеЧасти.КредиторскаяЗадолженность.Реквизиты.Сделка

ДокументСсылка.ИмпФормированиеДолевогоВклада

Документы.ПоступлениеНаРасчетныйСчет.ТабличныеЧасти.РасшифровкаПлатежа.Реквизиты.Сделка

ДокументСсылка.ИмпФормированиеДолевогоВклада

Документы.СписаниеСРасчетногоСчета.ТабличныеЧасти.РасшифровкаПлатежа.Реквизиты.Сделка

ДокументСсылка.ИмпФормированиеДолевогоВклада

Документы.ПриходныйКассовыйОрдер.ТабличныеЧасти.РасшифровкаПлатежа.Реквизиты.Сделка

ДокументСсылка.ИмпФормированиеДолевогоВклада

Документы.РасходныйКассовыйОрдер.ТабличныеЧасти.РасшифровкаПлатежа.Реквизиты.Сделка

ДокументСсылка.ИмпФормированиеДолевогоВклада

Документы.СчетФактураВыданный.ТабличныеЧасти.ДокументыОснования.Реквизиты.ДокументОснование

ДокументСсылка.ИмпАктПриемкиЗаконченногоСтроительствомОбъекта

РегистрыСведений.РасчетРезервовПоСомнительнымДолгам.Измерения.ДокументРасчетовСКонтрагентом

ДокументСсылка.ИмпФормированиеДолевогоВклада

По этому принципу включить свои изменения для проверки - в Колонке Объект - объект, в котором проверяем наличие, в колонке Типы, что проверяем

Потом читаем его, и проверяем наличие в метаданных описанных типов простой процедуркой (как обычно огромное спасибо Николаю Гусеву ( http://infostart.ru/profile/18469/ ), код практически его):

Процедура ПроверитьТипыНаСервере()
	СтрокаОшибки = "";
	ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
	Макет = ОбработкаОбъект.ПолучитьМакет("спво_ПроверитьТипы"); // x1c
	ТаблицаПроверки = ОбработкаОбъект.БДРС_ПолучитьДанныеИзМакета(Макет, "Таблица");
    Для Каждого стр Из ТаблицаПроверки Цикл
        _СтрокаОбъекта = стр.Объект;
        Если Лев (_СтрокаОбъекта, 1) = "#" Тогда
            // эта строка закомментирована
            Продолжить;
        КонецЕсли;
        Если ВРЕГ (Лев (_СтрокаОбъекта, 3)) = "В1:" Тогда
            // В1 - признак того, что нужно вычислить выражение
            // Если выражение выдает ошибку или результат выражения ЛОЖЬ, то фиксируется ошибка
            лРезультат = Ложь;
            лВыражение = Сред (_СтрокаОбъекта, 4);
            лОшибка = Ложь;
            Попытка
                лРезультат = Вычислить (лВыражение);
            Исключение
                лОшибка = Истина;
            КонецПопытки;
            Если (лРезультат = Ложь) ИЛИ лОшибка Тогда
                СтрокаОшибки = СтрокаОшибки + Символы.ПС + "Ошибка для " + _СтрокаОбъекта;
            КонецЕсли;
        Иначе    
            _ПозицияТочки = Найти(_СтрокаОбъекта, ".");
            _ПроверяемОбъект = Лев(_СтрокаОбъекта, _ПозицияТочки - 1);
            _ПроверяемИмя = Прав(_СтрокаОбъекта, СтрДлина(_СтрокаОбъекта) - _ПозицияТочки);
            _МассивПроверкиВхождений = спво_БДРС.БДРС_СтрокуВМассив(стр.Типы, Символы.ПС);
            Для Каждого _СтрокаМассива Из _МассивПроверкиВхождений Цикл
                Если Найти (ВРЕГ (_СтрокаОбъекта), "КРИТЕРИИОТБОРА.") = 1 Тогда
                    лСтрокаКодаСодержит = "Метаданные."+_СтрокаМассива;
                    лСтрокаКода1С = "Метаданные."+_СтрокаОбъекта+".Содержит (%1)";
                    лСтрокаКода1С = СтрЗаменить(лСтрокаКода1С, "%1", лСтрокаКодаСодержит);
                    лТест = Вычислить (лСтрокаКода1С);
                ИначеЕсли НЕ Найти (ВРЕГ (_СтрокаОбъекта), ".ВВОДИТСЯНАОСНОВАНИИ") = 0 Тогда
                    лСтрокаКодаСодержит = "Метаданные."+_СтрокаМассива;
                    лСтрокаКода1С = "Метаданные."+_СтрокаОбъекта+".Содержит (%1)";
                    лСтрокаКода1С = СтрЗаменить(лСтрокаКода1С, "%1", лСтрокаКодаСодержит);
                    лТест = Вычислить (лСтрокаКода1С);
                Иначе
                    лТест = Вычислить ("Метаданные."+_СтрокаОбъекта+".Тип.СодержитТип (Тип ("""+_СтрокаМассива+"""))");                
                КонецЕсли;
                Если Не лТест Тогда
                    СтрокаОшибки = СтрокаОшибки + Символы.ПС + "Для " + _СтрокаОбъекта + " не задан тип " + _СтрокаМассива + "!!!";                    
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
	Если Не СтрокаОшибки = "" Тогда
		ВызватьИсключение СтрокаОшибки;
	КонецЕсли;
КонецПроцедуры

Результатом выполнения которой не будет ничего, в случае наличия всех типов и т.п. в метаданных, или получим картинку с ошибками:

 

Потом принимаем волевое решение, откуда это дело вызывать. Вариантов много:

- можно создать обработку, включить её в состав изменённой конфигурации, и вызывать из общего модуля перед началом работы системы;

- табличный документ разместить в общем макете, процедуру в своём общем модуле, и опять же вызывать перед началом работы системы (я делаю именно так);

- сделать внешнюю обработку (пример прилагается) и запустить её на копии базы, в которой делаем обновление;

- как- нибудь ещё на Ваш выбор J

Правила заполнения табличного документы видно из примера, есть одно соглашение – строка, начинающаяся с # считается комментарием и не обрабатывается. В колонку «Типы» можно задать несколько проверяемых типов, каждый новый должен начинать с новой строки.

Пример внешней обработки на типовой БСО 3.0 (ничего личного, просто показать как это работает). Есть нетиповой для БП документ, добавленный в Виды субконто хозрасчетные :

 

Его же добавили в тип предопределённого субконто Документы расчетов с контрагентами:

 

А был ли этот документ в реквизите резервов по сомнительным долгам раньше проверять не буду, но вот сейчас (в релизе 3.0.40.3) его там нет:

 

Ежели до того он был, потом пропал, то будет так, как я выше про БСО 2.0 рассказал – т.е. печально…  Да и работать с регистром без наличия в измерениях регистра этого документа просто не получится – не начислит программа резерв правильно.

ИМХО, он должен присутствовать в перечисленных в табличном документе объектах. Запускаем обработку, и проверяем…

Скачать файлы

Наименование Файл Версия Размер
Проверка добавленных типов v 1.1 8
.epf 10,29Kb
23.11.16
8
.epf 1.0 10,29Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Сергей (seermak) 30.08.16 07:27
(0) под свои нужды скрестил Вашу обработку с http://infostart.ru/public/545418/ Причина: Заполнить шаблон сравнения проблема, а здесь только кнопки жми, да не забывай куда файлы соскладировал. Файл исправленной в прицепе
Прикрепленные файлы:
ПроверкаДобавленныхТипов.epf
2. Алексей Ермилов (Alex_E) 30.08.16 07:33
(1) seermak, Круто, будет досуг посмотрю, но выкладывать вот так файлы - ИМХО моветон))))
3. Канат Джумадылов (Fox-trot) 30.08.16 08:15
(2) Alex_E, крутой моветон чо ;-)
4. Алексей Ермилов (Alex_E) 30.08.16 08:30
(3) Fox-trot, Да мне то пофиг (мой код выложен в статье, а обработка так - для ленивых), но выложен файл, в котором код из публикации другого автора, а у него спросили?
5. Сергей (seermak) 30.08.16 08:44
(1)раньше можно было убрать из коментов данные (на это и было рассчитано), но...((((( нажал на спам - может так удалиться
6. Алексей Ермилов (Alex_E) 30.08.16 10:22
(5) seermak, Это уже к модераторам))) Я то же не знаю как тут что убирать, да и...ещё раз - в этом случае я не против, но есть другой человек... А вообще - на будущее - это через личку лучше делать))))
7. Дмитрий Иванов (ChessCat) 23.11.16 16:44
Способ контроля очень интересный.

На мой взгляд можно усилить этот контроль.

Добавить таблицу в которой будут все включенные Типы в ПланеВидов Характеристик.ВидыСубконтоХозрасчетные

И сравнивать при обновлении конфигурации изменения в этих типах.

Смысл - нас интересует чтобы случайно при обновлении не была снята галочка по Типу используемому в проводках (что приведет к тому что в проводках движения по этому субконто очистятся).

После обновления можно обновлять таблицу контроля типов субконто новыми значениями (если новые Типы добавлены в конфигурацию).
8. Алексей Ермилов (Alex_E) 23.11.16 17:42
(7) ChessCat, Обновил публикацию - теперь есть универсальный способ проверки - ввод произвольной строки с признаком "В1", например:
В1:ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ДокументыРасчетовСКонтрагентами.ТипЗначения.СодержитТип(Тип("ДокументСсылка.спво_ДоговорДолевогоУчастия"))
без указания типа в колонке "Типы" (ДоговорДолевогоУчастия - самопальный документ, включенный в состав предопределеного субконто "ДокументаРасчетовСКонтрагентами"). Просто будет вычислено произвольное выражение, которое вернет или Истину или Ложь. Таким образом можно реализовать любую проверку...
ChessCat; +1 Ответить