При активной разработке в расширениях для типовых конфигураций 1С (например, «1С:Бухгалтерия предприятия»), находящихся на поддержке, программисты часто сталкиваются с жесткими ограничениями платформы. Типичная задача — реализовать забалансовый учет по специфической аналитике, которая добавлена в виде нового справочника в расширении. При попытке программно создать забалансовый счет и назначить ему в качестве субконто этот новый справочник разработчик получает фатальную ошибку: «Тип не является подмножеством типа значений плана видов характеристик».
В этой статье мы подробно разберем, почему возникает эта ошибка, рассмотрим ограничения платформы на разных режимах совместимости и изучим практические варианты обхода этой проблемы без снятия конфигурации с поддержки.
В системе «1С:Предприятие» за субконто отвечает План видов характеристик (ПВХ) — обычно это предопределенный ПВХ ВидыСубконтоХозрасчетные. Тип значения характеристик этого ПВХ жестко определяет список типов данных, которые могут быть использованы в качестве аналитики на счетах бухгалтерского учета.
Когда мы создаем новый справочник в расширении, его тип данных (например, СправочникСсылка.Расш_МойНовыйСправочник) отсутствует в типе значения характеристик основного ПВХ конфигурации. На старых режимах совместимости (ниже 8.3.20) платформа запрещает расширять составной тип значений ПВХ объектами из расширения. При попытке назначить такой тип субконто система справедливо сообщает о нарушении целостности метаданных.
Давайте разберем три основных метода решения этой задачи: от классического «обходного пути» для старых платформ до современных возможностей актуальных релизов 1С.
---
Если ваша конфигурация работает в режиме совместимости 8.3.12 (как в случае автора темы) или любом другом до 8.3.20, обойти ограничение напрямую невозможно. Но мы можем применить паттерн «справочник-прокладка».
В типовой конфигурации «1С:Бухгалтерия» изначально присутствует предопределенный справочник Субконто. Он по умолчанию включен в тип значений характеристик ПВХ ВидыСубконтоХозрасчетные. Мы можем использовать его в качестве контейнера для хранения ссылок на наш новый справочник из расширения.
Разберем реализацию этого метода по шагам:
Субконто в свое расширение.Субконто новый реквизит, например, Расш_СсылкаНаОбъект. Установите для него тип вашего нового справочника из расширения (СправочникСсылка.Расш_МойНовыйСправочник).Субконто.Субконто, записываем в наш реквизит Расш_СсылкаНаОбъект ссылку на реальный элемент нового справочника и уже этот элемент Субконто подставляем в проводку.Для того чтобы пользователи в отчетах (оборотно-сальдовая ведомость, карточка счета) видели не безликие элементы справочника «Субконто», а реальные наименования вашего справочника, необходимо перехватить получение представления. Для этого в модуле менеджера заимствованного справочника Субконто в расширении напишем следующий код:
&Вместо("ОбработкаПолученияПредставления")
Процедура Расш_ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
// Если у элемента заполнена ссылка на наш справочник из расширения, выводим ее представление
Если Данные.Свойство("Расш_СсылкаНаОбъект") И ЗначениеЗаполнено(Данные.Расш_СсылкаНаОбъект) Тогда
СтандартнаяОбработка = Ложь;
Представление = Строка(Данные.Расш_СсылкаНаОбъект);
КонецЕсли;
КонецПроцедуры
Также рекомендуется переопределить событие ПередЗаписью справочника Субконто, чтобы автоматически синхронизировать наименование для стандартных поисковых механизмов:
&Перед("ПередЗаписью")
Процедура Расш_ПередЗаписью(Отказ)
Если ЗначениеЗаполнено(ЭтотОбъект.Расш_СсылкаНаОбъект) Тогда
ЭтотОбъект.Наименование = Лев(Строка(ЭтотОбъект.Расш_СсылкаНаОбъект), 150);
КонецЕсли;
КонецПроцедуры
---
Если у вас есть возможность обновить платформу «1С:Предприятие» до версии 8.3.20 и выше, а также поднять режим совместимости конфигурации, то проблема решается штатными средствами без каких-либо «костылей».
Начиная с версии платформы 8.3.20, разработчикам официально разрешено расширять свойство «Тип значения характеристик» у заимствованных Планов видов характеристик. Рассмотрим этот процесс:
ВидыСубконтоХозрасчетные в расширение.После этого ваш справочник станет полноправным типом для использования в качестве субконто. Вы сможете программно добавлять новые виды субконто и привязывать их к любым счетам.
---
Проанализируем архитектурную сторону вопроса. Часто программисты, переносящие код из старых версий (например, 1С 7.7), по привычке пытаются реализовать любой дополнительный учет через забалансовые счета регистра бухгалтерии. Однако в среде 1С 8.3 это не всегда оптимально.
Если забалансовый учет по вашему справочнику носит чисто информационный характер и не требует жесткого соблюдения принципа двойной записи (актив/пассив), рассмотрите возможность создания собственного Регистра накопления или Регистра сведений непосредственно внутри расширения.
Важное ограничение: Возможность добавлять собственные регистры накопления в расширения появилась в платформе начиная с версии 8.3.13. Если режим совместимости вашей базы равен 8.3.12 или ниже, платформа не позволит обновить конфигурацию базы данных с регистром накопления в расширении.
Если же режим совместимости позволяет (8.3.13+), то создание регистра — это самый «чистый» способ:
ОбработкаПроведения).Для решения проблемы с субконто из расширения выберите один из путей в зависимости от вашего ИТ-ландшафта: