В процессе сопровождения и разработки конфигураций на платформе 1С:Предприятие 7.7 программисты часто сталкиваются с неочевидным поведением механизмов сравнения и объединения. Одной из наиболее «коварных» проблем является игнорирование платформой изменения признака «Отбор» для объектов типа ВидСубконто. Рассмотрим подробно, почему возникает эта ошибка, к каким последствиям она приводит и как гарантированно перенести изменения между конфигурациями.
При выполнении стандартной операции «Сравнение и объединение конфигураций» платформа 1С 7.7 анализирует метаданные двух файлов (текущей конфигурации и загружаемого .md файла). Однако алгоритм сравнения объектов метаданных в «семерке» не является абсолютным. Для ускорения процесса или по причине программной ошибки в релизах (вплоть до 27-го), некоторые атрибуты объектов исключены из проверки на идентичность.
Проанализируем ситуацию: если в одном MD-файле у вида субконто стоит галочка «Отбор», а в другом — нет, штатный механизм сравнения может выдать сообщение «Конфигурации идентичны!!!». Это происходит потому, что внутренний идентификатор (ID) объекта совпадает, а признак «Отбор» не входит в перечень «контрольных» свойств, по которым платформа определяет наличие изменений. В результате, при объединении конфигураций, этот важный признак просто не обновляется в целевой базе данных.
Для понимания серьезности бага разберем, как этот флаг работает на уровне базы данных. В отличие от обычных справочников, где «Отбор» просто создает индекс, в бухгалтерском учете 1С 7.7 этот признак управляет заполнением специализированной системной таблицы _1SSBSEL (в SQL-версии) или соответствующего файла в DBF-формате.
_1SSBSEL служит для хранения «отборов проводок по субконто». Когда флаг установлен, при проведении документов записи дублируются в эту таблицу для максимально быстрого получения данных при использовании фильтров.ВыбратьПроводки с установленным фильтром по конкретному значению субконто, система будет вынуждена сканировать основной журнал проводок, что в разы медленнее.Поскольку платформа игнорирует изменение признака Отбор в чистом виде, нам необходимо «заставить» механизм сравнения увидеть изменения в объекте ВидСубконто. Проанализируем самый надежный способ, который профессиональные разработчики называют методом «толкача».
Шаг 1: Подготовка в исходной конфигурации (база-источник)
В конфигурации, из которой вы планируете переносить изменения, откройте дерево метаданных. Найдите нужный ВидСубконто. Помимо установки (или снятия) галочки «Отбор», внесите любое незначительное изменение в строковые реквизиты объекта. Лучше всего изменить поле «Комментарий» или временно добавить символ в «Наименование».
Шаг 2: Выполнение сравнения и объединения
Запустите процедуру объединения в целевой базе. Теперь, за счет изменения комментария, платформа увидит, что объект ВидСубконто изменился. В списке сравнения вы увидите этот объект помеченным. При объединении вместе с измененным комментарием «подтянется» и нужный нам флаг «Отбор».
Шаг 3: Возврат метаданных в исходное состояние
После успешного объединения вы можете вернуть комментарий или наименование к исходному виду. Главное, что триггер реструктуризации уже сработал.
Рассмотрим еще один способ, который позволяет избежать ручного изменения комментариев. Это использование пункта меню «Загрузить измененную конфигурацию» вместо «Объединения». При полной загрузке файла .md платформа не сравнивает объекты выборочно, а полностью перезаписывает структуру метаданных.
Внимание: Этот метод опасен, если в целевой рабочей базе велись параллельные разработки, которые отсутствуют в загружаемом файле. Пользуйтесь этим методом только в том случае, если вы уверены в полной идентичности всех остальных объектов.
Если вы обнаружили, что объединение прошло некорректно и данные в отчетах не сходятся, простого исправления галочки в конфигураторе недостаточно для старых данных. Выясним причину: установка флага влияет только на будущие проводки. Чтобы восстановить таблицу _1SSBSEL для прошлых периодов, выполните следующие действия:
_1SSBSEL актуальными данными.Если в вашей конфигурации нет штатной обработки управления отборами, поможет полный пересчет бухгалтерских итогов или использование программного кода для принудительной регистрации проводок в отборах. Рассмотрим пример логики, которая используется при пересчете (схематично):
// Пример логики обращения к механизму отборов (метакод)
Операция = СоздатьОбъект("Операция");
Операция.ВыбратьОперации(ДатаНачала, ДатаКонца);
Пока Операция.ПолучитьОперацию() = 1 Цикл
// При записи операции платформа автоматически анализирует
// актуальные признаки "Отбор" в Видах Субконто
// и обновляет системные таблицы
Операция.Записать();
КонецЦикла;
Подведем итог: баг платформы 7.7 при сравнении признака «Отбор» является системным ограничением логики хеширования метаданных. Для корректной работы всегда используйте изменение «соседних» полей объекта в качестве инициатора обновления. Помните, что после внесения изменений в структуру отборов на больших базах, крайне рекомендуется выполнить процедуру актуализации данных, чтобы отчеты работали корректно за все периоды.