1с при обновлении не показывает изменения
Процесс ручного обновления нетиповой 1С довольно длительный и напряженный. Часто исполнитель теряет на каком-либо этапе концентрацию внимания и допускает иногда глупые, а иногда очень серьезные ошибки.
Рассмотрим самые распространенные технические и методологические ошибки при обновления нетиповых конфигураций.
Ошибки перед обновлением
Первое правило администратора — сделать архив. Второе — проверить сделали или нет архив.
И, не смотря на это, самая распространенная и типичная ошибка — отсутствие резервной копии.
Ошибки в процессе обновления нетиповой 1С
- Часто нетиповую конфигурацию обновляют как типовую и все изменения, ранее внесенные в рабочую конфигурацию, исчезают.
- Ошибка, которую совершают практически все — после подготовки новой конфигурации ее сразу устанавливают на рабочую базу. Всегда не хватает времени, надо сделать что-то более срочное и важное и т.д. А первое что необходимо сделать после создания обновленной конфигурации — обновить на нее копию рабочей базы и протестировать все изменения и функционал из новой типовой конфигурации, корректность обновления данных информационной базы.
- При обновлении конфигураций платформы «1С: Предприятие 7.7», конфигуратор не показывает изменения свойств элементов управления диалоговых форм. Очень часто эти доработки не переносятся из-за невнимательности, и в обновлённой конфигурации будут ошибки.
- Обновляют все модули и формы, а права пользователей и интерфейсы — не обновляют.
- Обновление конфигурацию не последовательно через все контрольные релизы, а сразу на последний релиз новой типовой конфигурации. Возможно, это закончится тем, что важные данные исчезнут из информационной базы. Так же очень важно после обновления на все контрольные релизы запускать встроенную обработку обновления конфигурации — она часто выполняет различные конвертации данных и необходимые заполнения информацией.
- Часто забывают обновить или теряются внешние печатные формы и обработки.
Ошибки после обновления нетиповой конфигурации
- После обновления конфигурации необходимо обязательно прочитать историю изменений. Конфигурация стала работать по другому и для ее корректной работы может потребоваться какая то дополнительная настройка.
- Часто после обновления конфигуратор не даёт обновить конфигурацию информационной базы на новую конфигурацию, потому что коды и номера документов становятся неуникальным. Так же распространена проблема при обновлении регистров сведений — наборы записей так же становятся не уникальными. Варианты решения — перебить коды в информационной базе, изменить длину номера или кода, отключение контроля уникальности в справочниках, изменить свойство контроля уникальности справочника — по группе или во всём справочнике.
- После обновления форм в «1С: Предприятие 8.х» обязательно надо проверять как работают привязки, очень часто они перестают работать правильно.
- Возможная ошибка — потеря данных, после обновления. Это может произойти, если внутренние идентификаторы объектов или реквизитов в рабочей и обновленной конфигурации не совпадают.
12 статей про обновление 1С
Типовую программу 1С легко обновить самостоятельно через конфигуратор или интернет. Ещё один способ — использовать cfu-файл. Если пропущено много релизов, вам сэкономят время промежуточные конфигурации.
После обновления не забывайте запустить особые процедуры.
Бывает выгоднее отдать обновление нетиповой 1С на аутсорсинг.
Что нового для вашей 1С?
Рассылка осуществляется в день выхода обновления. Никакой рекламы, только полезная информация. Посмотрите пример →
Если я внесу изменения в типовую конфигурацию(добавлен еще один реквизит в документ платежное поручение и сделан отчет), то при следующем обновлении, все эти изменения удалятся. Недавно снова столкнулся с данной проблемой, начисто забыл способ решения. Можно просто после обновления внести изменения, но есть вроде бы какой-то более эффективный способ.
Реквизит совершенно левый, надо просто показать какие платежи были проведены по счетам с подписью директора, а какие согласованы по телефону, либо просто технические платежи.
А обновляю путем объедения конфигураций. Просто если изменений будет много, боюсь зависну с обновлениями каждого объекта.
может проще директор сам будет проводить платежи в банк-клиенте ?
zak555 - тролль.
Toall: Пожаловаться модеру можно, или самому опускать придется?
При вводе платежного поручения, бухгалтером делается отметка, на основании чего был отправлен платеж, в любом случае надо изменять форму создания платежного поручения, потому что никто ничего в конце недели помнить не будет.
Про выгрузки и директора - хорошо. Еще хороший совет - научить директора самому смотреть по платежным поручениям, подписывал он счет или нет.
(10) смысл контроля этого ?
он нужен для директора ?
тогда бух может наипать директора с этим контролем и всё
у каждого документа есть реквизит "комментарий" и будет, полагаю, всегда. Пиши туда кодовое слово/букву, потом шерсти, сколько влезет, своим отчетом. как всегда прыжки в ширину от неумения пользоваться типовыми..
насчет тролля - мал еще решать еще - палочка не выросла
Если ты внесешь изменения в типовую конфигурацию, то она уже не будет типовой.
Читай "обновление не типовых конфигураций"
Понятно. Я тебе сочувствую.
zak555 - типичная ошибка типичного ламера. Тебя не просят помочь налаживать бухгалтерский учет, тебя просят ответить на чисто технический вопрос. А вот как уж выстраивать отношения программист-директор-бухгалтер, это тема для отдельного топика.
//у каждого документа есть реквизит "комментарий" и будет, полагаю, всегда.
Думал над этим.
Формировать запись придется все равно специфическую, потому что поле комментарий иногда заполняется для технических нужд. В таком случае придется, при выведении отчета, проверять поле комментарий на наличие фрагмента подпись есть. Поэтому надо изменить форму самого документа. При обновлении одна созданная кнопочка на форме просто уйдет. В одной форме вручную изменить быстро. Если еще изменения вносить в другие формы, то большое количество задолбаешься отслеживать.
//Если ты внесешь изменения в типовую конфигурацию, то она уже не будет типовой.
О. То есть добавление ОДНОЙ конопки на форме делает конфигурацию НЕтиповой. Отлично.
Неужто никто не придумал внешнюю утилиту, для фиксирования самостоятельных изменений? Вроде есть приблуды для внешнего редактирования файла метаданных.
(18) "Неужто никто не придумал внешнюю утилиту, для фиксирования самостоятельных изменений" - есть. Назывется "программист". Стоит некоторых денег.
На Инфостарте присутствует довольно большое количество хороших статей про обновление нетиповых конфигураций, как на поддержке, так и без. Надеюсь, что данная статья также будет полезна тем, у кого еще не достаточно опыта для обновления нетиповых конфигураций, особое внимание уделено обновлению нетиповых форм.
Рассмотрим обновление на примере нетиповой конфигурации УПП 1.3 находящейся на поддержке с возможностью изменения с релиза 1.3.61.2 на релиз 1.3.62.1. Так как конфигурация сама по себе довольно тяжелая, то это накладывает некоторые особенности, в частности, не всегда получается открыть в одном конфигураторе несколько окон сравнения конфигурации.
Для обновления я использую две одинаковые копии базы данных старого релиза. В одной из них выполняю подготовку *.cf для обновления, назовем ее, например, for_updating. Другая база остается не тронутой и служит только как вспомогательная, для сравнения конфигураций, назовем ее base. В принципе, в качестве вспомогательной может использоваться конфигурация рабочей базы.
В базе for_updating выполняем «Конфигурация» – «Поддержка» – «Обновить конфигурацию», в открывшемся окне выбираем *.cfu нового релиза. Начинается процедура обновления, в результате которой появляется окно обновления.
Нажать кнопку «Выполнить», на данном этапе нет пока необходимости что-либо смотреть, так как целью является лишь получение конфигурации поставщика нового релиза.
В процессе обновления может появиться окно «Неразрешимые ссылки», нажимаем «Продолжить». О причинах появления данного окна поговорим ниже.
Откроется окно «Настройка правил поддержки» - для новых объектов (верхний раздел) с обеих сторон ставим «Объект редактируется с сохранением поддержки», для существующих объектов поставщика (нижний раздел) во всех четырех местах ставим флаг «Сохранять текущий режим», нажимаем «ОК».
Произошло обновление основной конфигурации. Сама по себе основная конфигурация на данном этапе нам не нужна, цель – получение новой конфигурации поставщика. Поэтому основную конфигурацию не сохраняем, конфигурацию базы данных не обновляем.
Выполняем «Конфигурация» – «Поддержка» – «Настройка поддержки». В открывшемся окне выбираем «Сохранить в файл» и сохраняем в *.cf конфигурацию поставщика нового релиза.
Основная конфигурация в том виде, в котором она на данный момент имеется, нам не нужна. Закрываем конфигурацию. «Конфигурация» - «Закрыть конфигурацию». Отказываемся от сохранения изменений.
В конфигурации для сравнения base запускаем сравнение конфигурации поставщика (старый релиз) и конфигурации поставщика из файла (новый релиз).
Таким образом, мы увидим только те изменения, которые будут выполнены в конфигурации при обновлении на новый релиз.
В базе for_updating снова запускаем обновление конфигурации через поддержку «Конфигурация» – «Поддержка» – «Обновить конфигурацию», в открывшемся окне выбираем *.cfu нового релиза. Начинается процедура обновления, в результате которой появляется окно обновления.
При нажатии на кнопку «Фильтр» откроется окно «Настройка фильтров просмотра». В данном окне устанавливаем флаг «Показывать только дважды измененные свойства».
При обновлении без нашего вмешательства происходит следующее:
- - объект не изменен нами, изменен в новом релизе – обновляется из нового релиза;
- - объект изменен нами, не изменен в новом релизе – остается наш объект;
- - объект изменен нами, изменен в новом релизе – это и есть дважды измененный объект, если ничего не менять – он загрузится из нового релиза.
Таким образом, наиболее пристальное внимание следует уделить именно дважды измененным объектам, их и будем рассматривать.
В данном примере изменено несколько общих модулей, в том числе и общий модуль « УчетНДС ».
По умолчанию в окне обновления показаны отличия основной и новой конфигурации поставщика от старой конфигурации поставщика.
Если посмотреть различия конфигураций в общем модуле «УчетНДС», то мы увидим следующую картину:
Если же сравнить эти модули в базе для сравнения base , то картина будет другая:
Очевидно, что функции «СобратьДанныеДляПечатиИсправленияСчетаФактуры», «СобратьДанныеДляПечатиКорректировочногоСчетаФактуры» и прочие содержат наши доработки, но не меняются при обновлении, а значит, нет смысла тратить время на их просмотр и анализ.
Поэтому, выполняя по процедурное обновление с выделенных процедур и функций можно снять флаги:
Многие скажут, что увидеть отличия старой конфигурации поставщика от новой можно с помощью изменения настройки фильтров просмотра в текущем конфигураторе, не используя сравнение конфигураций в базе base .
Однако, как показывает практический опыт это не так, процедуры и функции все равно отображаются в окне сравнения модулей, даже при установленном фильтре «показывать отличия новой конфигурации поставщика от старой конфигурации поставщика».
Сделав не большое мысленное усилие, выявим дважды измененные процедуры и функции, только они будут нуждаться в доработках после процесса объединения. С данными процедурами и функциями нужно определиться, что легче:
- - либо взять процедуру или функцию из новой конфигурации поставщика и потом, после объединения, внести наши доработки;
- - либо снять флаг обновления, тем самым сохранив наши доработки, и уже потом добавить нужный код из конфигурации поставщика.
Объединение с приоритетом основной конфигурации и объединение с приоритетом новой конфигурации поставщика использую редко, в принципе и без использования данных режимов результат получится качественным.
После того как общие модули были проанализированы и у части процедур сняты флаги обновления, видим, что у модулей теперь установлен режим объединения – индивидуальная настройка:
Двигаемся далее. Среди дважды измененных объектов имеется форма элемента справочника «ОсновныеСредства». Прежде чем определиться обновлять ли данную форму из новой конфигурации поставщика, нужно выяснить, что по факту меняется при обновлении.
Для этого в базе base с помощью контекстного меню вызовем «Отчет о сравнении объектов…». В открывшемся окне должны стоять все флаги в группе «Объекты».
Мне нравится режим вывода отчета в табличный документ, когда различия показываются графически, но это дело вкуса.
В результате сравнения формы элемента справочника «ОсновныеСредства» видим, что изменения есть только в модуле формы , а изменений в диалоге формы в обновлении нет.
Но так как форма элемента попала в дважды измененные объекты, то наши доработки есть либо в диалоге формы, либо в модуле.
Выполнив аналогичное сравнение в базе for_updating можно увидеть, что доработки есть в диалоге формы.
Причина тому, добавление справочника «ОсновныеСредства» в план видов характеристик «СвойстваОбъектов». Если обновить форму элемента справочника «ОсновныеСредства» мы получим неразрешимые ссылки, о чем и будет свидетельствовать окно:
В данном случае самым лучшим вариантом будет не обновлять форму элемента справочника «Основные средства» и уже потом добавить необходимый код в модуль формы элемента. В этом случае окно «Неразрешимые ссылки» при обновлении появляться не будет.
Сделаем отступление и представим, что диалог формы элемента справочника «Основные средства» меняется при обновлении на новый релиз, тогда лучшим вариантом было бы обновление формы. Уже потом, после объединения, нужно было бы добавить в форму наши изменения, как в модуль , так и в диалог . Если в модуле много наших доработок и мало от поставщика, то после объединения можно полностью вернуть наш модуль и добавить изменения поставщика.
В этом случае в процессе объединения появилось бы окно «Неразрешимые салки». Вариантов выбора в данном окне два: 1) «Пометить все для объединения»; 2) «Продолжить».
На мой взгляд, правильнее выбирать «Пометить все для объединения».
В этом случае план видов характеристик «СвойстваОбъектов» будет добавлен как объект для объединения в дереве во вновь открывшемся окне «Обновление…»
Естественно, что после обновления в план видов характеристик «СвойстваОбъектов» нужно будет добавить наши изменения, сделать это лучше с помощью сравнения и объединения с текущей конфигурацией.
Рассмотрим, что произошло бы, если бы мы выбрали «Продолжить» в окне «Неразрешимые ссылки». В этом случае форма элемента справочника «ОсновныеСредства» стала бы новой, а план видов характеристик «СвойстваОбъектов» остался бы старым. В этом случае у нас затрутся изменения в диалоге формы элемента справочника, а именно на странице «СвойстваИЗначения», смотри рисунок ниже.
Данная проблема тоже не является не преодолимой, если конечно о ней не забывать.
Конечно, лучше всего стараться как можно меньше вносить изменений в диалоги форм , например, создавать реквизиты и кнопки на форме программно.
Многие вообще рекомендуют не менять типовые формы, а создавать их копии с нашими доработками и делать их основными. Мне данный вариант не нравится потому, что если поставщик добавил что-то в диалоге форме – на моей форме это не появится и мне придется делать добавления вручную, а изменений поставщика может быть гораздо больше, чем наших.
Отдельное внимание хотелось бы уделить по процедурному обновлению форм (часть процедур беру из конфигурации поставщика, а часть нет - индивидуальная настройка). Рассмотрим, как при данном режиме происходит обновление диалога формы в отличие от режима « взять из конфигурации поставщика ».
Пример не имеет отношения к данному обновлению конфигурации, но показателен, поэтому рассмотрим его.
В справочник «Контрагенты» добавлено несколько реквизитов, и они помещены на форму элемента.
При обновлении конфигурации на новый релиз через поддержку будет предложено окно сравнения и объединения конфигурации, в котором можно сделать различные настройки. Сравним несколько вариантов:
1. Флаг обновления формы выставлен, но обновление сделано по процедурно , т.е. по факту выполнена индивидуальная настройка
Многие думают, что диалог формы должен взяться из конфигурации поставщика, а процедуры в зависимости от сделанных настроек. Посмотрим, насколько это так после выполнения объединения. Сделаем сравнение конфигурации поставщика с основной конфигурацией.
Очевидно, что на формах нарушились привязки и прочее, т.е. диалог формы не был полностью взят из конфигурации поставщика. В данном случае в диалоге формы остались наши объекты, с одной стороны это хорошо, с другой стороны, местоположение наших элементов на форме не всегда оптимально, особенно в связи с добавлением новых элементов поставщика, наблюдается изменение позиций обхода и нарушение привязок. В некоторых случаях легче вручную добавить наши элементы в диалог формы, чем делать исправления.
2. Флаг обновления формы выставлен, обновление сделано в режиме «Взять из новой конфигурации поставщика»
В данном случае диалог формы элемента полностью приводится в соответствие с диалогом формы элемента поставщика.
Вернемся к обновлению. С модулями объекта и модулями менеджера документов поступаем также как с общими модулями, обновляем их по процедурно. С формами документов поступаем аналогично тому, как поступали с формами справочников.
Отдельно нужно выделить работу с ролями. Не смотря на то, что в примере не требуется обновлять роли поговорить об этом стоит. Рассмотрим самый простой случай, когда в конфигурации поставщика содержится новый объект. В этом случае потребуется обновление роли « Полные права », но данная роль может содержать какие-то созданные нами объекты, например, справочники, документы и прочее.
Кажется, что с ролью «Полные права» все просто, объединяем их полностью, права на нетиповые объекты сохранятся в них все равно. Так и есть, права на нетиповые объекты никогда не пропадут, но у всех этих объектов будет включен флаг «Интерактивное удаление», что не всегда хорошо. При сравнении конфигураций старого релиза и подготовленной нового релиза это хорошо видно:
С остальными ролями поступаем аналогично тому, как мы работаем с модулями - если наших изменений больше, то не объединяем роль, после обновления добавляем в нее то, что добавил поставщик в новом релизе.
После того как проработали все дважды измененные объекты в окне обновления нажимаем «Выполнить»
На вопрос о том, что измененные нами объекты будут загружены из новой конфигурации, отвечаем утвердительно.
В открывшемся окне «Настройка правил поддержки» проверяем, установленные флаги, хотя по умолчанию должны стоять правильно, нажимаем «ОК».
По окончании процесса объединения сохраняем основную конфигурацию, конфигурацию базы данных пока не обновляем.
Теперь в конфигурацию for_updating добавляем те минимальные доработки, которые не удалось правильно обновить штатными средствами.
Чтобы удобнее было проконтролировать выполнение данного процесса, в базе base запустим сравнение конфигурации поставщика и основной конфигурации старого релиза.
В базе for_updating сделаем тоже самое. Контролируем дважды измененные объекты, различий быть не должно.
После того как обновление в базе for_undating будет завершено обновляем конфигурацию базы данных и тестируем некоторые моменты, что именно хорошо бы протестировать станет понятно в процессе обновления, тут все индивидуально.
Обновление в рабочей базе желательно выполнять с помощью поддержки «Конфигурация» – «Поддержка» – «Обновить конфигурацию». При этом дважды измененные объекты будут загружены из нового релиза, т.е. наши изменения затрутся (конфигурацию не сохраняем!), но потом при объединении с подготовленной конфигурацией мы их восстанавливаем. После этого можно сохранить конфигурацию, обновить конфигурацию базы данных.
В этой инструкции нетипового обновления измененной 1с 8.3 я не буду описывать базовые вещи, такие как: как открыть конфигуратор, что такое конфигурация БД, конфигурация поставщика и основная конфигурация. Об это и там много написано, и вы можете самостоятельно найти эту информацию на просторах интернета. Я постараюсь описать основные моменты процесса обновления и на что нужно обратить внимание.
Я взял для примера нетиповую бухгалтерию 3.0.51.22 и покажу как обновить ее до версии 3.0.53.29. На платформе версии 8.3.10.2561 (нет большой разницы на более старых платформах, просто раньше окошко сравнения выглядело чуть иначе).
Скажу сразу, будет много картинок и мало текста. Я считаю, что визуально проще запоминать процесс, чем читать море текста.
1. Проверить соответствие конфигурации БД и конфигурации поставщика.
Для этого вам нужно
-
первое – открыть из меню «Справка» - «О программе»
и в разделе конфигурация найти версию, указанную в скобках.
Эта же информация будет совпадать с версией разработки в свойствах конфигурации.
И в появившемся окне посмотреть версию (версии может вообще не быть, если конфигурация поставщика была удалена).
При совпадении можете смело переходить к пункту 2.
1а. Постановка конфигурации на поддержку.
Если у вас отличаются версия БД и версия конфигурации поставщика, то вам нужно удалить текущую конфигурацию все через то же меню: конфигурация – поддержка – настройка поддержки. И нажать кнопку «Снять с поддержки».
Далее нужно сравнить-объединить с типовой конфигурацией версии, указанной в «Справка» - «О программе». И на вопрос «Поставить на поддержку?» нажать «Да».
После «недолгого» ожидания снимаем все галочки. Ну и можно убрать галку «Сохранять настройки автоматически». И жмем выполнить.
В результате мы получим конфигурацию на поддержке с одинаковыми версиями баз данных.
2. Обновление базы.
Теперь можно переходить к обновлению.
Скажу сразу обновление делать нужно ТОЛЬКО через меню «Конфигурация» - «Поддержка» - «Обновить конфигурацию…».
Использовать «Сравнить, объединить с конфигурацией из файла…» НЕЛЬЗЯ. При использовании этого механизма вам при следующем обновлении придется переходить к пункту 1а. Поэтому давайте не будем так делать и создавать себе (или тому, кто будет в следующий раз обновлять базу) лишние проблемы.
Ожидаем, пока пройдет сравнение объектов.
Далее нам нужно внизу из списка выбрать пункт «показывать только дважды измененные свойства.
Так же хочу сказать по старые версии, раньше это был флажок.
Итак, мы теперь видим гораздо меньше объектов.
Если у вас пусто, то вам несказанно повезло, и вы можете смело нажимать кнопку «выполнить» и считайте обновление закончено. Ну у нас не все так просто, поэтому пробегусь по основным объектам.
-
Подсистемы – ставим режим «Объединить»
Первое что хочется сказать. Ни в коем случае не переключайте режим объединения. Он должен стоять «Взять из новой конфигурации поставщика». Иначе вы получите в базе мусор с комментарием MGR.
Никаких кнопок «показать различия в модулях…»!
Жмем именно на значок шестеренки рядом с модулем
Открывается окошко, в котором очень много изменений в функциях и процедурах.
Для того чтобы понять в какой функции были изменения нам нужно будет либо взять копию базы, либо через меню конфигурация сохранить конфигурацию в файл. И дальше загрузить в пустую базу. Далее зайти в меню «конфигурация» и нажать «Сравнить конфигурации…»
Выбрать сравнение основной конфигурации с конфигурацией поставщика.
И вот ту можно уже посмотреть изменения через «показать различия в модулях…». Т.к. мы не собираемся ничего менять, мы только хотим посмотреть, что было изменено.
И мы видим, что в функцию «Просклонять» был добавлен кусок кода. Все изменения можно посмотреть, нажимая на синие стрелки.
Вернемся к обновляемой конфигурации. Там мы через значок шестеренки зашли с режим объединения модулей. Далее ставим все галки…вручную..говоря про себя «спасибо» разработчикам платформы :)
Находим нашу функцию просклонять. Находим измененный элемент. Надеюсь, теперь стало понятно, зачем нужно отделять любой добавленный свой код комментариями – правильно, чтобы не гадать при обновлении, откуда взят этот код.
Нажимаем значок лупы, и платформа выделит строчку кода, куда нужно этот текст добавить.
Копируем его из верхнего окна и вставляем в нижнее окно.
Так проделать со всеми модулями. Если модуль не был изменен, как в нашем случае со справочником валюты. Мы просто ставим режим «Взять из новой конфигурации поставщика» и НЕ нажимаем на шестеренку (рядом с шестеренкой не должно стоять зеленой галочки, это означает что код полностью будет взят из новой конфигурации, без ручной настройки).
Отлично. Теперь пробежавшись по всем объектам можно снять галку «сохранять настройку автоматически» и потом «выполнить»
В следующем окне оставляем галки, как показано на картинке. И никак иначе. Должны стоять обе галки – «объекты редактируются с сохранением поддержки». Нажимаем ОК.
Все. Обновление нетиповой конфигурации 1с завершено.
Этот метод не претендует на идеал, но я думаю, многие совершают ошибки в этих шагах.
Конечно, я рассказал не все, тут еще много подводных камней. Но я думаю 90% обновлений можно смело обновлять по этой инструкции.
Надеемся, данная информация была полезна. При необходимости мы можем выгодно лицензировать вашу 1С
Также у вас есть возможность заработать на партнерской программе , приводя клиентов и получая комиссию с их покупок.
Любите ли Вы динамическое обновление конфигураций так, как люблю его я? Обожаю что-нибудь с его помощью пропатчить на продакшене! Особенно в пятницу! Вечером! Перед майскими праздниками! Без предупреждения!
На самом деле нет! Динамическое обновление с одной стороны выглядит отличным механизмом платформы 1С, который позволяет вносить изменения в конфигурации "на лету". Главное, чтобы изменения не затрагивали структуру базы данных, в противном случае придется выполнять обновление монопольно и "выгонять" пользователей.
Согласитесь, при появлении ошибки в коде после очередных изменений просто берешь и обновляешь базу "на горячую" и никаких проблем! Главное всем, кому нужны были эти изменения, перезапустили сеанс и изменения вступят в силу!
С другой стороны может что-то пойти не так и Вы найдете небольшую, но весомую порцию багов у себя.
И никакие отговорки, что это были изменения для ТОП-менеджеров Вам не помогут!
Но как же так! Вы пользуетесь динамическим обновлением и у Вас нет никаких проблем? Коллеги рассказывают страшные истории, но Вы им не верите? "Просто они плохие 1Сники!", думаете Вы?
Как работает динамическое обновление
Наверное это странный вопрос, ведь ответ лежит на поверхности - это механизм позволяет обновить конфигурацию базы данных без остановки ее работы, внося изменения не требующие модификации на уровне базы данных. В официальной документации на ИТС есть информация в каких случаях платформа позволяет провести динамическое обновление. Вроде все просто. Но что если пойти дальше.
В любой информационной базе есть таблицы "Config" и "ConfigSave". Назначение этих таблиц также известно:
- Config - содержит основную конфигурацию информационной базы, которая соответствует актуальной структуре базы данных и используется активными сеансами.
- ConfigSave - содержит сохраненную конфигурацию. Ту самую, которую Вы редактируете в конфигураторе. Как только Вы нажимаете "Сохранить", все измененные объекты и связанная информация записывается именно сюда. После запуска обновления информационной базы все изменения из этой таблицы переносятся в таблицу Config. Если же выполнить команду "Конфигурация -> Конфигурация базы данных -> Вернуться к конфигурации БД", то вся информация об изменениях в этой таблице удалится.
Все просто, не так ли? Но пойдем еще дальше. Посмотрите на структуру таблиц для хранения данных конфигурации.
Структура таблиц идентична.
Описание полей такое:
- FileName - строка длиной 128, используется для хранения имени "файла", это некоторая часть конфигурации.
- Creation - дата создания записи.
- Modified - дата модификации записи.
- Attributes - целое число, назначение которого сейчас нет смысла рассматривать (на самом деле я точно не могу утверждать, только предполагаю зачем оно нужно. Но если Вы знаете, то напишите в комментариях).
- DataSize - размер данных в байтах, хранящийся в поле "BinaryData"
- BinaryData - непосредственно данные конфигурации.
- PartNo - номер части. Иногда размер данных объекта метаданных может быть очень большим и платформа его разбивает на части.
То есть конфигурация хранится некоторыми блоками. Вообще, структура хранения конфигурации в таблице базы соответствует тому, как устроена внутренняя структура форматом файлов CF. Подробнее об этом Вы можете узнать в отличной статье "Описание формата файлов конфигурации (CF, EPF, ERF)" от Андрея Овсянкина.
Со структурой таблиц и их назначением понятно. Пойдем дальше.
Когда Вы начинаете процесс обновления информационной базы, на первом этапе платформа 1С выполняет множество служебных действий, останавливаться на которых сейчас особо нет смысла. Самое интересное начинается после того, как Вы нажимаете заветную кнопку "Обновить динамически".
Среди множества служебных действий, платформа переносит данные об объектах из таблицы ConfigSave в Config:
В следующий раз, когда информационная база будет обновляться в обычном режиме, записи об объектам, созданных при динамическом обновлении, будут удалены и останутся только основные записи с актуальными данными конфигурации.
Это очень поверхностное описание и сам процесс имеет множество особенностей как со стороны работы БД, так и со стороны работы клиентских приложений платформы 1С. Но суть должна быть понятной.
Подробный пример динамического обновления
Для того, чтобы детальней погрузиться в происходящее при таком обновлении, рассмотрим все действия платформы 1С, до которых можно добраться законым способом. То есть мы не будем влазить в модули работы самой платформы и открывать то, за что можно получить повестку в суд. Мы лишь посмотрим что делает платформа на стороне базы данных. И этого нам будет достаточно!
В нашем примере есть некоторая конфигурация на базе БСП (хотя это и не важно), в которой добавлен очень важный общий модуль "ДляДинамическогоОбновления".
Модуль полностью клиентский, имеет в своем составе только одну функцию.
На первом шаге мы вносим изменения в модуль и нажимаем "Сохранить конфигурацию". При этом изменения в конфигурации сохранены, но не применены к информационной базе.
На этом шаге платформа 1С делает записи в таблицу "ConfigSave", некоторое промежуточное хранилище, из котого потом измененные элементы конфигурации должны будут перенесены в основную таблицу конфигурации "Config".
Вот вся история операций в таблице "ConfigSave" после сохранения конфигурации. Здесь подробная информация обо всех действия практически на физическом уровне, поэтому некоторые операции "INSERT" разделены на две (INSERT и UPDATE), а операция UPDATE может быть выделена как операции DELETE и INSERT. Но эти особенности сейчас не играют роли.
Кроме этого в таблице есть дата операции (Period) и идентификатор транзакции (__$start_lsn). По факту все эти действия выполняются в разных транзакциях, лишь некоторые из действий в таблице выполняются в единой транзакции.
Вся операция, как уже упоминалось выше, делится на два этапа:
- Записываем в таблицу информацию об изменениях конфигурации , в частности нашего общего модуля "ДляДинамическогоОбновления". Кстати, на скрине выше видно, что его идентификатор "cb327a01-e9cc-44e6-af31-5f30c88faeca", отсюда и эти названия похожие. Имена содержат суффикс "new", что говорит о промежуточной записи объектов.
- На следующем шаге промежуточные записи преобразовываем в нормальные , просто исключив "new" из имен элементов конфигурации.
Тут все достаточно просто, идем к следующему шагу. Вы нажимаете кнопку "Обновить информационную базу", но так как в базе есть сеансы, а изменения касаются только модулей, то платформа 1С предлагает выполнить динамическое обновление без завершения сеансов.
В этот момент платформа 1С сделала два действия:
- Скопировала записи из таблицы "ConfigSave" в таблицу "Config" с суффиксом "new", почти все действия выполнены в одной транзакции.
- Затем было обнаружено, что обновление невозможно продолжить из-за наличия активных сеансов. Был показан диалог для динамического обновления, а ранее добавленные записи удалены из таблицы "Config" в одной транзакции.
Изменений в таблице "ConfigSave" в этот момент не выполнялось.
И вот мы добрались до последнего шага - запуска динамического обновления. Соглашаемся с этой операцией и получаем следующее.
- В таблице "Config" сначала добавляются новые записи с суффиком "new" для последующих операций с ними. Примерно такие же действия мы видели в самом начале в таблице "Config", перед тем как было предложено выполнение динамического обновления. Но в этот раз также сделаны служебные записи "commit", "dynamicCommit" и "dbStruFinal", которые относятся непосредственно к динамическому обновлению (частично о них было упомянуто выше).
- Предварительные записи с суффиксом "new" теперь платформа преобразовывает в нормальные записи, также добавляет записи с форматом "_dynupdate_", плюс вставляет флаг динамического обновления "DynamicallyUpdated".
- Из таблицы "ConfigSave" удалены все сохраненные ранее записи. Все в одной транзакции.
- И напоследок из таблицы "Config" удаляются служебные данные "commit", "dynamicCommit" и "dbStruFinal".
Заметьте, каждый этап - почти всегда разные транзакции, это важно.
После этого конфигурация успешно обновлена динамически, база работает. Чтобы клиентам получить новые изменения достаточно перезапустить сеанс. Вроде все хорошо.
На самом деле это не все действия платформы 1С, т.к. еще обновляются данные в таблице "Params" и некоторые другие. Но мы это рассматривать сейчас не будем.
Разработчики ликуют и со словами "Я же говорил" продолжают убеждать коллег, что динамическое обновление это нормально!
Что может пойти не так
Весь процесс динамического обновления мы рассмотрели, но что же может случиться?
Представим простую ситуацию: что, если все обновление прошло успешно, кроме последнего этапа? Например, во время выполнения запросов на удаление служебных данных соединение с базой данных почему-то "отпало":
- Сбой сети.
- Регламентные работы на сервере, внезапно.
- Обслуживание базы, которое завершило блокирующий сеанс, опять же внезапно!
- Конфигуратор вылетел из-за ошибки внутренней.
- Разработчик 1С был странным и завершил сеанс конфигуратора во время обновления.
- И еще сотни причин, которые лень добавлять.
Чтобы такое проще было представить, можно добавить в базу данных триггер, который при попытке удаления служебной записи о динамическом обновлении упадет в ошибку.
Попытаемся теперь выполнить динамическое обновление и столкнемся с ошибками:
- Сначала во время обновления в конфигураторе поймаем ошибку.
- А при попытке зайти в конфигуратор повторно мы словим ошибку.
- При попытке повторить обновление мы уйдем в бесконечную ошибку вида.
Все, конфигуратор нам больше недоступен! Чистите кэш, пытайтесь выполнить обновление ИБ, удаляйте сеансовые данные! Все бесполезно! Можете еще взять бубен, но и он бесполезен!
После этого проблема будет полностью исправлена в 99% случаев.
И это все?
Такая ошибка вас не остановит? Говорите, что ну и ладно, что в конфигуратор не вошли, зато клиенты работают, а с конфигуратором бы разобрались? Ведь решения есть на просторах интернета!
Хорошо, а как вам такой же "обрыв" соединения на этапе обновления данных в таблице "Params". Сделаем другой триггер (отключите только предыдущий):
При попытке обновления записи "DynamicallyUpdated" в таблице "Params" мы получим падение. Конфигуратор закроется системной ошибкой. Не страшно, скажите Вы! Но в этот же момент все клиентские соединения также вылетят, причем с разными ошибками. Например, с такой.
А при попытке перезапустить клиентский сеанс, также будут происходить различные ошибки. Никто не сможет работать с информационной базой!
Но и тут не все потеряно!
Клиентские сеансы не могут зайти в базу, их всех выкинуло и так далее! Но мы все еще можем в большинстве (но не во всех) случаев зайти в конфигуратор! И при повторном обновлении также в большинстве (но не во всех) случаях мы восстановим работу информационной базы!
Итог, все вылетели из базы, мы словили адреналина, и восстановили работу после штатного повторного обновления. Вас и это не убедило, что динамическое обновление очень опасно?
Вы поистине яркий человек
Если Вам и этого мало, то как Вы думаете, что будет, если оба этих случая будут комбинированы? В этом случае Вы "выкинете" всех пользователей из информационной базы, а потом еще и не сможете войти в конфигуратор повторно. Пойдете после этого вручную очищать таблицу "Config" от служебны записей динамического обновления и надеяться, что это в этот раз поможет.
Вы удивительный человек!
А ведь есть еще проблемы другого рода:
- Повреждение сеансовых данных сервера. Возникают из-за какого-то особого поведения платформы 1С, меняется от релиза к релизу, сложно прогнозируемые и сложновоспроизводимые ошибки.
- Повреждение клиентского кэша, которое приводит к:
- Ошибкам запуска клиентского приложения при входе в информационную базу
- Случайным ошибкам во время работы приложения, таким как "Тип неопределен" или подобные.
Ниже есть ссылки на примеры различных проблем и их решение. Для воспроизведения таких проблем мне пришлось бы откопать код приложений платформы 1С, но это не очень правильно.
Это весело
Вы все еще считаете, что динамическое обновление это хорошо? Что нет ни единой причины, чтобы отказаться от него? Что все описанные ошибки, которые даже можно воспроизвести прямо на свежих версиях платформы (от 8.0 до 8.3.20), не являются критичными? Может вы еще и бэкапы не делаете?
Кстати, описанные выше проблемы аткуальный как для платформы 1С версии 8.0, так и для всех более новых версий, вплоть до 8.3.20.*. И это только вершина айсберга!
Надеюсь, информация из статьи поможет кому-то хотя бы задуматься над тем, что Вы делаете!
P.S. А Вы задумывались над тем, что установка расширений тоже может приводить к подобным проблемам? :)
Читайте также: