Выход — запретить обновление настроенной базы, если указанные типы (регистраторы, объекты для ввода на основании, составы и пр. пр. пр.) забыли включить в состав объектов конфигурации!
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 рассказал – т.е. печально… Да и работать с регистром без наличия в измерениях регистра этого документа просто не получится – не начислит программа резерв правильно.
ИМХО, он должен присутствовать в перечисленных в табличном документе объектах. Запускаем обработку, и проверяем…
(0) под свои нужды скрестил Вашу обработку сhttp://infostart.ru/public/545418/ Причина: Заполнить шаблон сравнения проблема, а здесь только кнопки жми, да не забывай куда файлы соскладировал. Файл исправленной в прицепе
(1) seermak, Круто, будет досуг посмотрю, но выкладывать вот так файлы — ИМХО моветон))))
(2) крутой моветон чо 😉
(3) Fox-trot, Да мне то пофиг (мой код выложен в статье, а обработка так — для ленивых), но выложен файл, в котором код из публикации другого автора, а у него спросили?
(1)раньше можно было убрать из коментов данные (на это и было рассчитано), но…((((( нажал на спам — может так удалиться
(5) seermak, Это уже к модераторам))) Я то же не знаю как тут что убирать, да и…ещё раз — в этом случае я не против, но есть другой человек… А вообще — на будущее — это через личку лучше делать))))
Способ контроля очень интересный.
На мой взгляд можно усилить этот контроль.
Добавить таблицу в которой будут все включенные Типы в ПланеВидов Характеристик.ВидыСубконтоХозрасчетные
И сравнивать при обновлении конфигурации изменения в этих типах.
Смысл — нас интересует чтобы случайно при обновлении не была снята галочка по Типу используемому в проводках (что приведет к тому что в проводках движения по этому субконто очистятся).
После обновления можно обновлять таблицу контроля типов субконто новыми значениями (если новые Типы добавлены в конфигурацию).
(7) ChessCat, Обновил публикацию — теперь есть универсальный способ проверки — ввод произвольной строки с признаком «В1», например:
без указания типа в колонке «Типы» (ДоговорДолевогоУчастия — самопальный документ, включенный в состав предопределеного субконто «ДокументаРасчетовСКонтрагентами»). Просто будет вычислено произвольное выражение, которое вернет или Истину или Ложь. Таким образом можно реализовать любую проверку…