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



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

23.11.2024 — Обновил текст обработки проверки, теперь можно использовать произвольное выражение, обновил обработку

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

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

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

Объект

Типы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Потом читаем его, и проверяем наличие в метаданных описанных типов простой процедуркой (как обычно огромное спасибо Николаю Гусеву ( //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 рассказал – т.е. печально…  Да и работать с регистром без наличия в измерениях регистра этого документа просто не получится – не начислит программа резерв правильно.

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

8 Comments

  1. seermak

    (0) под свои нужды скрестил Вашу обработку с http://infostart.ru/public/545418/ Причина: Заполнить шаблон сравнения проблема, а здесь только кнопки жми, да не забывай куда файлы соскладировал. Файл исправленной в прицепе

    Reply
  2. Alex_E

    (1) seermak, Круто, будет досуг посмотрю, но выкладывать вот так файлы — ИМХО моветон))))

    Reply
  3. Fox-trot

    (2) крутой моветон чо 😉

    Reply
  4. Alex_E

    (3) Fox-trot, Да мне то пофиг (мой код выложен в статье, а обработка так — для ленивых), но выложен файл, в котором код из публикации другого автора, а у него спросили?

    Reply
  5. seermak

    (1)раньше можно было убрать из коментов данные (на это и было рассчитано), но…((((( нажал на спам — может так удалиться

    Reply
  6. Alex_E

    (5) seermak, Это уже к модераторам))) Я то же не знаю как тут что убирать, да и…ещё раз — в этом случае я не против, но есть другой человек… А вообще — на будущее — это через личку лучше делать))))

    Reply
  7. ChessCat

    Способ контроля очень интересный.

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

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

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

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

    После обновления можно обновлять таблицу контроля типов субконто новыми значениями (если новые Типы добавлены в конфигурацию).

    Reply
  8. Alex_E

    (7) ChessCat, Обновил публикацию — теперь есть универсальный способ проверки — ввод произвольной строки с признаком «В1», например:

    В1:ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ДокументыРасчетовСКонтрагентами.ТипЗначения.СодержитТип(Тип(«ДокументСсылка.спво_ДоговорДолевогоУчастия»))

    без указания типа в колонке «Типы» (ДоговорДолевогоУчастия — самопальный документ, включенный в состав предопределеного субконто «ДокументаРасчетовСКонтрагентами»). Просто будет вычислено произвольное выражение, которое вернет или Истину или Ложь. Таким образом можно реализовать любую проверку…

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *