Почему два одинаковых внешних отчета 1С перезаписывают настройки друг друга и как их разделить?

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

При работе в среде «1С:Предприятие» на базе обычных (неуправляемых) форм разработчики часто сталкиваются с загадочным поведением платформы: два абсолютно разных файла внешних отчетов (например, Отчет1.erf и Отчет2.erf) ведут себя как сиамские близнецы. Стоит нам изменить настройки, ввести коэффициенты или поменять состав колонок в первом отчете, как эти же данные чудесным образом появляются во втором. А любые изменения во втором отчете тут же затирают настройки первого.

Давайте подробно разберем, почему возникает этот эффект, заглянем во внутреннюю архитектуру платформы «1С:Предприятие» и по шагам рассмотрим проверенные практические способы решения этой проблемы.

Выясняем причину: почему платформа связывает два разных файла?

Когда мы создаем копию внешнего отчета простым копированием файла в операционной системе или используем функцию «Сохранить как» в Конфигураторе, мы копируем не просто внешний программный код. Мы полностью дублируем внутреннюю структуру файла метаданных.

Для платформы 1С имя файла на диске имеет второстепенное значение. Идентификация объектов и привязка их индивидуальных настроек (сохраняемых значений, положения окон, пользовательских настроек колонок) происходит по двум ключевым параметрам:

  1. Внутреннее имя объекта в палитре свойств (свойство Имя метаданных отчета).
  2. Уникальный идентификатор (GUID/UUID) самого отчета и его подчиненных объектов (в частности, форм и макетов).

Если мы просто скопировали файл, эти идентификаторы внутри структуры файлов остались абсолютно одинаковыми. Платформа записывает настройки в кэш или в регистр сведений СохраненныеНастройки, используя один и тот же GUID формы. В результате настройки одного отчета начинают беспрепятственно затирать настройки другого.

Ниже мы подробно разберем все способы решения этой проблемы, начиная от самых простых и заканчивая наиболее надежными профессиональными методами.

---

Способ 1. Изменение внутреннего имени внешнего отчета

Первое, с чего необходимо начать — проверить имя самого отчета в метаданных. Не путайте имя файла на диске и имя объекта внутри конфигуратора.

Выполним следующие шаги:

  1. Откроем первый отчет в Конфигураторе. Нажмем правой кнопкой мыши на самый верхний элемент дерева («Отчет») и выберем «Свойства».
  2. В поле Имя укажем, например, УниверсальныйОтчетВариант1.
  3. Откроем второй отчет и точно так же изменим его имя на УниверсальныйОтчетВариант2.
  4. Сохраним оба файла.

Очень часто одного этого действия бывает достаточно, если сохранение параметров происходит стандартными механизмами платформы, привязанными к имени метаданных.

---

Способ 2. Проверка программного кода сохранения настроек

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

Ищем в тексте использование следующих процедур и функций:

Если в коде присутствует подобная конструкция:


Процедура ПриЗаписиНастроек()
    СохранитьЗначение("КоэффициентыДляРасчетаОтчета", ТаблицаКоэффициентов);
КонецПроцедуры

Процедура ПриОткрытии()
    ТаблицаКоэффициентов = ВосстановитьЗначение("КоэффициентыДляРасчетаОтчета");
КонецПроцедуры

В данном случае оба отчета используют один и тот же жестко заданный строковый ключ "КоэффициентыДляРасчетаОтчета". Платформа будет записывать данные в одну ячейку базы данных или локального файла настроек пользователя.

Решение: Изменим этот ключ во втором отчете, сделав его уникальным:


Процедура ПриЗаписиНастроек()
    СохранитьЗначение("КоэффициентыДляРасчетаОтчета_Вариант2", ТаблицаКоэффициентов);
КонецПроцедуры

Процедура ПриОткрытии()
    ТаблицаКоэффициентов = ВосстановитьЗначение("КоэффициентыДляРасчетаОтчета_Вариант2");
КонецПроцедуры

---

Способ 3. Пересоздание формы для обновления уникального GUID (Быстрый метод)

Если имя изменено, программных сохранений в коде нет, но настройки все равно пересекаются, значит, дело в GUID самой формы. В старых неуправляемых формах настройки колонок табличного поля и размеры окна привязываются именно к идентификатору формы.

Разберем, как быстро пересоздать форму в проблемном отчете:

  1. Откроем второй отчет в Конфигураторе.
  2. В дереве метаданных отчета найдем ветку «Формы».
  3. Нажмем правой кнопкой мыши на нашу форму и выберем «Скопировать» (или просто нажмем клавишу F9). В списке появится копия формы с новым именем (например, ФормаОтчета1).
  4. У этой копии автоматически сгенерируется абсолютно новый уникальный идентификатор GUID.
  5. Установим новую форму в качестве основной. Для этого в свойствах самого отчета найдем поле «Основная форма» и выберем нашу свежесозданную копию.
  6. Старую оригинальную форму теперь можно безболезненно удалить.
  7. Переименуем новую форму обратно в исходное имя, если это необходимо для соблюдения стандартов разработки.
  8. Сохраним отчет.

После этой процедуры платформа начнет определять форму как совершенно новый объект и выделит под ее настройки отдельную область памяти.

---

Способ 4. Временный импорт в конфигурацию (Самый надежный метод)

Бывают ситуации, когда ручное копирование форм дает сбой или структура отчета слишком сложна (содержит много подчиненных элементов, макетов и вложенных схем компоновки данных). Существует изящный и на 100% надежный способ заставить СУБД 1С самостоятельно перегенерировать все идентификаторы отчета.

Выполним следующие шаги вместе:

  1. Откроем базу данных 1С в режиме Конфигуратор с открытым деревом основной конфигурации.
  2. Найдем ветку «Отчеты» в дереве метаданных.
  3. Нажмем правой кнопкой мыши на ветку «Отчеты» и выберем пункт «Вставить внешний отчет/обработку...».
  4. Укажем файл нашего второго проблемного отчета на диске.
  5. Отчет добавится в состав основной конфигурации. При выполнении этой операции СУБД автоматически сгенерирует абсолютно новые, гарантированно уникальные UUID для самого отчета, всех его форм, макетов и реквизитов.
  6. Теперь нажмем правой кнопкой мыши по добавленному отчету в дереве конфигурации и выберем пункт «Сохранить как внешний отчет, обработку...».
  7. Сохраним его на диск под новым именем.
  8. Удалим добавленный отчет из дерева конфигурации, чтобы не засорять основную метабазу.

Этот способ гарантирует полную независимость нового файла от его «прародителя». Кэш настроек больше никогда не пересечется.

---

Способ 5. Ключ сохранения положения окна и настроек колонок

Если в форме отчета выводится таблица (например, табличное поле с коэффициентами), у этого элемента и у самой формы есть важные свойства в панели свойств Конфигуратора.

Проверим и изменим их:

  1. Откроем форму отчета в режиме редактирования.
  2. Вызовем палитру свойств самой формы. Найдем свойство «Ключ сохранения положения окна» (WindowLocationKey). Если там написано одинаковое строковое значение, сотрите его или измените во втором отчете.
  3. Выделим элемент управления «Табличное поле», где выводятся коэффициенты. Найдем в свойствах «Ключ сохранения настроек». Если этот ключ совпадает в обоих отчетах, настройки колонок (видимость, ширина, порядок) будут дублироваться. Измените или очистите это свойство.

---

Важный шаг: Очистка локального кэша после изменений

Вы проделали все описанные выше действия, но настройки все равно продолжают дублироваться? Не паникуйте. Платформа 1С агрессивно кэширует структуру внешних обработок по путям к файлам.

Чтобы изменения вступили в силу, обязательно сделайте следующее:

  1. Никогда не тестируйте изменения, перезаписывая файлы поверх старых в ту же папку с теми же именами файлов во время сеанса работы. Сохраните новые варианты под уникальными именами файлов (например, РасчетКоэффициентов_Регион1.erf и РасчетКоэффициентов_Регион2.erf).
  2. Очистите кэш пользователя. Самый простой способ — удалить базу из списка запуска в стартере 1С и добавить ее заново (при этом папка кэша GUID для этой базы пересоздастся).
  3. Для полной очистки вручную удалите содержимое папок:
    • %userprofile%\AppData\Local\1C\1Cv8
    • %userprofile%\AppData\Roaming\1C\1Cv8

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

← На главную