Как вернуть неизмененные объекты конфигурации 1С на поддержку без изменения?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

В процессе сопровождения и доработки типовых конфигураций разработчики часто включают возможность редактирования для всей конфигурации или отдельных ее объектов. Со временем часть объектов (документов, справочников, реквизитов) остается полностью идентичной эталону поставщика, однако признак «Редактируется с сохранением поддержки» (желтый куб с карандашом) продолжает мешать штатному обновлению. Попытка вручную изменить правило поддержки прямо в форме настройки приводит к сообщению платформы о том, что действие возможно только в режиме сравнения и объединения. Разберем детально, почему так происходит и как вернуть неизмененные объекты на строгую поддержку поставщика (под «замок»).

Почему окно настройки поддержки блокирует выбор пункта «Объект поставщика не редактируется»

Проанализируем логику работы платформы 1С:Предприятие при управлении правилами поддержки. При попытке переключить правило непосредственно в окне настройки поддержки пункт «Объект поставщика не редактируется» часто оказывается серым (недоступным для выбора). Выясним основные технические причины такого поведения:

  1. Ограничение диалога настройки поддержки: В окне настройки платформа не выполняет глубокого сопоставления структуры метаданных и текстов модулей с конфигурацией поставщика. Чтобы предотвратить случайную потерю доработок, платформа требует выполнения операции через механизм сравнения и объединения.
  2. Иерархия правил поддержки: Подчиненный элемент метаданных (реквизит, табличная часть, форма) не может иметь уровень контроля выше, чем у его непосредственного родителя. Если у самого документа или корня конфигурации снят признак поддержки, вернуть дочерний реквизит на замок невозможно до тех пор, пока не будет ужесточено правило для родительского объекта.
  3. Собственные объекты конфигурации: Если объект был добавлен программистом с нуля, для него в принципе отсутствует эталон в конфигурации поставщика, поэтому установить для него статус неизменяемого объекта поставщика нельзя.

Штатный способ: возврат объектов на поддержку через сравнение и объединение

Рассмотрим стандартный и наиболее безопасный алгоритм восстановления правил поддержки без полного снятия базы с поддержки. Основная сложность, с которой сталкиваются специалисты: если объект не имеет различий с эталоном, механизм сравнения по умолчанию скрывает его из списка, не позволяя изменить правило. Разберем по шагам, как обойти это ограничение.

  1. Сохранение эталонной конфигурации поставщика: Перейдем в меню Конфигурация — Поддержка — Настройка поддержки. В открывшемся окне нажмем кнопку Сохранить в файл и сохраним файл с расширением .cf. Это эталонная конфигурация текущего релиза без пользовательских правок.
  2. Запуск сравнения и объединения: Откроем меню Конфигурация — Сравнить, объединить с конфигурацией из файла и укажем ранее выгруженный файл .cf.
  3. Отключение автоматического объединения: После построения дерева сравнения первым делом снимем общий флажок в корне дерева. Это критически важно, чтобы случайно не перезаписать реальные доработки конфигурации.
  4. Настройка отображения объектов: По умолчанию в окне отображаются только объекты с различиями. Переключим режим фильтрации: в панели инструментов окна сравнения найдем настройку фильтра и выберем значение «Без фильтра» (или покажем все объекты). Теперь в дереве появятся абсолютно все метаданные, включая полностью совпадающие.
  5. Установка правил поддержки: Выделим нужные объекты (или целые ветки метаданных, в которых не вносились изменения), нажмем кнопку Действия (или воспользуемся контекстным меню) и выберем пункт Установить правила поддержки.... Для выбранных позиций укажем правило «Объект поставщика не редактируется».
  6. Применение изменений: Нажмем кнопку Выполнить. В появившемся диалоге настройки правил поддержки убедимся, что правила сопоставлены корректно, и подтвердим выполнение. После завершения операции неизмененные объекты снова получат пиктограмму замка.

Автоматизация изменения правил поддержки с помощью скрипта

Если конфигурация сильно разветвлена, а ручное переключение правил через сравнение вызывает трудности или требует точечной обработки большого массива элементов, можно автоматизировать рутинные нажатия клавиш в окне настройки поддержки. Рассмотрим пример специализированного скрипта для утилиты AutoIt, который эмулирует действия разработчика в интерфейсе конфигуратора платформы 1С.

Разберем код скрипта, использующего горячие клавиши для пакетного изменения правил:


; Скрипт автоматизации возврата правил поддержки для AutoIt
#include <WinAPI.au3>

Dim $ConfTitle = "Конфигуратор - Управление торговлей, редакция 11.1"
Dim $Key2Send = "{UP}"   ; Направление выбора для состояния "Редактируется с сохранением поддержки"
Dim $Pause = 65          ; Задержка между операциями в миллисекундах
Dim $IterNum = 18        ; Количество итераций для массовой обработки
Dim $InstanceNumber = 9  ; Номер экземпляра элемента формы для версии платформы 8.3.8

Func GUICtrlGetStyle($hWnd)
    If Not IsHWnd($hWnd) Then
        $hWnd = GUICtrlGetHandle($hWnd)
    EndIf
    Local $aReturn = [_WinAPI_GetWindowLong($hWnd, $GWL_STYLE), _WinAPI_GetWindowLong($hWnd, $GWL_EXSTYLE)]
    Return $aReturn
EndFunc

Func Change()
    ; Передаем клик в окно настройки поддержки для вызова редактирования правила
    $Res = ControlClick($ConfTitle, "", "[CLASS:V8FormElement; INSTANCE:" & $InstanceNumber & "]")
    If $Res = 0 Then Return False
    Sleep(30)
    Send("{ENTER}")
    Sleep($Pause / 2)
    
    If Not WinExists("Настройка правил поддержки") Then Return False

    ; Проверяем доступность переключателя "Объект поставщика не редактируется"
    $hnd = ControlGetHandle("Настройка правил поддержки", "", "[CLASS:V8FormElement; INSTANCE:6]")
    If $hnd = 0 Then Return False
    
    Local $aArray = GUICtrlGetStyle($hnd)
    If $aArray[0] = 1577058304 Then Return False ; Элемент заблокирован (группа или объект без поддержки)

    ; Применяем выбор правила и закрываем диалог
    Send($Key2Send & "{TAB}{SPACE}{ENTER}")
    Sleep($Pause)

    ; Переходим к следующей строке дерева
    Send("+{TAB}+{TAB}")
    Sleep($Pause)
    Send("{DOWN}")
    Return True
EndFunc

Func KeyF7_1()
    Change()
EndFunc

Func KeyF8_5()
    For $ii = 1 To 5
        If Not Change() Then ExitLoop
    Next
EndFunc

Func KeyF9_Many()
    For $ii = 1 To $IterNum
        If Not Change() Then ExitLoop
    Next
EndFunc

HotKeySet("{F7}", "KeyF7_1")
HotKeySet("{F8}", "KeyF8_5")
HotKeySet("{F9}", "KeyF9_Many")

While 1
    Sleep(3000)
WEnd

Перед запуском скрипта обязательно создадим резервную копию информационной базы. Для работы откроем окно Конфигурация — Поддержка — Настройка поддержки, спозиционируемся на целевом объекте и используем клавиши F7 (один шаг), F8 (5 шагов) или F9 (пакет из 18 объектов).

Как найти объекты, снятые с поддержки или доступные для изменения

Проанализируем задачу поиска измененных объектов. Во встроенном языке 1С прикладной объект Метаданные не предоставляет программных свойств или методов для чтения правил поддержки (таких как состояние замка). Тем не менее выявить измененные объекты без ручного просмотра структуры можно следующими методами:

  1. Штатный отчет о сравнении конфигураций: Откроем меню Конфигурация — Сравнить конфигурации. В качестве первой выберем основную конфигурацию, в качестве второй — конфигурацию поставщика. В окне отчета настроим фильтрацию по признаку наличия различий. Это сформирует наглядный список всех доработанных объектов.
  2. Пакетная выгрузка в файлы: Запустим конфигуратор из командной строки с параметром /DumpConfigToFiles. В результирующем каталоге файлы метаданных формата XML содержат служебную информацию о статусе поддержки, которую можно легко обработать регулярными выражениями или скриптами.
  3. Командная строка сравнения: Использование пакетного режима запуска конфигуратора с параметром /CompareConfiguration позволяет автоматически сформировать отчет о расхождениях конфигурации с эталоном поставщика в текстовый файл.
← На главную