Почему во внешнем отчете 1С:УНФ 1.6 при изменении периода не пересчитываются остатки и как это исправить?

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

При разработке и доработке отчетов в конфигурациях на базе Библиотеки стандартных подсистем (БСП), таких как 1С:Управление нашей фирмой (УНФ) 1.6, 1С:Управление торговлей 11 или 1С:ERP, программисты часто сталкиваются с неприятным поведением платформы. Вы выгружаете стандартный отчет (например, «Остатки на складах») во внешний файл, вносите минимальные изменения, открываете его через меню «Файл — Открыть», но при изменении периода на форме отчет упорно отказывается обновлять данные. Он продолжает выводить информацию по старому периоду до тех пор, пока вы полностью не закроете форму и не откроете отчет заново.

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

Выясняем техническую причину проблемы

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

  1. Конфликт свойства «Хранилище вариантов»: У всех типовых отчетов в конфигурации заполнено свойство ХранилищеВариантов (как правило, это ХранилищеВариантовОтчетов). При сохранении отчета во внешний файл .erf это свойство наследуется. Когда вы открываете внешний файл, БСП пытается инициализировать механизмы кэширования настроек, связывая их с метаданными оригинального встроенного отчета. В результате возникает конфликт: форма считывает настройки из кэша информационной базы, игнорируя интерактивные изменения периода пользователем.
  2. Рассинхронизация компоновщика настроек: На уровне платформы 1С изменение периода на форме записывается в свойство КомпоновщикНастроек.ПользовательскиеНастройки. Однако при компоновке результата метод КомпоновщикНастроек.ПолучитьНастройки() может возвращать старую коллекцию параметров (без учета нового периода), так как изменения еще не зафиксировались в основной структуре компоновщика.
  3. Жесткая привязка к общему модулю в модуле объекта: В модуле объекта оригинального отчета в процедуре ПриКомпоновкеРезультата обычно прописан вызов общего модуля БСП, например, ОтчетыУНФ.ПриКомпоновкеРезультата(...). Этот код оптимизирован под работу со встроенными объектами метаданных и часто некорректно обрабатывает параметры внешних файлов.

Теперь, зная причины сбоя, разберем по шагам доступные варианты решения.

Способ 1. Очистка свойства «Хранилище вариантов» в Конфигураторе

Это самый быстрый и простой способ, который помогает в 90% случаев при работе с внешними отчетами. Нам необходимо разорвать связь внешнего файла с механизмами кэширования настроек БСП.

Рассмотрим порядок действий:

  1. Откройте ваш внешний отчет (файл .erf) в режиме Конфигуратор.
  2. В окне структуры отчета выделите самый верхний элемент (корневой элемент дерева свойств отчета).
  3. Нажмите правую кнопку мыши и выберите пункт Свойства (или нажмите комбинацию клавиш Alt + Enter).
  4. В палитре свойств найдите строку Хранилище вариантов.
  5. Очистите это поле, нажав на кнопку с красным крестиком (оно должно стать пустым).
  6. Сохраните отчет и протестируйте его в режиме «1С:Предприятие».

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

Способ 2. Принудительная синхронизация настроек в модуле объекта

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

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

  1. В конфигураторе откройте модуль объекта вашего внешнего отчета.
  2. Найдите предопределенную процедуру ПриКомпоновкеРезультата. Если ее нет, создайте ее.
  3. Добавьте в самое начало процедуры код, который принудительно загружает актуальные интерактивные пользовательские настройки обратно в компоновщик:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Принудительно синхронизируем настройки перед компоновкой
    КомпоновщикНастроек.ЗагрузитьНастройки(КомпоновщикНастроек.ПолучитьНастройки());
    
КонецПроцедуры

Этот простой прием заставляет платформу обновить значения параметров виртуальных таблиц СКД актуальными датами, которые пользователь только что выбрал на форме отчета.

Способ 3. Изменение имени, синонима и имени схемы СКД

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

Выясним, как правильно уникализировать наш отчет:

  1. В свойствах внешнего отчета измените поле Имя (например, задайте уникальное имя _Доработанный_ОстаткиНаСкладах).
  2. Измените Синоним отчета, чтобы пользователи не путались при открытии.
  3. Перейдите к макетам отчета, откройте основную схему компоновки данных (обычно она называется ОсновнаяСхемаКомпоновкиДанных) и переименуйте саму схему в свойствах макета (например, в Схема_ОстаткиНаСкладах).

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

Способ 4. Проверка связи параметров виртуальных таблиц в СКД

Если в вашем отчете используются запросы к виртуальным таблицам остатков и оборотов (например, РегистрНакопления.Запасы.Остатки), важно убедиться, что параметры этих таблиц правильно связаны со стандартным периодом СКД.

Проанализируем вкладку настроек параметров в СКД:

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

Способ 5. Работа с отчетом через справочник дополнительных обработок

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

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

← На главную