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