При разработке расширений или кастомизации типовых конфигураций на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с необходимостью программного открытия отчетов с уже заполненными фильтрами. Однако в типовых решениях, таких как Бухгалтерия предприятия 3.0, стандартный механизм передачи структуры Отбор через параметры формы часто приводит к фатальной ошибке: "Невозможно применить фиксированные настройки. Совпадают значения параметра".
В данной статье мы подробно разберем, почему возникает эта ситуация, проанализируем внутренние механизмы работы системы компоновки данных (СКД) и рассмотрим несколько эффективных способов решения проблемы.
Ошибка "Совпадают значения параметра" при открытии формы отчета возникает в момент так называемой "склейки" настроек. В СКД существует три уровня настроек, которые накладываются друг на друга:
Когда мы передаем структуру Отбор или Параметры в процедуру ОткрытьФорму, система пытается применить их как фиксированные настройки. Если в самом отчете (в схеме или выбранном варианте) это поле уже выведено в состав пользовательских настроек или имеет предустановленное значение, происходит конфликт дублирования. Программа "видит" два разных указания для одного и того же поля и выдает ошибку.
Рассмотрим наиболее надежный способ, который заключается в получении формы отчета и прямой манипуляции его компоновщиком настроек до момента открытия окна пользователю. Этот метод позволяет найти уже существующий элемент отбора и просто изменить его значение, вместо того чтобы создавать дубль.
Проанализируем пример кода:
// 1. Подготавливаем параметры формы
ПараметрыФормы = Новый Структура("СформироватьПриОткрытии", Истина);
ФормаОтчета = ПолучитьФорму("Отчет.ДвижениеТоваров.ФормаОбъекта", ПараметрыФормы);
// 2. Получаем доступ к компоновщику
Компоновщик = ФормаОтчета.Отчет.КомпоновщикНастроек;
ПолеНоменклатура = Новый ПолеКомпоновкиДанных("Номенклатура");
// 3. Ищем существующий отбор в настройках
Найден = Ложь;
Для Каждого Элемент Из Компоновщик.Настройки.Отбор.Элементы Цикл
Если ТипЗнч(Элемент) = Тип("ЭлементОтбораКомпоновкиДанных")
И Элемент.ЛевоеЗначение = ПолеНоменклатура Тогда
Элемент.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Элемент.ПравоеЗначение = ТекущаяНоменклатура;
Элемент.Использование = Истина;
Найден = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
// 4. Если стандартный отбор не найден, добавляем новый
Если Не Найден Тогда
НовыйОтбор = Компоновщик.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйОтбор.ЛевоеЗначение = ПолеНоменклатура;
НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
НовыйОтбор.ПравоеЗначение = ТекущаяНоменклатура;
НовыйОтбор.Использование = Истина;
КонецЕсли;
ОткрытьФорму(ФормаОтчета);
Важный нюанс: Обратите внимание, что мы работаем с КомпоновщикНастроек.Настройки. Если ваша цель — сделать отбор видимым для пользователя (чтобы он мог его отключить), необходимо работать с коллекцией ПользовательскиеНастройки, используя идентификаторы настроек.
В конфигурации Бухгалтерия предприятия 3.0 отчеты строятся на базе подсистемы "Бухгалтерские отчеты". Рассмотрим программный подход, который имитирует логику расшифровки. Этот метод позволяет передать настройки более "чисто", используя структуру ПользовательскиеНастройки.
&НаКлиенте
Процедура ОткрытьТиповойОтчет(ИмяОтчета, НоменклатураСсылка)
// Создаем объект пользовательских настроек
Настройки = Новый ПользовательскиеНастройкиКомпоновкиДанных;
// Используем типовой программный интерфейс БП для добавления отбора
// (Требуется наличие определенных общих модулей в конфигурации)
НастройкаОтбора = Настройки.Элементы.Добавить(Тип("ОтборКомпоновкиДанных"));
НастройкаОтбора.ИдентификаторПользовательскойНастройки = "Отбор";
// Добавляем элемент через структуру (пример упрощенной реализации)
НовыйЭлемент = НастройкаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура");
НовыйЭлемент.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
НовыйЭлемент.ПравоеЗначение = НоменклатураСсылка;
НовыйЭлемент.Использование = Истина;
ПараметрыОтчета = Новый Структура;
ПараметрыОтчета.Вставить("ПользовательскиеНастройки", Настройки);
ПараметрыОтчета.Вставить("СформироватьПриОткрытии", Истина);
ОткрытьФорму("Отчет." + ИмяОтчета + ".Форма", ПараметрыОтчета);
КонецПроцедуры
Иногда типовой отчет содержит слишком много предопределенных ограничений в ФиксированныхНастройках, которые мешают программному открытию. Посмотрим, как можно полностью очистить эти настройки перед установкой своих. Внимание: используйте этот метод осторожно, так как удаление фиксированных настроек может убрать важные системные фильтры (например, отбор по организации или пометке на удаление).
ФормаОтчета = ПолучитьФорму("Отчет.ДвижениеТоваров.ФормаОбъекта", ПараметрыФормы);
Компоновщик = ФормаОтчета.Отчет.КомпоновщикНастроек;
// Очищаем фиксированные настройки, чтобы избежать конфликта "Совпадают значения"
Компоновщик.ФиксированныеНастройки.Отбор.Элементы.Очистить();
// Добавляем свой чистый отбор
НовыйЭлемент = Компоновщик.ФиксированныеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура");
НовыйЭлемент.ПравоеЗначение = СсылкаНаОбъект;
НовыйЭлемент.Использование = Истина;
После того как программист побеждает ошибку совпадения параметров, часто возникает вторая проблема: при автоматическом формировании отчета (СформироватьПриОткрытии = Истина) вылетает сообщение о недействительном адресе временного хранилища.
Рассмотрим причины этой ситуации:
Для решения проанализируем свойство формы НастройкиОтчета.ФормироватьСразу. В некоторых релизах БП 3.0 установка этого флага в Истина помогает корректно запустить цепочку событий формирования без потери адреса хранилища.
Подводя итоги, сформулируем основные правила безопасной передачи параметров в отчеты:
ЭлементОтбораКомпоновкиДанных, просканируйте коллекцию существующих элементов. Если поле уже там есть — просто обновите его ПравоеЗначение.СтандартныйПериод. Его нужно устанавливать через КомпоновщикНастроек.Настройки.ПараметрыДанных.Рассмотренные подходы позволяют гибко управлять поведением типовых отчетов 1С, обеспечивая бесшовную интеграцию кастомного кода в стандартную экосистему Бухгалтерии предприятия.