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