При работе в среде «1С:Предприятие» на базе обычных (неуправляемых) форм разработчики часто сталкиваются с загадочным поведением платформы: два абсолютно разных файла внешних отчетов (например, Отчет1.erf и Отчет2.erf) ведут себя как сиамские близнецы. Стоит нам изменить настройки, ввести коэффициенты или поменять состав колонок в первом отчете, как эти же данные чудесным образом появляются во втором. А любые изменения во втором отчете тут же затирают настройки первого.
Давайте подробно разберем, почему возникает этот эффект, заглянем во внутреннюю архитектуру платформы «1С:Предприятие» и по шагам рассмотрим проверенные практические способы решения этой проблемы.
Когда мы создаем копию внешнего отчета простым копированием файла в операционной системе или используем функцию «Сохранить как» в Конфигураторе, мы копируем не просто внешний программный код. Мы полностью дублируем внутреннюю структуру файла метаданных.
Для платформы 1С имя файла на диске имеет второстепенное значение. Идентификация объектов и привязка их индивидуальных настроек (сохраняемых значений, положения окон, пользовательских настроек колонок) происходит по двум ключевым параметрам:
Имя метаданных отчета).Если мы просто скопировали файл, эти идентификаторы внутри структуры файлов остались абсолютно одинаковыми. Платформа записывает настройки в кэш или в регистр сведений СохраненныеНастройки, используя один и тот же GUID формы. В результате настройки одного отчета начинают беспрепятственно затирать настройки другого.
Ниже мы подробно разберем все способы решения этой проблемы, начиная от самых простых и заканчивая наиболее надежными профессиональными методами.
---
Первое, с чего необходимо начать — проверить имя самого отчета в метаданных. Не путайте имя файла на диске и имя объекта внутри конфигуратора.
Выполним следующие шаги:
Имя укажем, например, УниверсальныйОтчетВариант1.УниверсальныйОтчетВариант2.Очень часто одного этого действия бывает достаточно, если сохранение параметров происходит стандартными механизмами платформы, привязанными к имени метаданных.
---
Иногда разработчики реализуют собственное сохранение данных формы (например, таблицы коэффициентов) «вручную» с помощью методов глобального контекста. Проанализируем программный код модулей формы и модуля отчета.
Ищем в тексте использование следующих процедур и функций:
СохранитьЗначение()ВосстановитьЗначение()Если в коде присутствует подобная конструкция:
Процедура ПриЗаписиНастроек()
СохранитьЗначение("КоэффициентыДляРасчетаОтчета", ТаблицаКоэффициентов);
КонецПроцедуры
Процедура ПриОткрытии()
ТаблицаКоэффициентов = ВосстановитьЗначение("КоэффициентыДляРасчетаОтчета");
КонецПроцедуры
В данном случае оба отчета используют один и тот же жестко заданный строковый ключ "КоэффициентыДляРасчетаОтчета". Платформа будет записывать данные в одну ячейку базы данных или локального файла настроек пользователя.
Решение: Изменим этот ключ во втором отчете, сделав его уникальным:
Процедура ПриЗаписиНастроек()
СохранитьЗначение("КоэффициентыДляРасчетаОтчета_Вариант2", ТаблицаКоэффициентов);
КонецПроцедуры
Процедура ПриОткрытии()
ТаблицаКоэффициентов = ВосстановитьЗначение("КоэффициентыДляРасчетаОтчета_Вариант2");
КонецПроцедуры
---
Если имя изменено, программных сохранений в коде нет, но настройки все равно пересекаются, значит, дело в GUID самой формы. В старых неуправляемых формах настройки колонок табличного поля и размеры окна привязываются именно к идентификатору формы.
Разберем, как быстро пересоздать форму в проблемном отчете:
F9). В списке появится копия формы с новым именем (например, ФормаОтчета1).После этой процедуры платформа начнет определять форму как совершенно новый объект и выделит под ее настройки отдельную область памяти.
---
Бывают ситуации, когда ручное копирование форм дает сбой или структура отчета слишком сложна (содержит много подчиненных элементов, макетов и вложенных схем компоновки данных). Существует изящный и на 100% надежный способ заставить СУБД 1С самостоятельно перегенерировать все идентификаторы отчета.
Выполним следующие шаги вместе:
Этот способ гарантирует полную независимость нового файла от его «прародителя». Кэш настроек больше никогда не пересечется.
---
Если в форме отчета выводится таблица (например, табличное поле с коэффициентами), у этого элемента и у самой формы есть важные свойства в панели свойств Конфигуратора.
Проверим и изменим их:
WindowLocationKey). Если там написано одинаковое строковое значение, сотрите его или измените во втором отчете.---
Вы проделали все описанные выше действия, но настройки все равно продолжают дублироваться? Не паникуйте. Платформа 1С агрессивно кэширует структуру внешних обработок по путям к файлам.
Чтобы изменения вступили в силу, обязательно сделайте следующее:
РасчетКоэффициентов_Регион1.erf и РасчетКоэффициентов_Регион2.erf).%userprofile%\AppData\Local\1C\1Cv8%userprofile%\AppData\Roaming\1C\1Cv8Применяя данные методики, мы гарантируем стабильную и независимую работу нескольких одинаковых внешних отчетов с индивидуальными настройками для каждого пользователя.