1с методы не найденные в модулях обеих конфигураций
На Инфостарте присутствует довольно большое количество хороших статей про обновление нетиповых конфигураций, как на поддержке, так и без. Надеюсь, что данная статья также будет полезна тем, у кого еще не достаточно опыта для обновления нетиповых конфигураций, особое внимание уделено обновлению нетиповых форм.
Рассмотрим обновление на примере нетиповой конфигурации УПП 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С.
Основные возможности
- Отображение различий объектов метаданных/модулей конфигураций с помощью отчетов на СКД со всеми возможностями кастомизации. Возможность просмотра различий текстов запросов динамических списков, наборов данных СКД.
- Полуавтоматическая настройка объединения модулей, позволяющая уменьшить количество монотонной работы по расставлению флажков у процедур/функций в объединяемых модулях
- Отображение доработок, "потерянных" в процессе обновления
Анализируемые объекты
Подробный анализ доработок предусмотрен для большинства объектов метаданных. Анализируются все открытые модули, управляемые формы, реквизиты, табличные части, команды, роли, подсистемы, схемы компоновки данных, в общем все что выгружается в файлы *.xml или *.bsl в пригодном для анализа виде.
Объекты, исключаемые из подробного анализа (помечены флажком "Неподдерживаемый"): табличные документы, бинарные объекты (в т.ч. обычные, неуправляемые формы), текстовые макеты, содержимое справки, картинки, архивы и т.п. Для таких объектов фиксируется только факт отличия от типового объекта, без подробностей. Если такой объект будет полностью заменен типовым при обновлении релиза, это будет отображено в отчете "Потерянные изменения объектов метаданных", но при частичной потере доработок объекта отчет его не покажет, так как он будет по прежнему отличаться от типового.
Терминология
Маркером в данной разработке называются отметки в комментариях (обычно это фамилия или инициалы), которыми разработчики отмечают изменения в текстах модулей при доработке типовых конфигураций.
Например для такого куска кода
маркером является строка "Иванов".
Соответственно набором маркеров является все такие отметки, которые встречаются в конкретной доработанной конфигурации.
Для улучшения качества анализа доработок нужно заполнить набор маркеров и привязать его к обновляемой базе
Запуск базы "Контроль доработок конфигураций"
Данная конфигурация работает только в режиме "Управляемое приложение толстый клиент". Поэтому перед первым запуском ставим основной режим запуска "Толстый клиент".
Если вы забудете сделать это, программа не запустится
Подготовка к обновлению релиза типовой конфигурации
Для обеспечения возможности фиксации различий необходимо выгрузить конфигурации в файлы, каждую в отдельный каталог. Выгружаем:
- Типовую конфигурацию старого релиза
- Типовую конфигурацию нового релиза
- Доработанную конфигурацию
Например мы обновляем доработанную конфигурацию ЗУП 3.1.9.207 на 3.1.10.223. Нам понадобятся выгруженные в каталоги конфигурации:
- ЗУП 3.1.9.207 типовая
- ЗУП 3.1.10.223 типовая
- ЗУП 3.1.9.207 доработанная
Для выгрузки используем пункт меню "Конфигурация - Выгрузить конфигурацию в файлы". В каталоге должны появиться папки и файлы с объектами конфигурации.
ВНИМАНИЕ! Выгрузка конфигураций в файлы должна проводиться на одной и той же версии платформы!
При несоблюдении этого требования добавляемая при выгрузке в файлы служебная информация может различаться для разных релизов платформы, что приведет к значительному увеличению времени, требуемого для поиска различий в файлах а также может привести к ложным различиям. Чаще всего это может случиться если база с доработанной конфигурацией - клиент-серверная, а базы с типовыми конфигурациями - файловые. Если на компьютере разработчика установлены разные релизы платформы и есть более новый релиз, чем релиз сервера 1С, файловая база запустится на более новом релизе. В этом случае лучше запускать бинарный файл прямо из каталога с нужным релизом при выгрузке обоих конфигураций.
После выгрузки конфигураций в файлы открываем базу "Контроль доработок конфигураций".
Создаем или выбираем обновляемую базу из списка баз. При создании базы можно сразу указать набор маркеров, используемый в этой базе. Справочник "Конфигурации" заполняется автоматически при создании документа "Фиксация различий", ручное заполнение его не предусмотрено, поэтому если в справочнике нет нужной вам конфигурации, ничего не указываем, она заполнится потом автоматически.
После выбора базы создаем документ "Фиксация различий типовых релизов". Создаем новый документ и выбираем путь к ранее выгруженным файлам конфигураций. Программа сразу определяет наименования конфигураций и их релизы.
Записываем документ, после этого нажимаем "Заполнить". Поиск различий типовых релизов может занять достаточно продолжительное время, для указанных конфигураций на моем i3/16Gb это примерно полчаса. Если меняется не 3 разряд релиза, а только 4, например обновление с ЗУП 3.1.10.223 на 3.1.10.253, то заполнение различий происходит значительно быстрее, за 5-10 минут.
После заполнения различий сохраняем документ и выбираем его.
Затем создаем фиксацию различий доработанной конфигурации до обновления. В ней сразу заполнится каталог файлов типовой конфигурации (из документа фиксации различий типовых релизов), нужно указать только каталог с выгруженными файлами доработанной конфигурации. Записываем документ и нажимаем "Заполнить". Длительность заполнения зависит от количества различий между доработанной и типовой конфигурациями.
После сохранения выбираем документ из списка.
Просмотр различий конфигураций
При заполнении документ "Фиксация различий" сравнивает выгруженные файлы конфигураций. Если файлы различаются, то программа пытается определить в чем именно заключаются различия и сохранить эту информацию. Кроме того сохраняется текст отличающихся файлов, а для текстов модулей - отдельно сохраняется текст каждой процедуры/функции. Всю эту информацию можно затем увидеть в самом документе или в отчетах.
Пример определения различий в модулях:
Для каждого модуля определяются добавление/изменение/удаление процедур и функций, а также количество маркеров в каждой процедуре/функции. Нажав на гиперссылку "Сравнить тексты" можно увидеть чем конкретно отличаются тексты модулей.
Также можно просмотреть отличия всего модуля целиком:
Пример определения различий в метаданных ("Внутренний путь" - это иерархия в xml-файле):
Для удобства отображения в документе "Фиксация различий" есть фильтры по виду метаданных, виду различий (Добавлен/Изменен/Переименован/Удален) и типу объектов (равно как и Ctrl+F по любой колонке). Это может быть полезно если мы хотим увидеть например сразу все формы, которые были изменены интерактивно (не модули форм, а именно сами формы). Такой возможности Конфигуратор не предоставляет.
Различия конфигураций можно посмотреть также в отчетах "Различия в модулях" и "Различия в метаданных", которые можно открыть из рабочего стола (отчеты открываются с уже заполненными параметрами). Эти отчеты созданы на СКД, позволяют менять настройки, сохранять новые варианты. Сохраненные варианты отчетов можно открывать сразу с рабочего стола (на скриншоте выше это "Проверка соответствия стандартам разработки" и "Отклонения от стандартов разработки").
Пример сформированного отчета "Различия в метаданных":
Ещё одна уникальная функция, которой нет в Конфигураторе - просмотр различий текстов запросов динамических списков и наборов данных СКД (открывается при щелчке по гиперссылке "Сравнить"):
Пример сформированного отчета "Различия в модулях конфигураций" (щелчком по гиперссылке можно открыть сравнение текстов как отдельных процедур, так и модуля целиком):
Полуавтоматическая настройка объединения модулей
Ещё одна уникальная функция, которой лишён Конфигуратор. Данная конфигурация может сформировать xml-файл с настройками объединения модулей, который можно загрузить при обновлении релиза, значительно уменьшив тем самым количество вручную расставляемых флажков в модулях.
Если процедура/функция изменена только в новой типовой конфигурации или только в доработанной, для неё в файл записывается состояние флажка.
Для процедур/функций измененных дважды состояние флажка не записывается и нажав на переключатель "Отображать строки: Не записанные в файл" можно увидеть только такие процедуры/функции и при объединении заниматься только ими, не тратя времени на остальные. Также можно увидеть доработанные процедуры/функции, которые были удалены в новом типовом релизе и доработки из которых нужно переносить в другие процедуры/функции.
Полученный xml-файл я рекомендую загружать через "Добавить настройки из файла".
Но флажки при этом загружаются верно.
После обновления релиза выгружаем полученную конфигурацию в файлы и создаем документ "Различия доработанной конфигурации после обновления". После этого запускаем отчеты "Потерянные изменения объектов метаданных" и "Потерянные изменения модулей", которые выводят доработки метаданных/модулей, исчезнувшие после обновления релиза.
Для модулей сравнивается кроме самого факта наличия изменений также и количество маркеров, если оно уменьшилось, то считается что часть доработок процедуры/функции была утрачена. Поэтому при ручной настройке объединения процедур/функций лучше не менять количество маркеров доработок, чтобы исключить ложные срабатывания.
Поддержка английского языка
Конфигурация создана полностью на английском языке, все объекты метаданных и все программные модули написаны на английском. Если в конфигурации сделать основным языком английский, весь интерфейс тоже будет на английском.
Условия работоспособности
Для корректной работы программе требуется возможность создания COM-объекта "VBScript.RegExp", поэтому беспроблемная работа возможна только при запуске на Windows.
Тестовое окружение
Тестирование происходило на платформе 8.3.12.1790, запуск в режиме толстый клиент, файловая база. Операционная система: Windows 10.
Анализ изменений отрабатывался на конфигурациях ЗУП 3.1.9/3.1.10 и БП 3.0.57/3.0.71. Анализировать можно любую конфигурацию с открытыми модулями, но для конфигураций на обычных формах подробный анализ изменений форм недоступен, определяется только факт отличия от типовой формы.
Версия 1.1 от 13.04.2021
- Адаптация для работы в режиме клиент-сервер (толстый клиент).
- Оптимизация быстродействия
- Исправление ошибок
- Новая функция: "Поиск ссылок на удаленные в новом типовом релизе процедуры/функции".
Указываем документ фиксации различий типовых релизов (документ должен быть заполнен уже после обновления на версию 1.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. А Вы задумывались над тем, что установка расширений тоже может приводить к подобным проблемам? :)
*Доработанные или нетиповые конфигурации 1С – это программный продукт на платформе «1С:Предприятие», входящий в состав или составляющий целиком автоматизированную систему управления предприятия, претерпевший ряд изменений, обусловленных нуждами и спецификой бизнеса, в части форм и состава справочников, документов, ролей, модулей и т.д., поэтому обновление конфигурации 1С с изменениями – совсем не то же самое, что обновление типового решения.
Выпуск релизов и обновлений 1С направлен на исправление багов и внесение изменений и дополнений, обусловленных законодательством. Для новых, недавно вышедших на рынок конфигураций, характерен выпуск большого количества обновлений первого типа. Для конфигураций с функционалом, направленным, в основном, на составление регламентной отчетности, например «1С: ЗУП», «1С:Бухгалтерия», выходит больше обновлений второго типа.
Спецификой обновления нетиповых конфигураций является необходимость внесения всех изменений новейшего релиза 1С, при полном сохранении ранее произведенных доработок. Это нетривиальная задача, решение которой не имеет стандартного сценария, а значит, не может быть полностью автоматизировано. По этой причине в методике обновления нетиповых конфигураций превалируют ручные операции, требующие участия специалиста в рамках работы по сопровождению сложных систем 1С.
На этапы реализации обновления нетиповых конфигураций не влияет объем имеющихся доработок. Вкратце их можно описать так:
- Поиск и сопоставление измененных объектов;
- Внесение обновлений из нового релиза;
- Внесение ранее произведенных изменений, «затертых» на предыдущем этапе;
- Проверка совместимости и работы процессов.
Разница будет заключаться во времени реализации: если доработок много, процесс соответственно займет больше времени, потребует сосредоточенности, внимания и ручной проверки.
Рассмотрим для среды 1С обновление нетиповой конфигурации на примере «1С:Управление торговлей» (релиз 2014 года) на следующий доступный релиз.
Это весьма простой пример, но как уже было сказано выше, обновление более сложной конфигурации, конечно же, потребует больших затрат времени и сосредоточенности со стороны специалиста, но будет иметь те же этапы – обновление (на новую типовую конфигурацию), работа со сверкой внесенных и вносимых изменений и т.д. Поэтому, если вы не уверены в своих силах, следует обратиться к специалистам по сопровождению сложных систем 1С.
Перед обновлением конфигурации следует выгрузить информационную базу. Это действие рекомендуется производить перед любыми манипуляциями со всеми базами без исключения, и особенно, с нетиповыми:
Рис.1 Выгрузка ИБ
Выгрузка информационной базы завершена:
Рис.2 Заверение выгрузки ИБ
Обратите внимание, если бы конфигурация не была доработана, то есть была типовой, то в окне Конфигурации напротив названия, рядом с желтым кубиком, отображалась бы еще и пиктограмма замочка:
Рис.3 Типовая конфигурация
В меню Конфигурации выбираем «Поддержка» и «Обновить конфигурацию». По сути, на этом этапе, действия полностью совпадают с процессом обновления типовой конфигурации:
Рис.4 Обновление конфигурации
В зависимости от размера базы и ее доработок, автоматический поиск доступных обновлений может занять какое-то время. Поэтому стоит, несмотря на рекомендации, выбрать вариант «Выбор файла обновления» и самостоятельно, предварительно распаковав архив с обновлениями и сохранив их, указать путь вручную:
Рис.5 Выбор файла обновления
Окно со справочной информацией, инструкцией и очередностью обновлений:
Рис.6 Окно со справочной информацией
Окошко выбора нового релиза:
Рис.7 Окошко выбора нового релиза
Окошко сравнения конфигураций. Слева в дереве отображается состояние имеющейся конфигурации, справа – информация по новой, типовой версии. Также выделены разделы, претерпевшие изменения. Далее необходимо выяснить, какие разделы были изменены с нашей стороны и претерпели одновременно изменения в новой конфигурации:
Рис.8 Окошко сравнения конфигураций
Для того чтобы выяснить, какие типовые объекты метаданных были изменены ранее и также будут изменены при установке новой конфигурации поставщика, надо выбрать «Показать только дважды измененные свойства»:
Рис.9 Измененные свойства
Остались только объекты, подходящие под это условие:
Рис.10 Измененные объекты
Раскрыв дерево метаданных, можно увидеть, какие же конкретно объекты будут изменены. Для получения подробной информации, кликом правой клавиши выбираем измененный объект:
Рис.11 Дерево метаданных
Оценить изменения на уровне кода можно с помощью «Показать различия в модулях», но поскольку их необходимо еще и запомнить, чтобы внести после установки обновлений, создаем два отчета: «Отчет о сравнении объектов основной конфигурации со старой конфигурацией поставщика» (имеющиеся доработки) и «Отчет о сравнении объектов новой конфигурации поставщика со старой конфигурацией поставщика» (обновления).*
*Давайте разберемся в терминологии:
- «Основная конфигурация» – нетиповая конфигурация, которую необходимо обновить;
- «Старая конфигурация поставщика» – типовая конфигурация, из которой устанавливались обновления в последний раз;
- «Новая конфигурация поставщика» – та, на которую обновляем сейчас.
Рис.12 Отчет о сравнении объектов основной конфигурации со старой конфигурацией поставщика
Настраиваем форму отчета и выгружаем его. Список внесенных ранее изменений зафиксирован:
Рис.13 Настройка и выгрузка формы отчета
После выгрузки отчетов переходим непосредственно к обновлению и нажимаем «Выполнить». Конфигуратор предлагает правило обновление «Взять из новой конфигурации поставщика» (оно указано в третьем столбце). Это означает, что все доработки будут стерты и заменены типовыми обновленными объектами. Менять это правило на заманчивый «Режим объединения» не стоит, т.к. автоматическое объединение приведет к хаосу. Все же лучше потратить время и внести изменения вручную:
Рис.14 Внесение ручных изменений
В окне с общей информацией о снятии конфигурации с поддержки, менять ничего не надо. Нажатие «ОК» приведет к объединению объектов. Далее запускаем «Предприятие» и записываем изменения, чтобы точно закончить процесс обновления:
Рис.15 Окончание процесса обновления
Принимаем список изменений:*
Рис.16 Список изменений
*Если кнопка «Принять» неактивна, следует запустить «Тестирования исправлений»:
Рис.17 Тестирования исправлений
Запускаем через F5 отладку и получаем подтверждение легальности обновлений:
Рис.18 Подтверждение легальности обновлений
Список новшеств в версии:
Рис.19 Список новшеств в версии
После того, как получено подтверждение, что процесс накатки обновлений полностью завершен, следует вернуться в конфигуратор, зайти в дважды измененные объекты метаданных и вручную внести зафиксированные изменения на уровне кода, пользуясь выгруженными отчетами. После этого нужно проверить корректность настроек и адекватность процессов работы.
В заключение напомним, что обновление доработанных конфигураций – процесс, требующий максимальной сосредоточенности и участия специалиста, поэтому стоит обратиться за дополнительными консультациями по 1С в одну из фирм-франчайзи.
На общих модулях лежит обязанность хранения процедур и функций, которые вызываются из других мест системы 1С. Считается хорошим тоном размещение кода, вызывающегося несколько раз, в процедуре в общем модуле. Это правило универсально для всех конфигураций, поэтому любой разработчик 1С должен уметь работать с этими объектами конфигурации. Для этого нужно понимать все нюансы и уметь правильно использовать предоставленные платформой возможности.
Создание общего модуля в 1С
После создания функции в одном из модулей объекта возникла потребность использовать аналогичный алгоритм в другом месте. Самое правильно, что можно здесь сделать – перенести код в общий модуль, но перед этим необходимо создать его. Чтобы это сделать, нам нужно зайти в конфигуратор и в дереве конфигурации найти вкладку «Общие». Затем выделить «Общие модули» и воспользоваться кнопкой в виде белого плюса на зеленом кружке.
Рис.1 Общие модули
Справа откроются свойства добавленного общего модуля, и нам предстоит разобраться, что обозначает каждое из них. Они могут быть различной направленности, поэтому, перед тем как настраивать новый объект, желательно определиться, что мы там будем хранить. Если что, в будущем можно будет изменить свойства в соответствии с задачами:
- «Глобальный». Данный флаг ставится, если модуль предназначен для хранения процедур и функций, которые должны вызываться без указания имени модуля. Естественно, они должны быть экспортными, а их имена уникальными в разрезе всего глобального контекста. По использованию они не будут отличаться от стандартных функций платформы;
- «Клиент». Зависит от настроек системы и регламентирует, могут ли процедуры модуля выполняться на стороне клиента;
- «Сервер». Помечаются общие модули, в составе которых планируется помещать алгоритмы для выполнения на сервере;
- «Внешнее соединение». Процедуры модуля с активацией этого свойства смогут выполняться через подключение внешнего источника;
- «Вызов сервера». Отвечает за разрешения процедурам из модуля вызывать сервер, выполняясь на клиенте;
- «Привилегированный». Активация этой настройки позволит при работе кода процедур модуля не проверять права доступа. Вызвать общий модуль с такой настройкой можно только на сервере. Настройки «Клиент» и «Внешнее соединение» будут сброшены;
- «Повторное использование». Может принимать значения: «Не использовать», «На время сеанса», «На время вызова». При многократном вызове одной процедуры система может использовать рассчитанные ранее данные в рамках процедуры (вызов) или жизни всего сеанса (запуска 1С). Стоит быть очень осторожным с этой настройкой, так как из-за неправильного использования таких модулей могут возникать ошибки.
Рис.2 Свойства
Бывают ситуации, когда требуется создать общий модуль с вызовами процедуры на сервере и клиенте с отличиями в алгоритме. Для разграничения кода используются директивы препроцессора с проверкой. В результате для серверного вызова это будет один код, а для клиентского – другой.
Пример переноса кода в общий модуль 1С
Рассмотрим ситуацию, когда у нас два события на форме документа задействуют одну процедуру перемножения количества и цены в табличной части. Это достаточно распространенный алгоритм, так как он встречается во многих документах закупки и реализации. Перенесем код процедуры в общий модуль, который необходимо предварительно создать, чтобы получить возможность использовать этот код в других документах.
Так как для нашей задачи нам хватает вызова с клиента и не нужны данные из базы, ставим только флаг «Клиент». Если вы хотите в дальнейшем использовать этот же модуль для более сложных расчетов, то отметьте в свойствах еще и «Сервер». Подготовительный этап завершен и можем переходить к написанию кода.
Рис.3 Написание кода
Создадим экспортную процедуру в модуле и перенесем туда алгоритм расчета суммы из процедуры в модуле формы. В качестве параметра процедуры на входе будет использоваться строка табличной части. В модуле формы документа меняем вызовы процедуры в том же модуле на вызов процедуры из общего модуля.
Рис.4 Меняем вызовы процедуры
При запуске системы мы не заметим разницы, но такую структуру кода читать и сопровождать намного удобнее. Конечно, в данном примере количество кода не может показать всей пользы. В случае сложного алгоритма для десятков объектов конфигурации выигрыш в объеме кода и его структуры скажется и на быстродействии системы. Помимо этого опытные разработчики 1С рекомендуют в модулях формы не описывать алгоритмы, а помещать их в правильно настроенные общие модули.
При разработке общих модулей следует учитывать общепринятые правила по их созданию:
- Помещать в отдельный общий модуль процедуры и функции, относящиеся к сходному функционалу;
- В наименовании модуля отражать его принадлежность к контексту (Клиент, Сервер) и избегать общих слов (обработчики, процедуры и т.д.);
- Разделять внутреннюю серверную логику приложения и клиентскую для интерфейса;
- Будьте внимательны, создавая глобальный общий модуль. Отсутствие необходимости обращаться к процедуре через имя модуля может привести к путанице, особенно, если систему поддерживает несколько групп разработчиков.
Правильно созданные модули помогут вам намного быстрее ориентироваться в структуре конфигурации и делать доработки. Если вы видите возможность сделать полезную функцию универсальной и вынести ее в общий модуль, то сделайте это. В будущем вы и ваши коллеги будете благодарны за это решение.
Читайте также: