При разработке отчетов на базе Схемы компоновки данных (СКД) в конфигурации «1С:Бухгалтерия предприятия 3.0» (БП 3.0) программисты часто сталкиваются с загадочным поведением: при попытке пользователя выбрать номенклатуру в настройках отчета, открывшаяся форма выбора уже содержит жестко заданный отбор Услуга = Ложь. Это делает невозможным выбор услуг для формирования отчета, хотя в самом запросе никаких ограничений не прописывалось. Разберем детально, почему это происходит и как вернуть пользователю возможность выбирать любые типы номенклатуры.
Ситуация, когда система «сама» накладывает ограничения, не является ошибкой платформы. Это результат работы механизмов типового решения, заложенных разработчиками фирмы «1С». Рассмотрим подробнее основные причины этого поведения.
1. Наследование свойств метаданных
В конфигурации «Бухгалтерия предприятия 3.0» у многих реквизитов, связанных с номенклатурой (например, в табличных частях документов или регистрах накопления), в свойствах метаданных в поле «Параметры выбора» жестко прописано ограничение Отбор.Услуга(Ложь). Когда СКД строит запрос к этим таблицам, она автоматически подтягивает свойства полей. Система «считает», что если вы выбираете данные из таблицы, где хранятся только товары, то и в отчете вам не нужны услуги.
2. Контекст бухгалтерских счетов (Виртуальные таблицы)
Если ваш отчет обращается к виртуальным таблицам остатков или оборотов (например, Хозрасчетный.Остатки), система анализирует счета учета. Если запрос задевает счета, на которых учет услуг не предусмотрен (например, 10 «Материалы» или 41 «Товары»), форма выбора номенклатуры, вызываемая из СКД, автоматически инициализируется с фильтром. Это происходит потому, что услуги не имеют количественного остатка в классическом понимании складского учета.
3. Механизм связей параметров выбора в СКД
В конструкторе СКД на закладке «Наборы данных» для каждого поля существует колонка Параметры выбора. Иногда платформа автоматически заполняет эти параметры, основываясь на типе данных или связях субконто. Проанализируем ситуацию: если поле связано с типизированным субконто, СКД может унаследовать программные ограничения этого субконто.
Первым делом нам необходимо проверить настройки самого отчета в конфигураторе. Разберем по шагам:
Субконто1 или Номенклатура).Если очистка параметров не помогла, это означает, что СКД продолжает наследовать свойства поля из метаданных таблицы. Чтобы заставить систему игнорировать эти свойства, мы можем применить функцию ВЫРАЗИТЬ в тексте запроса. Рассмотрим пример:
Вместо обычного выбора поля:
ВЫБРАТЬ
ХозрасчетныйОстатки.Субконто1 КАК Номенклатура,
ХозрасчетныйОстатки.СуммаОстаток КАК Сумма
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, , , ) КАК ХозрасчетныйОстатки
Используем явное приведение типа:
ВЫБРАТЬ
ВЫРАЗИТЬ(ХозрасчетныйОстатки.Субконто1 КАК Справочник.Номенклатура) КАК Номенклатура,
ХозрасчетныйОстатки.СуммаОстаток КАК Сумма
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, , , ) КАК ХозрасчетныйОстатки
Проанализируем результат: использование ВЫРАЗИТЬ создает «новое» поле с точки зрения СКД, которое теряет жесткую привязку к параметрам выбора исходного субконто регистра бухгалтерии. Это часто решает проблему автоматических фильтров.
Если нам нужно гарантированно показать услуги, мы можем принудительно передать параметр в форму выбора прямо из настроек СКД. Выясним, как это сделать:
Отбор.Услуга.ПоказыватьУслуги со значением Истина, так как менеджер справочника номенклатуры анализирует этот флаг при открытии формы.Еще один надежный метод — это получение номенклатуры не напрямую из виртуальной таблицы регистра, а через левое соединение со справочником. Посмотрим на пример кода:
ВЫБРАТЬ
СпрНоменклатура.Ссылка КАК Номенклатура,
ДанныеРегистра.СуммаОстаток КАК Сумма
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, , , ) КАК ДанныеРегистра
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
ПО ДанныеРегистра.Субконто1 = СпрНоменклатура.Ссылка
В этом случае поле Номенклатура берется из «чистой» таблицы справочника, где нет предопределенных фильтров Услуга = Ложь, характерных для учетных регистров. Система будет открывать форму выбора без лишних ограничений.
Важно помнить, что 1С:Предприятие 8.3 умеет запоминать пользовательские настройки форм. Если вы один раз вручную установили отбор в форме выбора, он может сохраняться. Если после всех манипуляций в конфигураторе отбор остается, попробуйте выполнить следующие действия:
Подводя итог, можно сказать, что автоматический отбор Услуга = Ложь — это защитный механизм конфигурации, предотвращающий выбор «нефизических» объектов там, где ожидаются товары или материалы. Однако, используя ВЫРАЗИТЬ или корректируя параметры выбора в СКД, мы можем гибко управлять этим поведением под задачи нашего отчета.