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

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

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

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

Выясняем причину: почему настройки «склеиваются»?

Для операционной системы Windows файлы Отчет1.erf и Отчет2.erf — это два абсолютно разных объекта. Однако платформа 1С идентифицирует внешние отчеты совершенно иначе. Причиной «склеивания» настроек являются два ключевых фактора:

  1. Одинаковое имя в метаданных. У каждого внешнего отчета есть свойство Имя, которое задается внутри Конфигуратора. Если вы просто скопировали файл через проводник, имя внутри метаданных осталось прежним (например, ОтчетПоКоэффициентам). Именно по этому имени платформа идентифицирует объект при записи его настроек в базу данных (в частности, в системный регистр сведений «Сохраненные настройки»).
  2. Совпадение внутренних идентификаторов (GUID). Каждый объект метаданных, включая сам отчет и его формы, обладает уникальным 128-битным идентификатором (GUID), генерируемым платформой при создании. При обычном копировании файла на диске все внутренние GUID дублируются. Платформа 1С использует их для кэширования и связи форм с сохраненными значениями. Из-за этого система считает обе формы одним и тем же объектом.

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

---

Способ 1. Принудительное изменение имени и пересоздание формы

Этот метод является самым быстрым, если вам нужно оперативно исправить проблему прямо в файле отчета. Нам понадобится открыть проблемный отчет в режиме Конфигуратора и обновить его структуру.

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

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

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

---

Способ 2. Сброс идентификаторов через дерево конфигурации базы данных

Этот способ является наиболее надежным, так как при добавлении объекта во внутреннюю метаструктуру конфигурации платформа 1С автоматически пересоздает все внутренние идентификаторы (GUID) для самого отчета, его форм, макетов и реквизитов.

Проанализируем этот процесс по шагам:

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

Этот нехитрый прием позволяет полностью «очистить» файл от старых GUID, создавая чистый и независимый внешний отчет.

---

Способ 3. Создание чистого файла и перенос разработанных объектов

Если предыдущие методы по какой-то причине не помогли или структура отчета слишком сложная, мы можем создать абсолютно новый «чистый» файл отчета и перенести в него все наработки с помощью механизма сравнения и объединения.

Разберем, как это сделать:

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

---

Разбор проблемы с сохранением данных после изменения имени столбца

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

Выясним причину этого поведения. В обычных формах (на которых работает «Управление торговлей 10.3») сохранение данных и настроек формы может быть реализовано двумя путями: автоматически и программно.

1. Автоматическое сохранение настроек формы

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

Решение:

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

2. Программное сохранение настроек

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


Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    // Сохранение настроек в структуру
    СтруктураНастроек = Новый Структура;
    СтруктураНастроек.Вставить("СтароеИмяКолонки", ТаблицаКоэффициентов);
    СохранитьЗначение("НастройкиОтчетаКоэффициенты", СтруктураНастроек);
КонецПроцедуры

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

Для исправления этой ситуации выполните глобальный поиск по проекту (сочетание клавиш Ctrl + Shift + F) внутри вашего внешнего отчета. Проверьте все вхождения старого названия колонки в модуле формы и модуле объекта и замените их на актуальное имя.

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

← На главную